Skip to content

[polish] 润色后偶发产生相邻近似重复文本 #1011

Description

@tonyzaca7755963

现象

  • 触发条件:完成一次语音听写并启用 LLM 润色。问题为偶发,尚无稳定复现步骤。
  • 当前表现:最终插入文本中偶尔出现两段相邻、语义和字面都高度相似但并非完全相同的内容,相当于同一句话被润色输出两次。
  • 预期表现:单次口述中的同一语义只输出一次;若模型产生疑似相邻近似重复,至少应留下可关联的诊断指标,并允许采用保守的告警或可选去重策略。

一条脱敏运行证据(仅代表该样本)

2026-08-27 的一条本机历史候选显示:

  1. 未被纠正规则改动的 ASR/raw 长度为 55 字,内部未检测到重复;ASR 为 openai-compatible / large-v3
  2. 单次润色后的 finalText 长度为 150 字;其中相邻两段归一化长度为 21 / 27,普通 Levenshtein 相似度为 0.7407,扣除长度差后的相似度为 0.9524;LLM 为 custom / glmcn/glm-5.2
  3. 同一时间窗仅观察到 1 次 Whisper 转写、1 次 polish dispatch、1 次 LLM POST(HTTP 200)、1 条 history 记录,且 insertStatus=inserted
  4. 因此,该样本中的重复最早可观察于润色后的 finalText;运行证据不支持把它归因于该次 ASR、双触发或最终回填。该结论不应外推为所有近似重复问题的通用根因。

为保护隐私,本 issue 不包含转写片段、文本哈希、session ID、日志文件或本机路径。

与既有 issue 的区别

相关源码机制(固定到当前 beta HEAD)

  • types.rs 区分 raw_transcript、未处理 ASR 的可选 asr_transcriptfinal_textcoordinator/dictation.rs 将润色结果写入 final_text 后落一条 history。
  • coordinator/dictation.rs 在互斥分支中选择流式或一次性润色入口。本样本的运行记录同样只显示一次 polish dispatch。
  • polish/output_cleaning.rsclean_polish_output 只剥离 thinking、Markdown 围栏、已知前缀并 trim,没有相邻近似去重逻辑。
  • polish.rs 把 HTTP body 日志预览限制为 200 bytes;成功响应路径也只记录该预览(L750-L764)。现有日志无法对齐完整的模型 assistant 文本与清洗后文本,所以仍不能用该样本直接证明重复已经存在于模型原始响应,还是出现在响应提取/清洗边界内。
  • coordinator_state.rs 只允许 Listening -> Processing 一次;对应测试验证第二次进入会返回 NoneL467-L480)。
  • Windows 插入入口把文本交给一次剪贴板粘贴(insertion.rs L59-L73);实现中写剪贴板后仅调用一次 simulate_pasteL297-L318)。

另有一个独立潜在风险qwen_realtime.rs 会直接 push 每个 completed segment,随后 join_segments 仅处理空格/标点拼接,没有按 item/sentence ID 或重叠内容去重。但本候选没有使用 Qwen realtime,因此它不能作为本次样本的根因。

影响

  • 重复内容会被作为正常润色结果保存并插入,用户需要手工删除。
  • 因两段并非完全一致,简单的精确去重无法识别;激进的模糊去重又可能误删用户有意重复。
  • 当前阶段日志不足以把责任进一步定位到模型原始响应或客户端响应处理边界。

建议接受标准

  • 为同一 utterance/request 记录脱敏且可关联的 request/session ID。
  • 记录 ASR 原文长度/短哈希、LLM 清洗前后长度/短哈希,不记录正文。
  • 对流式 ASR 记录 completed item/sentence ID;对插入记录 insert attempt ID/count。
  • 能用这些字段确认重复最早出现于 ASR、LLM 清洗前、清洗后或插入边界。
  • 讨论润色后相邻近似重复的保守检测与告警,或提供默认关闭的可选去重;阈值和分段条件应避免误删用户有意重复。
  • 为“有意重复”和“仅长度相差几个字符的相邻近似重复”补充回归用例。

TODO / 不确定项

  • 需要新的脱敏观测字段才能确认本样本中重复是否已存在于完整模型响应。
  • 近似重复的分段方式、最小长度、相似度阈值及默认行为仍需产品/维护者确认。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions