Een klant zoekt in je kennisbank naar “terugbetaling”, maar jouw handleiding heet “Geld terug bij retour”. Een gewone zoekfunctie mist dat. Semantisch zoeken vindt het wel, omdat het op betekenis zoekt. In deze gids bouw je de kern daarvan met Cohere Embed in drie stappen.
Stap 1: installeer en kies je model
pip install cohere numpy
export COHERE_API_KEY="jouw-sleutel"
In de documentatie staan op het moment van schrijven onder meer embed-v5.0-pro (hoogste kwaliteit), embed-v5.0-fast (sneller), embed-v4.0 en de oudere embed-multilingual-v3.0 (Bron: Cohere Docs). De meertalige modellen ondersteunen volgens Cohere meer dan 100 talen, waaronder Nederlands. De v5.0-modellen accepteren tot 128k tokens per input; de v3-modellen 512.
💡 Beginner-tip: begin met
embed-v5.0-fast. Je kunt later overstappen naarproals je merkt dat de resultaten beter moeten. Embed je documenten opnieuw na een modelwissel, want vectoren van verschillende modellen zijn niet vergelijkbaar.
Stap 2: embed je documenten
Teksten die je doorzoekbaar wilt maken krijgen input_type="search_document":
import cohere
co = cohere.ClientV2()
documenten = [
"Geld terug bij retour: binnen 14 dagen krijg je je bedrag teruggestort.",
"Levering duurt twee tot drie werkdagen binnen Nederland.",
"Zo wijzig je het e-mailadres van je account.",
]
resp = co.embed(
inputs=[{"content": [{"type": "text", "text": t} for t in documenten]}],
model="embed-v5.0-fast",
input_type="search_document",
embedding_types=["float"],
)
doc_vectoren = resp.embeddings.float_
Let op het maximum: volgens de API-referentie mag je 96 teksten per aanroep sturen (Bron: Cohere Docs). Heb je er meer, loop dan in blokken van 96.
Stap 3: embed de vraag en vergelijk
De vraag van de gebruiker embed je met input_type="search_query", en je kiest het document waarvan de vector er het dichtst bij ligt:
import numpy as np
vraag = co.embed(
inputs=[{"content": [{"type": "text", "text": "hoe krijg ik terugbetaling?"}]}],
model="embed-v5.0-fast",
input_type="search_query",
embedding_types=["float"],
).embeddings.float_[0]
def cosinus(a, b):
a, b = np.array(a), np.array(b)
return float(a @ b / (np.linalg.norm(a) * np.linalg.norm(b)))
scores = [cosinus(vraag, d) for d in doc_vectoren]
print(documenten[int(np.argmax(scores))])
Het eerste document zou nu het hoogst moeten scoren, ook al komt “terugbetaling” er niet letterlijk in voor. Controleer dat met je eigen teksten voordat je erop vertrouwt.
⚡ Gevorderden: met
output_dimensionkies je een kleinere vector (beschikbaar voor v4 en nieuwer; voor v5.0 zijn 256 tot 2048 mogelijk, standaard 2048). Dat scheelt opslag in je vectordatabase. Meet wel op een testset of de zoekkwaliteit overeind blijft. Wil je de top van je resultaten nog scherper maken, zet er dan een reranker achter.
Waar je op moet letten
Ga je echte klantgegevens embedden, regel dan eerst je verwerkersovereenkomst met Cohere en kijk naar de EU-hostingopties. Een embedding lijkt anoniem, maar kan herleidbaar zijn naar de brontekst. Houd ook je bron-ID’s bij, zodat je bij een gevonden vector weet welke tekst erbij hoort.
