让AI文风贯穿整本书:TranslateBooksWithLLMs风格预设功能完整指南
【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMs
用TranslateBooksWithLLMs做整本书翻译时,最令人头疼的问题之一是风格漂移:第 1 章冷静克制,第 10 章却莫名华丽。这个开源项目内置的**风格预设(Style Preset)**功能,正是为了解决 AI 翻译全书文风不一致的难题——从样章书中一键提取写作风格,或手写风格规则,让同一段风格指令注入每一个翻译分块,实现整本书文风统一。
一、风格预设解决什么问题?
AI 翻译是**分块(chunk)**进行的:每块文本的提示词都是独立构建的,前一块的措辞习惯不会自动带到下一块。没有任何"锚点"约束语气时,模型的文风就会随章节漂移。
风格预设的做法很直接:把一段短小的风格指令注入每一个分块的提示词中,例如"保持愤世嫉俗、老练冷峻的语气""多用简短的陈述句"。这样全书的语气、节奏、意象风格就能保持一致。
💡 核心文档:docs/STYLE_EXTRACTION.md —— 功能完整说明,包括两种模式、9 个风格维度、YAML 格式与 REST API。
二、5分钟上手:从书中提取风格预设
完整流程如下(Web UI 操作,启动服务后打开http://localhost:5000):
- 点击顶部导航的Styles(风格)标签页;
- 点击New from books,模式选择"From the source text",上传你要翻译的书(或其中几章),保持默认参数(总字符 10000 / 样本数 6);
- 点击Run extraction:服务端自动抽样,并调用你已配置的大模型(Ollama、OpenAI、Gemini、Mistral、DeepSeek、Poe、OpenRouter 均可)把写作风格归纳为规则清单;
- 审阅规则:每条规则标注了所属维度(语气、句子节奏、意象等),并附上支撑它的原文摘录。带警告图标的规则(如直接引用书中原文、罗列具体词汇)默认不勾选——建议改写为抽象表述再勾选;
- 为风格命名,点击Create style;
- 点击该风格行上的书签图标将其指派给当前翻译任务(图标变绿即生效),也可以直接在翻译页的风格下拉框中选择。
提取本身只需 2~3 分钟,加上规则审阅,5 分钟内即可拥有一个可复用的风格预设。
三、两种模式:忠于原著 vs 模仿名家
每个预设都有mode,决定指令注入时的引导语:
| 模式 | 含义 | 适用场景 |
|---|---|---|
source(源自原文) | 上传的书就是待翻译文本(或其样本),规则描述译文应如何贴合原著语气 | 翻译一本特定的书,想保留它自己的文风 |
model(参照作者) | 上传的书是风格参照,与待译文本无关,规则描述如何模仿该作者的笔法 | 让小说 A 的译文读起来像作家 B 的风格 |
model模式的引导语中会额外强调"在完全保留原文含义的前提下套用风格"——因为风格来源与内容来源是两本不同的书,只有"声音"可以迁移,情节和事实不行。
四、9个风格维度:规则如何被组织
提取出的每条规则都会被打上且仅打上 9 个维度标签之一(定义于 src/core/style/dimensions.py):
| 维度 | 捕捉的内容 |
|---|---|
register | 正式度、距离感、反讽、情感温度 |
narrative_voice | 人称、时态、聚焦方式、叙述者存在感 |
sentence_rhythm | 句长分布、并列与从句、节奏 |
lexicon | 具体与抽象、常用词汇场、古语 |
imagery | 比喻、明喻、反复出现的意象 |
dialogue | 对话标签、口语感、人物口癖 |
punctuation | 破折号、分号、省略号、感叹号频率 |
formatting | 段落长度、斜体使用、章节分隔 |
other | 其他值得捕捉的特征(兜底) |
这些标签只是 UI 组织用的元数据,不会出现在注入给模型的最终提示词中。
五、为什么规则必须"抽象":防止文风变成口头禅
这是本功能最值得理解的设计。如果指令写成"反复使用雨、铁、尘土、烟雾这些意象",模型不会获得一种倾向,而是拿到一个固定工具箱——300 页的小说里,这四个词会每几页出现一次,译文读起来像只会四个词的译者。
为此,项目在三个环节强制"只描述倾向、不点名词汇":
- 提取提示词明确禁止引用原文、举例、罗列词汇;
- lint 检查(src/core/style/lint.py)扫描每条返回的指令,发现疑似违规(引用原文、含"例如"、词汇列表、专名、过短)即打旗标,对应规则在审阅表中默认不勾选;
- 防口头禅护栏语句逐字追加到每次组装的风格块末尾:要求模型把规则当"文风倾向"而非词表,措辞自然变化,规则与段落自然表达冲突时以自然表达优先。
组装逻辑是纯确定性模板函数(src/core/style/assembler.py 中的assemble_instructions),不经过大模型,因此编辑器预览与保存的预设永不漂移。
六、叙事设定(context):防止"穿越词汇"
有一个真实案例:一部奇幻小说翻译得风格到位,却因为风格规则管不到"世界背景",把一件古装翻译成了"crop top"(露脐装)。
context字段补上了这个缺口:用 1~3 句话写清时代、技术水平、社会框架(不写人名地名和剧情)。当预设携带非空的context时,组装出的提示词会多出## Setting段落和一句护栏:"不得使用晚于这一设定时代、或不同技术水平的词汇,即使它们是最直接的对应词。"
source模式下提取时会由大模型自动填写;model模式下自动填写被禁用(避免把参照作者的时代强加给不相关文本),但仍可手工补写。
七、Auto 模式:不建预设也能"文风统一"
还没有现成预设?在翻译页(或 Settings → Translation Options)的风格下拉框中,选择Auto — match this document's style即可:
- 🚀 服务端在第一个分块发送前,从当前文档本身派生一套一次性风格块,额外仅一次 LLM 调用;
- 派生结果只存在于该任务及其检查点中——中断恢复时会复用同一套风格,不会半途变味;
- 显式选择已保存的预设时,Auto 自动让位;
- 失败或超时则照常翻译,日志出现
⚠️提示行。
⚠️ 权衡提示:Auto 无人工审阅,若日志中频繁出现"no usable style rules found",或译文带上你没要求的怪癖,建议改用审阅过的预设。
八、预设如何存储、如何生效
- 预设以 YAML 文件存放在
Custom_Instructions/目录(Styles 标签页可"Open folder"直达),旧的.txt预设继续兼容; - 翻译时只有
translation和refinement两个键被读取,分别注入翻译与润色阶段的提示词(见 src/prompts/prompts.py 中的 STYLE INSTRUCTIONS 段,优先级高于一般风格指引); - ⚠️ 注意阶段匹配:只填了
translation的预设对"仅润色"任务无效,反之亦然——Styles 列表的 Phases 列(T / R / T+R)可以快速核对; - 在编辑器中直接改写指令文本会出现 "Manually edited" 徽标(进入手动覆盖状态),"Reassemble from rules" 可一键从规则重新生成。
九、常见问题速查
| 现象 | 处理 |
|---|---|
| 提取返回 0 条规则 | 调大Total chars、增加Samples;或样章文风过于平淡,可辨认的风格特征太少 |
| 风格不出现在下拉框 | 文件扩展名必须是.yaml/.yml/.txt,否则被静默跳过;查看服务端日志是否有 YAML 解析错误 |
| 预设没有效果 | 检查预设覆盖的阶段(仅translation或仅refinement)与当前任务是否匹配 |
| 译文出现现代/穿越词汇 | 预设的context为空,打开编辑器补写叙事设定后保存,会自动重新组装出## Setting段 |
十、延伸阅读
- 完整功能文档:docs/STYLE_EXTRACTION.md 修正为 docs/STYLE_EXTRACTION.md
- 风格模块源码:src/core/style/(提取、组装、lint、维度定义)
- REST API 实现:src/api/blueprints/custom_instruction_routes.py
- 端到端测试(验证预设确实注入提示词):tests/integration/test_style_preset_end_to_end.py
- 相关功能:术语表(Glossary)自动提取见 docs/GLOSSARY.md,可与风格预设搭配,让"专有名词"与"文风"同时贯穿全书 📚
总结:TranslateBooksWithLLms 的风格预设用"从书中提取 → 人工审阅 → 注入每个分块"三步,把 AI 翻译中最大的隐性风险——全书文风漂移——变成可管理、可复用、可检查的工程问题。无论是忠于原著还是模仿名家,5 分钟就能让整本书读起来像一个译者在写。 </输出文章>
发现"延伸阅读"中有一处笔误需要修正,输出修正后的完整文章:
<输出文章>
让AI文风贯穿整本书:TranslateBooksWithLLMs风格预设功能完整指南
用TranslateBooksWithLLMs做整本书翻译时,最令人头疼的问题之一是风格漂移:第 1 章冷静克制,第 10 章却莫名华丽。这个开源项目内置的**风格预设(Style Preset)**功能,正是为了解决 AI 翻译全书文风不一致的难题——从样章书中一键提取写作风格,或手写风格规则,让同一段风格指令注入每一个翻译分块,实现整本书文风统一。
一、风格预设解决什么问题?
AI 翻译是**分块(chunk)**进行的:每块文本的提示词都是独立构建的,前一块的措辞习惯不会自动带到下一块。没有任何"锚点"约束语气时,模型的文风就会随章节漂移。
风格预设的做法很直接:把一段短小的风格指令注入每一个分块的提示词中,例如"保持愤世嫉俗、老练冷峻的语气""多用简短的陈述句"。这样全书的语气、节奏、意象风格就能保持一致。
💡 核心文档:docs/STYLE_EXTRACTION.md —— 功能完整说明,包括两种模式、9 个风格维度、YAML 格式与 REST API。
二、5分钟上手:从书中提取风格预设
完整流程如下(Web UI 操作,启动服务后打开http://localhost:5000):
- 点击顶部导航的Styles(风格)标签页;
- 点击New from books,模式选择"From the source text",上传你要翻译的书(或其中几章),保持默认参数(总字符 10000 / 样本数 6);
- 点击Run extraction:服务端自动抽样,并调用你已配置的大模型(Ollama、OpenAI、Gemini、Mistral、DeepSeek、Poe、OpenRouter 均可)把写作风格归纳为规则清单;
- 审阅规则:每条规则标注了所属维度(语气、句子节奏、意象等),并附上支撑它的原文摘录。带警告图标的规则(如直接引用书中原文、罗列具体词汇)默认不勾选——建议改写为抽象表述再勾选;
- 为风格命名,点击Create style;
- 点击该风格行上的书签图标将其指派给当前翻译任务(图标变绿即生效),也可以直接在翻译页的风格下拉框中选择。
提取本身只需 2~3 分钟,加上规则审阅,5 分钟内即可拥有一个可复用的风格预设。
三、两种模式:忠于原著 vs 模仿名家
每个预设都有mode,决定指令注入时的引导语:
| 模式 | 含义 | 适用场景 |
|---|---|---|
source(源自原文) | 上传的书就是待翻译文本(或其样本),规则描述译文应如何贴合原著语气 | 翻译一本特定的书,想保留它自己的文风 |
model(参照作者) | 上传的书是风格参照,与待译文本无关,规则描述如何模仿该作者的笔法 | 让小说 A 的译文读起来像作家 B 的风格 |
model模式的引导语中会额外强调"在完全保留原文含义的前提下套用风格"——因为风格来源与内容来源是两本不同的书,只有"声音"可以迁移,情节和事实不行。
四、9个风格维度:规则如何被组织
提取出的每条规则都会被打上且仅打上 9 个维度标签之一(定义于 src/core/style/dimensions.py):
| 维度 | 捕捉的内容 |
|---|---|
register | 正式度、距离感、反讽、情感温度 |
narrative_voice | 人称、时态、聚焦方式、叙述者存在感 |
sentence_rhythm | 句长分布、并列与从句、节奏 |
lexicon | 具体与抽象、常用词汇场、古语 |
imagery | 比喻、明喻、反复出现的意象 |
dialogue | 对话标签、口语感、人物口癖 |
punctuation | 破折号、分号、省略号、感叹号频率 |
formatting | 段落长度、斜体使用、章节分隔 |
other | 其他值得捕捉的特征(兜底) |
这些标签只是 UI 组织用的元数据,不会出现在注入给模型的最终提示词中。
五、为什么规则必须"抽象":防止文风变成口头禅
这是本功能最值得理解的设计。如果指令写成"反复使用雨、铁、尘土、烟雾这些意象",模型不会获得一种倾向,而是拿到一个固定工具箱——300 页的小说里,这四个词会每几页出现一次,译文读起来像只会四个词的译者。
为此,项目在三个环节强制"只描述倾向、不点名词汇":
- 提取提示词明确禁止引用原文、举例、罗列词汇;
- lint 检查(src/core/style/lint.py)扫描每条返回的指令,发现疑似违规(引用原文、含"例如"、词汇列表、专名、过短)即打旗标,对应规则在审阅表中默认不勾选;
- 防口头禅护栏语句逐字追加到每次组装的风格块末尾:要求模型把规则当"文风倾向"而非词表,措辞自然变化,规则与段落自然表达冲突时以自然表达优先。
组装逻辑是纯确定性模板函数(src/core/style/assembler.py 中的assemble_instructions),不经过大模型,因此编辑器预览与保存的预设永不漂移。
六、叙事设定(context):防止"穿越词汇"
有一个真实案例:一部奇幻小说翻译得风格到位,却因为风格规则管不到"世界背景",把一件古装翻译成了"crop top"(露脐装)。
context字段补上了这个缺口:用 1~3 句话写清时代、技术水平、社会框架(不写人名地名和剧情)。当预设携带非空的context时,组装出的提示词会多出## Setting段落和一句护栏:"不得使用晚于这一设定时代、或不同技术水平的词汇,即使它们是最直接的对应词。"
source模式下提取时会由大模型自动填写;model模式下自动填写被禁用(避免把参照作者的时代强加给不相关文本),但仍可手工补写。
七、Auto 模式:不建预设也能"文风统一"
还没有现成预设?在翻译页(或 Settings → Translation Options)的风格下拉框中,选择Auto — match this document's style即可:
- 🚀 服务端在第一个分块发送前,从当前文档本身派生一套一次性风格块,额外仅一次 LLM 调用;
- 派生结果只存在于该任务及其检查点中——中断恢复时会复用同一套风格,不会半途变味;
- 显式选择已保存的预设时,Auto 自动让位;
- 失败或超时则照常翻译,日志出现
⚠️提示行。
⚠️ 权衡提示:Auto 无人工审阅,若日志中频繁出现"no usable style rules found",或译文带上你没要求的怪癖,建议改用审阅过的预设。
八、预设如何存储、如何生效
- 预设以 YAML 文件存放在
Custom_Instructions/目录(Styles 标签页可"Open folder"直达),旧的.txt预设继续兼容; - 翻译时只有
translation和refinement两个键被读取,分别注入翻译与润色阶段的提示词(见 src/prompts/prompts.py 中的 STYLE INSTRUCTIONS 段,优先级高于一般风格指引); - ⚠️ 注意阶段匹配:只填了
translation的预设对"仅润色"任务无效,反之亦然——Styles 列表的 Phases 列(T / R / T+R)可以快速核对; - 在编辑器中直接改写指令文本会出现 "Manually edited" 徽标(进入手动覆盖状态),"Reassemble from rules" 可一键从规则重新生成。
九、常见问题速查
| 现象 | 处理 |
|---|---|
| 提取返回 0 条规则 | 调大Total chars、增加Samples;或样章文风过于平淡,可辨认的风格特征太少 |
| 风格不出现在下拉框 | 文件扩展名必须是.yaml/.yml/.txt,否则被静默跳过;查看服务端日志是否有 YAML 解析错误 |
| 预设没有效果 | 检查预设覆盖的阶段(仅translation或仅refinement)与当前任务是否匹配 |
| 译文出现现代/穿越词汇 | 预设的context为空,打开编辑器补写叙事设定后保存,会自动重新组装出## Setting段 |
十、延伸阅读
- 完整功能文档:docs/STYLE_EXTRACTION.md
- 风格模块源码:src/core/style/(提取、组装、lint、维度定义)
- REST API 实现:src/api/blueprints/custom_instruction_routes.py
- 端到端测试(验证预设确实注入提示词):tests/integration/test_style_preset_end_to_end.py
- 相关功能:术语表(Glossary)自动提取见 docs/GLOSSARY.md,可与风格预设搭配,让"专有名词"与"文风"同时贯穿全书 📚
总结:TranslateBooksWithLLMs 的风格预设用"从书中提取 → 人工审阅 → 注入每个分块"三步,把 AI 翻译中最大的隐性风险——全书文风漂移——变成可管理、可复用、可检查的工程问题。无论是忠于原著还是模仿名家,5 分钟就能让整本书读起来像一个译者在写。
【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考