Skip to content

Self-Reflective RAG with LangGraph

使用 LangGraph 实现自反思 RAG 系统


原文: Self-Reflective RAG with LangGraph作者: Ankush Gola 发布日期: 2024年2月7日


Self-Reflective RAG 封面

概述

本章介绍如何使用 LangGraph 实现自反思 RAG (Self-Reflective RAG) 系统。我们将探索两种前沿方法:CRAG (Corrective RAG)Self-RAG,并学习如何通过 LangGraph 将这些研究论文的概念转化为实际可用的代码。

相关资源


一、动机 (Motivation)

大多数大语言模型 (LLM) 只是定期在公开数据语料库上进行训练,因此:

  • 缺乏最新信息 - 训练数据有截止日期
  • 无法访问私有数据 - 企业内部文档、个人笔记等

检索增强生成 (RAG) 是解决这些限制的核心范式,它通过将 LLM 连接到外部数据源来扩展模型的知识范围。

基础 RAG 流程

基础 RAG 流程

基础 RAG 管道遵循以下步骤:

  1. 嵌入用户查询 - 将用户问题转换为向量
  2. 检索相关文档 - 从向量数据库中查找相似文档
  3. 生成回答 - 将检索到的文档传递给 LLM,生成基于上下文的答案

二、自反思 RAG (Self-Reflective RAG)

自反思 RAG 涉及围绕检索步骤的逻辑推理。核心问题包括:

  • 何时检索? - 是否需要检索外部信息
  • 是否重写查询? - 当前查询能否获得更好的结果
  • 何时丢弃文档? - 检索到的文档是否相关,是否需要重试

RAG 的三种认知架构

认知架构对比

架构类型描述
Chain (链式)LLM 基于检索到的文档生成答案
Routing (路由)LLM 根据问题选择不同的检索器
State Machines (状态机)定义步骤(检索、文档评分、查询重写)和它们之间的条件转换

"状态机让我们能够定义一组步骤(例如:检索、评估文档、重写查询)并设置它们之间的转换选项。"

状态机设计

状态机设计

LangGraph 使我们能够实现 LLM 状态机,从而设计灵活的 RAG 流程。下面我们将通过两种当代研究方法来演示这一点。


三、CRAG (Corrective RAG)

CRAG (Corrective RAG) 是一种纠正性检索增强生成方法,引入了三个关键机制:

3.1 CRAG 的三大机制

CRAG 论文图表

机制功能
检索评估器 (Retrieval Evaluator)评估检索到的文档质量,进行置信度评分
网络搜索补充 (Web-based Supplementation)当向量库检索不明确或不相关时,使用网络搜索作为补充
知识细化 (Knowledge Refinement)将文档分割成"知识条",逐个评分,过滤不相关内容

3.2 LangGraph 实现 CRAG

CRAG LangGraph 实现

我们对 CRAG 进行了简化实现:

  1. 跳过知识细化阶段 - 初始版本先不实现
  2. 网络搜索补充 - 如果任何文档不相关,则使用网络搜索
  3. 查询重写 - 优化网络搜索的查询
  4. Pydantic 模型 - 使用结构化输出进行二元决策
python
from typing import Literal
from pydantic import BaseModel, Field

class GradeDocuments(BaseModel):
    """对检索到的文档进行相关性评分"""

    binary_score: Literal["yes", "no"] = Field(
        description="文档是否与问题相关,'yes' 或 'no'"
    )

3.3 CRAG 执行追踪

以下是 CRAG 系统的实际执行追踪示例:

CRAG 追踪示例 1

CRAG 追踪示例 2


四、Self-RAG 框架

Self-RAG 训练 LLM 生成自反思令牌 (Self-reflection Tokens),用于控制 RAG 的各个阶段。

4.1 Self-RAG 的四种令牌

Self-RAG 令牌表

令牌类型功能输入输出
Retrieve决定是否检索文档块问题,或问题 + 生成内容yes, no, continue
ISREL评估段落与问题的相关性问题,文档块relevant, irrelevant
ISSUP评估生成内容是否被文档块支持问题,文档块,生成内容fully supported, partially supported, no support
ISUSE评估生成内容对回答问题的有用程度问题,生成内容5, 4, 3, 2, 1

4.2 Self-RAG 流程图

Self-RAG 论文流程图

4.3 LangGraph 实现 Self-RAG

Self-RAG LangGraph 实现

简化实现包括:

  1. 文档评分 (Document Grading) - 如果所有检索到的文档都不相关,查询重构触发重新检索
  2. 合并生成 (Consolidated Generation) - 从所有相关文档生成单个回答(而不是按文档块生成)
  3. 双重评分 (Dual Grading) - 生成内容同时针对文档(防止幻觉)和整体有用性进行评估
python
class GraphState(TypedDict):
    """图状态定义"""

    question: str  # 用户问题
    generation: str  # LLM 生成的回答
    documents: List[str]  # 检索到的文档列表

五、Self-RAG 实际示例

以下是 Self-RAG 自我纠正能力的实际演示:

Self-RAG 执行追踪

示例:代理记忆类型问题

用户问题: "Explain how the different types of agent memory work?" (解释不同类型的代理记忆是如何工作的?)

第一轮:

  • 所有检索到的文档看起来都相关
  • 但生成的内容未通过有用性检查
  • 系统自动重构查询

查询重写: "How do the various types of agent memory function?" (各种类型的代理记忆是如何运作的?)

第二轮:

  • 重新检索文档
  • 过滤掉一个不相关的文档
  • 生成新的回答

最终回答:

"The various types of agent memory include sensory memory, short-term memory, and long-term memory. Sensory memory retains impressions of sensory information for a few seconds. Short-term memory is utilized for in-context learning and prompt engineering. Long-term memory allows the agent to retain and recall information over extended periods."

(各种类型的代理记忆包括感觉记忆、短期记忆和长期记忆。感觉记忆在几秒钟内保留感觉信息的印象。短期记忆用于上下文学习和提示工程。长期记忆使代理能够在较长时间内保留和回忆信息。)

该回答成功通过了两项检查:

  • 支持性检查 - 内容被文档支持,无幻觉
  • 有用性检查 - 内容对回答问题有帮助

六、总结

"自反思可以极大地增强 RAG,实现对低质量检索或生成内容的纠正。"

关键要点

  1. 自反思机制 - 通过评估检索质量和生成质量,系统可以自我纠正
  2. LangGraph 的优势 - 提供"流程工程"能力,便于实现研究论文中的高级 RAG 概念
  3. 清晰的审计追踪 - 每一步决策都可追溯,便于调试和优化

技术栈

组件用途
LangGraph图结构智能体编排
OpenAI Function Calling结构化输出,确保一致的二元逻辑
Tavily Search API网络搜索集成
LangSmith执行追踪和调试

参考资源


本文内容基于 LangChain 官方博客,翻译并整理为教程格式。

基于 MIT 许可证发布。内容版权归作者所有。