先这样答
解决这个问题的核心原则是数据视图的分离。工具执行完毕后,不需要把所有结构化数据转成纯文本塞进对话流,而是让同一次工具调用在用户端和模型端呈现两种不同的视图。
在用户端,工具返回的是带有类型标记的 JSON 数据。比如查询天气或股票,后端返回的结构化载荷中会明确标识数据类型是表格、卡片还是操作按钮。前端拦截到这个工具调用的响应后,不会直接把纯文本展示给用户,而是根据类型标记动态加载对应的 UI 组件,用结构化的方式把 JSON 里的字段映射到卡片或表格中渲染出来。这种方式能保证用户看到的信息直观且具备交互性。
在模型端,我们需要严格控制上下文的 token 消耗。如果把完整的表格或冗长的 JSON 直接喂给大模型,不仅会浪费大量 token,还容易导致模型注意力分散。因此,给模型输入的通常是经过处理的摘要数据。比如只告诉模型查询成功,共返回十条记录,最高价为某某,让模型基于这个精简的上下文生成一句自然的回复。前端再将模型的文本回复与渲染好的结构化组件组合展示。
总体来说,通过结构化载荷与双向视图分离,我们既保证了用户界面的表现力,又守住了模型上下文的容量底线。
面试官会怎么追问
- 「如果工具返回的表格数据量特别大,比如有几千行,怎么处理?」 这种情况需要实施大结果截断策略。前端渲染时可以采用分页组件或虚拟列表,只加载首屏数据,避免浏览器内存溢出。模型端则只截取前几行数据或提取整体统计特征作为摘要输入,防止上下文超载。
- 「要是前端没有对应的组件,或者 JSON 结构解析失败了怎么办?」 需要设计渲染失败降级为文本的机制。前端在捕获到组件加载错误或数据格式不匹配时,自动触发降级逻辑。此时直接把 JSON 转化为格式化的纯文本字符串展示,或者调用模型生成一段解释性文字,保证对话流程不断裂。
- 「工具返回的数据里如果包含用户隐私或者敏感字段,渲染时要注意什么?」 必须在后端的工具结果处理层进行敏感字段脱敏。在组装返回给前端的 JSON 载荷之前,对手机号、身份证等字段进行掩码处理。同时要确保给模型输入的摘要中也清除了这些敏感信息,防止模型在后续对话中发生隐私泄露。
回答的坑
- 认为所有工具结果都必须先经过大模型总结再展示给用户,正确的做法是前端直接根据 JSON 渲染结构化组件,大模型只负责生成辅助性的过渡话术。
- 忽略了模型输入与用户展示的差异,把完整的表格结构一股脑塞给大模型,正确方向是执行分离原则,给模型看摘要,给用户看完整结构。
同系列的题
—— 本题完 ——