【CodeFlow AI 实战】拒绝盲目调试:打造 Bug Diagnosis 故障诊断智能体(Bug Diagnosis)
实现 Bug Diagnosis Agent(故障诊断智能体) 是整个 CodeFlow AI 项目中最具“侦探色彩”的部分。它的核心逻辑不是简单的文本生成,而是**“证据链还原”**。
为了实现这个 Agent,我们需要让 AI 具备像程序员一样“顺藤摸瓜”的能力:从混乱的日志(Log)中提取线索,去代码库(RAG)里寻找犯罪现场,最后给出修复建议。
第二部分:Bug Diagnosis Agent 实现教程
1. 核心流程设计
-
线索提取 (Regex Parser):从 Traceback 中提取文件名、行号、错误类型。
-
现场还原 (Context Fetcher):读取报错行及其上下游代码(Context Window)。
-
深度检索 (RAG Search):搜索项目中相关的类定义、配置文件或历史变更。
-
因果推理 (LLM Reasoning):分析变量为何为空、逻辑为何冲突。
-
提交修复 (Change Gate):通过我们上一章实现的 Change Gate 提交 Diff。
2. 核心工具代码实现
我们需要在 codeflow/langchain_agent.py 中新增一个工具类:DiagnosisToolkit。
import re
from langchain.tools import tool
class DiagnosisToolkit:
@tool
def parse_stack_trace(log_text: str):
"""从日志或堆栈信息中提取文件名和行号"""
# 匹配 Python 典型的 Traceback: File "xxx.py", line 123
pattern = r'File "(.*?)", line (\d+)'
matches = re.findall(pattern, log_text)
if not matches:
return "未能解析出有效路径,请确保输入包含标准堆栈信息。"
results = []
for file_path, line in matches:
results.append({"path": file_path, "line": int(line)})
return results[-3:] # 通常最后几行是核心报错点
@tool
def get_code_snippet(file_path: str, line_number: int, window: int = 15):
"""读取指定行号前后的代码片段"""
try:
with open(file_path, "r", encoding="utf-8") as f:
lines = f.readlines()
start = max(0, line_number - window)
end = min(len(lines), line_number + window)
snippet = "".join(lines[start:end])
return f"--- {file_path} (Lines {start}-{end}) ---\n{snippet}"
except Exception as e:
return f"读取文件失败: {str(e)}"
@tool
def propose_bug_fix(file_path: str, new_code: str):
"""通过 Change Gate 提交修复建议"""
# 调用我们上一篇博文实现的全局 ChangeManager
change_id = global_change_manager.propose_change(
file_path=file_path,
new_content=new_code,
agent_name="BugDiagnosisAgent"
)
return f"已生成修复建议,变更ID: {change_id}。请在侧栏查看预览。"
3. Agent 提示词策略 (System Prompt)
为了让 Agent 像侦探,我们需要给它注入逻辑:
“你是一名资深调试专家。当你收到日志时:1. 先解析堆栈。2. 读取报错位置的代码。3. 思考该处的变量可能来自哪里,是否有空指针、类型错误或逻辑越界。4. 如果需要,检索相关配置文件。5. 最后给出详细分析和修复代码。”
前言
每个程序员都有过这样的痛苦经历:生产环境突然报错,对着几百行的 Traceback 疯狂翻找代码,试图理清调用链。如果 AI 能像资深专家一样,看一眼日志就直接定位到那行“该死的 Bug”,甚至写好修复补丁,那该多好?
今天,我们就来为 CodeFlow AI 注入灵魂——实现 Bug Diagnosis Agent。
一、 诊断逻辑:从“看到现象”到“发现本质”
一个优秀的诊断智能体不应该只是复读报错信息。它的核心能力在于**“上下文补全”**。
我们的 Agent 遵循 P-L-A-F 诊断模型:
-
Parse (解析):自动识别日志中的文件名和行号。
-
Locate (定位):深入代码库,提取报错点周边的生存环境。
-
Analyze (分析):利用 LLM 的逻辑能力推断数据流。
-
Fix (修复):通过 Change Gate 提交安全的修复补丁。
二、 技术深挖:它是如何“思考”的?
1. 自动线索提取
Agent 使用正则工具自动扫描用户输入的日志。
-
输入:AttributeError: 'NoneType' object has no attribute 'send' in api/v1/user.py at line 45
-
动作:提取 api/v1/user.py 第 45 行。
2. 代码现场还原
只看报错那一行是不够的。Agent 会自动调用 get_code_snippet 工具,把报错行前后的逻辑全部读入。它会看到:
# Agent 看到的现场
user = user_service.get_by_id(user_id) # 假设这里返回了 None
user.send_notification(msg) # 第45行:报错点
此时,Agent 会意识到:真正的 Bug 不在第 45 行,而是在 user_service.get_by_id 为什么没查到用户。
3. 跨文件追溯 (RAG 增强)
如果 user_service 在另一个文件中,Agent 会再次发起检索,读取 user_service.py 的定义。这种递归式的探索,正是它能锁定深层 Bug 的秘诀。
三、 实战演示:一次完美的修复
用户输入:
“后台报错了,日志如下:KeyError: 'db_config' in config_loader.py:22”
Agent 的执行轨迹:
-
[Tool: parse_stack_trace] 识别到 config_loader.py 第 22 行。
-
[Tool: get_code_snippet] 读取代码,发现是在读取环境变量。
-
[Tool: scan_project] 发现根目录缺少 .env.example。
-
[Agent 思考]:用户可能漏配了环境变量。
-
[Tool: propose_bug_fix] 在代码中加入 try-except 捕获 KeyError,并给出友好的报错提示。
-
[Change Gate] UI 弹出预览:
code Diffdownloadcontent_copy
expand_less- value = settings['db_config'] + value = settings.get('db_config', 'default_local_db')
四、 核心代码展示:诊断工具链
在博客中,我们可以分享如何定义这个 Agent 的工具接口(详见上文教程中的代码)。重点在于展示如何将正则解析、文件读取、Change Gate 提交这三者串联起来。
五、 总结
Bug Diagnosis Agent 的意义在于:它缩短了从“发现问题”到“修复问题”的路径。它不再是一个只会聊天的机器人,而是一个能读懂你的代码结构、理解你的逻辑漏洞、并遵循安全规则(Change Gate)的虚拟队友。
至此,CodeFlow AI 的四大智能体已经各就各位:
-
Code Review:把控增量代码质量。
-
Test Gen:筑起逻辑防线。
-
Doc Agent:让知识不再断层。
-
Bug Diagnosis:快速消灭存量 Bug。
下一篇预告:我们将迎来终极挑战——Refactoring Agent(代码重构)。看 AI 如何在大规模屎山上进行手术,且通过单测闭环保证手术成功!
给读者的启发:
-
精准上下文:给 AI 提供的信息不是越多越好,而是越准越好(通过行号定位)。
-
多级确认:对于诊断出的修复方案,永远不要跳过 Change Gate。
学习建议:
-
练手:尝试故意在你的代码里造一个 ZeroDivisionError,然后把日志扔给你的 Agent,看它能否准确找到那个分母。
-
扩展:如果你的项目是 Java 或 Go,记得修改 parse_stack_trace 里的正则逻辑,去适配不同语言的报错格式。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)