indietyp's picture
fix: citation key
a09a45d verified
|
Raw
History Blame Contribute Delete
5.54 kB
---
license: mit
language:
- en
tags:
- slug-generation
- onnx
- embedding-to-text
- url-slug
- beam-search
library_name: onnxruntime
pipeline_tag: summarization
---
# vec2slug-v1-openai-large
Generate URL slugs directly from text embeddings, without re-feeding
source text through a language model. Designed to piggyback on embeddings
a system already has for search or deduplication.
| | |
|---|---|
| **Parameters** | 24.8M |
| **Architecture** | Transformer decoder, 6L, d=512 |
| **Input** | OpenAI `text-embedding-3-small` (1536d) |
| **Vocab** | BPE, 5000 subwords |
| **Token F1** | 0.306 |
| **ONNX size** | 95.1 MiB |
| **Inference (CPU)** | ~41ms (M-series), ~160ms (budget VPS) |
14 to 19× faster and approximately 85× cheaper than a Haiku-class LLM
call for the same task, including the cost of computing a fresh embedding.
With existing embeddings (the intended use case), approximately 2,000×
cheaper.
This is the **larger** of two variants. It achieves the best Token F1 but at 2x the inference cost of the smaller model.
See also: [Vec2Slug V1-Openai-Small](https://huggingface.co/hashintel/vec2slug-v1-openai-small)
## Quickstart
```bash
# install dependencies
pip install onnxruntime numpy
# or run directly with uv
uv run inference.py . --input embeddings.npy
```
```python
from inference import OnnxPredictor
import numpy as np
predictor = OnnxPredictor.from_dir(".")
# embeddings: [N, 1536] float32 from OpenAI text-embedding-3-small
slugs = predictor.predict(embeddings)
# ["how-neural-networks-learn", "climate-change-solutions", ...]
```
PyTorch inference (requires `torch`):
```python
from inference import PyTorchPredictor
predictor = PyTorchPredictor.from_dir(".")
slugs = predictor.predict(embeddings)
```
## Examples
Predictions on held-out test samples (beam search, width 4). The model
sees only the 1536-dim embedding, never the source text.
| Source text | Reference slug | Predicted slug |
|---|---|---|
| Children's book about astronomy and living on Mars | `can-we-live-on-mars` | `can-we-live-on-mars` |
| Teaching resources for Martin Luther King Jr. Day | `celebrating-martin-luther-king-jr-day` | `celebrating-martin-luther-king-jr-day` |
| Article about Waldorf education practices | `12-things-may-not-know-waldorf-education` | `10-things-you-didnt-know-about-waldorf-education` |
The third example illustrates the typical case: the model captures the
topic correctly but diverges in specific wording. The common failure mode
is overgeneralization rather than incoherence.
## How it works
The model is a prefix-conditioned transformer decoder. A precomputed text
embedding is linearly projected into the decoder's hidden space and placed
at position 0 as a prefix token. The decoder then autoregressively generates
BPE subword tokens that form a kebab-case URL slug.
Beam search uses bounded additive length reward with score-based optimal
stopping ([Huang et al. 2017](https://doi.org/10.18653/v1/D17-1227)). All
decoding parameters are stored in `model.json`.
## Files
| File | Description |
|---|---|
| `model.onnx` | ONNX model (forward pass only) |
| `model.json` | Sidecar: vocabulary, beam search config, stopwords |
| `model.pt` | PyTorch weights (`state_dict`) |
| `tokenizer.json` | BPE tokenizer (HuggingFace `tokenizers` format) |
| `inference.py` | Standalone inference script (`uv run` compatible) |
| `manifest.train.json` | Training configuration and results |
| `manifest.onnx.json` | Export verification (tolerance, argmax agreement) |
| `history.train.jsonl` | Training loss/metric curves |
## Training
Trained on 2.3M documents from FineWeb-Edu with slugs extracted
from source URLs. The extraction pipeline filters on language, slug format,
Gopher repetition, and token count.
BPE vocabulary (5,000 subwords) with `-` as a special token. Trained for 36 epochs with label smoothing (0.1) and position-aware EOS loss weighting. Best checkpoint at step 70,560.
## Evaluation
Evaluated on 5,000 held-out test samples using the full beam search
decoding pipeline.
| Metric | Value |
|---|---|
| Token F1 (macro) | 0.306 |
| Exact match | 2.1% |
| ROUGE-L | 0.284 |
| BERTScore F1 | 0.872 |
| Validity | 100% |
| Vocab diversity | 97.8% |
Token F1 splits both slugs on hyphens and computes set-overlap F1 (order
ignored). ROUGE-L measures the longest common subsequence and penalizes
misordered words. BERTScore computes contextual embedding similarity via
roberta-large; the floor is high (~0.82) because short English slugs are
not widely separated in that embedding space.
## Limitations
- Requires precomputed embeddings from OpenAI `text-embedding-3-small`.
Other embedding models will produce poor results.
- Trained on English web content. Non-English or domain-specific text
may produce generic or inaccurate slugs.
- Slugs reflect patterns in the training URLs, which include SEO-influenced
and editorially inconsistent sources.
- The primary failure mode is overgeneralization: the model captures the
topic but may miss specific angles or proper nouns (`asm` instead of
`wasm` for a WebAssembly article).
## Links
- [Blog post](https://hash.dev/blog/vec2slug)
- [Training code](https://github.com/hashintel/labs)
- [Vec2Slug V1-Openai-Small](https://huggingface.co/hashintel/vec2slug-v1-openai-small)
## Citation
```bibtex
@misc{vec2slug2026,
title={vec2slug: URL Slug Generation from Text Embeddings},
author={Mahmoud, Bilal and {HASH}},
year={2026},
url={https://github.com/hashintel/labs}
}
```