Implementering af en RAG-pipeline (Retrieval Augmented Generation) ved at finjustere din egen semantiske søgemodel er en effektiv metode til at forbedre nøjagtigheden og relevansen af systemer til besvarelse af spørgsmål.
Denne teknik kombinerer styrkerne ved både semantisk søgning og generativ AI, hvilket gør systemet i stand til bedre at forstå brugernes spørgsmål og generere mere præcise og kontekstuelt relevante svar. Ved at finjustere en semantisk søgemodel ved hjælp af Sentence Transformers kan udviklere skræddersy modellen til deres specifikke domæne, hvilket forbedrer RAG-pipelinens samlede ydeevne.
Semantisk søgning er en datasøgeteknik, der går ud over de traditionelle søgeordsbaserede søgemetoder. Den bruger naturlig sprogbehandling og maskinlæringsalgoritmer til at forbedre nøjagtigheden af søgeresultaterne ved at tage hensyn til søgerens hensigt og den kontekstuelle betydning af de udtryk, der bruges i deres forespørgsel. Denne tilgang sigter mod at forstå den underliggende betydning af søgeforespørgslen og indholdet på websiderne i stedet for blot at matche nøgleord. På den måde kan semantisk søgning levere mere relevante resultater, selv om de ikke indeholder de nøjagtige ord, der blev brugt i den oprindelige forespørgsel.
For at opnå dette anvender semantisk søgning forskellige teknikker som f.eks. ordforklaringer, begrebsudvinding og udvidelse af forespørgsler. Den bruger også vektorsøgning og maskinlæring til at returnere resultater, der har til formål at matche brugerens hensigt og kontekst. Semantisk søgning bruges i vid udstrækning i websøgemaskiner som Google og drives af teknologier som Knowledge Graph, der gemmer strukturerede data om enheder og deres relationer. Det gør det muligt for søgemaskiner at forstå meningen bag søgeforespørgsler og give mere præcise og meningsfulde resultater.
Semantisk søgning er meget nyttig for virksomheder, der ønsker at besvare spørgsmål om deres egen domæneviden som f.eks. deres tekniske dokumentation, kontrakter, produktbeskrivelser...
Retrieval Augmented Generation (RAG) er en teknik, der forbedrer nøjagtigheden og pålideligheden af generative AI-modeller, såsom Large Language Models (LLM'er), ved at inkorporere eksterne datakilder for at give mere kontekstuelt nøjagtige og opdaterede oplysninger. Den integrerer en hentningskomponent med en generativ model, så systemet kan søge og hente relevante oplysninger fra en database eller vidensbase for at supplere sin interne viden, når det genererer svar.
Denne tilgang sikrer, at AI-modellen kan give svar baseret på de mest aktuelle og pålidelige fakta, og giver brugerne mulighed for at kontrollere kilderne til de oplysninger, der bruges i modellens svar. RAG hjælper med at basere AI-modellen på eksterne videnskilder, hvilket forbedrer kvaliteten af dens output og giver mulighed for at opdatere modellen uden behov for omfattende omskoling.
RAG er en god strategi til at afbøde potentielle hallucinationer fra generative AI-modeller. RAG hjælper med at opbygge et system til besvarelse af spørgsmål, der har det bedste fra begge verdener: faktuel nøjagtighed og menneskelige svar genereret på naturligt sprog.
Sentence Transformers-biblioteket er en kraftfuld Python-ramme, der er designet til avancerede tekstindlejringer. Det er bygget på transformerende neurale netværk som BERT, RoBERTa, XLM-R og andre, der opnår topresultater i forskellige opgaver, herunder semantisk søgning, parafrase mining, sammenligning af semantisk lighed, klyngedannelse og meget mere. Dette bibliotek giver mulighed for nem finjustering af sætningsindlejringsmetoder, hvilket gør det muligt at skabe opgavespecifikke sætningsindlejringer, der er skræddersyet til at opfylde specifikke behov. Læs mere på Sentence Transformers' hjemmeside
Biblioteket tilbyder et bredt udvalg af prætrænede Sentence Transformers-modeller til mere end 50 sprog, som er tilgængelige på Hugging Face-platformen. Brugere kan også træne eller finjustere deres egne modeller ved hjælp af biblioteket, hvilket giver fleksibilitet til at skabe tilpassede modeller til unikke brugssituationer. Sentence Transformers-teamet har for nylig udgivet en ny større version (v3), der forbedrer bibliotekets muligheder betydeligt, især dets finjusteringsmuligheder.
Sentence Transformers-biblioteket er hurtigt, omfattende og velholdt, hvilket er grunden til, at vi bruger det i denne vejledning.
At skabe sin egen semantiske søgemodel er en god måde at få præcise resultater på, samtidig med at man sikrer en meget lav latenstid. Det gælder i endnu højere grad, hvis du implementerer din egen semantiske søgemodel på en GPU.
Lad os først lave et lille datasæt, der indeholder vores data. Opret en CSV-fil med 1 kolonne (kaldet "dataset.csv"), der indeholder følgende tekniske dokumentation om HP-printere (i et virkeligt scenarie vil du selvfølgelig gerne 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 række kan indeholde op til 512 tokens (svarende til ca. 400 ord), og for at maksimere nøjagtigheden anbefales det at holde sig under 128 tokens (svarende til ca. 100 ord). Nu hvor vi har vores 3 stykker dokumentation i vores datasæt, kan vi kode dataene ved hjælp af vores model med Sentence Transformers. Opret et Python-script med følgende (sørg for, at PyTorch og Sentence Transformers er installeret).
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 script downloader og bruger paraphrase-multilingual-mpnet-base-v2 som en basismodel og bruger den til at kode vores data. Du kan vælge mellem mange tilgængelige prætrænede modeller, afhængigt af dine krav (modelstørrelse, brugssag, understøttede sprog, ...). Afhængigt af din hardware kan du tilpasse parameteren "batch_size" for at fremskynde kodningsprocessen.
Når den er oprettet, kan du bruge din model til inferens med følgende Python-script:
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]}
Ovenstående slutningsscript giver 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 vores inferensscript bestemmer parameteren "top_k", hvor mange resultater vi ønsker at returnere. I resultatet viser vi den matchende tekst fra datasættet med en tillidsscore. Denne score er vigtig, fordi den hjælper os med at beslutte, om vi vil acceptere svaret eller ej.
Som du kan se, er den største begrænsning ved semantisk søgning, at modellen returnerer den rå tekst fra datasættet uden direkte at besvare spørgsmålet. Så vi ønsker nu at give dette til en generativ AI-model som en kontekst for at besvare det oprindelige spørgsmål på naturligt sprog.
Vi kan nemt opnå dette ved at udnytte en avanceret LLM som GPT-4 på OpenAI eller LLaMA 3 og ChatDolphin på NLP Cloud. Du kan enten beslutte at beholde det bedste resultat fra den semantiske søgemodel og sende det som kontekst til LLM'en eller beholde flere resultater. Her er et eksempel på en prompt, der kun bruger det bedste resultat:
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 anmodning returnerer noget i den stil:
The warranty on the HP Color LasertJet Pro lasts at least 1 year.
I et RAG-system (Retrieval-Augmented Generation) er det to interessante muligheder at skabe en semantisk søgemodel med lokale kodede data eller at bruge en vektordatabase.
Når vi koder vores egne data, konverterer vi dataene til tensorer og har derefter mulighed for at indlæse dataene på en GPU. På den anden side er en vektordatabase en specialiseret database, der er designet til at lagre, indeksere og forespørge på disse højdimensionelle vektorer på en effektiv måde.
For virksomheder, der ønsker at opnå meget lave ventetider, anbefales det at kode sine egne data og indlæse dem i en GPU for at forbedre beregningstiden. Det er dog på bekostning af fleksibiliteten, da dine data skal kodes igen, hver gang datasættet ændres. Hvis dine underliggende data ændrer sig meget ofte, kan det være enklere for dig at udtrække indlejringerne og gemme dem trinvist i en vektordatabase (som f.eks. PG Vector).
Retrieval Augmented Generation er afgørende for virksomheder, der ønsker at besvare spørgsmål om specifikke data som teknisk dokumentation, kontrakter osv. RAG er f.eks. en nøglekomponent i en support-chatbot.
Sentence Transformers er et fantastisk bibliotek, der kan bruges til at skabe din egen semantiske søgemodel baseret på dine egne data. Når den implementeres på en GPU og kombineres med en avanceret generativ AI-model, viser en sådan model sig at være ekstremt kraftfuld.
Hvis du ikke selv er interesseret i at oprette og implementere din egen semantiske søgemodel baseret på Sentence Transformers, kan du nemt gøre det med et enkelt klik på NLP Cloud. Prøv semantisk søgning på NLP Cloud nu!
Hvis du har spørgsmål om RAG, semantisk søgning og Sentence Transformers, så tøv ikke med at spørge os, det er altid en fornøjelse at rådgive!
Julien
CTO hos NLP Cloud