测试与发布证据

Android 端侧 AI 提示词截断诊断:逐层定位内容丢失

用固定标记输入跟踪内容在哪个可观察边界消失,不用字符数猜 token 或上下文上限。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-04 · Fact IDs: MEMORY-01, COVE-LIFECYCLE-01

直接回答

诊断疑似提示词截断,应该逐层对比请求管线中的准确文本。先保存用户输入的测试源文本,再比较应用归一化后的输入、渲染完成的聊天模板、所选 API 能暴露的 tokenizer 或运行时输入表示、配置的输出预算,以及应用最终收到的响应。找出预期内容第一次消失的边界。回答较短本身不能证明提示词被截断:模型可能有不同的信息优先级、提示可能含糊、生成可能提前停止,也可能是应用解析器丢弃了内容。反过来,日志里看到了完整文本,也不证明运行时消费了所有 token。 应把准确模型制品、模板、tokenizer、运行时、解码配置和输入夹具作为一条可复现记录。LiteRT-LM 有独立的运行时和打包环境,因此不能因为任务看起来相似,就把 GGUF、MediaPipe 或其他模型文档中的 tokenizer 假设和格式说明直接移植过来。如果运行时没有暴露 token 数或最终序列化请求,应明确说明当前集成无法观测精确截断边界。不能从模型家族介绍页面编造上下文窗口,也不能把字符数当成 token 数。 建立一组边界夹具,包含短、普通和刻意拉长的输入,并在开头、中间和末尾放置独特标记,再准备必须保留的信息清单。一次只改变一个因素:模板、源文本归一化、上下文分配、输出预算,最后才看解析器。完整提示词只应出现在不含用户隐私的受控测试材料中。生产诊断宜记录脱敏后的长度和阶段元数据,而非保存用户输入或生成答案。对于不同产品功能,还要明确应用如何处理过长输入:截断源文本、缩短对话历史、拒绝超长输入,还是提示用户缩短。静默截断最难解释;当源文事实需要保留时,还可能导致重要信息丢失。 项目当前没有完整真实设备基准数据,事实卡也说明模型下载大小不能推导运行时缓冲区及 token 相关工作状态。因此本文给出的是诊断方法,不是对任何手机最大上下文、内存容量或回答质量的断言。可靠结果应指出哪一层转换或丢弃了内容;若当前运行时集成无法观测,就如实分类为未知,并加入可回归的测试夹具。 一个好的复现用例应让失败“可见”:如果应用在模板生成前已删掉尾部,标记会在应用输入边界消失;若模板扩展把内容挤出实际窗口,只有在运行时提供序列化输入或 token 观测时才能确认;若生成达到停止条件,则源输入仍完整但输出末尾结束;若界面解析器只保留首个字段,原始响应与渲染状态将不一致。不要用一段自然语言的“看起来少了”代替证据。为每种情况设立各自的验收与错误码,后续更换提示模板、运行时或制品时才能知道差异来自哪一层。 用户体验也需要透明。例如,超长文本被拒绝时应说明原因并提供分段或缩短建议,而不应悄悄删掉尾部后展示貌似完整的摘要。如果系统只能给出部分结果,要标示处理范围及仍未覆盖的材料;不能推测未处理段落的内容。对于生产支持,最好仅保留应用版本、制品版本、模板版本、输入长度区间、最后确认阶段、停止原因和解析结果类别,不上传原文或回答。这样既能在复现时定位管线,也能避免为了方便排障而默认收集私密文档。

生成摘要总是漏掉文档末尾一段

用户将一篇较长文档粘贴到 Android 应用中。输出流畅却漏掉了末尾的重要事实。应用最近修改了提示模板,团队要判断问题来自推理前截断、模板挤占、输出预算、停止条件还是解析阶段。

决策

使用含边界标记的固定夹具逐层比较,并一次只改一个管线环节。尚未观察到缺失边界前,不把症状命名为“上下文超限”。

预期结果

团队能指出可复现的文本转换,或如实说明当前运行时集成无法观察该原因;随后添加回归检查,不保留用户的真实文档。

需要收集的证据

只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:

  • MEMORY-01:运行时缓冲、KV cache、输入张量和分配器都会影响内存,不能由下载大小推断。
  • COVE-LIFECYCLE-01:Cove ModelManager 有明确的模型加载状态;加载状态和推理请求内容属于不同诊断阶段。

发布结论只对所记录的配置和验收集有效;扩大适用范围需要更多记录。

实施流程

  1. 冻结执行身份. 记录准确制品版本、运行时包及版本、聊天模板、已知 tokenizer 身份、生成配置、应用构建和输入夹具。若多项变量同时变化,不要把两条轨迹直接比较。
  2. 添加边界标记和验收清单. 建立不含隐私的合成输入,在开头、中间和末尾放入唯一标记,并列出必须保留的事实。在检查生成答案前先定义什么叫保留、截断和可接受摘要。
  3. 跟踪每个可观察请求层. 依次记录源文本、应用归一化结果、渲染模板;只有 API 暴露时才记录运行时序列化请求或 tokenizer 输出。记录输出预算和停止原因。隐藏边界要标为不可观察,不能用字符数估算填补。
  4. 隔离应用转换与模型行为. 标记在运行时边界前消失,就查应用截断或模板拼装;输入仍完整但生成提前结束,就查停止条件与输出预算;原始响应含事实而界面没有,就查解析与展示。重复固定夹具,区分确定性管线问题和模型输出变化。
  5. 制定并测试明确产品策略. 为超长输入选择用户可见方案:解释拒绝、按有文档的方法切块,或明确披露范围后再摘要。每个边界加入单元夹具,并从遥测和日志中排除生产私密内容。

让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。

验收标准

  • 团队能指出所有必需标记最后一次被观察到的管线阶段;若原生集成隐藏边界,也明确记录为不可观察。
  • 字符数不被当作 token 数,未获得对应制品与运行时证据前不声明上下文上限。
  • 固定合成夹具把输入截断、生成停止和解析丢失作为不同失败类别检测。
  • 生产诊断不会为了排查截断而保存原始用户提示词或生成文本。

决策对照表

维度选择或证据解读方式
源文本/应用边界对比用户输入与归一化输入定位模板拼装前发生的应用裁剪、归一化或字段长度限制。
模板/运行时边界仅在 API 暴露时检查序列化请求或 tokenizer 输出可以发现模板扩展和运行时变换;隐藏边界必须明确标成未知。
输出/界面边界对比原始响应、停止状态、解析结果和渲染视图区分生成提前停止与应用过滤或界面展示丢失。

需要避免的失败模式

  • 把短回答直接归因于上下文窗口溢出。
  • 用字符数比例猜 token 数,或把未知运行时边界写成已观测事实。

还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。

最小复现记录

层级记录内容
设备厂商、型号、芯片、内存档位、操作系统版本
软件应用版本和 Git 提交号
模型系列、变体、版本、格式、文件长度、摘要、量化方式
运行时名称、版本、请求后端及实际后端证据
工作负载样例版本、输入摘要、提示词摘要、输出策略
结果完成、失败、取消、回退及保护隐私的诊断信息

发布检查表

  • ☐ 主要搜索问题已回答,且没有未经支持的数字。
  • ☐ 所有模型文件和运行时版本均已固定。
  • ☐ 代表性任务和失败处理策略均有说明。
  • ☐ 生命周期、取消、清理和回退均已测试。
  • ☐ 用户内容与网络边界均有说明。
  • ☐ 结论只适用于被记录的配置。
  • ☐ 新增测试结果时链接到原始方法或证据。

来源与相关证据

中文部署与排错专题见。奇连 AI 端侧专题。

常见问题

回答很短是否说明模型触及上下文限制?

不能据此判断。模型可能选择性摘要、输入可能含糊、生成可能提前停止,或者应用过滤了输出。应先比较可观察的请求和响应边界,再确定原因。

能否用字符数除以常数估算 token?

不要把这种估算当作精确 token 数。分词取决于具体制品和 tokenizer。可用时应通过官方暴露的 tokenizer 或运行时测量;否则将该数标成未知,并加入回归检查。

为排查问题,生产日志是否应记录完整提示词?

通常不应如此。可用合成夹具复现,并在生产环境记录脱敏阶段和长度区间。原始提示与输出可能含私密内容,不应仅为了调试方便默认保存。