bc54124c
tangwang
docs
|
1
|
# 开发与配置指南
|
42e3aea6
tangwang
tidy
|
2
|
|
bc54124c
tangwang
docs
|
3
|
新人入口:环境、服务、模块、请求示例、基础配置、Provider 架构、模块扩展规范,一文档搞定。
|
42e3aea6
tangwang
tidy
|
4
|
|
bc54124c
tangwang
docs
|
5
|
**建议**:首次参与开发请先阅读 [DEVELOPER_GUIDE.md](./DEVELOPER_GUIDE.md) 建立项目全貌与协作规范,再使用本文做环境与配置速查。
|
701ae503
tangwang
docs
|
6
|
|
bc54124c
tangwang
docs
|
7
8
9
10
|
---
## 为什么这样整合
|
0e66a315
tangwang
docs
|
11
|
以下文档已删除,其核心内容已并入本文与 [DEVELOPER_GUIDE.md](./DEVELOPER_GUIDE.md) §7:原 `PROVIDER_ARCHITECTURE.md`、`MODULE_EXTENSION_SPEC.md`、`基础配置指南.md`。本文保留环境、服务、基础配置、Provider 与模块扩展的速查;协议与新增后端清单见 DEVELOPER_GUIDE §7。
|
bc54124c
tangwang
docs
|
12
13
14
15
16
17
18
19
|
关于 `docs/Usage-Guide.md`:保留为**运行/运维手册**更清晰(日志、故障排查、多环境切换、建议索引运行细节),本文只保留开发常用且高频的信息,避免一个文档同时承担“开发规范 + 运维 runbook”导致冗长和混乱。
---
## 目录
1. [快速上手](#1-快速上手)
|
2e3670ab
tangwang
index services
|
20
|
- [1.1 环境准备](#11-环境准备) / [1.2 服务与端口](#12-服务与端口) / [1.3 常用 API](#13-常用-api-请求示例) / [1.4 系统要求](#14-系统要求) / [1.5 Python 运行环境](#15-python-运行环境详细) / [1.6 外部服务与 .env](#16-外部服务与-env含生产凭证) / [1.7 店匠数据源](#17-店匠数据源说明) / [1.8 相关脚本](#18-相关脚本) / [1.9 配置入口总览](#19-配置入口总览)
|
bc54124c
tangwang
docs
|
21
22
23
24
25
|
2. [基础配置与搜索行为](#2-基础配置与搜索行为)
3. [Provider 架构](#3-provider-架构)
4. [模块扩展规范(Embedding / Rerank)](#4-模块扩展规范embedding--rerank)
5. [验证、日志与常见排障入口](#5-验证日志与常见排障入口)
6. [相关文档](#6-相关文档)
|
7299bae6
tangwang
tests
|
26
|
7. [持续集成测试(最小可维护方案)](#7-持续集成测试最小可维护方案)
|
bc54124c
tangwang
docs
|
27
28
29
30
31
32
33
34
35
|
---
## 1. 快速上手
### 1.1 环境准备
```bash
source activate.sh
|
2e3670ab
tangwang
index services
|
36
|
# 首次创建环境:
|
bc54124c
tangwang
docs
|
37
|
./scripts/create_venv.sh
|
bc54124c
tangwang
docs
|
38
|
|
07cf5a93
tangwang
START_EMBEDDING=...
|
39
40
|
# embedding 服务独立环境(推荐)
./scripts/setup_embedding_venv.sh
|
bc54124c
tangwang
docs
|
41
|
|
07cf5a93
tangwang
START_EMBEDDING=...
|
42
43
|
# reranker 服务独立环境(Qwen3-vLLM)
./scripts/setup_reranker_venv.sh
|
42e3aea6
tangwang
tidy
|
44
|
|
07cf5a93
tangwang
START_EMBEDDING=...
|
45
46
|
# CN-CLIP 独立环境
./scripts/setup_cnclip_venv.sh
|
42e3aea6
tangwang
tidy
|
47
48
|
```
|
07cf5a93
tangwang
START_EMBEDDING=...
|
49
50
|
依赖:Python 3.8+、Elasticsearch 8.x、MySQL、Redis(可选,缓存用途)。
|
2e3670ab
tangwang
index services
|
51
|
更详细的系统要求、Python 环境、外部服务与生产凭证见 [1.4–1.8](#14-系统要求)。
|
42e3aea6
tangwang
tidy
|
52
|
|
bc54124c
tangwang
docs
|
53
|
### 1.2 服务与端口
|
42e3aea6
tangwang
tidy
|
54
55
56
|
| 服务 | 端口 | 默认启动 | 说明 |
|------|-----:|:--------:|------|
|
bc54124c
tangwang
docs
|
57
58
|
| backend | 6002 | ✓ | 搜索 API(`/search/*`)+ 管理接口(`/admin/*`) |
| indexer | 6004 | ✓ | 索引 API(`/indexer/*`) |
|
42e3aea6
tangwang
tidy
|
59
|
| frontend | 6003 | ✓ | 调试 UI |
|
7b8d9e1a
tangwang
评估框架的启动脚本
|
60
|
| eval-web | 6010 | ✓ | 搜索评估 Web(`scripts/evaluation/`,依赖 backend 联调) |
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
61
62
|
| embedding | 6005 | - | 文本向量服务(`/embed/text`) |
| embedding-image | 6008 | - | 图片向量服务(`/embed/image`) |
|
bc54124c
tangwang
docs
|
63
64
65
66
|
| translator | 6006 | - | 翻译服务(`/translate`) |
| reranker | 6007 | - | 重排服务(`/rerank`) |
启动与停止:
|
42e3aea6
tangwang
tidy
|
67
68
|
```bash
|
7913e2fb
tangwang
服务管理和监控
|
69
70
|
./run.sh all
# 仅为薄封装:等价于 ./scripts/service_ctl.sh up all
|
07cf5a93
tangwang
START_EMBEDDING=...
|
71
|
# 说明:
|
3abbc95a
tangwang
重构(scripts): 整理sc...
|
72
|
# - all = tei cnclip embedding embedding-image translator reranker backend indexer frontend eval-web
|
7913e2fb
tangwang
服务管理和监控
|
73
|
# - up 会同时启动 monitor daemon(运行期连续失败自动重启)
|
07cf5a93
tangwang
START_EMBEDDING=...
|
74
|
# - reranker 为 GPU 强制模式(资源不足会直接启动失败)
|
af7ee060
tangwang
service_ctl 简化为“显...
|
75
|
# - TEI 默认使用 GPU;当 TEI_DEVICE=cuda 且 GPU 不可用时会直接失败(不会自动降级到 CPU)
|
07cf5a93
tangwang
START_EMBEDDING=...
|
76
|
# - cnclip 默认使用 cuda;若显式配置为 cuda 且 GPU 不可用会直接失败(不会自动降级到 cpu)
|
bc54124c
tangwang
docs
|
77
|
|
7913e2fb
tangwang
服务管理和监控
|
78
79
80
|
./restart.sh all
# 仅为薄封装:等价于 ./scripts/service_ctl.sh restart all
|
42e3aea6
tangwang
tidy
|
81
|
./scripts/service_ctl.sh status
|
7913e2fb
tangwang
服务管理和监控
|
82
|
./scripts/stop.sh all # 仅为薄封装:等价于 ./scripts/service_ctl.sh down all
|
42e3aea6
tangwang
tidy
|
83
84
|
```
|
af7ee060
tangwang
service_ctl 简化为“显...
|
85
86
87
|
服务管理方式(入口职责、默认行为、全量拉起顺序)见:
- `docs/Usage-Guide.md` -> `服务管理总览`
|
bc54124c
tangwang
docs
|
88
|
### 1.3 常用 API 请求示例
|
42e3aea6
tangwang
tidy
|
89
|
|
bc54124c
tangwang
docs
|
90
|
#### 搜索 API(backend 6002)
|
42e3aea6
tangwang
tidy
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
```bash
# 文本搜索
curl -X POST http://localhost:6002/search/ \
-H "Content-Type: application/json" \
-H "X-Tenant-ID: 162" \
-d '{"query": "玩具", "size": 10}'
# 图片搜索
curl -X POST http://localhost:6002/search/image \
-H "Content-Type: application/json" \
-H "X-Tenant-ID: 162" \
-d '{"image_url": "https://example.com/img.jpg", "size": 10}'
|
bc54124c
tangwang
docs
|
105
106
107
108
109
110
|
# Suggestion
curl "http://localhost:6002/search/suggestions?q=玩&size=5" \
-H "X-Tenant-ID: 162"
# 健康与统计
curl http://localhost:6002/admin/health
|
26b910bd
tangwang
refactor service ...
|
111
|
curl http://localhost:6002/admin/stats -H "X-Tenant-ID: 162"
|
42e3aea6
tangwang
tidy
|
112
113
|
```
|
bc54124c
tangwang
docs
|
114
|
API 文档:`http://localhost:6002/docs`
|
42e3aea6
tangwang
tidy
|
115
|
|
bc54124c
tangwang
docs
|
116
|
#### 索引 API(indexer 6004)
|
42e3aea6
tangwang
tidy
|
117
118
119
120
121
|
```bash
# 创建租户索引
./scripts/create_tenant_index.sh 162
|
bc54124c
tangwang
docs
|
122
|
# 全量重建(更新/写入,不删除旧索引)
|
42e3aea6
tangwang
tidy
|
123
124
125
126
|
curl -X POST http://localhost:6004/indexer/reindex \
-H "Content-Type: application/json" \
-d '{"tenant_id": "162", "batch_size": 500}'
|
bc54124c
tangwang
docs
|
127
128
129
130
131
132
|
# 增量索引
curl -X POST http://localhost:6004/indexer/index \
-H "Content-Type: application/json" \
-d '{"tenant_id": "162", "spu_ids": ["1001", "1002"]}'
# 构建文档(不写 ES)
|
42e3aea6
tangwang
tidy
|
133
134
|
curl -X POST http://localhost:6004/indexer/build-docs \
-H "Content-Type: application/json" \
|
bc54124c
tangwang
docs
|
135
|
-d '{"tenant_id":"162","items":[{"spu":{},"skus":[],"options":[]}]}'
|
42e3aea6
tangwang
tidy
|
136
137
|
```
|
bc54124c
tangwang
docs
|
138
139
|
API 文档:`http://localhost:6004/docs`
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
140
|
#### Embedding 服务(文本 6005 / 图片 6008)
|
42e3aea6
tangwang
tidy
|
141
142
|
```bash
|
07cf5a93
tangwang
START_EMBEDDING=...
|
143
144
|
# TEI(文本向量后端,默认)
# GPU(需 nvidia-container-toolkit)
|
af7ee060
tangwang
service_ctl 简化为“显...
|
145
|
TEI_DEVICE=cuda ./scripts/start_tei_service.sh
|
07cf5a93
tangwang
START_EMBEDDING=...
|
146
|
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
147
148
149
|
# Embedding API(text 会校验 TEI /health)
./scripts/start_embedding_text_service.sh
./scripts/start_embedding_image_service.sh
|
42e3aea6
tangwang
tidy
|
150
|
|
42e3aea6
tangwang
tidy
|
151
152
153
154
|
curl -X POST http://localhost:6005/embed/text \
-H "Content-Type: application/json" \
-d '["衣服", "Bohemian Maxi Dress"]'
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
155
|
curl -X POST http://localhost:6008/embed/image \
|
42e3aea6
tangwang
tidy
|
156
157
158
159
|
-H "Content-Type: application/json" \
-d '["https://example.com/img.jpg"]'
```
|
07cf5a93
tangwang
START_EMBEDDING=...
|
160
161
|
说明:
- TEI 默认镜像按 `TEI_VERSION` 组装:`cuda-<version>`(默认 `1.9`)。
|
af7ee060
tangwang
service_ctl 简化为“显...
|
162
|
- `TEI_DEVICE=cuda` 时会严格校验 Docker GPU runtime;未配置会直接报错退出。
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
163
|
- `/embed/image` 依赖 `cnclip`(`grpc://127.0.0.1:51000`),未启动时图片 embedding 服务会启动失败。
|
07cf5a93
tangwang
START_EMBEDDING=...
|
164
|
|
bc54124c
tangwang
docs
|
165
|
#### Translator 服务(6006)
|
42e3aea6
tangwang
tidy
|
166
167
|
```bash
|
0fd2f875
tangwang
translate
|
168
|
./scripts/setup_translator_venv.sh
|
32e9b30c
tangwang
scripts/ 根目录主要保留启...
|
169
|
./.venv-translator/bin/python scripts/translation/download_translation_models.py --all-local # 如需本地模型
|
42e3aea6
tangwang
tidy
|
170
171
172
173
|
./scripts/start_translator.sh
curl -X POST http://localhost:6006/translate \
-H "Content-Type: application/json" \
|
0fd2f875
tangwang
translate
|
174
|
-d '{"text":"商品名称","target_lang":"en","source_lang":"zh","model":"qwen-mt","scene":"sku_name"}'
|
42e3aea6
tangwang
tidy
|
175
176
|
```
|
0fd2f875
tangwang
translate
|
177
178
179
180
|
说明:
- translator service 是翻译统一入口,业务侧不再直接选择翻译 provider。
- 本地模型默认关闭;需先在 `config/config.yaml -> services.translation.capabilities` 中启用,再通过 `model` 指定。
|
bc54124c
tangwang
docs
|
181
|
#### Reranker 服务(6007)
|
42e3aea6
tangwang
tidy
|
182
183
|
```bash
|
07cf5a93
tangwang
START_EMBEDDING=...
|
184
|
# 默认后端 qwen3_vllm(Qwen3-Reranker-0.6B)
|
42e3aea6
tangwang
tidy
|
185
186
187
188
|
./scripts/start_reranker.sh
curl -X POST http://localhost:6007/rerank \
-H "Content-Type: application/json" \
|
bc54124c
tangwang
docs
|
189
190
191
|
-d '{"query":"wireless mouse","docs":["logitech mx master","usb cable"]}'
```
|
2e3670ab
tangwang
index services
|
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
### 1.4 系统要求
- **操作系统**:Linux(推荐 Ubuntu 18.04+)
- **Python**:3.10(由 venv 提供)
- **内存**:建议 8GB+(含模型与 ES)
- **磁盘**:10GB+(含模型与索引)
### 1.5 Python 运行环境(详细)
项目根目录的 `activate.sh` 激活 **`.venv`** 并加载当前目录 `.env`。
```bash
cd /data/saas-search
./scripts/create_venv.sh
source activate.sh
```
|
07cf5a93
tangwang
START_EMBEDDING=...
|
209
|
主程序 `.venv` 与模型服务环境隔离:
|
2e3670ab
tangwang
index services
|
210
|
|
07cf5a93
tangwang
START_EMBEDDING=...
|
211
212
213
214
215
|
- 主程序:`.venv`(`./scripts/create_venv.sh`)
- embedding 服务:`.venv-embedding`(`./scripts/setup_embedding_venv.sh`)
- reranker 服务:`.venv-reranker`(`./scripts/setup_reranker_venv.sh`)
- cnclip:`.venv-cnclip`(`./scripts/setup_cnclip_venv.sh`)
- TEI:Docker 容器(`./scripts/start_tei_service.sh`)
|
2e3670ab
tangwang
index services
|
216
217
218
219
220
221
222
223
224
225
226
|
### 1.6 外部服务与 .env(含生产凭证)
以下为 **AI 生产环境** 统一使用的地址与凭证(Redis / ES / MySQL 均以此为准)。本地开发可将 `DB_HOST`/`ES_HOST`/`REDIS_HOST` 改为 `localhost`(服务在本机时)。
| 服务 | 地址(生产) | 端口 | 说明 |
|------|--------------|------|------|
| **MySQL** | 10.200.16.14 / localhost | 3316 | 店匠 SPU/SKU 数据 |
| **Redis** | 10.200.16.14 / localhost | 6479 | Embedding/翻译缓存 |
| **Elasticsearch** | 10.200.16.14 / localhost | 9200 | 搜索索引 |
|
07cf5a93
tangwang
START_EMBEDDING=...
|
227
|
**MySQL**(AI 生产推荐使用 root,3 个用户均可远程登录):
|
2e3670ab
tangwang
index services
|
228
|
|
07cf5a93
tangwang
START_EMBEDDING=...
|
229
230
231
232
233
|
| 用户 | 密码 | 说明 |
|------|------|------|
| root | qY8tgodLoA&KT#yQ | AI 生产推荐 |
| saas | 6dlpco6dVGuqzt^l | 业务用户 |
| sa | C#HU!GPps7ck8tsM | 备用 |
|
2e3670ab
tangwang
index services
|
234
235
236
237
238
239
240
241
242
243
244
|
创建远程用户(如尚未创建):
```sql
mysql -uroot -p'qY8tgodLoA&KT#yQ'
CREATE USER 'saas'@'%' IDENTIFIED BY '6dlpco6dVGuqzt^l';
CREATE USER 'sa'@'%' IDENTIFIED BY 'C#HU!GPps7ck8tsM';
```
**Redis**:
|
07cf5a93
tangwang
START_EMBEDDING=...
|
245
|
- 地址:`10.200.16.14:6479`
|
2e3670ab
tangwang
index services
|
246
|
- 密码:`dxEkegEZ@C5SXWKv`
|
07cf5a93
tangwang
START_EMBEDDING=...
|
247
|
- 远程登录示例:`redis-cli -h 10.200.16.14 -p 6479 -a 'dxEkegEZ@C5SXWKv' --no-auth-warning`
|
2e3670ab
tangwang
index services
|
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
|
**Elasticsearch**:
- 用户名/密码:`saas` / `4hOaLaf41y2VuI8y`
- 访问示例:
```bash
curl -u 'saas:4hOaLaf41y2VuI8y' \
-X GET 'http://localhost:9200/search_products_tenant_111/_search?pretty' \
-H 'Content-Type: application/json' \
-d '{
"size": 11,
"_source": ["title"],
"query": {
"bool": {
"filter": [
{ "term": {"spu_id" : 206150} }
]
}
}
}'
```
|
02c40701
tangwang
frontend proxy se...
|
271
272
|
> 注意(Kibana 运维):应用侧 `.env` 的 `ES_USERNAME/ES_PASSWORD` 仅用于业务服务访问 ES;Kibana 不应复用该账号。Kibana 推荐在 `/etc/kibana/kibana.yml` 使用 `elasticsearch.serviceAccountToken`,否则在 `.kibana_*` 受限索引迁移阶段可能出现 `security_exception` 并导致 5601 长时间无响应。
|
c7e80cc2
tangwang
新的 .env 管理机制如下:
|
273
274
275
276
277
278
279
|
在项目根目录创建 `.env`:
```bash
./scripts/init_env.sh # 从 .env.example 复制(若 .env 不存在)
```
然后按环境修改 `.env`。**含特殊字符(#、$、&、空格)的密码需加引号**,例如:
|
2e3670ab
tangwang
index services
|
280
281
|
```env
|
07cf5a93
tangwang
START_EMBEDDING=...
|
282
|
# MySQL(AI 生产 10.200.16.14:3316,推荐 root)
|
2e3670ab
tangwang
index services
|
283
284
285
|
DB_HOST=10.200.16.14
DB_PORT=3316
DB_DATABASE=saas
|
07cf5a93
tangwang
START_EMBEDDING=...
|
286
|
DB_USERNAME=root
|
c7e80cc2
tangwang
新的 .env 管理机制如下:
|
287
|
DB_PASSWORD="qY8tgodLoA&KT#yQ"
|
2e3670ab
tangwang
index services
|
288
289
290
291
|
# Elasticsearch
ES_HOST=http://10.200.16.14:9200
ES_USERNAME=saas
|
c7e80cc2
tangwang
新的 .env 管理机制如下:
|
292
|
ES_PASSWORD="4hOaLaf41y2VuI8y"
|
2e3670ab
tangwang
index services
|
293
294
295
296
|
# Redis(可选)
REDIS_HOST=10.200.16.14
REDIS_PORT=6479
|
c7e80cc2
tangwang
新的 .env 管理机制如下:
|
297
|
REDIS_PASSWORD="dxEkegEZ@C5SXWKv"
|
2e3670ab
tangwang
index services
|
298
299
300
301
302
303
304
|
# DeepL 翻译(按需)
DEEPL_AUTH_KEY=your-key
# API
API_HOST=0.0.0.0
API_PORT=6002
|
7b8d9e1a
tangwang
评估框架的启动脚本
|
305
|
EVAL_WEB_PORT=6010
|
2e3670ab
tangwang
index services
|
306
307
308
309
310
311
312
313
314
315
316
|
```
> 生产环境请妥善保管凭证;本地/测试可改用上述值或自建实例。
### 1.7 店匠数据源说明
saas-search 以 MySQL 中的店匠标准表为权威数据源:
- `shoplazza_product_spu`:SPU 商品主表
- `shoplazza_product_sku`:SKU 变体表
|
41345271
tangwang
文档更新
|
317
|
**shoplazza_product_sku 字段节选**:`id`, `spu_id`, `shop_id`, `title`, `sku`, `price`, `compare_at_price`, `option1/2/3`, `inventory_quantity`, `image_src`, `tenant_id`, `create_time`, `update_time`, `deleted` 等。完整字段与 ES 对应关系见 `docs/索引字段说明v2.md`、`docs/MySQL到ES文档映射说明.md`。
|
2e3670ab
tangwang
index services
|
318
319
320
321
|
### 1.8 相关脚本
- **`activate.sh`**(项目根目录):激活 Python 环境并加载 `.env`,日常开发/部署以本脚本为准。
|
07cf5a93
tangwang
START_EMBEDDING=...
|
322
323
324
325
|
- `scripts/create_venv.sh`:创建主程序 venv(`.venv`)
- `scripts/setup_embedding_venv.sh`:创建 embedding 服务 venv(`.venv-embedding`)
- `scripts/setup_reranker_venv.sh`:创建 reranker 服务 venv(`.venv-reranker`)
- `scripts/start_tei_service.sh`:启动 TEI 容器(文本向量后端)
|
2e3670ab
tangwang
index services
|
326
327
328
|
- `scripts/mock_data.sh`:生成 Tenant1 Mock + Tenant2 CSV 并导入 MySQL
- `scripts/create_tenant_index.sh <tenant_id>`:创建租户 ES 索引结构
- `POST /indexer/reindex`:从 MySQL 全量导入到 ES
|
7913e2fb
tangwang
服务管理和监控
|
329
330
|
- `run.sh` / `restart.sh` / `scripts/stop.sh`:推荐入口(对应 up/restart/down)
- `scripts/service_ctl.sh`:`up/down/start/stop/restart/status/monitor/monitor-start/monitor-stop/monitor-status`
|
2e3670ab
tangwang
index services
|
331
332
333
334
|
更多脚本与验证命令见 `docs/Usage-Guide.md`。
### 1.9 配置入口总览
|
bc54124c
tangwang
docs
|
335
336
337
338
339
340
|
- **搜索行为配置**:`config/config.yaml`
- **索引结构定义**:`mappings/search_products.json`
- **provider/服务配置**:`config/config.yaml` 的 `services` 块
- **环境变量**:`.env`
|
0e66a315
tangwang
docs
|
341
|
---·
|
bc54124c
tangwang
docs
|
342
343
344
345
346
347
348
|
## 2. 基础配置与搜索行为
### 2.1 总体原则
- **统一索引结构**:所有租户使用同一套 mapping(按租户数据分索引名 + 文档内 `tenant_id` 隔离)
- **SPU 级索引**:每个文档是一个 SPU,包含嵌套 `skus`、`specifications`
|
bd96cead
tangwang
1. 动态多语言字段与统一策略配置
|
349
|
- **配置文件驱动**:搜索权重、动态多语言字段、重排融合、provider 全在 `config/config.yaml`,不再以“硬编码配置”为主
|
bc54124c
tangwang
docs
|
350
351
352
353
354
355
356
357
|
### 2.2 索引结构(Mapping)
文件:`mappings/search_products.json`
核心字段可分为:
- 标识字段:`tenant_id`, `spu_id`
|
bd96cead
tangwang
1. 动态多语言字段与统一策略配置
|
358
|
- 多语言文本:`title.<lang>`, `brief.<lang>`, `description.<lang>`, `vendor.<lang>`, `category_path.<lang>`, `category_name_text.<lang>`
|
bc54124c
tangwang
docs
|
359
360
361
362
363
364
365
|
- 类目过滤:`category1_name`, `category2_name`, `category3_name` 等
- 规格/变体:`specifications`(nested)、`skus`(nested)
- 价格库存:`min_price`, `max_price`, `total_inventory` 等
- 向量:`title_embedding`(dense vector)、`image_embedding`(nested)
### 2.3 查询、权重、排序(`config/config.yaml`)
|
bd96cead
tangwang
1. 动态多语言字段与统一策略配置
|
366
367
|
- `field_boosts`:字段权重(统一按字段基名配置,运行时按 `.{lang}` 动态组装)
- `query_config.search_fields`:动态多语言检索字段(multilingual/shared/core)
|
bcada818
tangwang
last
|
368
|
- `query_config.text_query_strategy`:文本召回策略参数(minimum_should_match、翻译boost、翻译失败原文兜底boost等)
|
bc54124c
tangwang
docs
|
369
|
- `query_config`:语言、embedding 开关、source_fields、knn_boost、翻译提示词等
|
bc54124c
tangwang
docs
|
370
371
372
373
374
375
376
377
378
379
380
381
382
383
|
- `function_score`:ES 层加权函数
- `rerank`:重排窗口、超时、ES/AI 融合权重
### 2.4 分面与返回字段
- 分面字段通常包括:`category1_name`、`category2_name`、`category3_name`、`specifications.*`
- `query_config.source_fields` 控制返回字段(`null`=全部,`[]`=不返回 source,列表=指定字段)
- 多语言返回遵循请求 language 与字段回退策略
### 2.5 修改配置时怎么做
| 修改项 | 操作 |
|--------|------|
| 索引结构(mapping) | 修改 `mappings/search_products.json` → `./scripts/create_tenant_index.sh <tenant_id>` → 重新导入 |
|
bd96cead
tangwang
1. 动态多语言字段与统一策略配置
|
384
|
| 搜索字段/权重/排序/重排 | 修改 `config/config.yaml` 对应块 |
|
0fd2f875
tangwang
translate
|
385
|
| provider 与服务 URL | 修改 `config/config.yaml` 的 `services` 块;translation 的 `service_url/default_model/default_scene` 只认 YAML,embedding/rerank 仍可按需用环境变量覆盖 |
|
bc54124c
tangwang
docs
|
386
387
388
|
---
|
0fd2f875
tangwang
translate
|
389
|
## 3. 能力接入架构
|
bc54124c
tangwang
docs
|
390
391
392
393
394
|
目标:调用方稳定、配置可切换、单一配置源。
### 3.1 当前代码结构
|
0fd2f875
tangwang
translate
|
395
396
|
- 模块:`providers/` + `translation/`
- 工厂:`translation.create_translation_client()`、`create_embedding_provider()`、`create_rerank_provider()`
|
bc54124c
tangwang
docs
|
397
398
|
- 配置解析:`config/services_config.py`
|
0fd2f875
tangwang
translate
|
399
400
401
402
403
|
| 能力 | 调用入口 | 服务内实现 |
|------|----------|------------|
| translation | `translation/client.py` | `translation/service.py` + `translation/backends/` |
| embedding | `providers/embedding.py`(http) | embedding 服务内 backend |
| rerank | `providers/rerank.py`(http) | reranker 服务内 backend |
|
bc54124c
tangwang
docs
|
404
405
406
407
408
409
410
411
|
### 3.2 配置与覆盖
统一在 `config/config.yaml`:
```yaml
services:
translation:
|
0fd2f875
tangwang
translate
|
412
413
414
415
416
417
418
419
420
421
422
|
service_url: "http://127.0.0.1:6006"
default_model: "llm"
default_scene: "general"
timeout_sec: 10.0
capabilities:
qwen-mt: { enabled: true, backend: "qwen_mt", model: "qwen-mt-flash", base_url: "https://dashscope-us.aliyuncs.com/compatible-mode/v1", timeout_sec: 10.0, use_cache: true }
llm: { enabled: true, backend: "llm", model: "qwen-flash", base_url: "https://dashscope-us.aliyuncs.com/compatible-mode/v1", timeout_sec: 30.0 }
deepl: { enabled: false, backend: "deepl", api_url: "https://api.deepl.com/v2/translate", timeout_sec: 10.0 }
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" }
|
bc54124c
tangwang
docs
|
423
424
|
embedding:
provider: "http"
|
07cf5a93
tangwang
START_EMBEDDING=...
|
425
|
backend: "tei"
|
bc54124c
tangwang
docs
|
426
|
providers:
|
af03fdef
tangwang
embedding模块代码整理
|
427
|
http: { text_base_url: "http://127.0.0.1:6005", image_base_url: "http://127.0.0.1:6008" }
|
07cf5a93
tangwang
START_EMBEDDING=...
|
428
429
|
backends:
tei: { base_url: "http://127.0.0.1:8080", timeout_sec: 60, model_id: "Qwen/Qwen3-Embedding-0.6B" }
|
bc54124c
tangwang
docs
|
430
431
|
rerank:
provider: "http"
|
d31c7f65
tangwang
补充云服务reranker
|
432
|
backend: "qwen3_vllm" # bge | qwen3_vllm | qwen3_transformers | dashscope_rerank
|
bc54124c
tangwang
docs
|
433
434
435
436
437
438
|
providers:
http: { base_url: "http://127.0.0.1:6007", service_url: "http://127.0.0.1:6007/rerank" }
```
环境变量覆盖(优先级更高):
|
af03fdef
tangwang
embedding模块代码整理
|
439
440
|
- `EMBEDDING_TEXT_SERVICE_URL`
- `EMBEDDING_IMAGE_SERVICE_URL`
|
07cf5a93
tangwang
START_EMBEDDING=...
|
441
442
|
- `EMBEDDING_BACKEND`
- `TEI_BASE_URL`
|
bc54124c
tangwang
docs
|
443
444
|
- `RERANKER_SERVICE_URL`
- `RERANK_BACKEND`(服务内后端)
|
0d3e73ba
tangwang
rerank mini batch
|
445
|
- `RERANK_DASHSCOPE_API_KEY_CN` / `RERANK_DASHSCOPE_API_KEY_US`(`dashscope_rerank` 后端鉴权)
|
d31c7f65
tangwang
补充云服务reranker
|
446
|
- `RERANK_DASHSCOPE_ENDPOINT`(`dashscope_rerank` 地域 endpoint 覆盖)
|
bc54124c
tangwang
docs
|
447
|
|
0fd2f875
tangwang
translate
|
448
|
### 3.3 新增接入能力的最小步骤
|
bc54124c
tangwang
docs
|
449
|
|
0fd2f875
tangwang
translate
|
450
451
452
453
454
455
456
457
458
459
460
|
1. translation 新增能力:
在 `translation/backends/` 实现 backend,在 `translation/service.py` 注册,并在 `services.translation.capabilities` 增加配置。
2. embedding / rerank 新增调用方式:
在 `providers/<capability>.py` 实现 provider 类,并在 `create_*_provider()` 注册。
3. embedding / rerank 新增服务内模型:
在对应服务的 `backends/` 下实现并注册,在 `services.<capability>.backends` 新增配置。
说明:
- translation 的 scene 规则、语言码映射、prompt 模板、模型方向约束位于 `translation/` 内部,不再放到 `config/`。
- 翻译公共接口只暴露 `model + scene`,不暴露 `prompt`。
- translation 的 `service_url`、`default_model`、`default_scene` 来自 `config/config.yaml -> services.translation`,不再由环境变量静默覆盖。
|
bc54124c
tangwang
docs
|
461
462
463
464
465
466
467
468
|
---
## 4. 模块扩展规范(Embedding / Rerank)
这里重点区分两层:
- **Provider 层(调用方式)**:调用方如何访问能力(http/direct)
|
07cf5a93
tangwang
START_EMBEDDING=...
|
469
|
- **Backend 层(推理实现)**:服务进程内部具体模型实现(tei / local_st / qwen3_vllm / ...)
|
bc54124c
tangwang
docs
|
470
471
472
473
474
475
476
477
478
479
480
481
482
|
### 4.1 Rerank(重排)扩展
调用链:
`search/rerank_client.py` -> `create_rerank_provider()` -> `HttpRerankProvider` -> `POST /rerank`
服务实现:
- `reranker/server.py`
- `reranker/backends/__init__.py`(工厂)
- `reranker/backends/bge.py`
- `reranker/backends/qwen3_vllm.py`
|
d31c7f65
tangwang
补充云服务reranker
|
483
484
|
- `reranker/backends/qwen3_transformers.py`
- `reranker/backends/dashscope_rerank.py`
|
bc54124c
tangwang
docs
|
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
|
后端协议(服务内):
- 实现 `score_with_meta(query, docs, normalize) -> (scores, meta)`
- 返回 `scores` 与输入 `docs` 等长且顺序一致
配置位置:
`config/config.yaml` -> `services.rerank.backend` + `services.rerank.backends.<name>`
### 4.2 Embedding(向量化)扩展
调用链:
`create_embedding_provider()` -> `POST /embed/text` / `POST /embed/image`
服务实现:
- `embeddings/server.py`(文本和图像可独立加载)
|
07cf5a93
tangwang
START_EMBEDDING=...
|
504
|
- 文本后端默认 `TEI`(Qwen3-Embedding-0.6B)
|
bc54124c
tangwang
docs
|
505
506
507
508
509
510
511
512
|
- 图像后端支持本地 CLIP 或 clip-as-service
扩展建议:
- 文本后端统一提供批量编码能力(与输入索引对齐)
- 图像后端实现 `ImageEncoderProtocol`(`encode_image_urls`)
- 如后续后端增多,建议与 rerank 一样在 `services.embedding.backend(s)` 统一配置
|
950a640e
tangwang
embeddings
|
513
514
|
选型建议(Qwen3-Embedding-0.6B):
|
07cf5a93
tangwang
START_EMBEDDING=...
|
515
516
|
- 当前仓库默认:`TEI`(Text Embeddings Inference)
- 生产高并发优先:`TEI` 通常比 vLLM 更贴合 embedding-only 场景
|
950a640e
tangwang
embeddings
|
517
518
|
- `vLLM` 更适合生成式/重排混合场景;若仅做文本 embedding,通常不作为首选
|
bc54124c
tangwang
docs
|
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
|
### 4.3 新增后端检查清单(以 `qwen3_vllm` 为例)
1. 实现后端协议(服务内)
2. 在后端工厂注册(如 `get_rerank_backend`)
3. 增加 `config/config.yaml` 对应 backend 配置
4. 提供健康检查中的 backend/model 可观测信息
5. 保持外部 HTTP 契约不变,调用方无需改造
---
## 5. 验证、日志与常见排障入口
### 5.1 快速健康检查
```bash
curl http://localhost:6002/health
curl http://localhost:6002/admin/health
curl http://localhost:6004/health
curl http://localhost:6005/health
|
5bac9649
tangwang
文本 embedding 与图片 ...
|
538
|
curl http://localhost:6008/health
|
bc54124c
tangwang
docs
|
539
540
|
curl http://localhost:6006/health
curl http://localhost:6007/health
|
7b8d9e1a
tangwang
评估框架的启动脚本
|
541
542
|
# eval-web(若已启动):根路径可访问即正常
curl -sf -o /dev/null http://localhost:6010/ || true
|
bc54124c
tangwang
docs
|
543
544
545
546
|
```
### 5.2 常看日志
|
28e57bb1
tangwang
日志体系优化
|
547
548
|
- `logs/<service>-YYYY-MM-DD.log`(`service_ctl.sh` 按天写入的真实文件)
- `logs/<service>.log`(指向当天文件的软链,推荐 `tail -F`)
|
7913e2fb
tangwang
服务管理和监控
|
549
|
- `logs/service-monitor.log`(`service_ctl.sh monitor` 运行期健康检查、失败计数、自动重启日志)
|
28e57bb1
tangwang
日志体系优化
|
550
551
552
|
- `logs/api.log`(backend 进程内日志,按天轮转)
- `logs/backend_verbose.log`(backend 大对象详细日志,按天轮转)
- `logs/indexer.log`(索引结构化 JSON 日志,按天轮转)
|
bc54124c
tangwang
docs
|
553
554
555
556
557
558
559
560
|
### 5.3 常用排障命令
```bash
./scripts/service_ctl.sh status
curl http://localhost:9200
lsof -i :6002
lsof -i :6004
|
7b8d9e1a
tangwang
评估框架的启动脚本
|
561
|
lsof -i :6010
|
42e3aea6
tangwang
tidy
|
562
563
|
```
|
bc54124c
tangwang
docs
|
564
|
更完整的运行排障(多环境切换、Suggestion 构建、FAQ)见 `docs/Usage-Guide.md`。
|
42e3aea6
tangwang
tidy
|
565
|
|
0536222c
tangwang
query parser优化
|
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
|
### 5.4 HanLP 与 `transformers` 版本(`BertTokenizer.encode_plus`)
若日志出现 **`AttributeError: BertTokenizer has no attribute encode_plus`**,通常是 **同一 venv 里装了 `transformers` 5.x**,与 **HanLP 2.1.x** 不兼容(HanLP 仍调用已移除的 `encode_plus`)。
**处理:** 将 `transformers` 固定到 **4.x**(例如 4.44+),然后重装/校验 HanLP:
```bash
source activate.sh
pip install -r requirements_hanlp.txt
python -c "from transformers import BertTokenizer; import transformers as t; print(t.__version__, hasattr(BertTokenizer, 'encode_plus'))"
# 期望:4.x 且 True
```
**说明:** 重排/TEI 等若使用 **独立 venv**(如 `.venv-reranker`),可与主 venv 的 `transformers` 版本分离;主 venv 只要装了 HanLP 做查询分词,就不要把 `transformers` 升到 5。
|
bc54124c
tangwang
docs
|
581
|
---
|
42e3aea6
tangwang
tidy
|
582
|
|
bc54124c
tangwang
docs
|
583
|
## 6. 相关文档
|
42e3aea6
tangwang
tidy
|
584
585
586
|
| 文档 | 用途 |
|------|------|
|
bc54124c
tangwang
docs
|
587
588
|
| `docs/DEVELOPER_GUIDE.md` | 项目全貌、规范、协作方式 |
| `docs/Usage-Guide.md` | 运行运维手册:日志、多环境、故障排查、Suggestion 运维 |
|
41345271
tangwang
文档更新
|
589
590
|
| `docs/搜索API对接指南-速查表.md` | 搜索 API 参数速查 |
| `docs/搜索API对接指南-00-总览与快速开始.md` | 搜索 API 分册总览(其余见 `搜索API对接指南-01`…`-10`) |
|
42e3aea6
tangwang
tidy
|
591
|
| `indexer/README.md` | 索引模块职责与接口 |
|
bc54124c
tangwang
docs
|
592
|
| `embeddings/README.md` | 向量化服务说明 |
|
bc089b43
tangwang
refactor(reranker...
|
593
|
| `docs/TEI_SERVICE说明文档.md` | TEI 专项(安装、部署、GPU/CPU 模式、排障) |
|
cc11ae04
tangwang
cnclip
|
594
|
| `docs/CNCLIP_SERVICE说明文档.md` | CN-CLIP/clip-as-service 专项(环境、GPU、运维) |
|
bc54124c
tangwang
docs
|
595
|
| `reranker/README.md` | 重排服务说明 |
|
7299bae6
tangwang
tests
|
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
|
---
## 7. 持续集成测试(最小可维护方案)
目标:让后续开发者在不依赖真实 ES/MySQL/模型服务的前提下,快速验证核心服务契约不被破坏。
### 7.1 测试范围
`tests/ci/test_service_api_contracts.py` 覆盖:
- 搜索接口:`/search/`、`/search/image`、`/search/suggestions`
- 索引接口:`/indexer/reindex`、`/indexer/index`、`/indexer/build-docs`
- 向量服务:`/embed/text`、`/embed/image`
- 翻译服务:`/translate`、`/health`
- 重排服务:`/rerank`、`/health`
### 7.2 运行方式
```bash
source activate.sh
python -m pytest tests/ci -q
```
### 7.3 设计取舍
- 使用 mock/stub 注入依赖,确保测试快且稳定
- 重点测“接口契约与参数行为”,而不是底层模型质量
- 作为 PR 级门禁;真实环境联调放在运维/预发布流程
|