Blame view

docs/翻译模块说明.md 5.86 KB
42e3aea6   tangwang   tidy
1
  # 翻译模块
3cd09b3b   tangwang   翻译接口改为调用qwen-mt-f...
2
  
42e3aea6   tangwang   tidy
3
  **快速上手**:见 `docs/QUICKSTART.md` 第 3.4 节。
3cd09b3b   tangwang   翻译接口改为调用qwen-mt-f...
4
  
42e3aea6   tangwang   tidy
5
  ## 环境变量
3cd09b3b   tangwang   翻译接口改为调用qwen-mt-f...
6
  
42e3aea6   tangwang   tidy
7
8
  ```bash
  # Qwen(默认)
3cd09b3b   tangwang   翻译接口改为调用qwen-mt-f...
9
10
11
12
  DASHSCOPE_API_KEY=sk-xxx
  
  # DeepL
  DEEPL_AUTH_KEY=xxx
3cd09b3b   tangwang   翻译接口改为调用qwen-mt-f...
13
14
  ```
  
985752f5   tangwang   1. 前端调试功能
15
16
17
18
19
20
  > **重要限速说明(Qwen 机翻)**  
  > 当前默认的 Qwen 翻译后端使用 `qwen-mt-flash` 云端模型,**官方限速较低,约 RPM=60(每分钟约 60 请求)**。  
  > - 推荐通过 Redis 翻译缓存复用结果,避免对相同文本重复打云端  
  > - 高并发场景需要在调用端做限流 / 去抖,或改为离线批量翻译  
  > - 如需更高吞吐,可考虑 DeepL 或自建翻译服务
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
21
22
23
24
25
26
  ## 配置模型
  
  翻译已改为“一个翻译服务 + 多种翻译能力”的结构:
  
  - 业务侧(`QueryParser` / indexer)统一调用 `http://127.0.0.1:6006`
  - 服务内按 `services.translation.capabilities` 加载并管理各翻译能力
0fd2f875   tangwang   translate
27
28
29
30
31
  - 已启用 capability 统一注册,后端实例按首次调用懒加载,避免多个本地模型在启动阶段一次性占满显存
  - `config.yaml` 只保留部署相关配置;scene 规则、语言码映射、prompt 模板、模型方向约束等翻译域知识统一收口在 `translation/` 内部
  - 每种能力独立配置 `enabled`、`model`、`base_url/api_url`、`timeout`、本地模型运行参数等部署项
  - 每种能力显式声明 `backend` 类型,例如 `qwen_mt`、`llm`、`deepl`、`local_nllb`、`local_marian`
  - `service_url`、`default_model`、`default_scene` 只从 `config/config.yaml` 读取,不再接受环境变量静默覆盖
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  - 外部接口通过 `model + scene` 指定本次使用哪种能力、哪个场景
  
  配置入口在 `config/config.yaml -> services.translation`,核心字段示例:
  
  ```yaml
  services:
    translation:
      service_url: "http://127.0.0.1:6006"
      default_model: "llm"
      default_scene: "general"
      timeout_sec: 10.0
      capabilities:
        qwen-mt:
          enabled: true
0fd2f875   tangwang   translate
46
          backend: "qwen_mt"
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
47
          model: "qwen-mt-flash"
0fd2f875   tangwang   translate
48
          base_url: "https://dashscope-us.aliyuncs.com/compatible-mode/v1"
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
49
50
        llm:
          enabled: true
0fd2f875   tangwang   translate
51
          backend: "llm"
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
52
          model: "qwen-flash"
0fd2f875   tangwang   translate
53
          base_url: "https://dashscope-us.aliyuncs.com/compatible-mode/v1"
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
54
55
        deepl:
          enabled: false
0fd2f875   tangwang   translate
56
57
58
59
60
61
62
63
64
65
66
67
68
69
          backend: "deepl"
          api_url: "https://api.deepl.com/v2/translate"
        nllb-200-distilled-600m:
          enabled: false
          backend: "local_nllb"
          model_id: "facebook/nllb-200-distilled-600M"
        opus-mt-zh-en:
          enabled: false
          backend: "local_marian"
          model_id: "Helsinki-NLP/opus-mt-zh-en"
        opus-mt-en-zh:
          enabled: false
          backend: "local_marian"
          model_id: "Helsinki-NLP/opus-mt-en-zh"
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
70
  ```
6f7840cf   tangwang   refactor: rename ...
71
  
0fd2f875   tangwang   translate
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  ## 本地模型部署
  
  本仓库已内置 3 个本地机翻 capability:
  
  - `nllb-200-distilled-600m`
  - `opus-mt-zh-en`
  - `opus-mt-en-zh`
  
  推荐流程:
  
  1. 创建独立运行环境:`./scripts/setup_translator_venv.sh`
  2. 下载本地模型:`./.venv-translator/bin/python scripts/download_translation_models.py --all-local`
  3.`config/config.yaml` 中把对应 capability 的 `enabled` 改为 `true`
  4. 启动服务:`./scripts/start_translator.sh`
  
  默认模型目录:
  
  - `models/translation/facebook/nllb-200-distilled-600M`
  - `models/translation/Helsinki-NLP/opus-mt-zh-en`
  - `models/translation/Helsinki-NLP/opus-mt-en-zh`
  
  说明:
  
  - 目前只支持 3 个标准 scene:`general`、`sku_name`、`ecommerce_search_query`
  - `nllb-200-distilled-600m` 支持多语,但依赖明确的 `source_lang`
  - 两个 OPUS 模型分别只支持 `zh -> en` 与 `en -> zh`
  - 本地模型建议单 worker 运行,避免重复加载占用显存
  
6f7840cf   tangwang   refactor: rename ...
100
101
102
103
  ## HTTP 接口契约(translator service,端口 6006)
  
  服务默认监听 `http://localhost:6006`,提供:
  
0fd2f875   tangwang   translate
104
  - `POST /translate`: 文本翻译(支持所有已启用 capability)
6f7840cf   tangwang   refactor: rename ...
105
106
107
108
109
110
111
112
113
114
115
  - `GET /health`: 健康检查
  
  ### `POST /translate`
  
  **请求体**
  
  ```json
  {
    "text": "商品名称",
    "target_lang": "en",
    "source_lang": "zh",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
116
    "model": "qwen-mt",
0fd2f875   tangwang   translate
117
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  }
  ```
  
  - `text` 支持两种形式:
    - 单条:`string`
    - 批量:`string[]`(等长返回,顺序对应)
  
  **响应体**(单条):
  
  ```json
  {
    "text": "商品名称",
    "target_lang": "en",
    "source_lang": "zh",
    "translated_text": "Product name",
    "status": "success",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
134
135
    "model": "qwen-mt",
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
136
137
138
139
140
141
142
143
144
145
146
147
  }
  ```
  
  **响应体**(批量):
  
  ```json
  {
    "text": ["商品名称1", "商品名称2"],
    "target_lang": "en",
    "source_lang": "zh",
    "translated_text": ["Product name 1", null],
    "status": "success",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
148
149
    "model": "qwen-mt",
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
150
151
152
153
154
  }
  ```
  
  批量模式下,**单条失败用 `null` 占位**(即 `translated_text[i] = null`),保证长度与顺序一一对应,避免部分失败导致整批报错。
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
155
156
  说明:
  
0fd2f875   tangwang   translate
157
158
  - `scene` 是标准字段
  - `prompt` 不属于外部接口;LLM prompt 由 translator service 内部根据 `scene` 生成
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
159
  - `model` 只能选择已在 `services.translation.capabilities` 中启用的能力
0fd2f875   tangwang   translate
160
  - `/health` 会返回 `default_model`、`default_scene`、`enabled_capabilities` 与 `loaded_models`
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
161
  
6f7840cf   tangwang   refactor: rename ...
162
163
  ---
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
164
  ## 开发者接口约定(代码调用)
6f7840cf   tangwang   refactor: rename ...
165
  
0fd2f875   tangwang   translate
166
  代码侧(如 query/indexer)通过 `translation.create_translation_client()` 获取实例并调用 `translate()`;业务侧不再存在翻译 provider 选择逻辑。
6f7840cf   tangwang   refactor: rename ...
167
168
169
170
171
172
173
174
175
176
  
  ### 输入输出形状(Shape)
  
  - `translate(text=...)` 支持:
    - **单条**`text: str` → 返回 `Optional[str]`
    - **批量**`text: List[str]` → 返回 `List[Optional[str]]`
  - **批量语义**:返回列表必须与输入 **等长且顺序对应**;某条翻译失败时,对应位置为 `None`(HTTP JSON 中表现为 `null`)。
  
  ### 批量能力标识(supports_batch)
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
177
  服务客户端与服务内后端都可以暴露 `supports_batch`。若后端不支持批量,服务端会逐条拆分并保持 shape。
6f7840cf   tangwang   refactor: rename ...
178
  
0fd2f875   tangwang   translate
179
  为便于上层(如 `api/translator_app.py`)做最优调用,client / backend 可暴露:
6f7840cf   tangwang   refactor: rename ...
180
181
  
  - `supports_batch: bool`(property)