Blame view

embeddings/README.md 6.64 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
  
4650fcec   tangwang   日志优化、日志串联(uid rqid)
8
9
  **请求日志串联(reqid / uid)**:统一实现在仓库根目录的 `request_log_context.py`(勿放到 `utils/` 下,以免 `.venv-embedding` 因 `utils/__init__.py` 拉取数据库依赖)。Uvicorn 日志配置见 `config/uvicorn_embedding_logging.json`
  
42e3aea6   tangwang   tidy
10
  ---
7bfb9946   tangwang   向量化模块
11
12
13
14
  
  这个目录是一个完整的“向量化模块”,包含:
  
  - **HTTP 客户端**`text_encoder.py` / `image_encoder.py`(供搜索/索引模块调用)
77516841   tangwang   tidy embeddings
15
  - **本地模型实现**`text_embedding_sentence_transformers.py` / `clip_model.py`
c10f90fe   tangwang   cnclip
16
  - **clip-as-service 客户端**`clip_as_service_encoder.py`(图片向量,推荐)
7bfb9946   tangwang   向量化模块
17
18
  - **向量化服务(FastAPI)**`server.py`
  - **统一配置**`config.py`
7a013ca7   tangwang   多模态文本向量服务ok
19
  - **接口契约**`protocols.ImageEncoderProtocol`(`encode_image_urls` + `encode_clip_texts`;本地 CN-CLIP 与 clip-as-service 均实现)
7bfb9946   tangwang   向量化模块
20
  
af03fdef   tangwang   embedding模块代码整理
21
  说明:历史上的云端 embedding 试验实现(DashScope)已从主仓库移除。当前默认部署为**文本服务 6005****图片服务 6008** 两条独立链路;`all` 模式仅作为单进程调试入口。
950a640e   tangwang   embeddings
22
23
24
  
  ### 文本向量后端(默认)
  
07cf5a93   tangwang   START_EMBEDDING=...
25
26
27
28
  - 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
29
  
7bfb9946   tangwang   向量化模块
30
31
  ### 服务接口
  
5bac9649   tangwang   文本 embedding 与图片 ...
32
33
  - 文本服务(默认 `6005`
    - `POST /embed/text`
af03fdef   tangwang   embedding模块代码整理
34
    - 请求体:`["文本1", "文本2", ...]`
b754fd41   tangwang   图片向量化支持优先级参数
35
    - 可选 query 参数:`normalize=true|false`、`priority=0|1`
af03fdef   tangwang   embedding模块代码整理
36
37
    - 返回:`[[...], [...], ...]`
    - 健康接口:`GET /health`、`GET /ready`
5bac9649   tangwang   文本 embedding 与图片 ...
38
  - 图片服务(默认 `6008`
7a013ca7   tangwang   多模态文本向量服务ok
39
40
41
    - `POST /embed/image`:图片 URL 或本地路径
    - `POST /embed/clip_text`:自然语言(CN-CLIP 文本塔,与 `/embed/image` 同向量空间;勿传 `http://` 图 URL)
    - 请求体:`["...", ...]` 字符串数组
b754fd41   tangwang   图片向量化支持优先级参数
42
    - 可选 query 参数:`normalize=true|false`、`priority=0|1`
af03fdef   tangwang   embedding模块代码整理
43
44
    - 返回:`[[...], [...], ...]`
    - 健康接口:`GET /health`、`GET /ready`
7bfb9946   tangwang   向量化模块
45
  
5bac9649   tangwang   文本 embedding 与图片 ...
46
47
48
49
50
51
52
53
  ### Redis 向量缓存
  
  - Value 格式没有变化,仍然是 **BF16 bytes**
    - 写入:`float32 -> BF16 -> bytes`
    - 读取:`bytes -> BF16 -> float32`
  - 现在是**双层缓存**
    - client 侧:`text_encoder.py` / `image_encoder.py`
    - service 侧:`server.py`
5a01af3c   tangwang   多模态hashkey调整:1. 加...
54
55
56
57
58
59
  - 当前主 key 格式(`model_name` 见 `CONFIG.MULTIMODAL_MODEL_NAME`,与 `services.embedding.image_backends` 一致):
    - 文本(TEI):`embedding:embed:norm{0|1}:{text_or_sha256_digest}`
    - CN-CLIP 图片:`embedding:image:embed:{model_name}:txt:norm{0|1}:{url_or_sha256_digest}`
    - CN-CLIP 文本塔:`embedding:clip_text:embed:{model_name}:img:norm{0|1}:{text_or_sha256_digest}`
  - 尾部负载:长度 ≤ `CACHE_KEY_RAW_BODY_MAX_CHARS`(默认 256,见 `embeddings/cache_keys.py`)用原文;更长用 `h:sha256:<hex>`(TEI 与多模态共用同一辅助函数)。
  - 切换多模态模型会自然换 key 空间;旧键需自行清理或等待过期。
5bac9649   tangwang   文本 embedding 与图片 ...
60
61
62
63
64
65
66
67
68
  
  ### 压力隔离与拒绝策略
  
  - 文本与图片各自有独立 admission control:
    - `TEXT_MAX_INFLIGHT`
    - `IMAGE_MAX_INFLIGHT`
  - 图片服务可以配置得比文本更严格。
  - 请求若是 full-cache-hit,会在服务端直接返回,不占用模型并发槽位。
  - 超过处理能力时直接拒绝,比无限排队更稳定。
b754fd41   tangwang   图片向量化支持优先级参数
69
70
71
72
73
  - 文本服务支持 `priority`
    - `priority=0`(默认,适合离线索引)仍受 `TEXT_MAX_INFLIGHT` 限制,超限直接返回 overload。
    - `priority>0`(建议在线 query 用 `1`)不会因 admission control 被拒绝,但仍会计入 inflight。
    - 文本服务内部使用双队列调度,处理时会优先消费高优先级请求,避免在线请求长期排在离线批量任务后面。
  - 图片服务同样支持 `priority`(语义与文本一致,按 `IMAGE_MAX_INFLIGHT` 计数;不做队列插队,仅 admission 规则不同)。
5bac9649   tangwang   文本 embedding 与图片 ...
74
  
c10f90fe   tangwang   cnclip
75
76
77
78
  ### 图片向量:clip-as-service(推荐)
  
  默认使用 `third-party/clip-as-service` 的 Jina CLIP 服务生成图片向量。
  
07cf5a93   tangwang   START_EMBEDDING=...
79
  1. **安装 embedding 专用环境**(首次使用):
c10f90fe   tangwang   cnclip
80
     ```bash
07cf5a93   tangwang   START_EMBEDDING=...
81
82
83
84
85
     ./scripts/setup_embedding_venv.sh
     ```
     如需使用本地 `local_st` 文本后端,再执行:
     ```bash
     INSTALL_LOCAL_ST=1 ./scripts/setup_embedding_venv.sh
c10f90fe   tangwang   cnclip
86
87
     ```
  
bc089b43   tangwang   refactor(reranker...
88
  2. **启动 CN-CLIP 服务**(独立 gRPC 服务,默认端口 51000,详见 `../docs/CNCLIP_SERVICE说明文档.md`):
c10f90fe   tangwang   cnclip
89
90
91
92
93
94
95
     ```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`
6d71d8e0   tangwang   多模态模型配置
96
     - `CLIP_AS_SERVICE_MODEL_NAME=CN-CLIP/ViT-H-14`(与 `config/config.yaml` 中 `services.embedding.image_backends` 一致;换 ViT-L 时为 768 维,须同步改 ES 映射)
4747e2f4   tangwang   embedding perform...
97
     - `scripts/start_cnclip_service.sh` 默认会读取同一个 `CLIP_AS_SERVICE_MODEL_NAME`,也可用 `CNCLIP_MODEL_NAME` 或 `--model-name` 临时覆盖
c10f90fe   tangwang   cnclip
98
  
b754fd41   tangwang   图片向量化支持优先级参数
99
100
  ### 性能与压测(沿用仓库脚本)
  
3abbc95a   tangwang   重构(scripts): 整理sc...
101
102
  - 接口级压测(与 `perf_reports/2026-03-12/matrix_report/` 等方法一致):`benchmarks/perf_api_benchmark.py`
    - 示例:`python benchmarks/perf_api_benchmark.py --scenario embed_text --duration 30 --concurrency 20`
b754fd41   tangwang   图片向量化支持优先级参数
103
    - 文本/图片向量可带 `priority`(与线上 admission 语义一致):`--embed-text-priority 1`、`--embed-image-priority 1`
3abbc95a   tangwang   重构(scripts): 整理sc...
104
    - 自定义请求模板:`--cases-file benchmarks/perf_cases.json.example`
b754fd41   tangwang   图片向量化支持优先级参数
105
106
  - 历史矩阵结果与说明见 `perf_reports/2026-03-12/matrix_report/summary.md`
  
7bfb9946   tangwang   向量化模块
107
108
  ### 启动服务
  
5bac9649   tangwang   文本 embedding 与图片 ...
109
  使用仓库脚本启动:
7bfb9946   tangwang   向量化模块
110
111
  
  ```bash
07cf5a93   tangwang   START_EMBEDDING=...
112
  # GPU(需 nvidia-container-toolkit)
af7ee060   tangwang   service_ctl 简化为“显...
113
  TEI_DEVICE=cuda ./scripts/start_tei_service.sh
07cf5a93   tangwang   START_EMBEDDING=...
114
115
  
  # CPU
af7ee060   tangwang   service_ctl 简化为“显...
116
  TEI_DEVICE=cpu ./scripts/start_tei_service.sh
07cf5a93   tangwang   START_EMBEDDING=...
117
  
5bac9649   tangwang   文本 embedding 与图片 ...
118
119
  ./scripts/start_embedding_text_service.sh
  ./scripts/start_embedding_image_service.sh
7bfb9946   tangwang   向量化模块
120
121
122
123
124
125
  ```
  
  ### 修改配置
  
  编辑 `embeddings/config.py`
  
af03fdef   tangwang   embedding模块代码整理
126
  - `PORT`: `all` 模式单进程端口(默认 6005)
950a640e   tangwang   embeddings
127
  - `TEXT_MODEL_ID`, `TEXT_DEVICE`, `TEXT_BATCH_SIZE`, `TEXT_NORMALIZE_EMBEDDINGS`
200fdddf   tangwang   embed norm
128
  - `IMAGE_NORMALIZE_EMBEDDINGS`(默认 true)
4747e2f4   tangwang   embedding perform...
129
  - `USE_CLIP_AS_SERVICE`, `CLIP_AS_SERVICE_SERVER`, `CLIP_AS_SERVICE_MODEL_NAME`:图片向量(clip-as-service)
c10f90fe   tangwang   cnclip
130
  - `IMAGE_MODEL_NAME`, `IMAGE_DEVICE`:本地 CN-CLIP(当 `USE_CLIP_AS_SERVICE=false` 时)
af7ee060   tangwang   service_ctl 简化为“显...
131
  - TEI 相关:`TEI_DEVICE`、`TEI_VERSION`、`TEI_MAX_BATCH_TOKENS`、`TEI_MAX_CLIENT_BATCH_SIZE`、`TEI_HEALTH_TIMEOUT_SEC`
5bac9649   tangwang   文本 embedding 与图片 ...
132
133
134
135
136
137
  - 分流/限流相关:
    - `EMBEDDING_SERVICE_KIND=all|text|image`
    - `EMBEDDING_TEXT_PORT`
    - `EMBEDDING_IMAGE_PORT`
    - `TEXT_MAX_INFLIGHT`
    - `IMAGE_MAX_INFLIGHT`