如何利用 LangGraph 构建一个具备自我修正能力的自动化代码审查 Agent

前端小哥哥 中级 2026/5/8 112 浏览 6 点赞 约 2 分钟

直接把 LLM 当成 Code Reviewer 最大的问题是它太“客气”且容易幻觉,很多建议看似正确但跑不通。要实现真正的自我修正,必须把 LLM 扔进一个「审查 → 执行 → 反馈」的闭环里。我用 LangGraph 搭建了一套工作流,核心逻辑是让 Agent 在提交建议前,必须先在沙箱里把修改后的代码跑一遍。

如何利用 LangGraph 构建一个具备自我修正能力的自动化代码审查 Agent

核心状态定义
首先得定义一个 State 来传递代码版本和错误日志,不能只传对话历史,否则上下文太长会导致 LLM 丢失细节。

from typing import TypedDict, List

class AgentState(TypedDict):
    code: str               # 当前代码版本
    review_comments: List[str] # 审查意见
    error_log: str          # 编译器/测试用例报错
    iteration_count: int    # 防止死循环的计数器

构建状态图的关键节点
我设置了三个关键节点:Reviewer(找茬)、Coder(修复)和 Executor(验证)。

1. Reviewer 节点:这里我用了 Claude 3.5 Sonnet,因为它对逻辑漏洞的感知比 GPT-4o 强。提示词里强制要求它输出具体的文件行号和修改建议。
2. Executor 节点:这是自修正的灵魂。不要让 AI 猜代码能不能跑,直接调用 subprocess 运行 pytestpylint

import subprocess

def executor_node(state: AgentState):
    # 将代码写入临时文件并运行测试
    with open("temp_test.py", "w") as f:
        f.write(state['code'])
    
    result = subprocess.run(["pytest", "temp_test.py"], capture_output=True, text=True)
    return {"error_log": result.stderr if result.returncode != 0 else "PASS"}

3. 条件路由 (Conditional Edge)
根据 Executor 的返回结果决定流向。如果 error_log 为 "PASS" 且 iteration_count 没超标,直接结束;否则打回 Coder 节点重新修改。

踩过的坑与优化技巧

避免死循环:LLM 有时会陷入「修复 A → 导致 B 报错 → 修复 B → 回到 A 报错」的循环。我在 State 中加入了 iteration_count,设定上限为 5 次,一旦超限强制输出当前最优版本并标注「无法自动修复」。

Prompt 技巧:在 Coder 节点的提示词中,我加入了:"对比之前的错误日志 {error_log},分析为什么之前的修改失败了,不要重复之前的错误路径"。这比简单的 "请修复代码" 效率高得多。

配置建议:建议给 Executor 节点配置独立的 Docker 容器,防止 AI 生成的删库脚本把本地环境搞崩。

效率提升点
这套方案把原本需要人工「提交 → 等 CI 报错 → 修改」的 15 分钟循环,压缩到了 30 秒内的自动化迭代。最爽的是,最后交给人类 Reviewer 的代码,已经是通过了所有单元测试的干净版本。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式