DEEPL_OPTIMIZATION.md 5.24 KB

DeepL 翻译优化指南

问题描述

在电商搜索环境中,DeepL 翻译可能会遇到多义词翻译不准确的问题。例如:

  • "车" 被翻译为 "rook"(象棋中的车)而不是 "car"(汽车)

解决方案

我们实现了以下优化方案来改善 DeepL 在电商场景下的翻译准确性:

1. 上下文提示(Context Hints)

系统会自动为单字查询添加电商上下文,帮助 DeepL 理解查询的领域。

工作原理:

  • 对于中文单字查询(如 "车"),系统会自动添加上下文 "购买 车"
  • DeepL 会根据上下文将 "车" 翻译为 "car" 而不是 "rook"
  • 翻译完成后,系统会自动提取实际的查询词("car")

配置:config/config.yaml 中可以设置翻译上下文:

query_config:
  translation_context: "e-commerce product search"  # 默认值

2. 术语表(Glossary)支持(推荐方案)

DeepL 支持使用自定义术语表来确保特定词汇的准确翻译。这是解决多义词问题的最佳方案。

创建术语表

  1. 使用 DeepL API 创建术语表:
import requests

# 创建术语表
api_url = "https://api.deepl.com/v2/glossaries"
headers = {
    "Authorization": "DeepL-Auth-Key YOUR_API_KEY",
    "Content-Type": "application/json",
}

# 术语表内容(TSV 格式)
glossary_entries = """车\tcar
手机\tmobile phone
电脑\tcomputer"""

payload = {
    "name": "e-commerce-glossary",
    "source_lang": "ZH",
    "target_lang": "EN",
    "entries": glossary_entries,
    "entries_format": "tsv"
}

response = requests.post(api_url, headers=headers, json=payload)
if response.status_code == 201:
    glossary_id = response.json()["glossary_id"]
    print(f"术语表创建成功,ID: {glossary_id}")
  1. 或者使用 DeepL 网页界面创建:
    • 登录 DeepL Pro 账户
    • 进入术语表管理页面
    • 创建新的术语表,添加 "车" -> "car" 等映射

配置术语表

config/config.yaml 中配置术语表 ID:

query_config:
  translation_glossary_id: "your-glossary-id-here"  # DeepL 术语表 ID

术语表格式

术语表使用 TSV(Tab-Separated Values)格式,每行一个词条:

车 car
手机  mobile phone
电脑  computer

注意:

  • 术语表功能需要 DeepL Pro 账户(付费版)
  • Free API 不支持术语表功能

3. 自动上下文处理

系统会自动检测以下情况并应用优化:

  • 单字中文查询:自动添加电商上下文
  • 多字查询:DeepL 通常有足够的上下文,无需特殊处理
  • 非中文查询:不应用上下文优化

使用示例

示例 1:使用上下文提示(自动)

查询 "车" 时:

  1. 系统检测到这是单字中文查询
  2. 自动添加上下文:"购买 车"
  3. DeepL 翻译为 "buy car"
  4. 系统提取实际查询词:"car"

示例 2:使用术语表(推荐)

  1. 创建术语表,包含 "车" -> "car" 的映射
  2. 在配置中设置 translation_glossary_id
  3. 查询 "车" 时,DeepL 直接使用术语表翻译为 "car"

最佳实践

  1. 优先使用术语表

    • 对于常见的电商术语,创建术语表是最可靠的方案
    • 术语表可以确保翻译的一致性和准确性
  2. 上下文提示作为补充

    • 对于未在术语表中的词汇,上下文提示可以提供帮助
    • 系统已默认启用,无需额外配置
  3. 定期更新术语表

    • 根据实际使用情况,不断添加新的术语映射
    • 特别是品牌名、产品类别等专业术语

技术实现细节

上下文添加逻辑

# 对于单字查询(长度 <= 2 个字符)
if len(text.strip().split()) == 1 and len(text.strip()) <= 2:
    context_phrase = f"购买 {text}"  # 添加 "购买" 前缀
    return context_phrase, True  # 需要从结果中提取

结果提取逻辑

翻译结果 "buy car" 会被处理:

  1. 识别上下文词(buy, purchase, product 等)
  2. 提取非上下文词作为实际查询词
  3. 返回 "car"

常见问题

Q: 为什么 "车" 会被翻译为 "rook"?

A: DeepL 在处理单字查询时,缺乏上下文来判断词义。"车" 在中文中既可以指汽车,也可以指象棋中的车。通过添加电商上下文或使用术语表,可以解决这个问题。

Q: 术语表和上下文提示哪个更好?

A: 术语表是更可靠的方案,因为它直接指定了翻译映射。上下文提示是自动的补充方案,适用于未在术语表中的词汇。

Q: Free API 可以使用术语表吗?

A: 不可以。术语表功能需要 DeepL Pro(付费版)账户。Free API 只能使用上下文提示优化。

Q: 如何测试翻译效果?

A: 可以通过搜索 API 测试翻译结果,查看返回的 translations 字段:

curl -X POST http://localhost:6002/api/search \
  -H "Content-Type: application/json" \
  -d '{"query": "车", "tenant_id": "test"}'

相关文件

  • query/translator.py - 翻译器实现
  • query/query_parser.py - 查询解析器(调用翻译器)
  • config/config.yaml - 配置文件
  • config/config_loader.py - 配置加载器

参考资源