Blame view

embeddings/README.md 5.7 KB
42e3aea6   tangwang   tidy
1
2
3
  # Embeddings 模块
  
  **请求示例**`docs/QUICKSTART.md` §3.3。
bc089b43   tangwang   refactor(reranker...
4
5
6
  **专项文档**
  - `../docs/TEI_SERVICE说明文档.md`
  - `../docs/CNCLIP_SERVICE说明文档.md`
42e3aea6   tangwang   tidy
7
8
  
  ---
7bfb9946   tangwang   向量化模块
9
10
11
12
  
  这个目录是一个完整的“向量化模块”,包含:
  
  - **HTTP 客户端**`text_encoder.py` / `image_encoder.py`(供搜索/索引模块调用)
77516841   tangwang   tidy embeddings
13
  - **本地模型实现**`text_embedding_sentence_transformers.py` / `clip_model.py`
c10f90fe   tangwang   cnclip
14
  - **clip-as-service 客户端**`clip_as_service_encoder.py`(图片向量,推荐)
7bfb9946   tangwang   向量化模块
15
16
  - **向量化服务(FastAPI)**`server.py`
  - **统一配置**`config.py`
200fdddf   tangwang   embed norm
17
  - **接口契约**`protocols.ImageEncoderProtocol`(图片编码统一为 `encode_image_urls(urls, batch_size, normalize_embeddings)`,本地 CN-CLIP 与 clip-as-service 均实现该接口)
7bfb9946   tangwang   向量化模块
18
  
af03fdef   tangwang   embedding模块代码整理
19
  说明:历史上的云端 embedding 试验实现(DashScope)已从主仓库移除。当前默认部署为**文本服务 6005****图片服务 6008** 两条独立链路;`all` 模式仅作为单进程调试入口。
950a640e   tangwang   embeddings
20
21
22
  
  ### 文本向量后端(默认)
  
07cf5a93   tangwang   START_EMBEDDING=...
23
24
25
26
  - 6005 文本向量服务默认后端:`TEI`(Text Embeddings Inference)
  - 默认模型:`Qwen/Qwen3-Embedding-0.6B`
  - 后端配置来源:`config/config.yaml -> services.embedding.backend/backends`
  - 环境变量覆盖:`EMBEDDING_BACKEND`、`TEI_BASE_URL`、`TEI_TIMEOUT_SEC`
950a640e   tangwang   embeddings
27
  
7bfb9946   tangwang   向量化模块
28
29
  ### 服务接口
  
5bac9649   tangwang   文本 embedding 与图片 ...
30
31
  - 文本服务(默认 `6005`
    - `POST /embed/text`
af03fdef   tangwang   embedding模块代码整理
32
    - 请求体:`["文本1", "文本2", ...]`
b754fd41   tangwang   图片向量化支持优先级参数
33
    - 可选 query 参数:`normalize=true|false`、`priority=0|1`
af03fdef   tangwang   embedding模块代码整理
34
35
    - 返回:`[[...], [...], ...]`
    - 健康接口:`GET /health`、`GET /ready`
5bac9649   tangwang   文本 embedding 与图片 ...
36
37
  - 图片服务(默认 `6008`
    - `POST /embed/image`
af03fdef   tangwang   embedding模块代码整理
38
    - 请求体:`["url或本地路径1", ...]`
b754fd41   tangwang   图片向量化支持优先级参数
39
    - 可选 query 参数:`normalize=true|false`、`priority=0|1`
af03fdef   tangwang   embedding模块代码整理
40
41
    - 返回:`[[...], [...], ...]`
    - 健康接口:`GET /health`、`GET /ready`
7bfb9946   tangwang   向量化模块
42
  
5bac9649   tangwang   文本 embedding 与图片 ...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  ### Redis 向量缓存
  
  - Value 格式没有变化,仍然是 **BF16 bytes**
    - 写入:`float32 -> BF16 -> bytes`
    - 读取:`bytes -> BF16 -> float32`
  - 现在是**双层缓存**
    - client 侧:`text_encoder.py` / `image_encoder.py`
    - service 侧:`server.py`
  - 当前主 key 格式:
    - 文本:`embedding:embed:norm{0|1}:{text}`
    - 图片:`embedding:image:embed:norm{0|1}:{url_or_path}`
  - 当前实现不再兼容历史 key 规则,只保留这一套格式,减少代码路径和缓存歧义。
  
  ### 压力隔离与拒绝策略
  
  - 文本与图片各自有独立 admission control:
    - `TEXT_MAX_INFLIGHT`
    - `IMAGE_MAX_INFLIGHT`
  - 图片服务可以配置得比文本更严格。
  - 请求若是 full-cache-hit,会在服务端直接返回,不占用模型并发槽位。
  - 超过处理能力时直接拒绝,比无限排队更稳定。
b754fd41   tangwang   图片向量化支持优先级参数
64
65
66
67
68
  - 文本服务支持 `priority`
    - `priority=0`(默认,适合离线索引)仍受 `TEXT_MAX_INFLIGHT` 限制,超限直接返回 overload。
    - `priority>0`(建议在线 query 用 `1`)不会因 admission control 被拒绝,但仍会计入 inflight。
    - 文本服务内部使用双队列调度,处理时会优先消费高优先级请求,避免在线请求长期排在离线批量任务后面。
  - 图片服务同样支持 `priority`(语义与文本一致,按 `IMAGE_MAX_INFLIGHT` 计数;不做队列插队,仅 admission 规则不同)。
5bac9649   tangwang   文本 embedding 与图片 ...
69
  
c10f90fe   tangwang   cnclip
70
71
72
73
  ### 图片向量:clip-as-service(推荐)
  
  默认使用 `third-party/clip-as-service` 的 Jina CLIP 服务生成图片向量。
  
07cf5a93   tangwang   START_EMBEDDING=...
74
  1. **安装 embedding 专用环境**(首次使用):
c10f90fe   tangwang   cnclip
75
     ```bash
07cf5a93   tangwang   START_EMBEDDING=...
76
77
78
79
80
     ./scripts/setup_embedding_venv.sh
     ```
     如需使用本地 `local_st` 文本后端,再执行:
     ```bash
     INSTALL_LOCAL_ST=1 ./scripts/setup_embedding_venv.sh
c10f90fe   tangwang   cnclip
81
82
     ```
  
bc089b43   tangwang   refactor(reranker...
83
  2. **启动 CN-CLIP 服务**(独立 gRPC 服务,默认端口 51000,详见 `../docs/CNCLIP_SERVICE说明文档.md`):
c10f90fe   tangwang   cnclip
84
85
86
87
88
89
90
     ```bash
     ./scripts/start_cnclip_service.sh
     ```
  
  3. **配置**`embeddings/config.py` 或环境变量):
     - `USE_CLIP_AS_SERVICE=true`(默认)
     - `CLIP_AS_SERVICE_SERVER=grpc://127.0.0.1:51000`
4747e2f4   tangwang   embedding perform...
91
92
     - `CLIP_AS_SERVICE_MODEL_NAME=CN-CLIP/ViT-L-14`
     - `scripts/start_cnclip_service.sh` 默认会读取同一个 `CLIP_AS_SERVICE_MODEL_NAME`,也可用 `CNCLIP_MODEL_NAME` 或 `--model-name` 临时覆盖
c10f90fe   tangwang   cnclip
93
  
b754fd41   tangwang   图片向量化支持优先级参数
94
95
96
97
98
99
100
101
  ### 性能与压测(沿用仓库脚本)
  
  - 接口级压测(与 `perf_reports/2026-03-12/matrix_report/` 等方法一致):`scripts/perf_api_benchmark.py`
    - 示例:`python scripts/perf_api_benchmark.py --scenario embed_text --duration 30 --concurrency 20`
    - 文本/图片向量可带 `priority`(与线上 admission 语义一致):`--embed-text-priority 1`、`--embed-image-priority 1`
    - 自定义请求模板:`--cases-file scripts/perf_cases.json.example`
  - 历史矩阵结果与说明见 `perf_reports/2026-03-12/matrix_report/summary.md`
  
7bfb9946   tangwang   向量化模块
102
103
  ### 启动服务
  
5bac9649   tangwang   文本 embedding 与图片 ...
104
  使用仓库脚本启动:
7bfb9946   tangwang   向量化模块
105
106
  
  ```bash
07cf5a93   tangwang   START_EMBEDDING=...
107
  # GPU(需 nvidia-container-toolkit)
af7ee060   tangwang   service_ctl 简化为“显...
108
  TEI_DEVICE=cuda ./scripts/start_tei_service.sh
07cf5a93   tangwang   START_EMBEDDING=...
109
110
  
  # CPU
af7ee060   tangwang   service_ctl 简化为“显...
111
  TEI_DEVICE=cpu ./scripts/start_tei_service.sh
07cf5a93   tangwang   START_EMBEDDING=...
112
  
5bac9649   tangwang   文本 embedding 与图片 ...
113
114
  ./scripts/start_embedding_text_service.sh
  ./scripts/start_embedding_image_service.sh
7bfb9946   tangwang   向量化模块
115
116
117
118
119
120
  ```
  
  ### 修改配置
  
  编辑 `embeddings/config.py`
  
af03fdef   tangwang   embedding模块代码整理
121
  - `PORT`: `all` 模式单进程端口(默认 6005)
950a640e   tangwang   embeddings
122
  - `TEXT_MODEL_ID`, `TEXT_DEVICE`, `TEXT_BATCH_SIZE`, `TEXT_NORMALIZE_EMBEDDINGS`
200fdddf   tangwang   embed norm
123
  - `IMAGE_NORMALIZE_EMBEDDINGS`(默认 true)
4747e2f4   tangwang   embedding perform...
124
  - `USE_CLIP_AS_SERVICE`, `CLIP_AS_SERVICE_SERVER`, `CLIP_AS_SERVICE_MODEL_NAME`:图片向量(clip-as-service)
c10f90fe   tangwang   cnclip
125
  - `IMAGE_MODEL_NAME`, `IMAGE_DEVICE`:本地 CN-CLIP(当 `USE_CLIP_AS_SERVICE=false` 时)
af7ee060   tangwang   service_ctl 简化为“显...
126
  - TEI 相关:`TEI_DEVICE`、`TEI_VERSION`、`TEI_MAX_BATCH_TOKENS`、`TEI_MAX_CLIENT_BATCH_SIZE`、`TEI_HEALTH_TIMEOUT_SEC`
5bac9649   tangwang   文本 embedding 与图片 ...
127
128
129
130
131
132
  - 分流/限流相关:
    - `EMBEDDING_SERVICE_KIND=all|text|image`
    - `EMBEDDING_TEXT_PORT`
    - `EMBEDDING_IMAGE_PORT`
    - `TEXT_MAX_INFLIGHT`
    - `IMAGE_MAX_INFLIGHT`