# 审计模块详细设计 ## 1. 模块目标 Audit 模块记录 Agent 执行过程,使演示者能够解释一次输出的来源、工具调用和模型结果。它是系统从“普通问答页面”变成“可追踪业务 Agent”的关键。 ## 2. 职责边界 负责: - `AgentAuditLog` 模型。 - 审计写入服务。 - 审计列表页。 - 审计详情页。 - 敏感信息过滤。 不负责: - 不执行 Agent。 - 不执行 RAG。 - 不执行工具。 - 不调用模型。 ## 3. 数据模型设计 模型:`AgentAuditLog` 字段见 `docs/设计文档/3.数据库设计.md`。 JSON 字段默认值必须使用函数,例如 `default=list`、`default=dict`,避免多实例共享同一对象。 ## 4. 日志写入流程 服务函数: ```python def create_audit_log( scenario_id: str, scenario_name: str, user_input: str, agent_result: AgentResult, ) -> AgentAuditLog: """将 AgentResult 映射为 AgentAuditLog,并在保存前做敏感信息脱敏。""" ``` 写入映射: - `agent_result.references` -> `retrieved_chunks` - `agent_result.tool_calls` -> `tool_calls` - `agent_result.structured_output` -> `structured_output` - `agent_result.answer` -> `final_answer` - `agent_result.raw_output` -> `raw_output` - `agent_result.model_name` -> `model_name` - `agent_result.latency_ms` -> `latency_ms` - `agent_result.status` -> `status` - `agent_result.error` -> `error_message` ## 5. 日志列表页设计 路径:`/audit/` 查询: - 默认按创建时间倒序。 - V1 可不做分页,若日志较多再加 Django Paginator。 展示: - ID。 - 场景名称。 - 用户输入前 80 字。 - 状态。 - 模型名。 - 耗时。 - 创建时间。 - 详情链接。 ## 6. 日志详情页设计 路径:`/audit//` 展示: - 基础信息。 - 用户输入。 - 最终回答。 - 结构化输出。 - RAG 检索片段。 - 工具调用。 - 原始输出。 - 错误信息。 JSON 可用格式化后的 `
` 展示。

## 7. 敏感信息处理

不得保存:

- `LLM_API_KEY`
- 完整环境变量 dump
- 用户机器上的敏感绝对路径
- Docker secret 或 token

如错误信息来自异常对象,应在保存前做简单脱敏,至少替换 API Key 值。

## 8. 异常处理

| 异常 | 处理 |
|---|---|
| AgentResult 字段缺失 | 使用默认空值 |
| JSON 不可序列化 | 转为字符串或空对象 |
| 日志不存在 | 返回 404 |
| 写入失败 | 抛给 Chat,由 Chat 展示审计失败提示 |

## 9. 验收标准

- 每次对话成功后有审计日志。
- Agent 失败也有失败日志。
- 列表页可查看日志摘要。
- 详情页可查看输入、输出、引用和工具调用。
- 日志不包含 API Key。