从简单模型到可靠系统:利用 LangGraph 构建 Reflexion 架构智能体
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
一个无法反思自己错误的 LLM 称不上是智能体,它充其量只是一个“加强版的自动补全工具”。你可能已经遇到过这种情况:你给大语言模型 (LLM) 布置了一个复杂的任务——撰写研究报告、调试多文件代码库或制定多步策略——它自信满满地给出了一个听起来很正确,但实际上存在细微甚至灾难性错误的结果。它没有暂停、自我质疑或尝试更好策略的机制。为了解决这一痛点,开发者需要像 n1n.ai 这样稳定且高速的 API 聚合平台,为智能体的迭代循环提供坚实的基础设施。
本文旨在弥合简单提示词与可靠系统之间的鸿沟。我们将探讨如何结合 Reflexion(一种让 AI 智能体自我批判并重试的技术)和 LangGraph(一个用于构建有状态、基于图的智能体工作流的框架)来构建生产级的 AI 系统。
原始 LLM 的局限性:为什么它们会失败?
无论是 OpenAI o3、Claude 3.5 Sonnet 还是 DeepSeek-V3,大模型本质上都是极其强大的模式补全器。它们通过单向的前向传播生成 Token。这种架构存在天然的局限性:
- 幻觉 (Hallucination):模型会编造看似权威但完全虚假的事实或引用。
- 过早收敛 (Premature Convergence):模型往往“安于”第一个合理的答案,而不去探索是否存在更优解。
- 规模化的上下文盲区:随着任务跨度的增加,模型会丢失早期的约束条件,导致逻辑矛盾。
- 无声失败 (Silent Failure):错误的输出与正确的输出在形式上没有区别,系统不会抛出异常,而是“成功”地返回了一个错误答案。
在 n1n.ai 的高并发场景下,这些问题如果得不到解决,将直接影响企业级应用的可用性。这不仅是 Prompt Engineering 的失败,更是系统架构的失败。
Reflexion 框架:语言强化学习的艺术
Reflexion 是由东北大学的 Shinn 等人在 2023 年提出的一种框架。其核心思想非常简洁:不通过微调(Fine-tuning)来改进模型,而是通过自然语言进行自我反思、存储记忆并重试。
该架构包含三个核心组件:
- 执行者 (Actor):负责实际任务的 LLM。它根据当前任务描述和历史记忆生成输出。
- 评估者 (Evaluator/Critic):评分函数,用于判断输出的质量。这可以是另一个 LLM 调用,也可以是确定性的代码逻辑(如单元测试或 Linter)。
- 反思者 (Reflector):读取执行者的输出和评估者的反馈,生成一段自然语言形式的自我批判。这段批判会被存入“情节记忆”中,注入到下一次的执行提示词里。
这种“语言化反思”之所以有效,是因为 LLM 往往擅长“谈论”自己的错误,即使它们在第一时间犯了错。通过 n1n.ai 调用高性能模型,这种反思循环可以将复杂推理任务的准确率从 30% 提升至 60% 以上。
LangGraph:智能体的骨架
在构建 Reflexion 架构时,传统的线性链(Chains)已不再适用。LangGraph 允许我们将工作流定义为有向图,其中节点是函数,边是跳转逻辑。它的优势在于:
- 显式状态管理:智能体的“工作记忆”被封装在一个名为
State的 Python 对象中,每一步的尝试和反思都清晰可查。 - 条件分支 (Conditional Edges):可以根据评估分数决定下一步是结束流程(END)还是跳转到
reflect_node。 - 持久化能力:支持 Checkpointing,这意味着长时间运行的任务可以被暂停、调试或交给人工介入。
实战指南:构建 Reflexion 智能体
1. 定义状态 (State)
我们需要记录任务描述、尝试历史、反思历史以及迭代次数。
from typing import Annotated, List, TypedDict
class ReflexionState(TypedDict):
task: str
attempts: List[str]
reflections: List[str]
scores: List[float]
iteration: int
max_iterations: int
2. 执行者节点 (Actor Node)
执行者需要读取所有的历史失败教训。通过 n1n.ai 接入 Claude 3.5 Sonnet 这种长上下文模型,可以更好地消化多轮反思建议。
def actor_node(state: ReflexionState):
# 提取历史记忆
memory = ""
for i, (att, ref) in enumerate(zip(state['attempts'], state['reflections'])):
memory += f"\n第 {i+1} 次尝试: {att}\n自我批判: {ref}"
prompt = f"任务: {state['task']}\n{memory}\n请吸取教训,给出更好的回答:"
# 通过 n1n.ai 调用模型
response = model.invoke(prompt)
return {
**state,
"attempts": state["attempts"] + [response.content],
"iteration": state["iteration"] + 1
}
3. 评估者逻辑
评估者的质量决定了系统的上限。对于代码任务,建议使用确定性的单元测试;对于文案任务,则可以使用基于评分标准的 LLM-as-judge。
4. 条件路由 (Router)
这是 Reflexion 的核心逻辑:如果分数达标或达到最大迭代次数,则停止;否则,进入反思环节。
def should_continue(state: ReflexionState):
if state["scores"][-1] >= 0.9 or state["iteration"] >= state["max_iterations"]:
return "__end__"
return "reflect"
专家建议:如何规避常见坑点?
- 防止“反思中毒” (Reflection Poisoning):如果评估者本身有偏差,错误的反馈会误导执行者。务必对评估者的提示词进行严格测试。
- 上下文窗口溢出:随着迭代增加,提示词会越来越长。建议在第 3 轮迭代后对旧的反思进行总结压缩。
- 异构模型策略:为了节省成本,你可以通过 n1n.ai 使用 OpenAI o3 作为执行者(处理高难度逻辑),而使用更便宜的 DeepSeek-V3 作为反思者和评估者。
结论
从简单的 LLM 调用转向可靠的 AI 系统,关键在于从“单次生成”转变为“迭代优化”。Reflexion 提供了认知循环,而 LangGraph 提供了执行基础设施。结合 n1n.ai 提供的多模型聚合能力,开发者可以轻松构建出能够自我纠错、适应复杂业务逻辑的生产级智能体。
立即在 n1n.ai 获取免费 API 密钥。