审计日志 & 对话留痕
设计原则
- 全量记录:所有对话输入/输出均留痕
- 不可篡改:写入后不可修改,只可查询
- 可搜索:支持按员工/时间/关键词检索
- 可导出:支持 CSV 导出,满足合规要求
审计字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | UUID | 唯一记录 ID |
| user_email | string | 员工邮箱 |
| timestamp | datetime | UTC 时间戳 |
| instance_id | string | 实例 ID |
| session_key | string | Session Key |
| model | string | 使用的模型 |
| input_text | text | 用户输入 |
| output_text | text | AI 输出 |
| input_tokens | int | 输入 Token 数 |
| output_tokens | int | 输出 Token 数 |
| latency_ms | int | 响应耗时(毫秒) |
| cost_usd | decimal | 本次费用(美元) |
技术实现
采集方式(LiteLLM 回调)
# litellm callback
import litellm
from litellm.integrations.custom_logger import CustomLogger
class AuditLogger(CustomLogger):
async def async_log_success_event(self, kwargs, response, start_time, end_time):
await db.audit_logs.insert({
"user_email": kwargs.get("user"),
"timestamp": start_time,
"model": kwargs.get("model"),
"input_text": kwargs["messages"][-1]["content"],
"output_text": response.choices[0].message.content,
"input_tokens": response.usage.prompt_tokens,
"output_tokens": response.usage.completion_tokens,
})
litellm.callbacks = [AuditLogger()]
存储方案
- 热数据(最近 30 天):PostgreSQL,快速查询
- 冷数据(30 天以上):BigQuery,低成本海量存储
查询界面
管理后台提供:
- 按员工邮箱过滤
- 按时间范围过滤
- 关键词全文搜索
- 导出 CSV