Skip to content

可观测执行器与测试替身 ​

Agent 服务的日志要能回答:哪次运行、哪一步、哪个模型、哪个工具、用了多少预算、为何停止。日志、指标和 trace 共享关联 ID,但敏感输入要脱敏,不能把完整提示词和密钥直接写入日志。确定性模型替身可以验证控制流,不能证明真实模型质量。

第一个可运行实验:记录跨度与敏感字段 ​

保存为 executor.py,用 Python 3.12 运行。

python
SENSITIVE = {'api_key', 'token', 'password'}

def scrub(payload):
    return {k: '[redacted]' if k in SENSITIVE else v for k, v in payload.items()}

def execute(run_id, steps):
    records = []
    for step, item in enumerate(steps, 1):
        records.append({'run_id': run_id, 'step': step, 'event': item['event'],
                        'attrs': scrub(item.get('attrs', {}))})
    return records

trace = execute('run-1', [
    {'event': 'model.request', 'attrs': {'model': 'test', 'token': 'secret'}},
    {'event': 'tool.result', 'attrs': {'count': 1}},
])
assert trace[0]['attrs']['token'] == '[redacted]'
assert [x['step'] for x in trace] == [1, 2]
print('observable executor passed')

生产 trace 还要记录父子 span、首 token 延迟、完整延迟、重试次数、工具耗时和停止原因。用户内容、检索文档和工具结果按数据分级处理;脱敏不能破坏排障所需的 request ID、schema 版本和错误分类。

变体实验 ​

让嵌套属性也包含 token,要求递归脱敏。再模拟异常,确认失败事件仍写入并带同一个 run ID。

练习 ​

  1. 设计模型调用、工具调用和队列任务的 trace span 关系。
  2. 为日志增加成本、缓存命中和供应商 request ID。
  3. 列出不能进入普通日志的字段,并给出可搜索替代字段。

用心记录每一步成长