Förstå semantisk sökning

Slutförd

Låt oss gå igenom grunderna i semantisk sökning:

  • Hur det skiljer sig från vanlig lexikal sökning.
  • Vad är vektorbäddning?
  • Vad gör vektordatabaser?

Standardlexikalsökning, eller nyckelordssökning, söker i dokument genom att matcha tecken. Frågan "ljus" matchar till exempel texten "starkt ljus" eftersom tecknet light visas i dokumentet.

Lexikal sökning kan utökas med osäker matchning, sökfrågan "lights" kan till exempel fortfarande matcha texten "starkt ljus" eller felstavat lihgts på grund av att det är ett tecken fel (ett saknas s, eller vid byte av g och h). Även om fuzzy-matchning och andra tekniker som härstamning är användbara, måste den här tekniken matcha synonymer eller semantiskt liknande språk: olika fraser, slang, teknisk vokabulär osv. För att tillhandahålla de mest relevanta sökresultaten med lexikal sökning måste författarna bädda in nyckelord i metadata eller själva texten (vilket kan vara en besvärlig användarupplevelse).

Ange semantisk sökning. Semantisk sökning använder inte teckenlikhet. I stället används numeriska representationer av begreppen i ord och fraser. Dessa numeriska representationer kallas inbäddningsvektorer eller helt enkelt inbäddningar.

Om två inbäddningar är numeriskt lika är de också semantiskt lika. Den här likheten är mer allmän än att testa överlappning av nyckelord eftersom den är mindre känslig för exakt nyckelordsval eller frasering.

Om du vill utföra en semantisk sökning genererar du först frågans inbäddningsvektor. Jämför sedan den vektorn mot en databas med vektorer. De inbäddningar som är närmast frågebäddningen är de dokument som mest semantiskt liknar frågan.

De flesta användningsfall för relationsdatabaser omfattar inte lagring av n-dimensionella vektorer och beräkning av det numeriska avståndet mellan dem. Effektiv semantisk sökning kräver funktioner för vektordatabaser .

Ett diagram som visar ett dokument och en fråga som går igenom API:et OpenAI Embeddings för att bli inbäddningsvektorer. Dessa vektorer jämförs sedan med cosininavstånd.

Inbäddningar

En inbäddning är en numerisk representation av semantik. Inbäddningar representeras som n-dimensionella vektorer: matriser med n tal. Varje dimension representerar viss semantisk kvalitet som bestäms av inbäddningsmodellen.

Ett diagram som visar indatatexten

Om två inbäddningsvektorer pekar i liknande riktningar representerar de liknande begrepp, till exempel "ljusa" och "soliga". Om de pekar bort från varandra representerar de motsatta begrepp, till exempel "ledsna" och "lyckliga". Inbäddningsmodellens struktur och träningsdata avgör vad som anses vara liknande och annorlunda.

Inbäddningar kan tillämpas på text och alla typer av data, till exempel bilder eller ljud. Den kritiska delen är att omvandla data till n-dimensionella inbäddningsvektorer baserat på någon modell eller funktion. Den numeriska likheten mellan inbäddningsproxys är den semantiska likheten mellan motsvarande data.

Den numeriska likheten mellan två n-dimensionella vektorer v1 och v2 ges av deras punktprodukt, skriven v1·v2. För att beräkna punktprodukten multiplicerar du varje dimensions värden parvis och summerar sedan resultatet:

dot_product(v1, v2) = SUM(
 v1[0] * v2[0],
 v1[1] * v2[1],
 ...,
 v1[n-1] * v2[n-1],
 v1[n] * v2[n]
)

Eftersom inbäddningarna är enhetsvektorer (vektorer av längd ett) är punktprodukten lika med vektorernas cosinniska likhet, ett värde mellan -1 (exakt motsatta riktningar) och 1 (exakt samma riktning). Vektorer med en cosinisk likhet av noll är ortogoniala: semantiskt orelaterade.

Du kan visualisera n-dimensionella rum genom att projicera dem till ett tredimensionellt rum med hjälp av huvudkomponentanalys (PCA). PCA är en standardteknik för att minska vektordimensioner. Resultatet är en förenklad men visualiseringsbar projektion av det n-dimensionella utrymmet. Om du återger inbäddning av dokument på det här sättet visas att fler liknande dokument grupperas i kluster medan fler olika dokument ligger längre bort.

Med dessa definitioner är det enkelt matematiskt att utföra en semantisk sökning av en fråga mot en samling dokumentinbäddningar:

  1. Generera frågeinbäddning med hjälp av en språkmodell.
  2. Ta dot-produkten av frågans inbäddning mot varje dokuments förberäknade inbäddning.
  3. Sortera punktprodukterna, talen från och med -1 till 1.
  4. De mest relevanta dokumenten (semantiskt lika) har de högsta poängen och de minst relevanta (semantiskt olika) dokumenten har lägst poäng.

Även om det är enkelt matematiskt är detta inte en enkel eller högpresterande fråga i en relationsdatabas. Om du vill lagra och bearbeta den här typen av vektorlikhetsfråga använder du en vektordatabas.

Vektordatabaser

En vektordatabas optimerar lagring och beräkning av mångadimensionella vektorer, till exempel inbäddningar. I synnerhet ger vektordatabaser snabba och exakta punktproduktberäkningar för att köra en vektorlikhetsfråga.

Vektorlikhetssökningar har flera användningsfall:

  • hitta bilder som liknar inbäddningen av frågebilden
  • hitta dokument som semantiskt liknar frågetexten
  • hitta produkter med liknande funktioner och klassificeringar för ett rekommendationssystem

Semantisk sökning frågar vektordatabasen om likheten mellan frågeinbäddningen och varje lagrad inbäddning. Program kan sedan hämta data som motsvarar inbäddningarna.

Det finns många interna vektordatabaser och databastillägg att välja mellan. Följande Azure-tjänster kan hjälpa dig att uppfylla dina vektordatabasbehov: