AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


解锁RAG应用:利用FastRAG中的Dense Retrievers优化开放域问答
发布日期:2024-08-30 12:47:46 浏览次数: 1733 来源:AI技术研习社


检索增强生成是一种在自然语言处理领域的前沿技术,结合了信息检索和生成模型的优势。其核心目标是通过检索相关段落或文档,生成信息更丰富、上下文更切合用户查询的响应。

这项技术在诸多应用中展现了巨大的潜力,尤其是在开放域问答领域。开放域问答的研究重点在于开发能够理解并回答用户多样化问题的系统,这通常涉及利用信息检索技术从海量非结构化数据中提取相关信息。

信息检索过去主要依赖于基于单词统计的稀疏技术。在传统方法中,文档通常使用词袋模型进行表示,文档与查询的相关性取决于特定词语的存在与否。

评分函数(如 BM25 和 TF-IDF)根据词频对文档进行评分,通过平衡关键字在文档中的出现频率与其在一般语境中的流行程度来判断相关性。一个常用的数据库是 Elasticsearch,它使用 Lucene 文本搜索引擎,结合单词统计与编辑距离(一种基于语法的计算方法)进行文本搜索。

下面是一个基于单词统计的稀疏技术的简单示例代码,使用 Python 的 Elasticsearch 库来执行基于 TF-IDF 和 BM25 的查询:

from elasticsearch import Elasticsearch# 初始化Elasticsearch客户端es = Elasticsearch()# 索引名称index_name = "example_index"
# 查询语句query = "sample query"
# 使用BM25的查询示例bm25_query = {"query": {"match": {"content": {"query": query,"operator": "and"}}}}
# 执行BM25查询bm25_response = es.search(index=index_name, body=bm25_query)
print("BM25 Query Results:")for hit in bm25_response['hits']['hits']:print(hit['_source'])
# 使用TF-IDF的查询示例tfidf_query = {"query": {"match": {"content": {"query": query,"operator": "and"}}},"similarity": {"default": {"type": "classic"# classic相当于TF-IDF}}}
# 执行TF-IDF查询tfidf_response = es.search(index=index_name, body=tfidf_query)
print("TF-IDF Query Results:")for hit in tfidf_response['hits']['hits']:    print(hit['_source'])

随着自然语言处理和机器学习领域的飞速发展,信息检索已经迎来了一场革命性的变革,转向采用更为密集的嵌入表示。这些嵌入技术能够精准捕捉单词和短语的深层语义,从而实现对内容的细致理解。

相较于传统的单词统计方法,嵌入表示在匹配查询与相关文档时展现出更高的准确性,因为它能够揭示那些微妙的语义相似性,这些相似性往往在传统方法下难以被发现。

从稀疏表示到密集表示的这一跃进,不仅显著提升了检索系统的整体性能,也极大增强了检索结果的精确度。

对于那些渴望深入了解神经信息检索(Neural IR)的读者,我们推荐阅读Mitra和Craswell在2018年的开创性工作;而对于希望探索信息检索问答领域的研究者,Abbasiantaeb和Momtazi在2021年的综述文章将是一个宝贵的资源。

这篇博客介绍了密集检索,我们重点介绍了两种密集文档检索模型:密集段落检索(DPR, Karpukhin et al. 2020)和 BERT 上的情境化后期交互 (ColBERT, Khattab and Zaharia 2020)。两种模型都使用语义搜索来查找相关文档。

语义搜索意味着我们使用文本的密集表示来衡量给定查询与潜在相关文档之间的相似性。这两种模型使用不同的方法来存储文档的向量并测量查询和文档之间的相似性。

我们将通过在称为自然问题(NQ、Kwiatkowski 等人,2019 年)的已知基准上测量准确性和延迟来比较模型,该基准是用户提交的问题的集合,可以在维基百科文章中找到答案。

FastRAG,这是一个由英特尔实验室开发的框架,最近作为开源软件发布。该框架的目标是实现检索增强生成式人工智能应用的快速研究和开发。这些可用于生成任务,如问答、总结、对话系统和内容创建,同时利用信息检索组件来使用外部知识锚定LLM输出。

应用程序由管道表示,该管道通常由知识库 (KB)、检索器、排名器和读取器组成,通常为 LLM“读取”查询和检索的文档,并生成输出。人们可以尝试不同的架构、模型,对性能和延迟的结果进行基准测试。我们提供的几种型号更适合英特尔硬件,以实现更低的延迟和相当的精度。

在信息检索领域,近期的更新推动了基于Transformer的编码器模型的应用。这些模型在检索中表现出了显著的优势:知识库中的文档被转换为向量并存储在索引中。

在查询时,查询内容同样被编码为向量,然后通过向量相似性搜索找到最相关的文档。这个过程不仅可以有效地筛选出相关文档,还可以用于对检索结果进行重新排序,尤其是对已检索到的文档进行进一步优化。这样,在运行时能够实现更精准的即时检索和排序。

在密集检索中,有几种常见的方法。其中一种方法是使用单个令牌的嵌入作为整个文档的代表。DPR(由 Karpukhin 等人在 2020 年提出)就是这种方法的一个典型例子。

在 DPR 中,编码器被训练为将整个文档的内容“总结”到第一个令牌的嵌入中。这个方法属于双编码器架构的一种形式,因为它使用了两个独立的编码器,一个用于查询,另一个用于文档。通过这种方式,查询和文档分别被编码为向量,随后进行匹配以检索最相关的内容。

另一种方法称为后期互动,如 ColBERT 中首次定义的那样(Khattab 和 Zaharia 2020)。这个想法是保存(并索引)文档中所有单词的编码向量。在运行时,查询向量将与所有文档单词的向量进行比较(因此在后期交互中为“延迟”),从而检索比 DPR 更相关的文档。请注意,为每个标记编制索引(而不仅仅是每个文档的第一个标记)可以增加索引大小。

这项工作的后期改进,即 ColBERT v2 和 PLAID(Santhanam、Khattab、Saad-Falcon 等人,2022 年;Santhanam, Khattab, Potts, et al. 2022) 帮助减少了索引大小和延迟时间,这要归功于两个主要改进:首先是索引中向量的量化和压缩。

其次是一组启发式方法,使用 K-means 算法对向量进行聚类,根据聚类的质心分层选择相关文档的标记进行查询标记。带有 PLAID 索引的 ColBERT v2 以低延迟实现了最先进的检索性能,接近稀疏检索(BM25、Lucene、Elasticsearch 等)的顺序,但精度要高得多。

使用FastARG之前,先进行安装。

pip install fastrag

在 FastRAG 中使用 ColBERT。一旦我们有了所有的成分,我们就初始化文档存储。

from fastrag.stores import PLAIDDocumentStore
document_store = PLAIDDocumentStore(index_path="data-index/",checkpoint_path="ColBERT-model/",collection_path="my-documents.tsv")py

from fastrag.retrievers.colbert import ColBERTRetriever
retriever = ColBERTRetriever(document_store=document_store)

我们使用我们刚刚定义的文档存储来定义一个检索器。我们可以使用 Haystack 流水线 API 来连接外部组件。在此示例中,管道仅包含检索器:

from haystack import Pipeline
p = Pipeline()p.add_node(component=retriever, name="Retriever", inputs=["Query"])
p.run(query, params={"Retriever": {"top_k": k}})

结果是一个哈希映射,其中包含包含结果列表的文档键:具有相关性分数的文档。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询