Kämpar du med AI eller fullstack-utveckling? Våra experter finns här för att vägleda dig: skräddarsydda råd, teknisk integration och mycket mer. Nå ut till oss på [email protected].

Skapande av en semantisk sökmodell med meningstransformatorer för en RAG-applikation

Att implementera en RAG-pipeline (Retrieval Augmented Generation) genom att finjustera din egen semantiska sökmodell är en kraftfull metod för att förbättra träffsäkerheten och relevansen i system för att besvara frågor.

Denna teknik kombinerar styrkorna hos både semantisk sökning och generativ AI, vilket gör det möjligt för systemet att bättre förstå användarnas frågor och generera mer exakta och kontextuellt relevanta svar. Genom att finjustera en semantisk sökmodell med hjälp av Sentence Transformers kan utvecklare skräddarsy modellen till sin specifika domän, vilket förbättrar den övergripande prestandan för RAG-pipelinen.

Semantisk sökning

Vad är semantisk sökning?

Semantisk sökning är en datasökningsteknik som går utöver de traditionella sökordsbaserade sökmetoderna. Den använder naturlig språkbehandling och maskininlärningsalgoritmer för att förbättra sökresultatens noggrannhet genom att ta hänsyn till sökarens avsikt och den kontextuella betydelsen av de termer som används i deras fråga. Syftet är att förstå den underliggande innebörden av sökfrågan och innehållet på webbsidorna, snarare än att bara matcha nyckelord. På så sätt kan semantisk sökning ge mer relevanta resultat, även om de inte innehåller exakt de ord som användes i den ursprungliga frågan.

För att uppnå detta använder semantisk sökning olika tekniker, till exempel ordkänsledisambiguering, konceptextrahering och frågeexpansion. Den använder också vektorsökning och maskininlärning för att returnera resultat som syftar till att matcha användarens avsikt och sammanhang. Semantisk sökning används ofta i sökmotorer på webben, t.ex. Google, och drivs av tekniker som Knowledge Graph, som lagrar strukturerad data om enheter och deras relationer. Detta gör det möjligt för sökmotorer att förstå innebörden bakom sökfrågor och ge mer exakta och meningsfulla resultat.

Semantisk sökning är mycket användbart för företag som vill svara på frågor om sin egen domänkunskap, t.ex. teknisk dokumentation, avtal, produktbeskrivningar osv.

Vad är RAG (Retrieval Augmented Generation)?

Semantisk sökning

Retrieval Augmented Generation (RAG) är en teknik som förbättrar noggrannheten och tillförlitligheten hos generativa AI-modeller, till exempel Large Language Models (LLM), genom att integrera externa datakällor för att ge mer kontextuellt korrekt och uppdaterad information. Den integrerar en hämtningskomponent med en generativ modell, vilket gör att systemet kan söka och hämta relevant information från en databas eller kunskapsbas för att komplettera sin interna kunskap när det genererar svar.

Detta tillvägagångssätt säkerställer att AI-modellen kan ge svar som baseras på de mest aktuella och tillförlitliga fakta och gör det möjligt för användarna att verifiera källorna till den information som används i modellens svar. RAG hjälper till att grunda AI-modellen på externa kunskapskällor, vilket förbättrar kvaliteten på dess resultat och ger ett sätt att uppdatera modellen utan behov av omfattande omskolning.

RAG är en bra strategi för att mildra potentiella hallucinationer från generativa AI-modeller. RAG hjälper till att bygga ett frågesvarssystem som har det bästa av två världar: faktamässig noggrannhet och mänskliga svar som genereras på naturligt språk.

Vad är meningen Transformers Library?

Meningstransformatorer

Sentence Transformers-biblioteket är ett kraftfullt Python-ramverk utformat för toppmoderna textinbäddningar. Det bygger på transformerande neurala nätverk som BERT, RoBERTa, XLM-R och andra, vilket ger topprestanda i olika uppgifter, inklusive semantisk sökning, parafrasbrytning, semantisk likhetsjämförelse, klustring och mer. Detta bibliotek möjliggör enkel finjustering av metoder för meningsinbäddning, vilket gör det möjligt att skapa uppgiftsspecifika meningsinbäddningar som är skräddarsydda för att möta specifika behov. Läs mer på webbplatsen för Sentence Transformers

Biblioteket erbjuder ett brett urval av förtränade Sentence Transformers-modeller för mer än 50 språk, tillgängliga på Hugging Face-plattformen. Användare kan också träna eller finjustera sina egna modeller med hjälp av biblioteket, vilket ger flexibilitet att skapa anpassade modeller för unika användningsfall. Sentence Transformers-teamet släppte nyligen en ny huvudversion (v3) som avsevärt förbättrar bibliotekets funktioner, särskilt dess finjusteringsfunktioner.

Sentence Transformers-biblioteket är snabbt, omfattande och väl underhållet, vilket är anledningen till att vi använder det i den här handledningen.

Skapa din egen semantiska sökmodell

Att skapa en egen semantisk sökmodell är ett utmärkt sätt att få korrekta resultat och samtidigt säkerställa en mycket låg latens. Detta är ännu mer sant om du distribuerar din egen semantiska sökmodell på en GPU.

Låt oss först skapa en liten dataset som innehåller våra data. Skapa en CSV-fil med 1 kolumn (kallad "dataset.csv") som innehåller följande tekniska dokumentation om HP-skrivare (i ett verkligt scenario kommer du naturligtvis att vilja inkludera många fler exempel):

"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."

Varje rad kan innehålla upp till 512 tokens (ungefär motsvarande 400 ord), och för att maximera noggrannheten rekommenderas att man håller sig under 128 tokens (ungefär motsvarande 100 ord). Nu när vi har våra 3 dokument i vår dataset kan vi koda data med hjälp av vår modell med Sentence Transformers. Skapa ett Python-skript med följande (se till att PyTorch och Sentence Transformers är installerade).

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)

Detta skript hämtar och använder paraphrase-multilingual-mpnet-base-v2 som en basmodell och använder den för att koda våra data. Du kan välja bland många tillgängliga förtränade modeller, beroende på dina krav (modellstorlek, användningsfall, språk som stöds, ...). Beroende på din maskinvara bör du anpassa parametern "batch_size" för att påskynda kodningsprocessen.

När du har skapat din modell kan du använda den för inferens med följande 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]}

Ovanstående slutledningsskript ger följande resultat:

{
"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 vårt inferensskript bestämmer parametern "top_k" hur många resultat vi vill returnera. I resultatet visar vi den matchande texten från datasetet med en konfidenspoäng. Den här poängen är viktig eftersom den hjälper oss att avgöra om vi vill acceptera svaret eller inte.

Generera ett svar på naturligt språk med generativ AI

Som du kan se är den största begränsningen med semantisk sökning att modellen returnerar råtexten från datasetet utan att direkt besvara frågan. Därför vill vi nu ge detta till en generativ AI-modell som ett sammanhang för att kunna besvara den ursprungliga frågan på ett naturligt språk.

Vi kan enkelt uppnå detta genom att utnyttja en avancerad LLM som GPT-4 på OpenAI eller LLaMA 3 och ChatDolphin på NLP Cloud. Du kan antingen välja att behålla det bästa resultatet från den semantiska sökmodellen och skicka det som ett sammanhang till LLM, eller behålla flera resultat. Här är ett exempel på en prompt som endast använder det bästa 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?

Denna begäran returnerar något liknande:

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

Semantisk sökmodell med kodade data VS lagring av inbäddningar i en vektordatabas

I ett RAG-system (Retrieval-Augmented Generation) är det två intressanta alternativ att skapa en semantisk sökmodell med lokalt kodade data eller att använda en vektordatabas.

När vi kodar våra egna data konverterar vi data till tensorer och har sedan möjlighet att ladda data på en GPU. Å andra sidan är en vektordatabas en specialiserad databas som är utformad för att lagra, indexera och ställa frågor om dessa högdimensionella vektorer på ett effektivt sätt.

För företag som vill uppnå mycket låga latenser rekommenderas att man kodar sina egna data och laddar dem i en GPU för att förbättra beräkningstiden. Det sker dock på bekostnad av flexibiliteten eftersom dina data måste kodas igen varje gång datasetet ändras. Om dina underliggande data ändras mycket ofta kan det vara enklare för dig att extrahera inbäddningarna och stegvis lagra dem i en vektordatabas (som till exempel PG Vector).

Slutsats

Retrieval Augmented Generation är avgörande för företag som vill svara på frågor om specifika data, t.ex. teknisk dokumentation, avtal etc., eftersom det avsevärt ökar precisionen i resultaten. RAG är en nyckelkomponent i till exempel en supportchattbot.

Sentence Transformers är ett fantastiskt bibliotek som kan användas för att skapa din egen semantiska sökmodell baserad på dina egna data. När en sådan modell används på en GPU och kombineras med en avancerad generativ AI-modell visar den sig vara extremt kraftfull.

Om du inte är intresserad av att skapa och distribuera din egen semantiska sökmodell baserad på Sentence Transformers själv, kan du enkelt göra det med 1 klick på NLP Cloud. Testa semantisk sökning på NLP Cloud nu!

Om du har frågor om RAG, semantisk sökning och Sentence Transformers, tveka inte att fråga oss, det är alltid ett nöje att ge råd!

Julien
CTO på NLP Cloud