直接回答
重复 token 循环只是输出症状,可能来自多个位置。首先确认重复内容存在于运行时的完整响应里,还是只在应用组装流事件后出现。随后核对实际发送给运行时的提示词和对话历史、制品与 tokenizer 身份、模板、解码设置和停止/结束状态。模型可能重复生成一句话,提示历史可能已包含两次,收集器可能重复追加一个块,恢复界面也可能重放旧状态。这些原因要用不同修复;如果没有受控轨迹就直接调温度或其他采样值,可能遮住问题,而不是定位问题。 建立有版本的合成夹具,包括曾出现症状的短提示、纯单轮控制和多轮案例。固定制品、运行时、提示模板、解码设置、应用构建和流收集器行为。若接口暴露事件序号,就记录对话历史项、每个块、终止事件和最终解析结果。如果运行时只返回最终字符串,就说明无法观察块级证据。比较完整渲染的提示历史,但不要在诊断日志中保存真实用户对话。不能仅凭一个案例就将可见重复归类成通用模型缺陷。 先检查提示历史。应用可能把最新用户回合再次追加到已经包含它的会话,离开页面后恢复旧流,或用过期状态重试请求。应将目标回合序列和提交前的准确渲染对话对照,包括角色边界和回合结束标记。然后检查流生命周期:一个请求 ID 只应有一个收集所有者;部分文本只追加一次;完成或取消后的请求不能继续写入后续任务。屏幕观察者重启,并不自动说明原生生成重新开始或已经停止。 只有排除输入与应用投递问题之后,才测试解码或模型行为。在同一夹具上一次只改一个有文档依据的解码参数,进行重复运行并报告所有结果,不要只挑一个最好的答案。提示词或停止 token 是单独变量,也要绑定准确模型格式。除非所选运行时和模型文档支持,否则不能给出通用温度、重复惩罚或停止 token 建议。报告里还应包含结束原因和取消行为。 本文是测试方法,不是性能或模型质量结果。项目基准事实要求定量主张具备设备与配置原始记录。目标是标出重复首次出现的边界,保留回归夹具,并向用户提供清晰恢复方式,例如停止、使用干净会话重试或编辑提示词。日常诊断不要保存真实对话;多数问题用合成夹具和脱敏阶段元数据即可复现。 回归测试应把应用的任务身份纳入断言:请求 ID、会话 ID、观察者实例以及可见页面状态要相互对应。如果旧任务在新会话开始后又返回数据,应用应丢弃或隔离,不得串入当前文本。模型层输出重复与应用层重复需要不同错误类别,也可使用不同支持提示。若根因仍不可观察,就保留未知,而不是因为某个解码参数让演示更好看便宣布修复完成。 用户可见恢复也不需要暴露技术细节。界面可提供停止本次生成、清空会话后重试或编辑上一条输入;同时保留已确认完成的部分文本。不要偷偷重发含私人信息的请求,或把重复内容当作确定的最终答案自动保存。报告只记配置摘要、阶段码、事件顺序和结果类别。这样既能帮助工程师查清重复发生在哪里,也能确保排障不变成默认收集聊天内容。
离开聊天页面再返回后,最后一句重复出现
用户发出一次提示,流式生成期间导航离开再返回,界面末尾短语重复。团队不清楚是原生运行时生成了两次,还是屏幕观察者又追加了旧块。
决策
用请求 ID 和有序流轨迹配合固定合成提示,分别对比运行时完成文本、应用累积文本和恢复后的会话状态。
预期结果
故障可以归类到生成、提示历史、流收集或状态恢复,并形成不需要保存真实对话的回归用例。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- BENCHMARK-01:量化结果需要完整设备与运行配置原始记录;单个样例只能作为方法线索。
- COVE-LIFECYCLE-01:当前 ModelManager 对模型加载串行化,但这不能替代推理流所有权测试。
发布结论只对所记录的配置和验收集有效;扩大适用范围需要更多记录。
实施流程
- 冻结完整生成配置. 记录制品和 tokenizer 身份、运行时版本、提示/模板、对话历史、解码设置、停止配置、应用构建和夹具。每轮只运行一个请求,并分配明确 ID。
- 保存准确提示历史与渲染输入. 将预期回合与运行时提交前的精确渲染序列比较。检查最新用户回合重复追加、旧历史恢复或角色边界双插入;私密内容必须脱敏。
- 跟踪流事件和最终状态. 接口暴露块时,记录请求 ID、序号、块标识、取消、完成和终止状态。断言每个块只消费一次,旧观察者无法写入后续任务。只有最终文本可见时,标注中间事件不可获得。
- 区分应用重复和模型重复. 比较运行时原始完整输出与界面最终文本。用纯单轮控制和重建页面后的同一合成夹具重复测试;调采样之前先检查 UI 状态恢复和重试路径。
- 进行单变量模型实验. 只有在提示历史和收集器行为正确后,才改一个有文档依据的解码/停止规则并重跑完整夹具。保留所有输出和结束原因,不能凭一个有利样本发布通用修复。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 能识别重复文本首次出现的边界;无法观察时明确标记不可观察。
- 记录准确制品、提示历史、运行时、解码与停止配置、应用构建及请求身份。
- 导航、取消、重试或状态恢复后,不会把流块或最终文本重复追加。
- 任何解码变化都作为单独实验,不凭少量样例升级成通用修复结论。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 运行时原始响应已重复 | 检查准确提示、制品和有文档依据的解码/停止配置 | 重复在 UI 前已出现;仍需多轮固定夹具来确认性质。 |
| 原始结果正常但界面重复 | 检查流收集器、重试和页面恢复状态 | 更可能是应用事件累积问题,而非模型生成。 |
| 提示历史本身包含重复回合 | 修正对话构造并回放测试 | 模型是在回应重复输入;改采样会掩盖真正原因。 |
需要避免的失败模式
- 没有检查提示历史和流收集器就改温度或停止参数。
- 把页面恢复时重复追加误判为模型生成循环。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
提高温度是否能停止重复 token?
不能假定这就是原因。先检查历史重复、流累积和停止/结束处理,然后再用固定夹具单独测试有文档依据的解码变量;保留未改变的基线。
导航后流收集器会重复文本吗?
请求所有权与观察者生命周期不清楚时可能发生。记录请求 ID 和块顺序,确保旧观察者不能写入恢复后的页面或新任务;不要让两个收集器同时追加。
一个回答重复一次就能说模型有缺陷吗?
不能。单个例子无法区分生成变化、提示构造、解码和应用重复投递。保留合成夹具,并报告准确配置及重复试验结果,不能外推普遍行为。