Blame view

docs/翻译模块说明.md 4.8 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
  - 外部接口通过 `model + scene` 指定本次使用哪种能力、哪个场景
  
3eff49b7   tangwang   trans nllb-200-di...
34
  配置入口在 `config/config.yaml -> services.translation`
6f7840cf   tangwang   refactor: rename ...
35
  
0fd2f875   tangwang   translate
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  ## 本地模型部署
  
  本仓库已内置 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 ...
64
65
66
67
  ## HTTP 接口契约(translator service,端口 6006)
  
  服务默认监听 `http://localhost:6006`,提供:
  
0fd2f875   tangwang   translate
68
  - `POST /translate`: 文本翻译(支持所有已启用 capability)
6f7840cf   tangwang   refactor: rename ...
69
70
71
72
73
74
75
76
77
78
79
  - `GET /health`: 健康检查
  
  ### `POST /translate`
  
  **请求体**
  
  ```json
  {
    "text": "商品名称",
    "target_lang": "en",
    "source_lang": "zh",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
80
    "model": "qwen-mt",
0fd2f875   tangwang   translate
81
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  }
  ```
  
  - `text` 支持两种形式:
    - 单条:`string`
    - 批量:`string[]`(等长返回,顺序对应)
  
  **响应体**(单条):
  
  ```json
  {
    "text": "商品名称",
    "target_lang": "en",
    "source_lang": "zh",
    "translated_text": "Product name",
    "status": "success",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
98
99
    "model": "qwen-mt",
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
100
101
102
103
104
105
106
107
108
109
110
111
  }
  ```
  
  **响应体**(批量):
  
  ```json
  {
    "text": ["商品名称1", "商品名称2"],
    "target_lang": "en",
    "source_lang": "zh",
    "translated_text": ["Product name 1", null],
    "status": "success",
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
112
113
    "model": "qwen-mt",
    "scene": "sku_name"
6f7840cf   tangwang   refactor: rename ...
114
115
116
117
118
  }
  ```
  
  批量模式下,**单条失败用 `null` 占位**(即 `translated_text[i] = null`),保证长度与顺序一一对应,避免部分失败导致整批报错。
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
119
120
  说明:
  
0fd2f875   tangwang   translate
121
122
  - `scene` 是标准字段
  - `prompt` 不属于外部接口;LLM prompt 由 translator service 内部根据 `scene` 生成
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
123
  - `model` 只能选择已在 `services.translation.capabilities` 中启用的能力
0fd2f875   tangwang   translate
124
  - `/health` 会返回 `default_model`、`default_scene`、`enabled_capabilities` 与 `loaded_models`
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
125
  
6f7840cf   tangwang   refactor: rename ...
126
127
  ---
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
128
  ## 开发者接口约定(代码调用)
6f7840cf   tangwang   refactor: rename ...
129
  
3eff49b7   tangwang   trans nllb-200-di...
130
  代码侧(如 query/indexer)通过 `translation.create_translation_client()` 获取实例并调用 `translate()`
6f7840cf   tangwang   refactor: rename ...
131
  
3eff49b7   tangwang   trans nllb-200-di...
132
  ### 输入输出Shape
6f7840cf   tangwang   refactor: rename ...
133
134
135
136
137
138
139
140
  
  - `translate(text=...)` 支持:
    - **单条**`text: str` → 返回 `Optional[str]`
    - **批量**`text: List[str]` → 返回 `List[Optional[str]]`
  - **批量语义**:返回列表必须与输入 **等长且顺序对应**;某条翻译失败时,对应位置为 `None`(HTTP JSON 中表现为 `null`)。
  
  ### 批量能力标识(supports_batch)
  
5e4dc8e4   tangwang   翻译架构按“一个翻译服务 +
141
  服务客户端与服务内后端都可以暴露 `supports_batch`。若后端不支持批量,服务端会逐条拆分并保持 shape。
6f7840cf   tangwang   refactor: rename ...
142
  
0fd2f875   tangwang   translate
143
  为便于上层(如 `api/translator_app.py`)做最优调用,client / backend 可暴露:
6f7840cf   tangwang   refactor: rename ...
144
145
  
  - `supports_batch: bool`(property)