聊天机器人在不同行业中有着广泛的应用,例如向客户提供个性化产品推荐、全天候客户支持以解决查询问题、协助客户预订等。本文将探讨如何创建一个专门针对客户交互设计的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可以用于各种自然语言处理任务,如语义搜索、句子相似性、聚类、信息检索和文本分类。它使比较和分析句子之间的语义相似性成为可能。