设计原则
可信 AI 界面要让用户知道哪些结论有来源、来源是否可访问、证据何时生成、如何打开或复制,以及缺失/过期/低置信来源如何处理。
大理论
AI 答案的可信度不能只靠模型语气或一个“Sources”标题来建立。用户需要把具体 claim 追溯到具体来源,知道来源是网页、文件、数据库行还是 tool result,并理解 citation 在 streaming 过程中的状态。一个健康的 AI evidence surface 会同时处理阅读流、引用粒度、证据卡、权限边界、复制分享、错误恢复和移动端可用性。
小知识点
- 先定问责级别:普通探索、内部辅助、客户可见、高风险领域或合规审计。风险越高,越需要 timestamp、no-answer、人工复核和 evidence export。
- 引用粒度按任务选择:claim-level 用 inline citations,answer-level 用 source list,复杂证据用 source cards/drawer;不要把每句话都标号造成阅读噪音。
- citation data 至少包含 stable id、source type、title、href/locator、provider、snippet/quote、cited claim ids、retrievedAt、access/status 和可选 score。
- 答案、证据、推理要分层:final answer 负责阅读;sources 负责可验证证据;tool logs/retrieval traces/reasoning summary 进入独立折叠区。不要把隐藏 chain-of-thought 当作信任 UI。
- streaming 时 citation 状态必须诚实:sources pending、partial sources、complete、error。source 未到时不要显示可点击的最终引用标记。
- source card 要处理 missing、stale、inaccessible、restricted 和 low-confidence 状态;内部文档不能泄露用户无权限看到的文件名、路径或 URL。
- copy/share/export 必须决定是否保留 citation;如果不保留,需要明确提示。否则复制出去的答案会失去证据上下文。
- hover-only citation 不够;移动端和键盘用户需要可聚焦 trigger、可关闭 popover/drawer、清晰 aria label 和不会整页溢出的长 URL/snippet。
设计判断
如果用户能从同一条答案中定位被引用 claim、打开或检查来源、看到 snippet/quote、知道证据是否完整,并在复制/分享时保留来源,这个契约成立。若 sources 只是答案底部一组链接,或 citation marker 与 source card 对不上,它不能支撑可信 AI 体验。
实现建议
建立 AiResponseCitationContract:answerId、status、riskLevel、answerParts、citations 和 actions。React 实现中把 source parts 与 text parts 独立存储,并用 stable ids 连接;source card 和 inline marker 都从同一 citations 数组渲染。AI SDK/AI Elements 项目可组合 Sources、Inline Citation、Message、Reasoning;assistant-ui 适合生产聊天 runtime 和多后端集成;tool-ui Citation 适合把 tool payload 变成 schema-validated source card。测试覆盖 no sources、one source、many sources、sources pending、missing source、permission denied、copy with citations 和移动端 drawer。
反例/风险
答案最后只有“Sources: 3”但不知道哪个 claim 对应哪个来源;streaming 过程中先出现 citation pill 后 source 为空;检索分数直接作为置信度展示;hover 卡在手机上不可用;复制答案时丢掉引用;内部知识库把私有文件路径显示给外部用户;reasoning、tool logs 和 evidence 混在同一个信任抽屉里。
案例分析
AI Elements 的 Sources 组件说明它用于查看生成回答所用的 sources/citations,并支持 collapsible source list、自定义来源、响应式控制;示例里通过 sendSources: true 把 source-url message parts 传给前端。Inline Citation 组件把 citation pill、source card、carousel、source metadata 和 quote 分开,并明确目前 inline citations 不适合直接依赖普通 markdown/Response,需要 structured citation data。Reasoning 组件则把 reasoning content 放进独立 collapsible 区,并提醒 reasoning 与 Chain of Thought 可用不同呈现。tool-ui 的 Citation 组件强调 clickable reference card、title、domain、favicon 和 snippet,让读者可追溯 claim。可学习点是:可信 AI UI 不是单个链接列表,而是 answer parts、source data、streaming status 和 evidence actions 的共同契约。
来源链接
AI Elements: https://elements.ai-sdk.dev/ AI Elements Sources: https://elements.ai-sdk.dev/components/sources AI Elements Inline Citation: https://elements.ai-sdk.dev/components/inline-citation AI Elements Message: https://elements.ai-sdk.dev/components/message AI Elements Reasoning: https://elements.ai-sdk.dev/components/reasoning AI SDK streamText: https://ai-sdk.dev/docs/reference/ai-sdk-core/stream-text assistant-ui: https://www.assistant-ui.com/ assistant-ui GitHub: https://github.com/assistant-ui/assistant-ui tool-ui Citation: https://www.tool-ui.com/docs/citation tool-ui GitHub: https://github.com/assistant-ui/tool-ui
Agent 指令
生成 AI 答案 UI 前必须输出 citation data contract、streaming source states、source card/drawer 行为、权限边界和 copy/export 规则;禁止只在答案底部放一组不可映射链接。