
Text-Embedding-3-Small API Handleiding - OpenAI Embedding Model Gids
Ben je een semantische zoekmachine of een RAG-systeem (Retrieval-Augmented Generation) aan het bouwen? Text-embedding-3-small is het nieuwste embeddingmodel van OpenAI dat tekst omzet in numerieke vectoren, waardoor krachtige similariteitszoekopdrachten en contentretrieval mogelijk worden.
In deze gids leer je:
- Wat text embeddings zijn en waarom ze belangrijk zijn
- Hoe je de text-embedding-3-small API gebruikt
- Volledige codevoorbeelden in Python en Node.js
- Aangepaste dimensies voor geoptimaliseerde opslag
- Prijsvergelijking en kostenoptimalisatie
Wat is Text-Embedding-3-Small?#
Text-embedding-3-small is OpenAI's compacte embeddingmodel, uitgebracht in januari 2024. Het zet tekst om in 1536-dimensionale vectoren die semantische betekenis vastleggen en zo het volgende mogelijk maken:
- Semantisch zoeken: Vind relevante documenten op basis van betekenis, niet alleen trefwoorden
- RAG-systemen: Haal context op voor LLM-antwoorden
- Similarity Matching: Vergelijk tekstsimilariteit voor aanbevelingen
- Clustering: Groepeer vergelijkbare documenten
- Classificatie: Categoriseer tekst op basis van inhoud
Modelspecificaties#
| Specificatie | Waarde |
|---|---|
| Modelnaam | text-embedding-3-small |
| Standaarddimensies | 1536 |
| Aangepaste dimensies | 256, 512, 1024, 1536 |
| Max input tokens | 8,191 |
| Output | Genormaliseerde vector |
Snelstart#
Vereisten#
- Meld je aan bij Crazyrouter
- Haal je API-sleutel op uit het dashboard
- Python 3.8+ of Node.js 16+
Python Voorbeeld#
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Genereer een embedding voor één tekst
response = client.embeddings.create(
model="text-embedding-3-small",
input="Machine learning is transforming industries worldwide."
)
embedding = response.data[0].embedding
print(f"Dimensions: {len(embedding)}") # Output: 1536
print(f"First 5 values: {embedding[:5]}")
Node.js Voorbeeld#
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'your-crazyrouter-api-key',
baseURL: 'https://crazyrouter.com/v1'
});
async function getEmbedding(text) {
const response = await client.embeddings.create({
model: 'text-embedding-3-small',
input: text
});
return response.data[0].embedding;
}
// Usage
const embedding = await getEmbedding('Machine learning is amazing');
console.log(`Dimensions: ${embedding.length}`); // Output: 1536
cURL Voorbeeld#
curl -X POST https://crazyrouter.com/v1/embeddings \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-3-small",
"input": "Hello world"
}'
Response:
{
"object": "list",
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 2,
"total_tokens": 2
},
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [-0.0020785425, -0.049085874, 0.02094679, ...]
}
]
}
Batch Embedding#
Verwerk meerdere teksten in één API-call voor betere efficiëntie:
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# Batch embedding - meerdere teksten tegelijk
texts = [
"Python is a programming language",
"JavaScript runs in browsers",
"Machine learning uses neural networks"
]
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
# Toegang tot elke embedding
for i, data in enumerate(response.data):
print(f"Text {i}: {len(data.embedding)} dimensions")
# Output:
# Text 0: 1536 dimensions
# Text 1: 1536 dimensions
# Text 2: 1536 dimensions
Aangepaste Dimensies#
Verminder opslagkosten door kleinere dimensies te gebruiken. Het model ondersteunt dimensiereductie met behoud van kwaliteit:
# Gebruik 512 dimensies in plaats van 1536
response = client.embeddings.create(
model="text-embedding-3-small",
input="Your text here",
dimensions=512 # Options: 256, 512, 1024, 1536
)
embedding = response.data[0].embedding
print(f"Dimensions: {len(embedding)}") # Output: 512
Dimensievergelijking#
| Dimensies | Opslag (per vector) | Use Case |
|---|---|---|
| 256 | 1 KB | Mobiele apps, beperkte opslag |
| 512 | 2 KB | Gebalanceerde performance |
| 1024 | 4 KB | Hoge nauwkeurigheid nodig |
| 1536 | 6 KB | Maximale nauwkeurigheid |
Een Semantisch Zoeksysteem Bouwen#
Hier is een volledig voorbeeld van het bouwen van een semantisch zoeksysteem:
import numpy as np
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
def get_embedding(text):
"""Get embedding for a single text"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_similarity(a, b):
"""Calculate cosine similarity between two vectors"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Documentdatabase
documents = [
"Python is great for data science and machine learning",
"JavaScript is essential for web development",
"Docker containers simplify deployment",
"Kubernetes orchestrates container workloads",
"PostgreSQL is a powerful relational database"
]
# Vooraf embeddings berekenen voor alle documenten
doc_embeddings = [get_embedding(doc) for doc in documents]
# Zoekfunctie
def search(query, top_k=3):
query_embedding = get_embedding(query)
# Similariteiten berekenen
similarities = [
cosine_similarity(query_embedding, doc_emb)
for doc_emb in doc_embeddings
]
# Topresultaten ophalen
results = sorted(
zip(documents, similarities),
key=lambda x: x[1],
reverse=True
)[:top_k]
return results
# Voorbeeldzoekopdracht
results = search("How to deploy applications?")
for doc, score in results:
print(f"Score: {score:.4f} - {doc}")
# Output:
# Score: 0.8234 - Docker containers simplify deployment
# Score: 0.7891 - Kubernetes orchestrates container workloads
# Score: 0.6543 - PostgreSQL is a powerful relational database
Integratie met Vector Databases#
Pinecone Integratie#
import pinecone
from openai import OpenAI
# Clients initialiseren
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
pinecone.init(api_key="your-pinecone-key")
index = pinecone.Index("your-index")
def embed_and_upsert(texts, ids):
"""Embed texts and store in Pinecone"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
vectors = [
(id, data.embedding)
for id, data in zip(ids, response.data)
]
index.upsert(vectors=vectors)
def search_pinecone(query, top_k=5):
"""Search Pinecone with query embedding"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=query
)
results = index.query(
vector=response.data[0].embedding,
top_k=top_k
)
return results
ChromaDB Integratie#
import chromadb
from openai import OpenAI
client = OpenAI(
api_key="your-crazyrouter-api-key",
base_url="https://crazyrouter.com/v1"
)
# ChromaDB initialiseren
chroma_client = chromadb.Client()
collection = chroma_client.create_collection("documents")
def get_embeddings(texts):
"""Get embeddings for multiple texts"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
return [data.embedding for data in response.data]
# Documenten toevoegen
documents = ["doc1 content", "doc2 content", "doc3 content"]
embeddings = get_embeddings(documents)
collection.add(
embeddings=embeddings,
documents=documents,
ids=["doc1", "doc2", "doc3"]
)
# Query
query_embedding = get_embeddings(["search query"])[0]
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
Beschikbare Embeddingmodellen#
Crazyrouter biedt toegang tot meerdere OpenAI embeddingmodellen:
| Model | Dimensies | Prijsratio | Beste voor |
|---|---|---|---|
text-embedding-3-small | 1536 | 0.01 | Algemeen gebruik, beste prijs-kwaliteit |
text-embedding-3-large | 3072 | 0.065 | Hoge precisiebehoeften |
text-embedding-ada-002 | 1536 | 0.05 | Legacy-compatibiliteit |
Prijsvergelijking#
| Provider | Model | Prijs per 1M tokens |
|---|---|---|
| OpenAI Official | text-embedding-3-small | $0.020 |
| Crazyrouter | text-embedding-3-small | $0.002 |
| OpenAI Official | text-embedding-3-large | $0.130 |
| Crazyrouter | text-embedding-3-large | $0.013 |
Prijsdisclaimer: De getoonde prijzen zijn ter demonstratie en kunnen wijzigen. De daadwerkelijke facturatie is gebaseerd op realtime prijzen op het moment van de aanvraag.
Voorbeeld kostenbesparing:
Voor een RAG-systeem dat 10M tokens/maand verwerkt:
- OpenAI Official: $200/maand
- Crazyrouter: $20/maand
- Besparing: 90%
Best Practices#
1. Batch je requests#
# Goed - één API-call voor meerdere teksten
response = client.embeddings.create(
model="text-embedding-3-small",
input=["text1", "text2", "text3"] # Up to 2048 texts
)
# Slecht - meerdere API-calls
for text in texts:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
2. Cache Embeddings#
import hashlib
import json
embedding_cache = {}
def get_embedding_cached(text):
# Maak cache key
cache_key = hashlib.md5(text.encode()).hexdigest()
if cache_key in embedding_cache:
return embedding_cache[cache_key]
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
embedding = response.data[0].embedding
embedding_cache[cache_key] = embedding
return embedding
3. Gebruik Passende Dimensies#
- 256 dimensies: Mobiele apps, IoT-devices
- 512 dimensies: Webapplicaties met opslagbeperkingen
- 1024 dimensies: Standaardapplicaties
- 1536 dimensies: Maximale nauwkeurigheidsvereisten
Veelgestelde Vragen#
Wat is het verschil tussen text-embedding-3-small en text-embedding-3-large?#
Text-embedding-3-small produceert 1536-dimensionale vectoren en is geoptimaliseerd voor kostenefficiëntie. Text-embedding-3-large produceert 3072-dimensionale vectoren met hogere nauwkeurigheid, maar tegen 6,5x de kosten. Voor de meeste toepassingen levert text-embedding-3-small uitstekende resultaten.
Kan ik de dimensies verminderen nadat embeddings zijn gegenereerd?#
Ja, je kunt de dimensions parameter gebruiken om direct kleinere vectoren te genereren. Dit is efficiënter dan eerst volledige vectoren genereren en ze daarna af te kappen.
Hoeveel teksten kan ik in één request embedden?#
Je kunt tot 2048 teksten in één enkele API-aanvraag embedden. Voor grote datasets kun je je verzoeken in batches van 2048 opdelen.
Zijn de embeddings genormaliseerd?#
Ja, text-embedding-3-small retourneert genormaliseerde vectoren (unit length), zodat je de dot product kunt gebruiken in plaats van cosine similarity voor snellere berekeningen.
Aan de Slag#
- Meld je aan bij Crazyrouter
- Haal je API-sleutel op uit het dashboard
- Installeer de SDK:
pip install openaiofnpm install openai - Start met embedden met de codevoorbeelden hierboven
Gerelateerde artikelen:
Voor vragen, neem contact op met support@crazyrouter.com


