通过微调自己的语义搜索模型来实施检索增强生成(RAG)管道,是提高问题解答系统准确性和相关性的有力方法。
这项技术结合了语义搜索和生成式人工智能的优势,使系统能够更好地理解用户的问题,并生成更准确、与上下文更相关的回复。通过使用句子转换器对语义搜索模型进行微调,开发人员可以根据自己的特定领域定制模型,从而提高 RAG 管道的整体性能。
语义搜索是一种数据搜索技术,它超越了传统的基于关键词的搜索方法。它使用自然语言处理和机器学习算法,通过考虑搜索者的意图及其查询中所用术语的上下文含义来提高搜索结果的准确性。这种方法旨在理解搜索查询和网页内容的潜在含义,而不是简单地匹配关键词。通过这样做,语义搜索可以提供更相关的结果,即使这些结果不包含原始查询中使用的确切词语。
为此,语义搜索采用了各种技术,如词义消歧、概念提取和查询扩展。它还利用矢量搜索和机器学习来返回符合用户意图和上下文的结果。语义搜索在谷歌等网络搜索引擎中得到了广泛应用,它由知识图谱(Knowledge Graph)等技术提供支持,知识图谱存储了关于实体及其关系的结构化数据。这让搜索引擎能够理解搜索查询背后的含义,并提供更准确、更有意义的结果。
语义搜索对于那些希望回答与自身领域知识有关的问题(如技术文档、合同、产品说明等)的企业来说非常有用......
检索增强生成(RAG)是一种技术,它通过整合外部数据源来提供更准确和最新的上下文信息,从而提高生成式人工智能模型(如大型语言模型(LLM))的准确性和可靠性。它将检索组件与生成模型集成在一起,允许系统在生成响应时从数据库或知识库中搜索和获取相关信息,以补充其内部知识。
这种方法可确保人工智能模型能够根据最新、最可靠的事实提供答案,并使用户能够验证模型回答中所用信息的来源。RAG 有助于将人工智能模型建立在外部知识来源的基础上,提高其输出的质量,并提供一种无需大量重新培训即可更新模型的方法。
RAG 是减少生成式人工智能模型潜在幻觉的绝佳策略。RAG 有助于建立一个两全其美的问题解答系统:事实准确性和以自然语言生成的人类回答。
Sentence Transformers 库是一个功能强大的 Python 框架,专为最先进的文本嵌入而设计。它建立在 BERT、RoBERTa、XLM-R 等变换器神经网络的基础上,在语义搜索、转述挖掘、语义相似性比较、聚类等各种任务中都取得了一流的性能。该库可轻松微调句子嵌入方法,从而创建特定任务的句子嵌入,以满足特定需求。 了解更多信息,请访问句子变形网站
该库在 Hugging Face 平台上为 50 多种语言提供了多种预训练的 Sentence Transformers 模型。用户还可以使用该库训练或微调自己的模型,灵活地为独特的用例创建自定义模型。Sentence Transformers 团队最近发布了一个新的重要版本(v3),大大提高了该库的功能,尤其是微调功能。
Sentence Transformers 库快速、全面,而且维护得很好,这就是我们在本教程中使用它的原因。
创建自己的语义搜索模型是获得准确结果的好方法,同时还能确保极低的延迟。如果在 GPU 上部署自己的语义搜索模型,效果会更好。
首先,让我们创建一个包含数据的小型数据集。创建一个单列 CSV 文件(名为 "dataset.csv"),其中包含以下有关惠普打印机的技术文档(当然,在实际应用中,您还需要包含更多示例):
"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."
每行最多可包含 512 个标记(大致相当于 400 个单词),为了最大限度地提高准确性,建议将标记数保持在 128 个(大致相当于 100 个单词)以下。现在我们的数据集中已经有了 3 篇文档,我们可以使用句子转换器模型对数据进行编码。用以下代码创建一个 Python 脚本(确保已安装 PyTorch 和 Sentence Transformers)。
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)
该脚本下载并使用 paraphrase-multilingual-mpnet-base-v2 作为基础模型,并用它对我们的数据进行编码。您可以根据自己的要求(模型大小、使用情况、支持的语言......),从许多可用的预训练模型中进行选择。根据硬件情况,您需要调整 "batch_size "参数,以加快编码过程。
创建模型后,您可以使用以下 Python 脚本进行推理:
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]}
上述推理脚本返回以下结果:
{
"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."
},
]
}
在我们的推理脚本中,"top_k "参数决定了我们要返回多少个结果。在结果中,我们会显示数据集中的匹配文本以及置信度得分。这个分数非常重要,因为它可以帮助我们决定是否接受该回复。
正如你所看到的,语义搜索的主要局限性在于,模型只返回数据集的原始文本,而不直接回答问题。因此,我们现在希望将其作为上下文交给生成式人工智能模型,以便用自然语言回答最初的问题。
我们可以利用先进的 LLM(如 OpenAI 上的 GPT-4 或 NLP Cloud 上的 LLaMA 3 和 ChatDolphin)轻松实现这一目标。您既可以决定保留语义搜索模型中的最佳结果,并将其作为上下文传递给 LLM,也可以保留多个结果。下面是一个仅使用最佳结果的提示示例:
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?
该请求会返回类似的信息:
The warranty on the HP Color LasertJet Pro lasts at least 1 year.
在检索增强生成(RAG)系统中,利用本地编码数据创建语义搜索模型或使用矢量数据库是两种有趣的选择。
在对自己的数据进行编码时,我们会将数据转换为张量,然后有机会将数据加载到 GPU 上。另一方面,向量数据库是一种专门的数据库,旨在高效地存储、索引和查询这些高维向量。
对于希望实现极低延迟的企业,建议对自己的数据进行编码,并将数据加载到 GPU 中,以提高计算时间。但是,这样做会牺牲灵活性,因为每次数据集发生变化时,都必须重新对数据进行编码。如果您的基础数据变化非常频繁,那么提取嵌入数据并将其增量存储到矢量数据库(例如 PG Vector)中可能会更简单。
检索增强生成对于企业回答有关技术文档、合同等特定数据的问题至关重要,因为它能大大提高结果的准确性。例如,RAG 是支持聊天机器人的关键组成部分。
Sentence Transformers 是一个很棒的库,可用于根据自己的数据创建自己的语义搜索模型。当部署在 GPU 上并与先进的生成式人工智能模型相结合时,这样的模型将被证明是极其强大的。
如果您对自己创建和部署基于句子转换器的语义搜索模型不感兴趣,只需在 NLP Cloud 上点击一下即可轻松完成。 现在就尝试在 NLP Cloud 上进行语义搜索!
如果您对 RAG、语义搜索和 Sentence Transformers 有任何疑问,请随时咨询我们,我们很乐意为您提供建议!
Julien
NLP Cloud 首席技术官