如何代理性 RAG 减少幻觉并改善检索
探索 Agentic RAG 如何通过重新制定查询、细化结果和利用更大的语言模型来减少幻觉并提高检索。为您的 RAG 应用程序解锁更全面和相关的响应。
2025年2月19日

利用代理解锁检索增强型生成(RAG)的力量。探索如何通过引入能够分析查询、优化搜索和生成更准确、全面响应的智能代理,来增强您的RAG管道并减少幻觉。本博客文章提供了实施代理RAG的实用指南,为您的自然语言处理应用程序提供提升工具。
代理人如何修复 RAG 中的幻觉
代理人如何修复 RAG 中的幻觉
信息检索步骤在检索增强型生成(RAG)中高度依赖于用户提出问题的方式。如果查询没有很好地表达,即使用户所需的信息存在于知识库中,信息检索也可能很困难。在传统的RAG中,我们只获得一个简短的检索结果,但我们可以通过代理RAG来解决这个问题。
要了解代理RAG如何帮助,让我们看看传统RAG的检索设置。用户查询通过基于语义的相似性搜索,寻找信息库中最相关的片段。但如果问题本身没有正确提出,会发生什么?在这种情况下,您的RAG管道很可能会产生幻觉,也就是开始编造答案,或者语言模型会告诉用户找不到信息,即使信息实际存在于知识库中。
我们可以通过在RAG管道中引入代理,并赋予他们不仅分析初始查询,还分析RAG管道生成的响应的能力来解决这个问题。通常情况下,它是这样的:
- 初始查询通过代理传递。
- 代理将重新表述初始查询。
- 精炼后的查询通过知识库,进行基于语义的相似性搜索,以检索最相关的文档。
- 在将相关文档传递给语言模型之前,代理再次分析这些文档或片段,如果认为检索到的文档无法回答问题,则会进一步细化查询。
- 根据精炼后的查询,该过程将重复进行,直到代理对检索到的文档和重新表述的查询感到满意。
- 最终的上下文被传递给语言模型以生成答案。
在这种情况下,代理可以计划、分析和执行,在您的RAG管道中实现代理循环。您有几个选择,如Crew AI、AutoGPT或LangChain中的LangGraph框架,您可以使用它们来构建代理。在这个视频中,我们将使用Transformers Agents,这是Transformers包中一个鲜为人知的功能,允许您创建自己的代理。
构建代理 RAG 管道
构建代理 RAG 管道
检索增强型生成或RAG中的信息检索步骤高度依赖于用户提出问题的方式。如果查询没有很好地表达,即使用户所需的信息存在于知识库中,信息检索也可能很困难。在传统的RAG中,我们只获得一个简短的检索结果,但我们可以通过代理RAG来解决这个问题。
要了解代理RAG如何帮助,让我们看看传统RAG的检索设置。用户查询通过基于语义的相似性搜索,寻找信息库中最相关的片段。但如果问题本身没有正确提出,会发生什么?在这种情况下,您的RAG管道很可能会产生幻觉,也就是开始编造答案,或者大型语言模型会告诉用户找不到信息,即使信息实际存在于知识库中。
我们可以通过在RAG管道中引入代理,并赋予他们不仅分析初始查询,还分析RAG管道生成的响应的能力来解决这个问题。通常情况下,它是这样的:
- 初始查询通过代理传递。
- 代理将重新表述初始查询。
- 精炼后的查询通过知识库,进行基于语义的相似性搜索,以检索最相关的文档。
- 在将相关文档传递给大型语言模型之前,代理再次分析这些文档或片段,如果认为检索到的文档无法回答问题,则会进一步细化查询。
- 根据精炼后的查询,该过程将重复进行,直到代理对检索到的文档和重新表述的查询感到满意。
- 最终的上下文被传递给大型语言模型以生成答案。
要在您的RAG管道中实现代理循环,您有几个选择,如Crew AI、Auto或LangChain中的LangGraph框架。在这种情况下,我们将使用Transformers Agents,这是Transformers包中一个鲜为人知的功能,允许您创建自己的代理。
首先,我们需要安装所需的软件包,包括pandas、LangChain、LangChain社区软件包、Sentence Transformer软件包和Transformers软件包。然后,我们将导入必要的模块并设置数据,包括将文档拆分为块并创建嵌入。
接下来,我们将创建一个检索工具,代理可以使用它从知识库中检索相关文档。我们还将设置大型语言模型,在本例中使用OpenAI引擎。
最后,我们将创建代理本身,它将拥有检索工具和大型语言模型的访问权限,以及指导代理行为的系统提示。然后,我们将运行代理通过代理循环来生成对样本问题的答案,并将结果与标准RAG管道进行比较。
代理RAG方法允许通过使代理能够细化查询并检索最相关的信息,从而获得更强大和全面的答案,从而导致大型语言模型产生更高质量的响应。
创建检索工具
创建检索工具
要为代理RAG管道创建检索工具,我们定义一个RetrievalTool
类,其结构如下:
class RetrievalTool:
"""使用语义相似性,从知识库中检索与输入最相似的一些文档。"""
def __init__(self, vector_db):
self.vector_db = vector_db
def __call__(self, query: str) -> List[str]:
"""
从矢量数据库中检索最多7个最相似的块,用于给定的查询。
Args:
query (str): 要执行检索的查询。这应该在语义上接近目标文档。
Returns:
List[str]: 从矢量数据库中检索到的最多7个最相似的块。
"""
results = self.vector_db.similarity_search(query, k=7)
return [chunk.page_content for chunk in results]
RetrievalTool
类将vector_db
对象作为输入,这是用于存储文档嵌入的矢量存储(例如Faiss、Chroma、Pinecone)。
类的__call__
方法将query
字符串作为输入,并返回最多7个最相似的块从矢量数据库中检索。它使用vector_db
对象的similarity_search
方法,根据余弦相似性找到最相似的块。
这个检索工具然后可以作为代理RAG管道的一部分使用,代理可以分析初始查询,对其进行细化,并通过检索工具从知识库中获取最相关的块。
集成语言模型
集成语言模型
要将语言模型集成到代理RAG管道中,我们需要设置将由代理和最终响应生成使用的LLM。我们有两个选择:
-
使用Hugging Face引擎: 这允许我们直接调用Hugging Face无服务器架构提供的不同LLM的API端点。我们可以使用像Llama 38B或70B这样的模型,但这通常需要Hugging Face Pro订阅。
-
使用OpenAI: 在这个例子中,我们将使用OpenAI引擎。这个过程可以被调整以设置任何其他LLM。
要设置OpenAI引擎,我们创建一个名为OpenAIEngine
的类,它使用Transformer Agents LLM引擎中的message_rle
和gpt_generate_message_list
函数。这个类处理输入消息的清理,并使用OpenAI聊天完成端点生成响应。
接下来,我们创建实际的代理。代理可以访问我们之前创建的检索工具、我们想要使用的LLM(在本例中是OpenAIEngine
)以及我们希望代理在停止代理循环之前执行的最大迭代次数。
我们还为代理提供了一个系统提示,指导它如何使用知识库中的信息为用户的问题提供全面的答案。该提示鼓励代理在找不到必要的信息时,重试检索过程并使用不同的查询。
有了代理和LLM的设置,我们现在可以运行代理循环来回答用户的问题。代理将迭代地细化查询,从知识库中检索相关信息,并使用LLM生成最终响应。这种方法与标准RAG管道相比,可以产生更详细和相关的答案。
实施代理代理
实施代理代理
要实现代理代理,我们将使用Transformers包中的Transformers Agents功能。这提供了一种模块化和清晰的方法来创建自定义代理。
首先,我们需要安装所需的软件包,包括pandas、Langchain、Langchain社区软件包、Sentence Transformers和Transformers Agents。
接下来,我们导入必要的模块和包。我们将使用ReactJsonAgent,构建代理的自定义工具,并利用Hugging Face引擎作为语言模型。
要构建RAG管道,我们从包含Hugging Face文档的数据集开始。我们将文档拆分为块,并使用GTE-small模型创建嵌入。然后,我们删除任何重复的块,并将唯一的块存储在基于F的矢量存储中。
现在,我们将代理引入其中。我们创建一个RetrievalTool
,使用语义相似性根据用户的查询从知识库中检索最相关的块。
我们还设置了语言模型,在本例中使用OpenAI引擎和GPT-4模型。
然后创建代理,可以访问检索工具和语言模型。我们还指定代理可以执行的最大迭代次数,以细化查询和检索的上下文。
代理被提供了一个系统提示,指导它使用知识库为用户的问题提供全面的答案。代理然后经历一个迭代过程,重新表述查询并检索更相关的信息,直到对响应感到满意。
然后将代理RAG管道与标准RAG管道进行比较,演示代理方法如何提供更详细和相关的答案,特别是当用户的初始查询表达不佳时。
比较标准 RAG 和代理 RAG
比较标准 RAG 和代理 RAG
标准RAG和代理RAG之间的关键区别是:
-
查询重新表述: 在标准RAG中,用户查询直接通过基于语义的相似性搜索传递到知识库,以检索相关块。在代理RAG中,代理分析初始查询并可以重新表述它以改善检索过程。
-
迭代细化: 代理RAG允许代理迭代地细化查询和检索的上下文。如果代理对初始检索结果不满意,它可以使用精炼的查询重复该过程,以获得更好的结果。
-
简洁和相关的响应: 代理方法倾向于生成更简洁和相关的响应,而不是标准RAG。代理分析查询和检索的上下文的能力有助于它提供更全面的答案。
-
处理表述不佳的查询: 代理方法更擅长处理用户查询表述不佳的情况。代理可以识别初始查询的局限性,并努力重新表述它,从而导致更好的检索和更丰富的响应。
-
灵活性和可定制性: 代理RAG允许更大的灵活性和可定制性,因为代理可以配备各种工具和功能,以满足应用程序的特定需求。
总之,代理RAG引入了额外的智能和控制层,使系统能够更好地理解用户的意图,细化检索过程,并生成更有针对性和信息丰富的响应,即使初始查询并不理想。
结论
结论
将代理引入检索增强型生成(RAG)管道可以显著提高生成响应的质量和相关性。通过允许代理分析初始查询、对其进行细化,并从知识库中迭代地检索和评估最相关的信息,代理RAG方法可以克服传统RAG设置的局限性,其中输出的质量高度依赖于用户能否有效地表述查询。
代理RAG方法的主要优势包括:
-
改善查询重新表述: 代理分析初始查询并根据检索到的信息对其进行重新表述的能力,确保最终查询在语义上更贴近用户的意图,从而获得更相关的结果。
-
迭代检索和评估: 代理反复检索和评估检索到的信息的能力,使其能够细化查询,确保提供给语言模型的最终上下文是全面的,并解决了用户的问题。
-
**增
FAQ
FAQ