基于BERT和Elasticsearch的FAQ聊天机器人开发指南

聊天机器人在不同行业中有着广泛的应用,例如向客户提供个性化产品推荐、全天候客户支持以解决查询问题、协助客户预订等。本文将探讨如何创建一个专门针对客户交互设计的FAQ聊天机器人。FAQ聊天机器人在一个特定领域内回答问题,使用预定义的问题列表和相应的答案。这种类型的聊天机器人依赖于语义问题匹配作为其底层机制。

学习目标

理解BERT模型的基础知识

了解Elasticsearch及其在聊天机器人中的应用

创建聊天机器人的机制

Elasticsearch中的索引和查询

BERT是什么?

BERT,即Bidirectional Encoder Representations from Transformers,是谷歌在2018年推出的大型语言模型。与单向模型不同,BERT是基于Transformer架构的双向模型。它通过考虑句子中一个词之前和之后的词来学习理解上下文,从而实现更全面的理解。

BERT面临的一个主要挑战是它无法为NLP任务实现最先进的性能。主要问题是,token级别的嵌入无法有效用于文本相似性,导致生成句子嵌入时性能不佳。

为了解决这一挑战,开发了Sentence-BERT(SBERT)。SBERT基于孪生网络,一次处理两个句子,并使用BERT模型将它们转换为token级别的嵌入。然后,它对每组嵌入应用池化层以生成句子嵌入。在本文中,将使用SBERT进行句子嵌入。

Elasticsearch是什么?

Elasticsearch是一个开源的搜索和分析引擎,功能强大、高度可扩展,并且设计用于实时处理大量数据。它基于Apache Lucene库开发,提供全文搜索能力。Elasticsearch高度可扩展,因为它提供了一个高度分布式的网络,可以跨多个节点进行扩展,提供高可用性和容错性。它还提供了灵活且强大的RESTful API,允许使用HTTP请求与搜索引擎进行交互。它支持各种编程语言,并提供客户端库以便于应用程序集成。

如何使用BERT和Elasticsearch创建聊天机器人?

本文将指导如何使用预训练的BERT和Elasticsearch创建一个FAQ聊天机器人。

步骤1) 安装SBERT库

pip install sentence-transformers

步骤2) 生成问题嵌入

from sentence_transformers import SentenceTransformer sent_transformer = SentenceTransformer("bert-base-nli-mean-tokens") questions = [ "如何提高交谈技巧?", "谁决定印度总督的任命?", "在线赚钱的最佳方式是什么?", "印度政府的首脑是谁?", "如何提高英语口语技巧?" ] ques_embedd = sent_transformer.encode(questions)

步骤3) 安装Elasticsearch库

pip install elasticsearch

步骤4) 在Elasticsearch中创建索引

from elasticsearch import Elasticsearch es_client = Elasticsearch("localhost:9200") INDEX_NAME = "chat_bot_index" dim_embedding = 768 def create_index(): 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()

在上述代码中,创建了一个名为“chat_bot_index”的索引,该索引定义了三个字段,即'embedding'、'question'和'answer',以及它们的类型,即'embeddings'为“dense_vector”,其他两个为“text”。

步骤5) 在Elasticsearch中索引问题-答案

def indexing_q(qa_pairs: List[Dict[str, str]]): for pair in qa_pairs: ques = pair["question"] ans = pair["answer"] embedding = sent_transformer.encode(ques)[0].tolist() data = { "question": ques, "embedding": embedding, "answer": ans, } es_client.index( index=INDEX_NAME, body=data ) qa_pairs = [{ "question": "如何提高交谈技巧?", "answer": "多说", },{ "question": "谁决定印度总督的任命?", "answer": "印度总统", },{ "question": "如何提高英语口语技巧?", "answer": "多练习", }] indexing_q(qa_pairs)

在上述代码中,已经将问题-答案对索引到Elasticsearch数据库中,并包含了问题的嵌入。

步骤6) 从Elasticsearch查询

ENCODER_BOOST = 10 def query_question(question: str, top_n: int=10): 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("如何使英语流利?")

可以通过在ES查询中包含一个“script”字段来修改查询,使能够创建一个计算嵌入的余弦相似度分数的评分函数。将这个分数与ES BM25匹配分数结合起来。要调整嵌入余弦相似度的权重,可以修改称为“ENCODER_BOOST”的超参数。

在本文中,探讨了SBERT和Elasticsearch在创建聊天机器人中的应用。讨论了创建一个基于预定义的问题-答案对回答查询的聊天机器人,同时考虑查询的意图。以下是探索的关键要点:

理解SBERT和Elasticsearch在聊天机器人开发领域的重要性,利用它们的能力来增强对话体验。

使用SBERT生成问题的嵌入,使它们能够更深入地理解其语义和上下文。

利用Elasticsearch建立一个索引,有效地存储和组织问题-答案对,优化搜索和检索操作。

展示了Elasticsearch中的查询过程,说明了聊天机器人如何根据用户的问题有效地检索最相关的答案。

Q1. SBERT与BERT有何不同?

A. SBERT扩展了BERT以编码句子级别的语义,而BERT专注于单词级别的表示。SBERT将整个句子视为单个输入序列,生成捕获整个句子含义的嵌入。

Q2. SBERT可以用于什么?

A. SBERT可以用于各种自然语言处理任务,如语义搜索、句子相似性、聚类、信息检索和文本分类。它使比较和分析句子之间的语义相似性成为可能。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485