Sliter du med AI eller fullstack-utvikling? Ekspertene våre er her for å veilede deg: skreddersydde råd, teknisk integrasjon og mer. Ta kontakt på [email protected].

Opprette en semantisk søkemodell med setningstransformatorer for en RAG-applikasjon

Implementering av en RAG-pipeline (Retrieval Augmented Generation) ved å finjustere din egen semantiske søkemodell er en effektiv tilnærming for å forbedre nøyaktigheten og relevansen til systemer for spørsmålssvar.

Denne teknikken kombinerer styrken til både semantisk søk og generativ AI, noe som gjør systemet i stand til å forstå brukernes spørsmål bedre og generere mer nøyaktige og kontekstuelt relevante svar. Ved å finjustere en semantisk søkemodell ved hjelp av Sentence Transformers kan utviklere skreddersy modellen til sitt spesifikke domene, noe som forbedrer den generelle ytelsen til RAG-pipelinen.

Semantisk søk

Hva er semantisk søk?

Semantisk søk er en datasøketeknikk som går lenger enn de tradisjonelle søkeordbaserte søkemetodene. Den bruker naturlig språkbehandling og maskinlæringsalgoritmer for å forbedre nøyaktigheten i søkeresultatene ved å ta hensyn til søkerens intensjon og den kontekstuelle betydningen av begrepene som brukes i søket. Denne tilnærmingen tar sikte på å forstå den underliggende betydningen av søket og innholdet på nettsidene, i stedet for bare å matche nøkkelord. På denne måten kan semantiske søk levere mer relevante resultater, selv om de ikke inneholder nøyaktig de ordene som ble brukt i det opprinnelige søket.

For å oppnå dette bruker semantiske søk ulike teknikker, for eksempel ordsansedisambiguering, begrepsekstraksjon og utvidelse av spørringen. Det benytter også vektorsøk og maskinlæring for å returnere resultater som samsvarer med brukerens intensjon og kontekst. Semantisk søk er mye brukt i søkemotorer på nettet, for eksempel Google, og drives av teknologier som Knowledge Graph, som lagrer strukturerte data om enheter og deres relasjoner. Dette gjør det mulig for søkemotorer å forstå meningen bak søkespørsmål og gi mer nøyaktige og meningsfulle resultater.

Semantisk søk er svært nyttig for bedrifter som ønsker å få svar på spørsmål om sin egen domenekunnskap, for eksempel teknisk dokumentasjon, kontrakter, produktbeskrivelser osv.

Hva er Retrieval Augmented Generation (RAG)?

Semantisk søk

Retrieval Augmented Generation (RAG) er en teknikk som forbedrer nøyaktigheten og påliteligheten til generative AI-modeller, for eksempel Large Language Models (LLM), ved å innlemme eksterne datakilder for å gi mer kontekstuelt nøyaktig og oppdatert informasjon. Den integrerer en gjenfinningskomponent med en generativ modell, slik at systemet kan søke og hente relevant informasjon fra en database eller kunnskapsbase for å supplere den interne kunnskapen når det genererer svar.

Denne tilnærmingen sikrer at AI-modellen kan gi svar basert på de mest aktuelle og pålitelige faktaene, og gjør det mulig for brukerne å verifisere kildene til informasjonen som brukes i modellens svar. RAG bidrar til å forankre AI-modellen i eksterne kunnskapskilder, noe som forbedrer kvaliteten på resultatene og gjør det mulig å oppdatere modellen uten omfattende omskolering.

RAG er en god strategi for å redusere potensielle hallusinasjoner fra generative AI-modeller. RAG bidrar til å bygge et system for spørsmålssvar som har det beste fra begge verdener: faktanøyaktighet og menneskelige svar generert på naturlig språk.

Hva er Sentence Transformers-biblioteket?

Setningstransformatorer

Sentence Transformers-biblioteket er et kraftig Python-rammeverk som er utviklet for avansert tekstinnbygging. Det er bygget på transformerende nevrale nettverk som BERT, RoBERTa, XLM-R og andre, og oppnår topp ytelse i ulike oppgaver, inkludert semantisk søk, parafraseutvinning, sammenligning av semantisk likhet, klynging og mer. Biblioteket gjør det enkelt å finjustere setningsinnbyggingsmetodene, noe som gjør det mulig å lage oppgavespesifikke setningsinnbygginger som er skreddersydd for å dekke spesifikke behov. Les mer på nettstedet til Sentence Transformers

Biblioteket tilbyr et bredt utvalg av forhåndstrente Sentence Transformers-modeller for mer enn 50 språk, som er tilgjengelige på Hugging Face-plattformen. Brukerne kan også trene eller finjustere sine egne modeller ved hjelp av biblioteket, noe som gir fleksibilitet til å lage tilpassede modeller for unike bruksområder. Sentence Transformers-teamet har nylig lansert en ny hovedversjon (v3) som forbedrer funksjonene i dette biblioteket betraktelig, spesielt finjusteringsmulighetene.

Sentence Transformers-biblioteket er raskt, omfattende og godt vedlikeholdt, og det er derfor vi bruker det i denne opplæringen.

Opprett din egen semantiske søkemodell

Å lage din egen semantiske søkemodell er en flott måte å få nøyaktige resultater på, samtidig som du sikrer en svært lav latenstid. Dette gjelder i enda større grad hvis du distribuerer din egen semantiske søkemodell på en GPU.

La oss først lage et lite datasett som inneholder dataene våre. Opprett en CSV-fil med én kolonne (kalt "dataset.csv") som inneholder følgende tekniske dokumentasjon om HP-skrivere (i et virkelig scenario vil du selvfølgelig inkludere mange flere eksempler):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Hver rad kan inneholde opptil 512 tokens (tilsvarer omtrent 400 ord), og for å maksimere nøyaktigheten anbefales det å holde seg under 128 tokens (tilsvarer omtrent 100 ord). Nå som vi har de tre dokumentasjonsdelene i datasettet vårt, kan vi kode dataene ved hjelp av modellen vår med Sentence Transformers. Opprett et Python-skript med følgende (sørg for at PyTorch og Sentence Transformers er installert).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Dette skriptet laster ned og bruker paraphrase-multilingual-mpnet-base-v2 som en basismodell og bruker den til å kode dataene våre. Du kan velge blant mange tilgjengelige forhåndstrente modeller, avhengig av dine krav (modellstørrelse, bruksområde, språk som støttes, ...). Avhengig av maskinvaren din vil du ønske å tilpasse parameteren "batch_size" for å øke hastigheten på kodingsprosessen.

Når du har opprettet modellen, kan du bruke den til inferens ved hjelp av følgende Python-skript:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

Skriptet ovenfor gir følgende resultater:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

I inferensskriptet vårt bestemmer parameteren "top_k" hvor mange resultater vi ønsker å returnere. I resultatet viser vi den samsvarende teksten fra datasettet med en tillitsscore. Denne poengsummen er viktig fordi den hjelper oss med å avgjøre om vi vil godta svaret eller ikke.

Generere et svar på naturlig språk med generativ AI

Som du kan se, er den største begrensningen ved semantisk søk at modellen returnerer råteksten fra datasettet uten å svare direkte på spørsmålet. Derfor ønsker vi nå å gi dette til en generativ AI-modell som en kontekst for å besvare det opprinnelige spørsmålet på naturlig språk.

Vi kan enkelt oppnå dette ved å utnytte en avansert LLM som GPT-4 på OpenAI eller LLaMA 3 og ChatDolphin på NLP Cloud. Du kan enten velge å beholde det beste resultatet fra den semantiske søkemodellen og sende dette som en kontekst til LLM-en, eller beholde flere resultater. Her er et eksempel på en ledetekst som kun bruker det beste resultatet:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Denne forespørselen returnerer noe sånt:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Semantisk søkemodell med kodede data VS lagring av innstøpte data i en vektordatabase

I et RAG-system (Retrieval-Augmented Generation) er det to interessante alternativer å lage en semantisk søkemodell med lokalt kodede data eller å bruke en vektordatabase.

Når vi koder våre egne data, konverterer vi dataene til tensorer og har deretter muligheten til å laste dataene inn på en GPU. En vektordatabase er derimot en spesialisert database som er utviklet for å lagre, indeksere og stille spørsmål om disse høydimensjonale vektorene på en effektiv måte.

For bedrifter som ønsker å oppnå svært lave ventetider, anbefales det å kode egne data og laste dem inn i en GPU for å forbedre beregningstiden. Det går imidlertid på bekostning av fleksibiliteten, ettersom dataene må kodes på nytt hver gang datasettet endres. Hvis de underliggende dataene endres svært ofte, kan det være enklere for deg å trekke ut innstøpningene og lagre dem trinnvis i en vektordatabase (som for eksempel PG Vector).

Konklusjon

Retrieval Augmented Generation er avgjørende for bedrifter som ønsker å svare på spørsmål om spesifikke data som teknisk dokumentasjon, kontrakter osv. RAG er for eksempel en nøkkelkomponent i en chatbot for kundestøtte.

Sentence Transformers er et flott bibliotek som kan brukes til å lage din egen semantiske søkemodell basert på dine egne data. Når en slik modell brukes på en GPU og kombineres med en avansert generativ AI-modell, viser den seg å være ekstremt kraftig.

Hvis du ikke er interessert i å lage og distribuere din egen semantiske søkemodell basert på Sentence Transformers selv, kan du enkelt gjøre det med ett klikk på NLP Cloud. Prøv semantisk søk på NLP Cloud nå!

Hvis du har spørsmål om RAG, semantiske søk og Sentence Transformers, ikke nøl med å spørre oss, det er alltid en glede å gi deg råd!

Julien
Teknisk direktør i NLP Cloud