机器翻译和大模型翻译在通用文本上表现不错,但一碰到产品名、技术术语、公司内部黑话,结果就容易飘。比如把 Redis 翻译成 红is,或者把某个内部系统名翻成字面意思。遇到这种情况,单纯追加一句“请准确翻译专有名词”往往收效甚微,因为模型并不清楚哪些词必须保持原样、哪些词需要替换成指定译法。与其反复试错,不如把术语翻译表做成自定义词典,并且在Prompt中通过权重保留技巧让这些约束稳定生效。

一、先定位翻译不准的根源
通用翻译模型之所以在术语上翻车,通常不是能力不够,而是缺少上下文约束。模型在训练阶段见过大量平行语料,但企业内部的缩写、产品线代号、行业黑话并不在这些公开语料里。即使模型具备推理能力,它也需要明确的映射关系才能输出固定译法。
另一个原因是Prompt中的指令强度会被长文本稀释。当一段待翻译内容包含多个句子时,模型会优先保证通顺性和语义完整性,术语一致性被放在次要位置。这就是为什么只在结尾补一句“保持术语一致”效果不明显。要解决这个问题,需要把术语约束前置、重复、并在结构上单独成块,让模型意识到这不是普通背景信息,而是高优先级规则。
自定义词典的价值就在这里。它相当于给模型提供了一份术语对照表,把模糊的“准确翻译”变成明确的“A必须翻译成B”。而Prompt权重保留技巧则是告诉模型,这份对照表比一般翻译习惯更重要。
二、自定义词典的数据结构与注入方式
词典不一定要很复杂。最小可用结构可以是一个JSON对象,键为源词,值为目标语言中的固定译法。如果涉及大小写敏感或词性变化,可以扩展成数组,每个条目包含源词、译文、是否区分大小写、是否整词匹配等字段。
# 自定义词典示例
term_dict = {
"Redis": "Redis",
"Kubernetes": "K8s",
"灰度发布": "canary release",
"中台": "middle platform",
"复盘": "retrospective"
}
实际使用时,不要直接把原词典丢进Prompt,而是先转换成一行或一段结构化的规则文本,并加上明确的指令前缀。例如可以写成:以下术语必须严格按照映射翻译,不得意译或省略:Redis -> Redis、Kubernetes -> K8s。这样模型能快速识别这是约束条件,而不是待翻译文本。
如果术语量大,建议按业务域拆分。例如技术文档、市场营销、法务合同各用一份词典,每次只注入当前文本可能涉及的术语。这样做有两个好处:一是减少无关信息对模型的干扰,二是避免词典过大导致Prompt超出上下文窗口。
三、Prompt权重保留的几个实用技巧
所谓权重保留,本质是在Prompt设计中给词典规则分配更高的注意力。大模型对靠近指令开头、被特殊符号包裹、或者重复出现的文本会更敏感。我们可以利用这些特性把术语约束放在Prompt的最前面,并用独立小节标注。
一个比较稳妥的模板是这样的:先用系统角色说明任务和输出要求,紧接着放术语对照表,并用类似【高优先级规则】或必须遵守这样的中文标记强化。然后才是待翻译文本。最后在输出要求中再提醒一次,如果遇到术语表中的词,直接使用给定译文。
system_prompt = """你是一名专业翻译。必须严格遵守以下术语对照表: 【高优先级规则】 Redis -> Redis Kubernetes -> K8s 灰度发布 -> canary release 中台 -> middle platform 复盘 -> retrospective 以上映射不可修改。翻译时如果遇到这些词,直接替换为对应译文。 """
这里有两个细节值得注意。第一,术语规则的优先级不应该只靠“请”这样的礼貌用语,而是用“必须”“不可修改”等硬约束词。第二,如果模型仍然翻错,可以尝试在规则末尾加入一个自检要求:翻译完成后,请检查是否所有术语都已按对照表替换,如果没有,请重新输出。这种自我修正指令可以进一步提升一致性。
另一个技巧是重复关键术语。对待翻译文本中的源词,可以用<mark>或特殊的方括号包裹,并在Prompt中说明这些标记表示需要保留的术语。例如把Redis写成[[Redis]],然后告诉模型方括号内的词必须原样保留。这相当于在输入侧做了一层显式加权重,比单纯在规则里写一遍更直接。
四、将词典与Prompt结合到实际调用中
下面给一个Python调用OpenAI兼容接口的完整示例。代码会把自定义词典格式化成规则段,拼接到系统提示词中,同时把用户输入的待翻译文本按段落传入。这里以英文翻译成中文为例,实际使用时替换接口地址和模型名即可。
import json
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://api.openai.com/v1"
)
term_dict = {
"Redis": "Redis",
"Kubernetes": "K8s",
"canary release": "灰度发布",
"middle platform": "中台"
}
def build_rules(term_dict):
lines = ["以下是必须严格遵守的术语对照表:", "【高优先级规则】"]
for src, dst in term_dict.items():
lines.append(f"{src} -> {dst}")
lines.append("以上映射不可修改。翻译时遇到这些词必须直接替换。")
return "\n".join(lines)
def translate(text):
rules = build_rules(term_dict)
system_prompt = f"""你是一名专业翻译。\n{rules}\n另外,翻译结果应保持句子通顺,不改变原意。"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": text}
],
temperature=0.2,
max_tokens=2048
)
return response.choices[0].message.content
text = "We deployed Redis and Kubernetes for the canary release of our middle platform."
print(translate(text))
这个例子中,temperature设置成0.2是为了降低随机性,让模型在翻译任务上更贴近规则。如果业务场景更偏向创意翻译,也可以适当调高,但术语一致性会随之波动。另一个可以调节的参数是 top_p,在术语要求严格的场景下建议使用较小的值,例如0.3,这样模型生成时会优先选择概率最高的词,减少自由发挥。
调用完成后还需要做结果校验。可以写一个简单的函数,检查译文里是否出现了所有目标译法,如果缺失则把校验提示追加到消息里再请求一次。这种“翻译-校验-修正”的循环对长文本尤其有效,比单次Prompt更稳定。
五、局限性说明与替代思路
自定义词典加Prompt权重保留并不是万能的。它依赖于模型对指令的遵循能力,在参数较小或指令微调不充分的模型上,即使给了硬约束也可能会翻车。此外,当术语数量过多时,Prompt会变得很长,模型可能只关注前面的规则而忽略后半部分。
对于这种场景,可以考虑把词典压缩成更短的映射表,例如只保留缩写和音译词,或者用正则预处理,在进入模型前先把源词替换成带特殊标记的占位符,翻译完成后再替换回来。这种方法不依赖模型遵循约束,但需要额外维护后处理逻辑,并且对词形变化比较敏感。
还有一种做法是在模型侧微调或使用嵌入检索增强。把术语库存储在向量数据库中,翻译前先检索与文本相关的术语,再动态注入。这样既能保留完整词典,又不会撑爆上下文窗口。不过对于大多数中小型项目来说,文中的词典加Prompt权重方案已经足够稳定,落地成本也低得多。