如何利用 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 运行 pytest 或 pylint。
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)
还没有回复,来发第一条吧!
