随着联想AI PC的推出,消费者越来越多地接触到大型语言模型应用(LLMs)。这些应用可以回答用户的问题,提供有用的信息,甚至进行有意义的对话。然而,LLMs 有一个重要的局限性,即无法访问其训练数据截止日期之后的数据。为了解决这个问题,我们可以使用检索增强生成(RAG)框架,它可以从外部知识库中检索事实,以在最准确、最新的信息上为 LLMs 提供事实基础,从而提高 LLM 生成的响应质量。
RAG 简单来说有两个核心阶段:知识检索和内容生成。检索阶段的目标是从外部知识库中检索与用户查询相关的文档。生成阶段的目标是使用 LLM 生成答案。在这两个阶段中,我们可以使用各种技术来提高 RAG 系统的性能。在这篇文章中,我们将结合具体例子重点讨论调优检索和生成过程的几种方法,以提高 RAG 系统的性能。
我们简要回顾一下构成“RAG”这个词的三个缩写词的含义:
·Retrieval:检索,指的是从大量文档中找到与用户查询最相关的文档。
·Augmented:增强,创建一个结构良好的 prompt,以便当调用 LLM 时,它完全知道其目的是什么,上下文是什么,以及应该如何响应。
·Generation:生成,指的是使用 LLM 生成答案。当模型获得了良好的上下文(由“检索”步骤提供)并且有清晰的指令(由“增强”步骤提供),它将为用户生成高价值的响应。
正如我们看到的,对用户查询的响应生成(如果我们是为了问答目的应用 RAG),直接取决于我们构建“增强”尤其是“检索”的有多好。
在本节中,我们将专门关注“检索”,讨论一些用于检索相关文档的技术。
总体来说,我们将讨论以下几种检索器:
1. 朴素检索器
2. 自我查询检索器
3. 混合检索器
4. 父文档检索器
5. 融合检索器
为了展示这些方法,我们将通过一个实际用例来解释。
最近,我们有这样一个需求:有一个外部的漏洞公告知识库,用户使用自然语言提供漏洞公告信息查询,我们用自然语言回答相关问题,需要从知识库中找到最相关的漏洞公告文档,以便我们可以将这些文档作为上下文,结合用户的问题生成答案。以下称为“漏洞公告 Q&A 系统”。
每篇漏洞公告是一个独立的文档,包含一个正文字段和一个来源字段。
构建漏洞公告 Q&A 系统涉及确定检索器组件将处理的文档的理想块大小。在这里,块大小的选取主要考虑了任务的要求:小的分块有利于扩大样本规模和增加某些问题的语义相似度。大的分块有助于保存尽可能多的有关上下文信息,但不利于根据用户查询计算语义相似的文本内容。但总之,漏洞公告 Q&A 系统把两种不同长度分块的文本向量都进行存储和索引,以应用不同的检索器。
朴素检索器是最简单的检索器。它只是在向量存储中查找与用户原始查询最相似的文档。
可以看到,我们询问关于 2024-044 漏洞的受影响模块,但是朴素检索器返回的前三个文档包含与漏洞编号无关的信息,即使返回的 top-k 范围扩大到 10,也几乎没有与漏洞编号相关的文本。这是因为知识库中包含了大量不同的漏洞公告,而这些公告的内容和结构非常相似,导致分块之后朴素检索器无法区分特定于某个漏洞的分块。
此时,我们的需求是找到与漏洞编号相关的文档,而不仅仅是单纯比较查询与文本块的相似度。这时,我们可以使用自我查询检索。漏洞公告 Q&A 系统经常需要处理指定漏洞编号的用户查询,这时,可以利用 LLM 重新生成结构化的查询,一部分去进行文本检索,另一部分是去查询存储的元信息进行结构化的筛选。
如图所示,可以看到,自我查询检索器返回的文档与漏洞编号 2023-006 相关,这是因为自我查询检索器利用了漏洞编号的元信息字段 source,将其转换为结构化的查询{content: "affected firmware", source:"2023-006"}。先对元信息 source 字段筛选,然后在向量存储中查找与结构化查询 content 最相似的文档。
用户可能会有这样的需求:查询 SHA256 值为 dbc3842a5e3918463690fa165b2b0955989c00702bc7284af5875ef08e7606b1 的漏洞模块的相关信息。这时如果只使用上述方法,可能会返回与 SHA256 值完全不相关的文档,不包含漏洞模块的相关信息。这是因为向量化之后的文本很难存储这种精确的特征值,这时候我们可以使用混合检索器,结合稀疏检索器和密集检索器的优点,来返回最相关的文档。
检索方法通常可以根据信息编码方法分为两种类型:稀疏和密集。稀疏检索是基于单词的,主要应用于文本检索,而密集检索将查询和外部知识嵌入向量空间中,可应用于各种数据格式,我们上面一直使用的向量检索就是密集检索。BM25 是一种词袋检索函数,根据查询关键字在每个文档中的出现情况对一组文档进行排名,而不考虑它们在文档中的接近程度。它是一组具有略有不同组成部分和参数的评分函数,与向量检索互为补充。
“混合检索”实际上并没有明确的定义,本节以向量检索和 BM25 检索的组合为例。如果我们使用其他搜索算法的组合,同样可以被称为“混合检索”,我们在下文明确为“融合检索器”。
父文本是为了解决分块大小舍取导致的精度和上下文的矛盾。这为每个文档索引多个子块,然后在嵌入空间中找到最相似的块,但检索整个父文档并返回它(而不是单独的子块)。因为在拆分文档时,通常存在冲突的愿望:您可能希望拥有小型文档,以便它们的嵌入可以最准确地反映其含义,如果太长,那么嵌入可能会失去意义。同时,您也希望有足够长的文档,以保留每个块的上下文。
请注意,“父文档”指的是一个子块从属的文档。这可以是整个原始文档,也可以是一个较大的块。在这里我们返回的父文档是整个原始文档。
由此也引入了融合检索,通过调整各个检索器的权重结合不同检索器的优点。融合检索接受检索器列表作为输入,赋予各个检索器不同的权重,并根据互倒排序融合算法对它们的 get_relevant_documents() 方法的结果进行整合和重新排名。通过利用不同算法的优势,融合检索可以实现比任何单一算法更好的性能。稀疏检索器擅长根据关键词查找相关文档,而密集检索器擅长根据语义相似性查找相关文档。
因此,结合上述的四种方法,可以得到更好的综合检索效果。
在检索阶段,我们已经找到了与用户查询最相关的文档。在生成阶段,我们将使用 LLM 生成答案。在这一阶段,我们可以使用以下几种技术来提高生成的质量。
在生成阶段,我们将检索到的文档作为上下文传递给 LLM。但是,由于我们的文档是在检索之前分块的,LLM 并不能识别各个文档组成的上下文是否是多个文档,我们需要明确文档的边界。这样,LLM 才能正确地理解上下文的结构,避免来自于不同漏洞公告的文本块迷惑 LLM ,让 LLM 对多个文本块产生混淆,从而生成被误导的答案。在我们的漏洞公告 Q&A 系统中,我们可以使用特殊的分隔符来明确文档的边界。
system_prompt = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
Each piece of fact is separated by @@@@@ and not mixed up with each other.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
nn
Context: {context}
Answer:"""
prompt = ChatPromptTemplate.from_messages(
[
("system", system_prompt),
("user", "{input}"),
]
)
在自我查询检索器中,我们使用 LLM 生成结构化查询,然后再进行文本检索。引导 LLM 生成结构化查询的示例可以帮助 LLM 更好地理解结构化查询的格式。在我们的漏洞公告 Q&A 系统中,我们可以使用少样本示例来引导 LLM 生成结构化查询。
examples = [
(
"what is the vulnerability public disclosed date in 2022-158?",
{
"query": "public disclosed date",
"filter": 'eq("source", "2022-158")',
},
),
(
"What are the affected modules in 2022-158?",
{
"query": "affected module",
"filter": 'eq("source", "2022-158")',
},
),
]
我们可以看到,通过调优检索和生成过程,可以提高 RAG 系统的性能。在检索阶段,我们可以使用朴素检索器、自我查询检索器、混合检索器、父文档检索器和融合检索器等技术来提高检索的准确性。在生成阶段,我们可以使用明确文档边界和少样本示例等技术来提高生成的质量。通过调优检索和生成过程,我们可以提高 RAG 系统的性能,为用户提供更好的体验。未来,我们可以进一步研究如何进一步提高 RAG 系统的性能,以更好满足用户的需求和企业部署。
- RAG: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (https://arxiv.org/abs/2005.11401)
- Retrievers: LangChain (https://python.langchain.com/v0.1/docs/modules/data_connection/retrievers/)
- Advanced Retriever Techniques to Improve Your RAGs (https://towardsdatascience.com/advanced-retriever-techniques-to-improve-your-rags-1fac2b86dd61)
原文始发于微信公众号(联想全球安全实验室):RAG QA 系统的检索和生成调优
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/2922654.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论