chatbots zijn steeds meer standaard en waardevolle interfaces geworden die door tal van organisaties voor verschillende doeleinden worden gebruikt. Ze vinden tal van toepassingen in verschillende industrieën, zoals het geven van gepersonaliseerde productaanbevelingen aan klanten, het bieden van XNUMX uur per dag klantenondersteuning voor het oplossen van vragen, hulp bij boekingen van klanten en nog veel meer. Dit artikel onderzoekt het proces van het maken van een FAQ-chatbot die speciaal is ontworpen voor klantinteractie. FAQ-chatbots behandelen vragen binnen een specifiek domein, gebruikmakend van een vooraf gedefinieerde lijst met vragen en bijbehorende antwoorden. Dit type chatbot vertrouwt op Semantic Question Matching als onderliggend mechanisme.
leerdoelen
- Begrijp de basisprincipes van het BERT-model
- Elasticsearch en de toepassing ervan in chatbot begrijpen
- Het mechanisme voor het maken van de chatbots
- Indexeren en bevragen in Elasticsearch
Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.
Inhoudsopgave
Wat is BERT?
BERT, Bidirectional Encoder Representations van Transformers, is een groot taalmodel van Google in 2018. In tegenstelling tot unidirectionele modellen is BERT een bidirectioneel model gebaseerd op de Transformer-architectuur. Het leert de context van een woord te begrijpen door rekening te houden met zowel de woorden ervoor als erna in een zin, waardoor een beter begrip mogelijk wordt.
Een grote uitdaging met BERT was dat het geen state-of-the-art prestaties voor NLP-taken kon bereiken. Het belangrijkste probleem was dat de insluitingen op tokenniveau niet effectief konden worden gebruikt voor tekstuele gelijkenis, wat resulteerde in slechte prestaties bij het genereren van insluitingen van zinnen.
Sentence-BERT (SBERT) is echter ontwikkeld om deze uitdaging aan te gaan. SBERT is gebaseerd op een Siamese netwerk, dat twee zinnen tegelijk neemt en ze omzet in inbedding op tokenniveau met behulp van het BERT-model. Het past vervolgens een poolinglaag toe op elke set inbeddingen om zinsinbeddingen te genereren. In dit artikel zullen we SBERT gebruiken voor het insluiten van zinnen.
Wat is elastisch zoeken?
Elastic Search is een open-source zoek- en analyse-engine die zeer krachtig en zeer schaalbaar is en is ontworpen om uitgebreide gegevens in realtime te verwerken. Ontwikkel via de Apache Lucene-bibliotheek, die zoekmogelijkheden biedt voor volledige tekst. Elasticsearch is zeer schaalbaar omdat het een sterk gedistribueerd netwerk biedt dat kan worden geschaald over meerdere knooppunten, waardoor hoge beschikbaarheid en fouttolerantie worden geboden. Het biedt ook een flexibele en robuuste RESTful API, die interactie met de zoekmachine mogelijk maakt met behulp van HTTP-verzoeken. Het ondersteunt verschillende programmeertalen en biedt clientbibliotheken voor eenvoudige toepassingsintegratie.
Hoe maak je een chatbot met BERT en Elastic Search?
Dit artikel leert ons om een FAQ-chatbot te maken met vooraf getrainde BERT en Elasticsearch.
Stap 1) Installeer de SBERT-bibliotheek
#install sentence transformers library
pip install sentence-transformers
Stap 2) Genereer vraaginsluitingen
We zullen de SBERT-bibliotheek gebruiken om de inbeddingen voor de vooraf gedefinieerde vragen te krijgen. Voor elke vraag genereert het een numpy-array met een dimensie van 768, wat overeenkomt met de grootte van algemene inbedding op BERT-tokenniveau:
from sentence_transformers import SentenceTransformer sent_transformer = SentenceTransformer("bert-base-nli-mean-tokens") questions = [ "How to improve your conversation skills? ", "Who decides the appointment of Governor in India? ", "What is the best way to earn money online?", "Who is the head of the Government in India?", "How do I improve my English speaking skills? " ] ques_embedd = sent_transformer.encode(questions)
Stap 3) Installeer Elasticsearch Library
pip install elasticsearch
Stap 4) Index maken in Elasticsearch
from elasticsearch import Elasticsearch # defingin python client for elastic search
es_client = Elasticsearch("localhost:9200") INDEX_NAME = "chat_bot_index" #index dimensions for numpy array i.e. 768
dim_embedding = 768 def create_index() -> None: es_client.indices.delete(index=INDEX_NAME, ignore=404) es_client.indices.create( index=INDEX_NAME, ignore=400, body={ "mappings": { "properties": { "embedding": { "type": "dense_vector", "dims": dim_embedding, }, "question": { "type": "text", }, "answer": { "type": "text", } } } } ) create_index()
Het proces van het maken van een index in elastische zoekopdrachten lijkt sterk op het proces van het definiëren van een schema in een willekeurige database. In de bovenstaande code hebben we een index gemaakt met de naam "chat_bot_index", die drie velden definieert, dwz 'embedding', 'vraag' en 'antwoord', en hun typen, dwz 'dense_vector' voor 'embedding' en 'text ” voor de andere twee.
Stap 5) Vraag-antwoorden indexeren in Elastic Search
def indexing_q(qa_pairs: List[Dict[str, str]]) -> None: for pair in qa_pairs: ques = pair["question"] ans = pair["answer"] embedding = sent_transformer.encode(ques)[0].tolist() data = { "question": questi, "embedding": embedding, "answer": ans, } es_client.index( index=INDEX_NAME, body=data ) qa_pairs = [{ "question": "How to improve your conversation skills? ", "answer": "Speak more", },{ "question": "Who decides the appointment of Governor in India? ", "answer": "President of India", },{ "question": "How can I improve my English speaking skills? ", "answer": "More practice", }] indexing_q(qa_pairs)
In de bovenstaande code hebben we vraag-antwoordparen geïndexeerd in de elastische zoekdatabase met de inbedding van de vragen.
Stap 6) Query's vanuit Elasticsearch
ENCODER_BOOST = 10 def query_question(question: str, top_n: int=10) -> List[dict]: embedding = sentence_transformer.encode(question)[0].tolist() es_result = es_client.search( index=INDEX_NAME, body={ "from": 0, "size": top_n, "_source": ["question", "answer"], "query": { "script_score": { "query": { "match": { "question": question } }, "script": { "source": """ (cosineSimilarity(params.query_vector, "embedding") + 1) * params.encoder_boost + _score """, "params": { "query_vector": embedding, "encoder_boost": ENCODER_BOOST, }, }, } } } ) hits = es_result["hits"]["hits"] clean_result = [] for hit in hits: clean_result.append({ "question": item["_source"]["question"], "answer": item["_source"]["answer"], "score": item["_score"], }) return clean_result query_question("How to make my English fluent?")#import csv
We kunnen de ES-query aanpassen door een "script"-veld op te nemen, waardoor we een scorefunctie kunnen maken die de cosinusovereenkomstscore op inbeddingen berekent. Combineer deze score met de algehele ES BM25-matchingscore. Om de weging van de ingesloten cosinusovereenkomst aan te passen, kunnen we de hyperparameter genaamd "ENCODER_BOOST" wijzigen.
Conclusie
In dit artikel hebben we de toepassing van SBERT en Elasticsearch onderzocht bij het maken van de chatbot. We bespraken het maken van een chatbot die de vragen zou beantwoorden op basis van vooraf gedefinieerde vraag-antwoordparen, rekening houdend met de bedoeling van de vraag.
Hier zijn de belangrijkste afhaalrestaurants van onze verkenning:
- Het belang begrijpen van SBERT en Elasticsearch op het gebied van de ontwikkeling van chatbots, en hun capaciteiten benutten om conversatie-ervaringen te verbeteren.
- Door SBERT te gebruiken om inbeddingen voor de vragen te genereren, krijgt u een beter begrip van hun semantiek en context.
- Gebruikmaken van Elasticsearch om een index op te zetten die de vraag-antwoordparen efficiënt opslaat en organiseert, waardoor zoek- en ophaalbewerkingen worden geoptimaliseerd.
- Het demonstreren van het zoekproces in Elasticsearch, illustreren hoe de chatbot effectief de meest relevante antwoorden ophaalt op basis van de vraag van de gebruiker.
Veelgestelde Vragen / FAQ
A. SBERT breidt BERT uit om semantiek op zinsniveau te coderen, terwijl BERT zich richt op representaties op woordniveau. SBERT beschouwt de hele zin als een enkele invoerreeks en genereert inbeddingen die de betekenis van de hele zin vastleggen.
A. Gebruik SBERT voor verschillende natuurlijke taalverwerkingstaken, zoals semantisch zoeken, zinsgelijkenis, clustering, ophalen van informatie en tekstclassificatie. Het maakt het mogelijk om de semantische gelijkenis tussen zinnen te vergelijken en te analyseren.
A. SBERT is in de eerste plaats ontworpen voor inbedding op zinsniveau. Het kan echter ook korte alinea's of tekstfragmenten aan. Voor langere documenten is het gebruikelijk om representaties op zinsniveau te extraheren en ze samen te voegen met behulp van technieken zoals middeling of pooling.
A. Elasticsearch werkt als een gedistribueerd systeem, waarbij gegevens worden verdeeld in meerdere shards die over verschillende knooppunten in een cluster kunnen worden verspreid. Elke shard bevat een subset van de gegevens en is volledig functioneel, waardoor een efficiënte parallelle verwerking en hoge beschikbaarheid mogelijk is. Wanneer een zoekopdracht wordt uitgevoerd, gebruikt Elasticsearch een gedistribueerd zoekcoördinatiemechanisme om de zoekopdracht naar de relevante shards te routeren, de zoekbewerkingen parallel uit te voeren en de resultaten samen te voegen voordat ze naar de gebruiker worden geretourneerd.
De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.
Verwant
- Door SEO aangedreven content en PR-distributie. Word vandaag nog versterkt.
- PlatoData.Network Verticale generatieve AI. Versterk jezelf. Toegang hier.
- PlatoAiStream. Web3-intelligentie. Kennis versterkt. Toegang hier.
- PlatoESG. Automotive / EV's, carbon, CleanTech, Energie, Milieu, Zonne, Afvalbeheer. Toegang hier.
- BlockOffsets. Eigendom voor milieucompensatie moderniseren. Toegang hier.
- Bron: https://www.analyticsvidhya.com/blog/2023/07/build-custom-faq-chatbot-with-bert/