[Bug] 双语对照下带内联格式的段落按片段翻译,译文变成碎片(豆包 / 自定义系统与用户提示词)

Author: Traveler0014Created Sep 16, 2026Updated Sep 16, 2026

环境 / 配置

  • 扩展版本:FluentRead 0.0.34,Chrome / MV3

  • 翻译服务:豆包(doubao)

  • 模型:自定义模型 doubao-seed-2-0-mini-260428(thinking disabled)

  • 自定义系统提示词system_role[doubao],设置 → 服务配置 → 系统提示词):

    你是专业的翻译引擎,为用户提供忠实且准确的翻译。
    翻译时,须遵守如下规则:
    * 若原文含有无需翻译的内容,如人名、专有名词、缩写、程序代码、语言标记等,则对应内容需在输出时保持原样。
    * 禁止输出其他注释、说明性文本。
    * 译文风格需匹配原始文本的风格,如果原文表达方式在译文语境下不自然,则可以对译文语序进行适当调整。
  • 自定义用户提示词user_role[doubao],设置 → 服务配置 → User 提示词):

    将下述文本译为恰当的{{to}}表达:
    
    {{origin}}
  • 源语言 auto,目标语言简体中文

  • 展示:双语对照;识别范围:正文;全文模式:视口

  • enableAIContext = falseenableAIMultiSegment = false

复现

  1. 按上述配置启用豆包 + 自定义系统/用户提示词,全文翻译 → 双语对照。
  2. 打开 https://en.wikipedia.org/wiki/Menches,观察首段。

原文

Menches was an ancient Egyptian official who served as the scribe of the village of Kerkeosiris from before 119 BC until 110 BC. He lived during the Ptolemaic period, when a Greek dynasty ruled Egypt. He was also known by the Greek name Asklepiades and may have been descended from Greek settlers, although little is known of his personal life.

现状(错误)

Image

scribe 独自成片,被译成词典式同义词列表;from before 119 BC until 110 BC 被链接边界切断;a Greek dynasty 里的 a 未翻译;Ptolemaic period 一段被拆成两个独立短句。

期望

如下图

Image

根因

双语正文的候选按 DOM 文本节点切成多个槽位,每个槽位独立成一次翻译

  1. AI 路径用 serializeTranslationSlots 给每个槽位套上 ___FLUENTREAD_*_{BEGIN,END}___ 标记,并在 user 消息里追加「Preserve every marker exactly once… Translate only the text between matching markers」。模型于是把每个标记对当成一个独立翻译单元——被 <a> / <b> / <i> 单独包住的词或短语因此脱离上下文。
  2. 上面这段自定义系统提示词要求「语言标记等无需翻译的内容保持原样」,所以标记大概率被完整保留,parseTranslationSlots 成功。这不是解析失败后的逐片段回退;碎片恰恰是标记协议按设计工作的产物。(即便没有系统提示词、标记被破坏,回退到 translateSlotsIndividually 也只会得到同样症状。)
  3. 机器翻译端点通常不保留这类标记,parseTranslationSlots 失败后回退到逐片段请求;症状相同、根因同源。
  4. 即使模型完整保留标记,跨语系语序重排也会让「第 i 个槽位」在译文里没有对应的语义边界,逐槽回填并不等于语义正确。

这不是自定义提示词导致的buildUserPrompt 的早返回只针对页面摘要请求(summaryPrompt),用户自定义的 system_role / user_role 仍是系统消息与模板,标记协议说明照常追加。自定义提示词只是没有改善这个结构性问题。

影响

所有语言对,跨语系(en→zh 等)尤其严重;带链接、加粗、斜体或脚注标记的段落都会被逐片段翻译。