AI 应用应该记录哪些日志

传统 Web 应用记录日志,通常关注请求是否成功、接口耗时、错误堆栈和数据库查询。

AI 应用也需要这些,但远远不够。

当用户说“这次回答不对”“它突然变慢了”“为什么扣了这么多额度”“为什么模型忘了前文”,普通接口日志很难回答。因为 AI 输出不是一个确定性函数,它受模型、prompt、上下文、检索、工具、历史消息、采样参数和运行状态共同影响。

AI 应用的日志要能回答三个问题:

  • 发生了什么?
  • 为什么会这样?
  • 下次如何改进?

这意味着日志不只是排错工具,也是成本管理、质量评估、安全审计和产品迭代的基础。

AI 日志和普通日志有什么不同

普通接口通常可以用 request、response、status、latency 定位大部分问题。

AI 请求更复杂。一次看似简单的聊天回复,可能包含:

  • 用户消息。
  • 系统 prompt。
  • 历史消息裁剪。
  • 检索片段。
  • 工具定义。
  • 模型路由。
  • Provider 调用。
  • streaming delta。
  • 工具调用和工具结果。
  • token 用量。
  • 内容安全判断。
  • 用户反馈。

其中任何一环变化,都可能改变最终答案。

所以 AI 日志需要覆盖完整链路,而不是只记录最终文本。

这张图不是要求所有日志都放在一张表里,而是提醒我们:AI 可观测性是一条链路。只记录其中一段,就很难解释整体行为。

第一类:请求与身份日志

每次 AI 请求都应该有稳定的 trace id 或 run id。

基础字段包括:

字段含义
run_id一次 AI 运行的唯一 id
request_idHTTP 请求 id
tenant_id租户或组织
user_id发起用户
feature功能入口,如 chat、summary、rewrite
thread_id会话 id
message_id触发消息
clientWeb、mobile、extension、internal tool
created_at请求时间

这些字段决定日志能不能串起来。

前端报一个 run id,后端应该能查到对应用户、会话、模型调用、token 用量和错误。没有统一 id,线上问题会变成“你把当时的问题再发我一遍”。

对前端来说,run id 也应该出现在错误上报和用户反馈里。用户点击“这条回答不好”时,不只是提交一段文本,而是提交这次生成的可追踪引用。

第二类:模型调用日志

模型调用日志记录 Gateway 或 AI Runtime 实际调用了什么。

常见字段包括:

  • provider。
  • model。
  • model policy。
  • prompt version。
  • temperature、top_p、max_tokens。
  • response format。
  • tools enabled。
  • streaming enabled。
  • fallback from。
  • retry count。
  • normalized error code。

这里的重点不是把 Provider 请求原样完整保存下来,而是保留足够复现和分析的结构化信息。

例如,当模型质量突然下降,你需要知道是不是模型版本换了、temperature 被改了、prompt version 更新了、fallback 到了更弱模型,还是输出格式约束被关闭了。

如果只记录“请求成功,耗时 8 秒”,基本没有分析价值。

第三类:上下文日志

上下文是 AI 应用里最容易出问题、也最容易缺日志的部分。

一次模型调用到底看到了什么?它有没有看到用户刚上传的文件?有没有引用过期历史?检索结果是不是错的?系统 prompt 有没有被错误拼接?

上下文日志可以记录:

字段含义
context_strategy最近 N 轮、摘要、RAG、混合策略
included_message_ids本次注入的历史消息
excluded_message_count被裁剪的消息数
summary_id使用的滚动摘要
retrieval_query检索查询,可脱敏
retrieved_doc_ids命中文档
retrieved_chunk_ids命中片段
context_tokens上下文 token
redaction_applied是否脱敏

注意,上下文日志不一定要保存完整明文。很多产品不能把用户隐私、业务数据或文件内容原样写进日志。更稳妥的方式是保存引用、摘要、哈希、长度、token 数和脱敏后的片段。

如果需要保存完整 context snapshot,也应该放在受控存储里,并设置访问权限、保留周期和脱敏策略。

第四类:Streaming 与运行时日志

AI Chat 的体验问题经常发生在生成过程中,而不是请求结束后。

你需要知道:

  • run 什么时候开始。
  • 首 token 什么时候出现。
  • streaming 中间是否断开。
  • 用户是否点击停止。
  • 是否发生服务端超时。
  • 是否有 delta 写入失败。
  • 是否出现部分输出后失败。

关键指标包括:

  • queue_time_ms:排队时间。
  • first_token_ms:首 token 时间。
  • generation_ms:生成耗时。
  • total_latency_ms:总耗时。
  • stream_event_count:streaming 事件数量。
  • client_aborted:客户端是否中断。
  • server_cancelled:服务端是否取消。

前端看到“卡住了”,背后可能是排队、Provider 慢、首 token 慢、网络断流、浏览器中断或渲染压力。没有运行时日志,很难区分。

第五类:Token、成本和配额日志

AI 应用必须记录 token 和成本。

至少记录:

字段含义
input_tokens输入 token
output_tokens输出 token
total_tokens总 token
cached_tokens命中缓存的 token,如果 Provider 支持
estimated_cost估算成本
quota_before请求前额度
quota_after请求后额度
billing_unit次数、额度、金额或 token

这些日志可以回答:

  • 哪些功能最贵?
  • 哪些用户或租户消耗异常?
  • 成本上涨来自输入还是输出?
  • 重试和失败浪费了多少?
  • 哪个模型性价比更好?

对前端产品来说,成本日志还会变成额度 UI、套餐设计、用量报表和限制提示的基础。

第六类:工具调用和外部动作日志

只要 AI 能调用工具,日志就必须更严格。

工具调用可能读取数据、写入系统、发送邮件、创建订单、修改配置。模型可以建议,但真实执行必须由系统负责审计。

工具日志应该记录:

  • tool name。
  • tool call id。
  • run id。
  • arguments。
  • arguments redaction status。
  • required permission。
  • approval status。
  • executor。
  • external request id。
  • result status。
  • result summary。
  • error code。

对于高风险工具,还要记录用户确认:

  • 谁确认了。
  • 什么时候确认。
  • 确认前展示了什么内容。
  • 最终执行了什么参数。

不要只在 prompt 里写“高风险操作要确认”。确认应该是系统流程,日志也要能证明它发生过。

第七类:质量反馈日志

AI 应用上线后,质量改进不能只靠感觉。

用户反馈日志包括:

  • thumbs up / thumbs down。
  • 用户选择的原因。
  • 用户是否点击重试。
  • 用户是否编辑了 AI 输出。
  • 用户是否复制、插入、采纳或删除结果。
  • 用户是否继续追问。
  • 人工标注的正确性。

这些反馈能帮助你建立评估集。

例如,一条差评回答可以关联 run id、context snapshot、model、prompt version 和用户修改后的最终文本。后续你可以用它做回归测试,验证 prompt 修改或模型升级是否真的改善了问题。

前端在这里很关键。反馈入口如果太重,用户不会填;如果只收一个“差评”,工程团队又很难知道哪里错。更好的方式是提供轻量反馈,并在必要时让用户选择原因,例如“不准确”“没理解上下文”“太啰嗦”“格式不对”“引用错误”。

第八类:安全与审计日志

AI 应用可能处理敏感数据,也可能代表用户执行动作,所以安全日志不能缺。

需要关注:

  • 权限校验结果。
  • 数据脱敏结果。
  • prompt injection 检测。
  • 内容安全拦截。
  • 敏感信息输出风险。
  • 工具调用审批。
  • 管理员或内部人员查看日志的行为。

一个容易忽视的点是:日志本身也可能变成敏感数据仓库。

如果你把用户输入、检索内容、工具结果、模型输出全部明文写入日志,那么日志系统就拥有了比业务数据库更混杂、更难管控的数据。AI 日志必须有脱敏、权限和保留周期。

日志数据流设计

一个较完整的 AI 日志链路可以这样设计:

这里有两个实践建议。

第一,日志要结构化。不要只写自然语言字符串。模型、token、耗时、状态、错误码、功能入口、租户都应该是可查询字段。

第二,日志要分层存储。高频运行日志、长期分析指标、安全审计、完整上下文快照,不一定放在同一个系统里。它们的访问权限、保留时间和查询方式不同。

前端工程师要关心哪些日志

前端不负责全部日志系统,但很多关键数据来自前端。

前端应该传:

  • client request id。
  • thread id 和 message id。
  • 用户触发入口。
  • 选中文本、页面对象或文件引用。
  • abort、retry、regenerate 等用户操作。
  • 用户反馈。
  • 客户端错误和断流信息。

前端也应该消费:

  • run id。
  • run status。
  • normalized error code。
  • usage summary。
  • fallback 或降级状态。
  • source/citation 信息。

这样 UI 才能准确表达“正在生成”“工具执行中”“已取消”“可重试”“上下文过长”“额度不足”“基于哪些来源回答”。

AI 日志不是后端的内部事务。它最终会变成前端可见状态和用户信任的一部分。

常见坑

坑一:只记录最终回答。

最终回答无法解释模型为什么这么回答。至少要记录模型、prompt version、上下文引用、token、耗时和状态。

坑二:完整明文记录所有 prompt 和上下文。

这样排查方便,但安全风险极高。日志要有脱敏、访问控制和保留周期。能存引用时,不要盲目存全文。

坑三:错误码不归一。

Provider 的原始错误不适合直接给前端和分析系统使用。应该映射成内部错误码,例如 rate_limitedcontext_too_longquota_exceededprovider_timeouttool_failed

坑四:没有记录失败和取消。

失败、取消、中断、超时往往比成功更有分析价值。只记录成功请求,会系统性低估成本和体验问题。

坑五:反馈和 run 脱节。

用户点了差评,但没有关联 run id、message id、prompt version 和 context,就很难把反馈转化为评估样例。

坑六:日志字段没有租户维度。

多租户产品如果缺少 tenant_id,后续成本分摊、权限隔离、异常排查和企业报表都会很麻烦。

坑七:日志太多但无法查询。

日志不是越多越好。没有结构化字段、索引、采样策略和仪表盘,海量日志只会增加存储成本。

小结

AI 应用的日志要覆盖请求、身份、模型、上下文、运行时、token 成本、工具调用、质量反馈和安全审计。它不是简单的 debug 输出,而是 AI 系统可观测、可评估、可控成本和可合规的基础。

对前端工程师来说,日志的意义也不只是后端排查。run id、streaming 状态、错误码、引用来源、用量反馈和用户评价,都会直接进入产品体验。

当你能从一条用户反馈追溯到一次 run、一个 prompt 版本、一组上下文、一串工具调用和一份 token 成本时,AI 应用才真正具备持续改进的能力。