通过装饰器记录 AI Agent 的每一次工具调用、参数和返回值,配合 MonkeyCode 免费额度构建可重复的调试工作流,揭示模型实际行为而非最终补丁。
凌晨 2 点,我的 Agent 重写了一个配置文件。本地测试通过。部署却静默失败了。
日志没有报错。Agent 调用了 read_file 和 write_file。diff 看起来正确。但服务崩溃了。
我需要工具调用追踪。每一次输入、输出和 diff。不只是指标。
MonkeyCode 是一个开源项目。它提供免费服务器层和 1000 万免费 LLM 调用额度。足够运行一个真实调试会话的追踪分析流水线。披露:本文是 MonkeyCode 产品推广的一部分。
以下是我使用的工作流。
LLM Agent 会隐藏它们的推理过程。你只看到最终的补丁。看不出那个错误的假设。
工具调用是 ground truth。它们展示模型实际做了什么。读取了哪个文件。运行了哪个命令。写入了哪个值。
Diffs 展示变更。没有它们,你无法判断 Agent 是否编辑了正确的行。
用一个小装饰器包装每个工具。记录时间戳、工具名、参数、返回值和 token 消耗。
# trace_tools.py (example)
import json, time
from functools import wraps
TRACE_LOG = 'traces.jsonl'
def traced(name):
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
start = time.time()
result = fn(*args, **kwargs)
entry = {
'time': start,
'tool': name,
'args': kwargs,
'result': result,
'cost_tokens': kwargs.get('max_tokens', 0)
}
with open(TRACE_LOG, 'a') as f:
f.write(json.dumps(entry) + chr(10))
return result
return wrapper
return decorator
这会生成一个 JSONL 文件。每次调用一行。易于解析。
MonkeyCode 的免费服务器托管一个小型解析器。先上传日志文件。
scp traces.jsonl user@your-free-server:~/agent-runs/
然后运行分析脚本。
python analyze_trace.py traces.jsonl
捕获每次调用前后的文件状态。然后使用 difflib.unified_diff。
import difflib
def compute_diff(before, after):
before_lines = before.splitlines()
after_lines = after.splitlines()
return chr(10).join(difflib.unified_diff(
before_lines, after_lines, lineterm=''
))
在每个追踪条目中存储 before 快照。将其添加到装饰器中。
这是核心逻辑。它使用 MonkeyCode 的免费模型为每次调用打标签。
# analyze_trace.py (pseudocode)
import json, sys
def analyze(path):
with open(path) as f:
traces = [json.loads(line) for line in f]
for t in traces:
diff = compute_diff(t['before'], t['result'])
# MonkeyCode free model call (pseudocode)
label = monkeycode.complete(
prompt='Did this diff preserve intent?',
trace=t,
diff=diff,
model='free'
)
if label == 'suspicious':
print(t['time'], t['tool'])
analyze(sys.argv[1])
这个脚本回答一个问题。"哪个工具调用可能导致失败?"
我的循环有七个步骤。
这是我在每个追踪中使用的表。
diff 和参数的组合能捕捉大多数失败。
我一次又一次地看到三种模式。
调试循环能捕捉全部三个。它只需要一些好的追踪。
上周,一个 Agent 运行了一个重命名操作。它调用了 move_file(src, dst)。diff 显示旧内容被覆盖。
追踪揭示了一个第三个参数。工具 schema 改变了。Agent 使用了过时的描述。
调试循环在几分钟内捕捉到了它。不需要付费遥测。
1000 万 token 池是有限的。计划好它的用途。
假设一次分析消耗 200 token。那就是 50,000 次分析。几次失败的运行产生数百个追踪。免费层持续很长时间。
如果每次工具调用都调用模型,数学就会改变。将多次调用批量到一个 prompt 中。这样能节省 token。
这种方法需要一个可包装的 Agent。有些 Agent 使用黑盒函数。
免费服务器可能无法处理高并发。不要在那里运行生产遥测。
10M token 额度很慷慨。但不适合高频在线摘要。将你的追踪批量处理。
我的捕获脚本是示例代码。根据你自己的 Agent 框架调整它。
如果你需要实时告警,选择托管可观测性服务。
如果你的 Agent 生成许多并行工具,免费服务器可能会丢弃请求。
如果你存储敏感数据,不要将追踪上传到远程服务器。运行本地解析器代替。
工具调用追踪桥接日志和结果。你不需要大预算就能开始。
MonkeyCode 的免费层让我测试了这个流水线。你也可以试试。从一次失败的运行开始。追踪它。修复它。重复。
下次你的 Agent 在凌晨 2 点崩溃时,你会准确知道该怪哪次调用。