> For the complete documentation index, see [llms.txt](https://orderbook-trade.gitbook.io/agent/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://orderbook-trade.gitbook.io/agent/langgraph/2.1-langgraph-rag.md).

# 2.1 Langgraph RAG

前面一个 part1 模块，RAG 的整个流程，我们都搞定了

它其实是一些很基本，但是完整的链路，包括&#x20;

> Query Rewrite 改写问题
>
> Multi Query 多路召回
>
> Hybrid Search 混合检索
>
> Rerank 重排
>
> Structured Output 格式化输出

但是从问题出发的话，每一个模块都是相对来说比较独立的。所以其实有现成的轮子，我们就可以考虑使用现成的轮子去解决整个检索的流程。

现在我们要做的工作，就是将其串成一个完整的 pipeline。

### Why Langgraph ?

之前 RAG 的每一步都是线性的，一个函数调完调下一个。这种方式很简单，但有一个问题——没有状态，也没有办法做条件控制。

为什么突然直接用 LangGraph 呢？

首先第一个原因，就是这个 LangGraph 是有一个状态的。

每一次一步一步都有一个对应的状态，然后我们能够拿状态去进行走下一步。

#### Langgraph 核心

其实这个和我之前的背景区块链是比较类似的。每一个块都是一个独立的区块状态机。

* State —— 整条链路共享的数据结构，每个 Node 读取、写入它
* Node —— 每个处理步骤，输入 State，输出一个 partial update
* Edge —— 决定执行顺序，可以是固定的，也可以是条件分支

#### LangGraph 和langchain 的关系

我们就沿着前面的去一并下来。

* **LangChain** 更像是一个工具箱，提供各种组件，LLM 接入、Prompt 模板、向量检索、Chain 链式调用等等
* **LangGraph** 是在 LangChain 之上做的一层，专门解决"有状态、有分支、可循环"的 Agent 流程编排(agent orchestration)问题

其实从名字也可以看出来，Chain 是一个链式的结构，它是一个线性的，跑完就完了。像我们之前做的 RAG 基本都是线性的，我们定义好它的每一步数据输入输出即可。

现在我们直接走 Graph，之后再补 LangChain 的内容。

Graph 相当于一个环式的结构，中间可能有失败、错误或者置信度低的情况。我们需要处理这些错误，从错误出发去加入一些机制，包括：

1. 快照（Checkpoint）
2. HITK 人类介入，去做一些重要的的 evidence 判断

#### 执行流

这里可以把我们之前所有的文档，在执行的时候，检索（Retrieve）到这块。使用新的框架去搭一个完整的 AI Pipeline，最终类似是这样的。

```
START → rewrite_node → retrieve_node → answer_node → END
```

### 核心代码

#### AgentState&#x20;

每一个状态就相当于一个快照，State 就是一个 TypedDict，所有 Node 共享这同一个 schema

```python
class RAGState(TypedDict):
    # input
    question: str

    # query understanding
    rewritten_query: Optional[str]
    search_queries: List[str]
    intent: Optional[str]
    needs_context: bool
    missing_context: Optional[str]

    # retrieval
    candidates: List[Dict[str, Any]]
    evidence: List[Dict[str, Any]]

    # answer
    answerable: Optional[bool]
    answer: Optional[str]
    citations: List[int]
    confidence: Optional[float]
    missing_information: Optional[str]

    # tracing
    steps: Annotated[List[Dict[str, Any]], operator.add]
    errors: Annotated[List[str], operator.add]

    # control
    status: str
    retry_count: int
```

#### Build Graph 构建Grpah based 的RAG 工作流

* 初始的状态就根据之前的 AgentState 定义来。
* node 就相当于我们之前每一步的一些操作，比如说&#x20;
  * **rewrite\_node:** 把原始问题改写成检索友好的 query，同时拿到 intent、search\_queries、needs\_context 等字段。
  * **retrieve\_node** 接入 Step14 做 multi\_query\_search 多路召回，再接 Step09 Reranker 做 Cross-Encoder 重排，最终只保留 top\_k=5 的证据
  * **answer\_node**  接入 Step12 的 structured output，把证据喂给 LLM，拿到 answerable、answer、citations、confidence 这些结构化字段。
* 所以这里和前面的 RAG 基础就是一并相连的。把 edge 加上，就相当于整个 graph 走的一个流程：

  1. 先从开始的时候 rewrite
  2. 接下来从 rewrite 到 query 再到 answer

  最终把这个 agent 的整个流执行下来。

```python
def build_graph():
    graph = StateGraph(RAGState)

    graph.add_node("rewrite", rewrite_node)
    graph.add_node("retrieve", retrieve_node)
    graph.add_node("answer", answer_node)

    graph.add_edge(START, "rewrite")
    graph.add_edge("rewrite", "retrieve")
    graph.add_edge("retrieve", "answer")
    graph.add_edge("answer", END)

    return graph.compile()
```

* **注**； 这里的 Edge 都是固定的，全部跑完整个链路， 但是它并不是一个图状的结构，如果出现失败的话就直接失败了，没有 fallback 的一些操作。当然，这个在后面会具体介绍。

### 执行结果

* 我在每一个 node 执行前后都打了一些日志，可以看到一个比较精准的 LangGraph 执行细节。

```

Question: 系统架构概览

[2026-06-13T09:41:28.455058Z] === 开始执行 rewrite_node ===
原始问题: 系统架构概览
[2026-06-13T09:41:34.264381Z] --- rewrite_node 执行成功 ---
改写后的问题: 系统架构概览
生成子查询数: 5 ['系统架构概览', '系统结构介绍', '软件架构概述', 'system architecture overview', '架构设计总览']
用户意图: 用户希望了解系统架构的概览信息

================================================================================================
[2026-06-13T09:41:34.267126Z] === 开始执行 retrieve_node ===
检索查询词: ['系统架构概览', '系统结构介绍', '软件架构概述', 'system architecture overview', '架构设计总览']
[2026-06-13T09:41:34.598638Z] 召回候选块数量: 18
开始使用 Cross-Encoder 进行重排 (耗时较长)...
[2026-06-13T09:41:35.371022Z] --- retrieve_node 执行成功 ---
重排后保留的证据数: 5

================================================================================================================================================================
[2026-06-13T09:41:35.371394Z] === 开始执行 answer_node ===
证据数量: 5，开始调用 LLM 生成回答...
[2026-06-13T09:41:44.143613Z] --- answer_node 执行成功 ---
可回答性 (answerable): True
置信度 (confidence): 1.0

Final Answer
================================================================================
平台采用分层架构：前端工作台负责交互和可视化，后端 orchestrator 管理 Agent 状态，tool gateway 执行受控工具调用，retrieval service 提供 RAG 检索，eval service 负责离线回放与质量评估。所有关键链路都记录 trace_id。架构可简化为五个模块：User Workspace、Agent Orchestrator、Tool Gateway、Knowledge Index、Eval & Observability。
```

最终 find the answer 也是和我们文档中对应的问题保持一致的。

所以整个执行下来，看起来效果和工作流还是挺不错的
