如何代理性 RAG 减少幻觉并改善检索

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

2025年2月19日

party-gif

利用代理解锁检索增强型生成(RAG)的力量。探索如何通过引入能够分析查询、优化搜索和生成更准确、全面响应的智能代理,来增强您的RAG管道并减少幻觉。本博客文章提供了实施代理RAG的实用指南,为您的自然语言处理应用程序提供提升工具。

代理人如何修复 RAG 中的幻觉

信息检索步骤在检索增强型生成(RAG)中高度依赖于用户提出问题的方式。如果查询没有很好地表达,即使用户所需的信息存在于知识库中,信息检索也可能很困难。在传统的RAG中,我们只获得一个简短的检索结果,但我们可以通过代理RAG来解决这个问题。

要了解代理RAG如何帮助,让我们看看传统RAG的检索设置。用户查询通过基于语义的相似性搜索,寻找信息库中最相关的片段。但如果问题本身没有正确提出,会发生什么?在这种情况下,您的RAG管道很可能会产生幻觉,也就是开始编造答案,或者语言模型会告诉用户找不到信息,即使信息实际存在于知识库中。

我们可以通过在RAG管道中引入代理,并赋予他们不仅分析初始查询,还分析RAG管道生成的响应的能力来解决这个问题。通常情况下,它是这样的:

  1. 初始查询通过代理传递。
  2. 代理将重新表述初始查询。
  3. 精炼后的查询通过知识库,进行基于语义的相似性搜索,以检索最相关的文档。
  4. 在将相关文档传递给语言模型之前,代理再次分析这些文档或片段,如果认为检索到的文档无法回答问题,则会进一步细化查询。
  5. 根据精炼后的查询,该过程将重复进行,直到代理对检索到的文档和重新表述的查询感到满意。
  6. 最终的上下文被传递给语言模型以生成答案。

在这种情况下,代理可以计划、分析和执行,在您的RAG管道中实现代理循环。您有几个选择,如Crew AI、AutoGPT或LangChain中的LangGraph框架,您可以使用它们来构建代理。在这个视频中,我们将使用Transformers Agents,这是Transformers包中一个鲜为人知的功能,允许您创建自己的代理。

构建代理 RAG 管道

检索增强型生成或RAG中的信息检索步骤高度依赖于用户提出问题的方式。如果查询没有很好地表达,即使用户所需的信息存在于知识库中,信息检索也可能很困难。在传统的RAG中,我们只获得一个简短的检索结果,但我们可以通过代理RAG来解决这个问题。

要了解代理RAG如何帮助,让我们看看传统RAG的检索设置。用户查询通过基于语义的相似性搜索,寻找信息库中最相关的片段。但如果问题本身没有正确提出,会发生什么?在这种情况下,您的RAG管道很可能会产生幻觉,也就是开始编造答案,或者大型语言模型会告诉用户找不到信息,即使信息实际存在于知识库中。

我们可以通过在RAG管道中引入代理,并赋予他们不仅分析初始查询,还分析RAG管道生成的响应的能力来解决这个问题。通常情况下,它是这样的:

  1. 初始查询通过代理传递。
  2. 代理将重新表述初始查询。
  3. 精炼后的查询通过知识库,进行基于语义的相似性搜索,以检索最相关的文档。
  4. 在将相关文档传递给大型语言模型之前,代理再次分析这些文档或片段,如果认为检索到的文档无法回答问题,则会进一步细化查询。
  5. 根据精炼后的查询,该过程将重复进行,直到代理对检索到的文档和重新表述的查询感到满意。
  6. 最终的上下文被传递给大型语言模型以生成答案。

要在您的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。我们有两个选择:

  1. 使用Hugging Face引擎: 这允许我们直接调用Hugging Face无服务器架构提供的不同LLM的API端点。我们可以使用像Llama 38B或70B这样的模型,但这通常需要Hugging Face Pro订阅。

  2. 使用OpenAI: 在这个例子中,我们将使用OpenAI引擎。这个过程可以被调整以设置任何其他LLM。

要设置OpenAI引擎,我们创建一个名为OpenAIEngine的类,它使用Transformer Agents LLM引擎中的message_rlegpt_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之间的关键区别是:

  1. 查询重新表述: 在标准RAG中,用户查询直接通过基于语义的相似性搜索传递到知识库,以检索相关块。在代理RAG中,代理分析初始查询并可以重新表述它以改善检索过程。

  2. 迭代细化: 代理RAG允许代理迭代地细化查询和检索的上下文。如果代理对初始检索结果不满意,它可以使用精炼的查询重复该过程,以获得更好的结果。

  3. 简洁和相关的响应: 代理方法倾向于生成更简洁和相关的响应,而不是标准RAG。代理分析查询和检索的上下文的能力有助于它提供更全面的答案。

  4. 处理表述不佳的查询: 代理方法更擅长处理用户查询表述不佳的情况。代理可以识别初始查询的局限性,并努力重新表述它,从而导致更好的检索和更丰富的响应。

  5. 灵活性和可定制性: 代理RAG允许更大的灵活性和可定制性,因为代理可以配备各种工具和功能,以满足应用程序的特定需求。

总之,代理RAG引入了额外的智能和控制层,使系统能够更好地理解用户的意图,细化检索过程,并生成更有针对性和信息丰富的响应,即使初始查询并不理想。

结论

将代理引入检索增强型生成(RAG)管道可以显著提高生成响应的质量和相关性。通过允许代理分析初始查询、对其进行细化,并从知识库中迭代地检索和评估最相关的信息,代理RAG方法可以克服传统RAG设置的局限性,其中输出的质量高度依赖于用户能否有效地表述查询。

代理RAG方法的主要优势包括:

  1. 改善查询重新表述: 代理分析初始查询并根据检索到的信息对其进行重新表述的能力,确保最终查询在语义上更贴近用户的意图,从而获得更相关的结果。

  2. 迭代检索和评估: 代理反复检索和评估检索到的信息的能力,使其能够细化查询,确保提供给语言模型的最终上下文是全面的,并解决了用户的问题。

  3. **增

FAQ