利用 Elasticsearch 中的 NLP 和向量搜索增强聊天机器人功能
探索矢量搜索和 NLP 如何增强聊天机器人的能力,并了解 Elasticsearch 如何促进这一过程。
对话式界面已经存在了一段时间,作为协助完成各种任务(如客户服务、信息检索和任务自动化)的一种手段,它正变得越来越流行。这些界面通常通过语音助手或消息应用程序访问,模拟人类对话,以帮助用户更高效地解决疑问。
随着技术的进步,聊天机器人被用来快速处理更复杂的任务,同时还能为用户提供个性化体验。自然语言处理(NLP)使聊天机器人能够处理用户的语言,识别其信息背后的意图,并从中提取相关信息。例如,"命名实体识别 "通过将文本分类,提取文本中的关键信息。情感分析可确定情感基调,而问题解答则可确定查询的 "答案"。NLP 的目标是使算法能够处理人类语言,并完成历史上只有人类才能完成的任务,如在大量文本中查找相关段落、总结文本以及生成新的原创内容。
这些先进的 NLP 功能建立在一种称为向量搜索的技术之上。Elastic 本身支持向量搜索,可执行精确和近似的k-nearest neighbor (kNN) 搜索,还支持 NLP,可直接在 Elasticsearch 中使用自定义或第三方模型。
在这篇博文中,我们将探讨矢量搜索和 NLP 如何增强聊天机器人的能力,并演示 Elasticsearch 如何促进这一过程。首先,让我们简要介绍一下矢量搜索。
向量搜索
虽然人类可以理解书面语言的含义和上下文,但机器却无法做到这一点。这就是向量的作用所在。通过将文本转换为矢量表示(文本含义的数字表示),机器可以克服这一限制。与传统搜索相比,矢量不依赖于关键词和基于频率的词法搜索,而是使用为数值定义的运算来处理文本数据。
这样,通过使用"嵌入空间" 中的距离来表示给定查询向量的相似性,向量搜索就能定位具有相似概念或上下文的数据。当数据相似时,相应的向量也会相似。

矢量搜索不仅可用于 NLP 应用,还可用于涉及非结构化数据的其他各种领域,包括图像和视频处理。
在聊天机器人流程中,用户的查询可能有多种方式,因此,有不同的方法来改进信息检索,以获得更好的用户体验。由于每种方案都有自己的优点和可能的缺点,因此必须考虑到可用的数据和资源,以及训练时间(如适用)和预期的准确性。在下一节中,我们将介绍 NLP 问答模型的这些方面。
回答问题
问题解答(QA)模型是一种 NLP 模型,旨在回答用自然语言提出的问题。当用户提出的问题需要从多个资源中推断答案,而文档中又没有预先存在的目标答案时,生成式质量保证模型就能派上用场。不过,这些模型的计算成本可能很高,而且需要大量数据来进行与领域相关的训练,因此在某些情况下可能不太实用,尽管这种方法对处理域外问题特别有价值。
另一方面,当用户就特定主题提出问题,而实际答案就在文档中时,就可以使用提取式质量保证模型。这些模型直接从源文档中提取答案,提供透明、可验证的结果,对于希望提供简单高效的问题解答方式的企业或组织来说,是一种更实用的选择。
下面的示例演示了如何使用预先训练好的抽取式质量保证模型从给定上下文中抽取答案,该模型可在 Hugging Face 上获得,并已部署到 Elasticsearch 中:
POST _ml/trained_models/deepset__minilm-uncased-squad2/deployment/_infer
{
"docs": [{"text_field": "Canvas is a data visualization and presentation application within Kibana. With Canvas, live data can be pulled directly from Elasticsearch and combined with colors, images, text, and other customized options to create dynamic, multi-page displays."}],
"inference_config": {"question_answering": {"question": "What is Kibana Canvas?"}}
}
{
"predicted_value": "a data visualization and presentation application",
"start_offset": 10,
"end_offset": 59,
"prediction_probability": 0.28304219431376443
}处理用户查询和检索信息的方法多种多样,在处理非结构化数据时,使用多种语言模型和数据源不失为一种有效的选择。为了说明这一点,我们以一个聊天机器人的数据处理为例,该聊天机器人会根据从选定文档中提取的数据来回答询问。
聊天机器人数据处理:NLP 和向量搜索

如上图所示,聊天机器人的数据处理可分为三个部分:
矢量处理:这部分将文档转换为矢量表示。
用户输入处理:这部分从用户查询中提取相关信息,并执行语义搜索和混合检索。
优化:这部分包括监控,对于确保聊天机器人的可靠性、最佳性能和良好的用户体验至关重要。
矢量处理
对于处理部分,第一步是确定每个文档的组成部分,然后将每个元素转换为矢量表示法;这些表示法可以为多种数据格式创建。
有多种方法可用于计算嵌入,包括预训练模型和库。
值得注意的是,在这些表征上进行搜索和检索的有效性取决于现有数据以及所用方法的质量和相关性。
在计算向量时,它们会以dense_vector字段类型存储在 Elasticsearch 中。
PUT <target>
{
"mappings": {
"properties": {
"doc_part_vector": {
"type": "dense_vector",
"dims": 3
},
"doc_part" : {
"type" : "keyword"
}
}
}
}聊天机器人用户输入处理
对于用户来说,在收到问题后,最好先从中提取所有可能的信息,然后再继续提问。这有助于理解用户的意图,在这种情况下,我们使用命名实体识别模型(NER)来帮助理解用户的意图。NER 是将命名实体识别和分类为预定义实体类别的过程。
POST _ml/trained_models/dslim__bert-base-ner/deployment/_infer
{
"docs": { "text_field": "How many people work for Elastic?"}
}
{
"predicted_value": "How many people work for [Elastic](ORG&Elastic)?",
"entities": [
{
"entity": "Elastic",
"class_name": "ORG",
"class_probability": 0.4993975435876747,
"start_pos": 25,
"end_pos": 32
}
]
}虽然这不是必要步骤,但通过使用结构化数据或上述或其他 NLP 模型结果对用户的查询进行分类,我们可以使用过滤器对 kNN 搜索进行限制。这有助于减少需要处理的数据量,从而提高性能和准确性。
"filter": {
"term": {
"org": "Elastic"
}
}语义搜索和混合检索
由于提示源于用户询问,而聊天机器人需要处理人类语言的多变性和模糊性,因此语义搜索非常适合。在 Elasticsearch 中,只要将查询字符串和嵌入模型的 ID 传递到 query_vector_builder 对象中,就能在一个步骤中执行语义搜索。这将对查询进行矢量化,并执行 kNN搜索,以检索与查询含义最接近的前 k 个匹配项:
POST /<target>/_search
{
"knn": {
"field": "doc_part_vector",
"k": 5,
"num_candidates": 20,
"query_vector_builder": {
"text_embedding": {
"model_id": "<text-embedding-model-id>",
"model_text": "<query_string>"
}
}
}
}端到端示例:如何部署文本嵌入模型并将其用于语义搜索。Elasticsearch 使用 Okapi BM25 的 Lucene 实现(一种稀疏模型)对文本查询进行相关性排序,而密集模型则用于语义搜索。为了综合矢量匹配和文本查询匹配的优势 ,可以执行混合检索:
POST <target>/_search
{
"query": {
"match": {
"content": {
"query": "<query_string>"
}
}
},
"knn": {
"field": "doc_part_vector",
"query_vector_builder": {
"text_embedding": {
"model_id": "<text-embedding-model-id>",
"model_text": "<query_string>"
}
},
"filter": {
"term": {
"org": "Elastic"
}
}
}
}将稀疏模型和密集模型相结合,往往能获得最佳结果
稀疏模型通常在简短查询和特定术语方面表现更佳,而密集模型则利用上下文和关联。如果您想进一步了解这些方法如何相互比较和互补,我们在此将 BM25 与两个经过专门检索训练的密集模型进行比较。
最相关的结果通常可能是给用户的第一个答案,分数是一个用来确定返回文档相关性的数字。
优化聊天机器人
为了帮助改善聊天机器人的用户体验、性能和可靠性,除了应用混合评分外,您还可以采用以下方法:情感分析:为了在对话过程中了解用户的评论和反应,您可以采用情感分析模型:
POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
"docs": { "text_field": "That was not my question!"}
}
{
"predicted_value": "NEGATIVE",
"prediction_probability": 0.980080439016437
}GPT 的功能 :作为增强整体体验的另一种方法,您可以将 Elasticsearch 的搜索相关性与 OpenAI 的 GPT 问题解答功能相结合,利用聊天完成 API返回给用户由模型生成的回复,并将这些前 k 个文档作为上下文。提示:"回答此问题<user_question> 仅使用此文档<top_search_result>"
可观察性:确保任何聊天机器人的性能都至关重要,而监控是实现这一目标的重要组成部分。除了记录聊天机器人的互动日志,跟踪响应时间、延迟和其他相关的聊天机器人指标也很重要。Elastic Observability工具使您能够收集和分析这些信息。
总结
这篇博文介绍了什么是 NLP 和矢量搜索,并举例说明了聊天机器人如何通过考虑从文档的矢量表示中提取的数据来回答用户的询问。
如图所示,利用 NLP 和矢量搜索,聊天机器人能够执行结构化、目标数据之外的复杂任务。这包括使用多种数据源和格式作为上下文进行推荐和回答特定产品或业务相关查询,同时提供个性化的用户体验。
使用案例包括提供客户服务,协助客户进行咨询;帮助开发人员进行查询,提供逐步指导,提出建议,甚至自动执行任务。根据目标和现有数据,还可以利用其他模型和方法来取得更好的效果,改善整体用户体验。
下面是一些关于该主题的链接,可能会对您有所帮助:
通过在 Elasticsearch 中集成 NLP 和本地矢量搜索,您可以利用其速度、可扩展性和搜索功能来创建高效、有效的聊天机器人,从而能够处理大量结构化或非结构化数据。
准备好开始了吗?开始免费试用弹性云。
在本博文中,我们可能会使用或提及第三方生成式人工智能工具,这些工具由其各自所有者拥有和运营。Elastic对第三方工具没有任何控制权,我们对其内容、操作或使用不承担任何责任或义务,对您使用此类工具可能造成的任何损失或损害也不承担任何责任或义务。在使用人工智能工具处理个人、敏感或机密信息时,请务必谨慎。您提交的任何数据都可能用于人工智能培训或其他目的。我们不保证您所提供信息的安全性或保密性。在使用任何人工智能生成工具之前,您都应熟悉其隐私惯例和使用条款。
Elastic、Elasticsearch 和相关标记是 Elasticsearch N.V. 在美国和其他国家的商标、徽标或注册商标。所有其他公司和产品名称均为其各自所有者的商标、徽标或注册商标。
如何优化聊天机器人
1.
利用 GPT 的功能:将 Elasticsearch 的搜索相关性与 OpenAI 的 GPT 问题解答功能相结合,利用聊天完成 API 返回给用户由模型生成的回复,并将这些前 k 个文档作为上下文。
2.
融入情感分析:结合情感分析模型,在对话展开时了解用户的评论和反应。
3.
可观察性:除了记录聊天机器人的互动日志,跟踪响应时间、延迟和其他相关聊天机器人指标也很重要。通过这样做,您可以确定模式和趋势,甚至发现异常。




