Vektorsøk i Elasticsearch innebærer en prosess hvor man beregner avstanden mellom en spørringsvektor og andre vektorer i datasettet, ved hjelp av en valgt likhetsfunksjon. Etter å ha funnet avstander til et forhåndsbestemt antall kandidater, sorteres disse etter nærhet til spørringsvektoren, og de nærmeste k-punktene – de såkalte k-nærmeste naboene – velges ut. Før versjon 8 benyttet Elasticsearch en brute-force metode, hvor avstandene ble beregnet mellom spørringsvektoren og samtlige vektorer i databasen. Denne metoden var både tidkrevende og ressurskrevende.

Fra og med versjon 8 har Elasticsearch tatt i bruk Hierarchical Navigable Small World (HNSW) algoritmen for Approximate Nearest Neighbor (ANN) søk, noe som har økt både effektiviteten og hastigheten betraktelig. HNSW benytter en flerlags grafstruktur hvor hvert lag er en undergruppe av laget under, og det nederste laget inneholder alle elementene. Søket starter i det øverste laget med færre punkter, og beveger seg deretter nedover, noe som dramatisk reduserer antall avstandsberegninger og dermed akselererer søket.

I tillegg til forbedringer i selve søkealgoritmen finnes flere strategier for å øke både presisjon og ytelse. En slik teknikk er «chunking», som håndterer lange tekstsekvenser ved å dele dem opp i mindre deler, slik at modeller som ellers bare kan prosessere et begrenset antall tokens, likevel kan anvendes på omfattende datamateriale. Dette bidrar til å bevare viktig informasjon som ellers ville gå tapt ved trunkiéring av tekst til et fast tokenantall.

Elasticsearch har også introdusert byte-sized vektorer, som lagres med mindre plass og gir nesten ingen presisjonstap sammenlignet med tradisjonelle 32-bit flyttallvektorer. Dette muliggjør mer lagringseffektive indekser uten betydelig kompromiss på nøyaktighet.

Modellutplassering er en annen kritisk faktor for skalerbarhet og ytelse. I enklere oppsett kan man kjøre én modellallokering med én tråd, men for større eller mer krevende systemer kan man skalere ved å øke antall allokeringer og tråder per allokering på tvers av flere maskinlæringsnoder. Slik utnyttes hardware mer effektivt og parallelliserer arbeidsoppgaver som vektoruttrekk og inferens.

Vektorsøk benyttes ikke bare til semantisk søk, men også i mange andre applikasjoner som bildesøk, duplikatdeteksjon, anbefalingssystemer og svindeldeteksjon. Dette understreker vektorsøks brede anvendelsesområde og viktigheten av å forstå hvordan man kan tilpasse metoder og parametere til spesifikke behov.

Elasticsearch har også utviklet egen teknologi for sparsom vektorreprensentasjon gjennom Elastic Learned Sparse Encoder (ELSER). ELSER muliggjør effektiv semantisk søk basert på sparsomme vektorer, noe som kan gi fordeler som bedre skalerbarhet og raskere søk sammenlignet med tradisjonelle tette vektorer. For å benytte ELSER kreves minst Elasticsearch versjon 8.11 og maskinlæringsnoder med minimum 4 GB RAM.

Det er viktig å merke seg at søkeprosessen og modelladministrasjon krever nøye håndtering av modeller i Kibana, inkludert å stoppe tidligere modellutplasseringer før nye modeller deployeres. Automatiserte skript for generering av vektorer og ingestering bidrar til å effektivisere arbeidsflyten.

I tillegg til de tekniske detaljene må man ha innsikt i at vektorsøk alltid innebærer kompromisser mellom hastighet, presisjon og ressursbruk. Optimaliseringer som HNSW og byte-sized vektorer hjelper til med å balansere dette, men forståelse av datamengde, spørringsmønstre og bruksområde er avgjørende for å oppnå ønskede resultater. Forståelsen av de underliggende prinsippene bak ANN-søk og sparsomme versus tette vektorer bidrar til bedre beslutninger rundt implementasjon og videreutvikling av søkesystemer.

Hvordan forbedrer dokumentdeling og indeksering søk og samtale i chatbotter?

For å oppnå presise og relevante svar i søk og samtaleapplikasjoner basert på store tekstmengder, er det avgjørende å dele (chunk) dokumentene før de indekseres. Denne prosessen innebærer at lange tekster deles opp i mindre segmenter – i dette tilfellet på rundt 1000 tokens med 200 tokens overlapp – før de lastes inn i en søkemotor som Elasticsearch. Fordelen er at slike mindre biter enkelt kan håndteres innenfor de begrensningene som finnes i vektorbaserte modeller, som typisk har en øvre grense for hvor mange tokens de kan prosessere samtidig. Uten denne delingen vil lengre dokumenter bli trunkert, noe som resulterer i tap av viktig informasjon og dermed dårligere søkeresultater.

Når dokumentene deles og indekseres som individuelle enheter, øker det totale antallet dokumenter i indeksen betydelig, som i eksempelet med filmplott der antallet dokumenter tredobles. Denne økningen kan ved første øyekast virke overraskende, men den gjenspeiler nettopp den granulariteten som trengs for å dekke alle aspekter av innholdet i søk og gjenfinning.

I praksis betyr dette at en søkemotor som Elasticsearch kan finne og returnere mye mer presise resultater når en bruker spør om detaljerte elementer i et langt dokument, for eksempel spesifikke hendelser i en film. I en demonstrasjon med en chatbot som bruker en slik chunked indeks, ga spørsmål om filmplottet til Titanic gode og riktige svar, mens en tradisjonell indeks uten deling ikke klarte å identifisere filmen eller gi tilfredsstillende svar.

Videre muliggjør denne teknikken også mer flytende og kontekstbevisste samtaler. Chatboten kan opprettholde kontekst over flere spørsmål uten at brukeren trenger å gjenta nøkkelord, noe som gir en mer naturlig og engasjerende dialog. Dette skjer ved at tidligere meldinger lagres og sammenfattes i en prompt-strategi, slik at den generative språkmodellen alltid får tilstrekkelig bakgrunnsinformasjon til å gi relevante og sammenhengende svar.

Teknisk sett benyttes verktøy som LangChain for å laste inn dokumentene, hvor metadatafelter som tittel, år, regissør og sjanger defineres for å strukturere dataene bedre. Deretter brukes et tekstsplitteverktøy, som NLTKTextSplitter, til å dele opp dokumentene i mindre, overlappende biter. Denne overlappen sikrer at informasjon som går over to segmenter ikke går tapt. I tillegg anvendes spesialtilpassede analyzere i Elasticsearch for å forbedre den leksikalske søkekvaliteten, blant annet ved å filtrere ut vanlige stoppord på engelsk.

Når det gjelder valg av chunk-størrelse, er det et kompromiss mellom presisjon og kontekstlengde. For små chunks kan føre til at mange relevante biter ikke får plass i modellens kontekstvindu, mens for store chunks overskrider token-grensene og fører til trunkering. En størrelse på rundt 1000 tokens med overlapp har vist seg å være et optimalt valg i denne sammenhengen.

Det er også viktig å merke seg at denne metoden ikke bare forbedrer nøyaktigheten i svar, men også ytelsen til applikasjonen, da hvert dokument er lettere å hente og prosessere. Den hybride søkestrategien som kombinerer både vektor- og leksikalsk søk, sikrer at man drar nytte av styrkene til begge metodene: semantisk forståelse og presis tekstmatching.

I tillegg gir implementeringen av en enkel samtalehistorikk, som for eksempel via Streamlit Session State, chatboten en form for korttidshukommelse, noe som er avgjørende for å kunne føre naturlige og meningsfulle samtaler over tid. Historikken samles og kondenseres i prompten, slik at konteksten alltid er tilgjengelig for den generative modellen uten at brukerens opplevelse svekkes av gjentakelser eller konteksttap.

Dette innebærer at når man bygger avanserte applikasjoner for søk og samtaler med store tekstmengder og generativ AI, er det essensielt å forstå både teknologien bak indeksering og deling av dokumenter, og hvordan kontekstbehandling og promptstrategier spiller sammen for å skape en helhetlig og effektiv brukeropplevelse.

For å få fullt utbytte av slike løsninger må man også ha kunnskap om tokenbegrensninger i språkmodeller, viktigheten av metadata for strukturering, og hvordan man kan optimalisere både søkealgoritmer og generativ respons basert på dokumentstrukturen.