Worstel je met AI of full-stack ontwikkeling? Onze experts staan klaar om je te begeleiden: advies op maat, technische integratie en meer. Neem contact op met [email protected].

Een semantisch zoekmodel maken met zintuigtransformatoren voor een RAG-toepassing

Het implementeren van een Retrieval Augmented Generation (RAG) pijplijn door het verfijnen van je eigen semantische zoekmodel is een krachtige aanpak om de nauwkeurigheid en relevantie van vraag-antwoordsystemen te verbeteren.

Deze techniek combineert de sterke punten van zowel semantisch zoeken als generatieve AI, waardoor het systeem gebruikersvragen beter begrijpt en nauwkeurigere en contextueel relevantere antwoorden genereert. Door een semantisch zoekmodel te verfijnen met behulp van Sentence Transformers kunnen ontwikkelaars het model aanpassen aan hun specifieke domein, waardoor de algehele prestaties van de RAG-pijplijn verbeteren.

Semantisch zoeken

Wat is semantisch zoeken?

Semantisch zoeken is een zoektechniek voor gegevens die verder gaat dan de traditionele zoekmethoden op basis van trefwoorden. Het maakt gebruik van natuurlijke taalverwerking en algoritmen voor machinaal leren om de nauwkeurigheid van zoekresultaten te verbeteren door rekening te houden met de intentie van de zoeker en de contextuele betekenis van de termen die in hun zoekopdracht worden gebruikt. Deze benadering is erop gericht om de onderliggende betekenis van de zoekopdracht en de inhoud op webpagina's te begrijpen, in plaats van simpelweg trefwoorden te matchen. Op deze manier kan semantisch zoeken relevantere resultaten opleveren, zelfs als deze niet de exacte woorden bevatten die in de oorspronkelijke zoekopdracht werden gebruikt.

Om dit te bereiken maakt semantisch zoeken gebruik van verschillende technieken, zoals woord-zin disambiguatie, concept extractie en query uitbreiding. Het maakt ook gebruik van vectorzoeken en machinaal leren om resultaten terug te geven die overeenkomen met de intentie en context van de gebruiker. Semantisch zoeken wordt veel gebruikt in webzoekmachines, zoals Google, en wordt aangedreven door technologieën zoals de Knowledge Graph, waarin gestructureerde gegevens over entiteiten en hun relaties worden opgeslagen. Hierdoor kunnen zoekmachines de betekenis achter zoekopdrachten begrijpen en nauwkeurigere en betekenisvollere resultaten leveren.

Semantisch zoeken is erg nuttig voor bedrijven die vragen willen beantwoorden over hun eigen domeinkennis, zoals hun technische documentatie, contracten, productbeschrijvingen...

Wat is Retrieval Augmented Generation (RAG)?

Semantisch zoeken

Retrieval Augmented Generation (RAG) is een techniek die de nauwkeurigheid en betrouwbaarheid van generatieve AI-modellen, zoals Large Language Models (LLM's), verbetert door externe gegevensbronnen te integreren om contextueel nauwkeurigere en actuelere informatie te leveren. Het integreert een retrieval component met een generatief model, waardoor het systeem relevante informatie kan zoeken en ophalen uit een database of kennisbank om de interne kennis aan te vullen bij het genereren van antwoorden.

Deze aanpak zorgt ervoor dat het AI-model antwoorden kan geven die gebaseerd zijn op de meest actuele, betrouwbare feiten en stelt gebruikers in staat om de bronnen van de informatie die gebruikt wordt in de antwoorden van het model te verifiëren. RAG helpt om het AI-model te baseren op externe kennisbronnen, waardoor de kwaliteit van de output wordt verbeterd en het model kan worden bijgewerkt zonder dat uitgebreide hertraining nodig is.

RAG is een geweldige strategie om potentiële hallucinaties van generatieve AI-modellen te beperken. RAG helpt bij het bouwen van een vraagbeantwoordingssysteem dat het beste van twee werelden heeft: feitelijke nauwkeurigheid en menselijke reacties gegenereerd in natuurlijke taal.

Wat is de Bibliotheek voor zinsveranderingen?

Zin transformatoren

De bibliotheek Sentence Transformers is een krachtig Python-raamwerk dat is ontworpen voor geavanceerde tekstinbeddingen. Het is gebouwd op neurale transformatienetwerken zoals BERT, RoBERTa, XLM-R en andere, en levert topprestaties in verschillende taken zoals semantisch zoeken, parafrase mining, semantische gelijkenis vergelijking, clustering en meer. Met deze bibliotheek kunnen zinsinsinbeddingsmethoden eenvoudig worden verfijnd, waardoor taakspecifieke zinsinbeddingen op maat kunnen worden gemaakt om aan specifieke behoeften te voldoen. Meer informatie op de Sentence Transformers website

De bibliotheek biedt een brede selectie van voorgetrainde Sentence Transformers-modellen voor meer dan 50 talen, die beschikbaar zijn op het Hugging Face-platform. Gebruikers kunnen ook hun eigen modellen trainen of verfijnen met behulp van de bibliotheek, wat de flexibiliteit biedt om aangepaste modellen te maken voor unieke gebruikssituaties. Het Sentence Transformers-team heeft onlangs een nieuwe grote versie (v3) uitgebracht die de mogelijkheden van deze bibliotheek aanzienlijk verbetert, met name de mogelijkheden voor fijnafstemming.

De Sentence Transformers bibliotheek is snel, uitgebreid en goed onderhouden, daarom gebruiken we die in deze tutorial.

Je eigen semantische zoekmodel maken

Het maken van je eigen semantische zoekmodel is een geweldige manier om nauwkeurige resultaten te krijgen met een zeer lage latency. Dit geldt nog meer als je je eigen semantische zoekmodel inzet op een GPU.

Laten we eerst een kleine dataset maken die onze gegevens bevat. Maak een CSV-bestand met 1 kolom (genaamd "dataset.csv") dat de volgende technische documentatie over HP printers bevat (in een echt scenario zul je natuurlijk veel meer voorbeelden willen opnemen):

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

Elke rij kan tot 512 tokens bevatten (ruwweg gelijk aan 400 woorden), en om de nauwkeurigheid te maximaliseren wordt aanbevolen om onder de 128 tokens te blijven (ruwweg gelijk aan 100 woorden). Nu we onze 3 stukken documentatie in onze dataset hebben, kunnen we de gegevens coderen met behulp van ons model met Sentence Transformers. Maak een Python-script met het volgende (zorg ervoor dat PyTorch en Sentence Transformers zijn geïnstalleerd).

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)

Dit script downloadt en gebruikt paraphrase-multilingual-mpnet-base-v2 als basismodel en gebruikt het om onze gegevens te coderen. Je kunt kiezen uit vele beschikbare voorgetrainde modellen, afhankelijk van je vereisten (modelgrootte, use case, ondersteunde talen, ...). Afhankelijk van je hardware zul je de parameter "batch_size" willen aanpassen om het coderingsproces te versnellen.

Eenmaal gemaakt kun je je model gebruiken voor inferentie met het volgende 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]}

Het bovenstaande inferentiescript geeft de volgende resultaten:

{
"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."
    },
    ]
}

In ons inferentiescript bepaalt de parameter "top_k" hoeveel resultaten we willen teruggeven. In het resultaat tonen we de overeenkomende tekst uit de dataset met een betrouwbaarheidsscore. Deze score is belangrijk omdat het ons helpt beslissen of we het antwoord willen accepteren of niet.

Een antwoord genereren in natuurlijke taal met generatieve AI

Zoals je kunt zien, is de belangrijkste beperking van semantisch zoeken dat het model de ruwe tekst uit de dataset retourneert zonder direct antwoord te geven op de vraag. We willen dit nu dus aan een generatief AI-model geven als context om de oorspronkelijke vraag in natuurlijke taal te beantwoorden.

We kunnen dit eenvoudig bereiken door gebruik te maken van een geavanceerde LLM zoals GPT-4 op OpenAI of LLaMA 3 en ChatDolphin op NLP Cloud. Je kunt ervoor kiezen om het beste resultaat van het semantische zoekmodel te behouden en dit als context door te geven aan de LLM, of om meerdere resultaten te behouden. Hier is een voorbeeld van een prompt waarbij alleen het beste resultaat wordt gebruikt:

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?

Dit verzoek retourneert zoiets:

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

Semantisch zoekmodel met gecodeerde gegevens VS Embeddings opslaan in een vectordatabase

In een Retrieval-Augmented Generation (RAG)-systeem zijn het creëren van een semantisch zoekmodel met lokaal gecodeerde gegevens of het gebruik van een vectordatabase twee interessante opties.

Wanneer we onze eigen gegevens coderen, converteren we de gegevens naar tensors en hebben we vervolgens de mogelijkheid om de gegevens op een GPU te laden. Aan de andere kant is een vector database een gespecialiseerde database die ontworpen is om deze hoog-dimensionale vectoren efficiënt op te slaan, te indexeren en te bevragen.

Voor bedrijven die zeer lage latencies willen bereiken, is het aan te raden om je eigen gegevens te coderen en de gegevens in een GPU te laden om de rekentijd te verbeteren. Dit gaat echter ten koste van de flexibiliteit, omdat je gegevens telkens opnieuw moeten worden gecodeerd als de dataset verandert. Als je onderliggende data erg vaak verandert, is het misschien eenvoudiger om de embeddings te extraheren en incrementeel op te slaan in een vector database (zoals PG Vector bijvoorbeeld).

Conclusie

Retrieval Augmented Generation is cruciaal voor bedrijven die vragen willen beantwoorden over specifieke gegevens zoals technische documentatie, contracten, enzovoort, omdat het de nauwkeurigheid van de resultaten aanzienlijk vergroot. RAG is bijvoorbeeld een belangrijk onderdeel van een supportchatbot.

Sentence Transformers is een geweldige bibliotheek die kan worden gebruikt om je eigen semantische zoekmodel te maken op basis van je eigen gegevens. Wanneer zo'n model wordt ingezet op een GPU en wordt gekoppeld aan een geavanceerd generatief AI-model, is het bijzonder krachtig.

Als je niet geïnteresseerd bent in het zelf maken en implementeren van je eigen semantische zoekmodel op basis van Sentence Transformers, kun je dit eenvoudig in 1 klik doen op NLP Cloud. Probeer nu semantisch zoeken op NLP Cloud!

Als je vragen hebt over RAG, semantisch zoeken en Sentence Transformers, aarzel dan niet om het ons te vragen, het is altijd een genoegen om advies te geven!

Julien
CTO bij NLP Cloud