DEVELOPER_GUIDE.md
22.3 KB
开发者开放指南
本文档面向后续参与开发的工程师,用于快速建立项目全貌、理解设计原则与规范,保证所有迭代在统一框架内进行,减少设计分叉与冗余代码,产出可持续继承的高质量代码。
阅读建议:首次请按顺序通读第一至第五节;扩展能力或新增模块时重点阅读第六、七节;日常开发与 Code Review 可依赖第八、九节。
目录
1. 文档说明与阅读路径
1.1 本指南的角色
- 唯一入口:新人应首先阅读本指南,建立“框架全貌 + 规范”的认知。
- 规范聚合:设计原则、配置约定、扩展方式、代码质量要求均在此汇总,并指向更细的专项文档。
- 迭代约束:所有新功能、新模块、重构都应在符合本指南的前提下进行,Code Review 时可对照第九节检查清单。
1.2 推荐阅读路径
| 阶段 | 阅读内容 | 目的 |
|---|---|---|
| 入职/接手 | 本指南 §1–§5 | 建立全貌:项目是什么、架构怎样、模块边界 |
| 开发前 | 本指南 §5–§7 + 相关专项文档 | 理解原则与配置、扩展方式,避免造轮子与分叉 |
| 开发中 | 本指南 §8 + QUICKSTART / API 文档 | 编码风格、测试要求、接口约定 |
| 提测/合入前 | 本指南 §9 | 自检是否满足框架与规范 |
1.3 与本指南配套的专项文档
以下文档由本指南引用,按需深入:
- QUICKSTART.md — 环境、服务、模块、请求示例
- PROVIDER_ARCHITECTURE.md — 翻译/向量/重排 Provider 架构与新增 Provider
- MODULE_EXTENSION_SPEC.md — 向量化/重排后端可插拔设计、协议与配置
- 系统设计文档.md — 索引结构、数据流、通用化设计
- 基础配置指南.md — 索引与查询配置说明
- 搜索API对接指南.md — 搜索/索引/管理接口完整说明
- 环境配置说明.md — 首次部署、新机器环境
- Usage-Guide.md — 运维、日志、多环境、故障排查
2. 项目定位与核心价值
2.1 项目是什么
- 产品形态:面向跨境独立站(如店匠 Shoplazza)的多租户可配置搜索 SaaS,提供搜索后端与索引富化能力。
- 核心交付:
- 搜索服务:文本搜索、图片搜索、建议(suggestions)、过滤、分面、排序、可选重排。
- 索引服务:将 MySQL 中的店匠标准表(SPU/SKU)富化为符合 ES mapping 的文档(多语言、翻译、向量、规格聚合等),支持全量/增量及“仅构建 doc、由上游写 ES”的对接方式。
- 支撑服务:向量服务(embedding)、翻译服务(translator)、重排服务(reranker),可独立部署、通过配置切换。
2.2 核心价值与边界
- 多租户:单套代码与索引结构,通过
tenant_id隔离数据;租户级配置(如主语言、索引语言)由配置与 tenant_config 支持。 - 可配置:字段权重、搜索域、排序表达式、查询改写、功能开关等由配置驱动,避免硬编码业务逻辑。
- 可扩展:翻译/向量/重排采用 Provider + 后端可插拔设计,新增实现时遵循协议与配置规范,不破坏现有调用方。
- 不负责:商品主数据同步、店铺配置写库、全量/增量调度策略由上游(如 Java 索引程序)负责;本仓库专注“如何查、如何建 doc”。
3. 总体架构
3.1 数据流(简化)
MySQL (店匠 SPU/SKU)
→ Indexer(富化:多语言、翻译、向量、规格聚合)
→ Elasticsearch(按租户索引:search_products_tenant_<id>)
→ 搜索 API(QueryParser → Searcher,可选翻译/向量/重排)
→ 前端 / 上游业务
- 索引侧:Java 或脚本决定“对哪些 SPU 做索引”;Python indexer 负责“单条/批量 SPU → ES 文档”的完整逻辑,或通过
/indexer/build-docs仅返回 doc、由调用方写 ES。 - 搜索侧:请求经 QueryParser(解析、改写、翻译、向量化)→ Searcher(ES 查询、可选重排)→ 结果格式化 → 返回。
3.2 服务拓扑与端口
| 服务 | 端口 | 说明 | 默认随 run.sh 启动 |
|---|---|---|---|
| backend | 6002 | 搜索 API(含 admin) | ✓ |
| indexer | 6004 | 索引 API(reindex/build-docs 等) | ✓ |
| frontend | 6003 | 调试 UI | ✓ |
| embedding | 6005 | 向量服务(文本/图片) | 可选 |
| translator | 6006 | 翻译服务 | 可选 |
| reranker | 6007 | 重排服务 | 可选 |
- 启动:
./run.sh仅启动 backend / indexer / frontend;需全功能时通过环境变量或脚本另行启动 embedding / translator / reranker。 - 停止:统一使用
./scripts/stop.sh(会停止上述所有端口上的进程)。 - 详见 QUICKSTART.md 与 Usage-Guide.md。
3.3 仓库目录结构(与架构对应)
api/ # FastAPI 应用:搜索路由、管理路由、索引路由(indexer_app)
config/ # 配置加载与解析:config.yaml、services、env
indexer/ # MySQL → ES 管道:mapping、transformer、bulk、增量、build-docs
query/ # 查询解析:规范化、改写、翻译、embedding 调用、布尔解析
search/ # 搜索执行:多语言查询构建、Searcher、重排客户端、分数融合
embeddings/ # 向量化:服务端(server)、文本/图像后端、协议与配置
reranker/ # 重排:服务端(server)、后端(backends)、配置
providers/ # 能力提供者:翻译/向量/重排的客户端抽象与工厂
suggestion/ # 建议:索引构建、建议检索
utils/ # 共享工具:ES 客户端、DB 连接等
mappings/ # ES 索引 mapping 定义(如 search_products.json)
scripts/ # 脚本:环境、服务启停、数据、运维
frontend/ # 调试用前端静态资源
tests/ # 单元与集成测试
docs/ # 文档(含本指南)
- 约定:业务逻辑按能力放入对应顶层包;新增“能力”时优先考虑是否属于现有某包或 providers,避免随意新建顶层包导致分叉。
4. 核心模块与职责
4.1 api
- 职责:对外 HTTP 入口;挂载搜索、管理、索引等路由;中间件(限流、CORS、安全头等);不承载具体搜索/索引算法。
- 入口:
api/app.py(搜索 + 管理)、api/indexer_app.py(索引),均由main.py的serve/serve-indexer启动。 - 原则:路由层只做参数校验、租户解析、调用 search/query/indexer 等模块,不写复杂业务逻辑;配置与能力访问通过 config 与 providers 统一获取。
4.2 config
- 职责:加载与解析
config/config.yaml(搜索行为、字段权重、分面、function_score、rerank 融合参数等);提供ConfigLoader与SearchConfig等数据结构;服务级配置(翻译/向量/重排的 provider、URL、后端)由config/services_config.py从config.yaml的services块及环境变量解析。 - 原则:索引结构由
mappings/search_products.json定义;搜索行为与能力配置以 config 为主、环境变量覆盖,不在业务代码中散落硬编码。
4.3 indexer
- 职责:将 MySQL 行或上游传入的 SPU/SKU/options 转为符合
mappings/search_products.json的 ES 文档;含多语言组织、翻译调用、向量生成、规格/SKU 聚合、类目路径等;支持全量/增量写入 ES,以及仅返回 doc(build-docs)供上游写 ES。 - 对接:调用方通过
providers获取翻译、向量等能力;索引名通过indexer/mapping_generator.get_tenant_index_name(tenant_id)与ES_INDEX_NAMESPACE一致。 - 详见:
indexer/README.md、系统设计文档.md。
4.4 query
- 职责:查询解析与预处理:规范化、语言检测、改写(词典)、翻译、文本向量化、布尔表达式解析;输出可供 Searcher 使用的结构化查询信息。
- 原则:翻译/向量通过
providers获取,不直接依赖具体服务 URL 或实现;支持按配置关闭翻译/向量(如短查询、typing 场景)。
4.5 search
- 职责:构建多语言 ES 查询、执行检索、可选重排、分数融合、结果格式化;分面、过滤、排序、SKU 维度筛选等。
- 原则:重排通过
search/rerank_client.py调用create_rerank_provider(),不关心重排服务内是 BGE 还是 Qwen3;与 ES 的交互封装在 Searcher 内,便于 mock 与测试。
4.6 embeddings
- 职责:提供向量服务(FastAPI):
POST /embed/text、POST /embed/image;服务内按配置加载文本后端(如 BGE)与图像后端(如 clip-as-service 或本地 CN-CLIP),实现协议即可插拔。 - 原则:图片后端实现
embeddings/protocols.ImageEncoderProtocol;配置优先从config或embeddings/config.py读取,与services.embedding的 URL 分离。 - 详见:
embeddings/README.md、MODULE_EXTENSION_SPEC.md。
4.7 reranker
- 职责:提供重排服务(FastAPI):
POST /rerank(query + docs → scores);服务内按配置加载一个重排后端(如 BGE 或 Qwen3-vLLM),实现score_with_meta(query, docs, normalize)协议。 - 原则:对外 HTTP 契约固定;新增后端只在
reranker/backends中实现协议并注册,不修改调用方。 - 详见:MODULE_EXTENSION_SPEC.md。
4.8 providers
- 职责:统一“能力”的调用方式:翻译、向量、重排均通过工厂函数(如
create_translation_provider()、create_rerank_provider()、create_embedding_provider())获取实现,配置来自config/services_config(即config.yaml的services+ 环境变量)。 - 原则:业务代码只依赖 Provider 接口,不依赖具体 URL 或后端类型;新增调用方式(如新 Provider 类型)在对应
providers/<capability>.py中实现并在工厂中注册。 - 详见:PROVIDER_ARCHITECTURE.md。
4.9 suggestion
- 职责:建议索引的构建与检索:从 ES 商品索引与 MySQL 日志等构建 suggestion 索引;搜索 API 的
/search/suggestions使用本模块。 - 原则:索引命名与租户、环境命名空间一致;构建入口可通过
main.py build-suggestions或脚本封装调用。
4.10 utils / mappings
- utils:ES 客户端、DB 连接等通用工具;避免在业务包内重复实现。
- mappings:ES 索引 mapping 的 JSON 定义;所有租户共享同一结构,仅索引名按租户与环境区分。
5. 设计原则与约束
5.1 多租户
- 数据隔离仅通过
tenant_id实现;索引可为单索引多租户或 per-tenant 索引(如search_products_tenant_<id>),由索引名与查询时 filter 统一保证。 - 租户级配置(主语言、索引语言等)从
tenant_config或等价配置读取,不在代码中写死租户 ID 或店铺逻辑。
5.2 配置驱动
- 搜索行为(字段权重、搜索域、排序、function_score、重排融合参数等)来自
config/config.yaml,由ConfigLoader加载。 - 能力访问(翻译/向量/重排的 provider、URL、后端类型)来自
config.yaml的services块及环境变量,由config/services_config解析。 - 新增开关或参数时,优先在现有 config 结构下扩展,避免新增散落配置文件。
5.3 单一配置源与优先级
- 同一类配置只在一个地方定义默认值;覆盖顺序约定为:环境变量 > config 文件。
- 服务 URL、后端类型等均在
services.<capability>下配置;环境变量用于部署态覆盖(如RERANKER_SERVICE_URL、RERANK_BACKEND)。
5.4 调用方与实现解耦(Provider + Backend)
- 调用方:通过 Provider(如
HttpRerankProvider)访问能力,不依赖具体 URL 或服务内实现。 - 服务内:通过“后端”实现具体推理(如 BGE 与 Qwen3-vLLM);后端实现协议、在配置与工厂中注册即可插拔。
- 新增“一种调用方式”在 providers 中扩展;新增“一种推理实现”在对应服务的 backends 中扩展,并遵循 MODULE_EXTENSION_SPEC.md。
5.5 协议契约
- 同类型后端实现同一协议(如重排的
score_with_meta、图片的ImageEncoderProtocol);调用方只依赖协议,不依赖具体类名或实现细节。 - 新增后端时必须满足现有协议(输入输出、顺序、长度、meta 字段等),避免调用方为兼容新后端而改代码。
5.6 索引与查询结构统一
- 索引结构以
mappings/search_products.json为唯一来源;indexer 产出的 doc 必须与该 mapping 一致。 - 查询侧使用的字段名、多语言后缀(.zh/.en)、嵌套路径等与 mapping 保持一致;新增字段时同步更新 mapping 与查询/分面/过滤逻辑。
5.7 错误与降级
- 外部能力(翻译、向量、重排)调用失败时,应有明确降级策略(如跳过向量、仅用 BM25、重排失败时保留 ES 顺序),并打日志便于排查;不因单一能力不可用导致整请求失败。
6. 配置体系
6.1 主配置文件
- config/config.yaml:搜索行为(field_boosts、indexes、query_config、ranking、function_score、rerank 融合参数)、SPU 配置、services(翻译/向量/重排的 provider 与 backends)、tenant_config 等。
- .env:敏感信息与部署态变量(DB、ES、Redis、API Key、端口等);不提交敏感值,可提供
.env.example模板。
6.2 services 块结构(能力统一约定)
services:
<capability>:
provider: "http" # 调用方使用方式:http | direct | ...
base_url: "http://..."
providers:
http: { base_url: "...", ... }
direct: { ... }
backend: "bge" # 服务内后端(可选)
backends:
bge: { model_name: "...", ... }
qwen3_vllm: { ... }
- provider:调用方如何访问(如 HTTP)。
- backend / backends:当能力由本仓库内服务提供时,该服务加载哪个后端及参数。
- 解析入口:
config/services_config.py的get_*_config()及get_*_base_url()/get_rerank_service_url()等。
6.3 环境变量(常用)
- 能力 URL:
TRANSLATION_SERVICE_URL、EMBEDDING_SERVICE_URL、RERANKER_SERVICE_URL - 能力选择:
TRANSLATION_PROVIDER、EMBEDDING_PROVIDER、RERANK_PROVIDER、RERANK_BACKEND - 环境与索引:
ES_HOST、ES_INDEX_NAMESPACE、RUNTIME_ENV、DB 与 Redis 等
7. 扩展规范(能力与后端)
7.1 何时看扩展规范
- 新增或替换翻译/向量/重排的调用方式(如新的 HTTP 客户端、gRPC):见 PROVIDER_ARCHITECTURE.md。
- 新增或替换向量/重排的推理实现(如新模型、vLLM):见 MODULE_EXTENSION_SPEC.md。
7.2 新增 Provider(调用方式)
- 在
providers/<capability>.py中实现新类(与现有 Provider 同接口)。 - 在
create_*_provider()中按config.provider或环境变量增加分支。 - 在
config/config.yaml的services.<capability>.providers下补充参数。 - 不修改业务调用方(search/query/indexer 仍通过工厂获取实例)。
7.3 新增 Backend(推理实现)
- 实现协议:在对应目录(如
reranker/backends/、embeddings/)实现满足协议接口的类。 - 配置:在
config/config.yaml的services.<capability>.backends下增加新后端名及参数;支持环境变量覆盖(如RERANK_BACKEND)。 - 注册:在 backends 的工厂(如
get_rerank_backend(name, config))中增加分支并返回实例。 - 服务启动:服务(如
reranker/server.py)启动时读取 backend 配置并调用工厂,不写死后端类型。 - 文档与依赖:在 README 或 docs 中说明新后端的依赖、资源要求;可选依赖放入
requirements_ml.txt或 extra。
详见 MODULE_EXTENSION_SPEC.md 的“新增后端清单”。
7.4 禁止做法
- 在业务代码中硬编码服务 URL 或后端类型。
- 新增能力时复制一套独立配置体系或新顶层包,而不纳入
services与 providers/backends。 - 新增后端时破坏现有协议(如修改返回长度、顺序或 meta 约定)。
8. 代码规范与质量
8.1 风格与结构
- Python:遵循 PEP 8;类型注解推荐在公共接口与配置数据结构上使用;模块级文档字符串简要说明职责。
- 包结构:业务逻辑按能力归属对应顶层包;共享工具放
utils;不随意新增与现有包平行的“杂项”包。 - 命名:模块与类名清晰表意;配置键与
config.yaml/ 环境变量命名保持一致。
8.2 测试
- 位置:
tests/,可按unit/、integration/或按模块划分子目录;公共 fixture 在conftest.py。 - 标记:使用
@pytest.mark.unit、@pytest.mark.integration、@pytest.mark.api等区分用例类型,便于按需运行。 - 依赖:单元测试通过 mock(如
mock_es_client、sample_search_config)不依赖真实 ES/DB;集成测试需在说明中注明依赖服务。 - 运行:
python -m pytest tests/;仅单元:python -m pytest tests/unit/或-m unit。 - 原则:新增逻辑应有对应测试;修改协议或配置契约时更新相关测试与 fixture。
8.3 配置与环境
- 测试用配置优先从 fixture 或临时 config 构造,避免依赖仓库外部的
.env或真实 DB/ES;必要时使用clear_services_cache()等清理缓存。 - 不在代码中提交敏感信息;敏感项通过
.env或环境变量注入,并在文档中说明。
8.4 日志与可观测性
- 关键路径(请求入口、外部调用、失败降级)打日志;日志级别合理(如 debug 用于详细参数,info 用于流程,warning 用于降级)。
- 对外接口的耗时、错误码、租户等可考虑结构化日志或后续接入监控,便于运维与排查。
9. 迭代检查清单
在提交代码或发起 Code Review 前,建议自检以下项,确保迭代符合框架与规范。
9.1 架构与模块
- [ ] 新逻辑放在合适的现有包中,未随意新建与现有能力平行的顶层包。
- [ ] 未在业务代码中硬编码服务 URL、后端类型或租户 ID。
- [ ] 调用外部能力(翻译/向量/重排)时通过 providers 工厂获取实例,配置来自
services_config。
9.2 配置与扩展
- [ ] 新增配置项放在
config.yaml或services.<capability>下,并有环境变量覆盖方式(如需要)。 - [ ] 新增 Provider 或 Backend 时已阅读 PROVIDER_ARCHITECTURE.md / MODULE_EXTENSION_SPEC.md,并按要求实现协议、注册与配置。
- [ ] 新增后端满足现有协议(输入输出、顺序、长度、meta),未破坏调用方。
9.3 索引与查询
- [ ] 索引结构变更已同步到
mappings/search_products.json;indexer 产出与 mapping 一致。 - [ ] 查询/分面/过滤使用的字段名与 mapping 一致;多语言字段使用
.zh/.en等约定。
9.4 测试与质量
- [ ] 新增或修改逻辑有对应测试;修改接口或协议时已更新相关测试与 fixture。
- [ ] 单元测试不依赖真实 ES/DB;集成测试在文档或注释中说明依赖。
- [ ] 无敏感信息提交;敏感配置通过环境变量或 .env 说明。
9.5 文档与可维护性
- [ ] 新增模块或重要行为在 README 或 docs 中有简要说明;复杂逻辑有注释或文档引用。
- [ ] 本指南与相关专项文档在需要时已更新(如新增服务、端口、配置项、扩展步骤)。
10. 文档与资源索引
10.1 按用途查找
| 用途 | 文档 |
|---|---|
| 新人上手、环境与请求示例 | QUICKSTART.md |
| 框架全貌与规范(本文) | 本指南 |
| 翻译/向量/重排 Provider 扩展 | PROVIDER_ARCHITECTURE.md |
| 向量/重排后端可插拔与协议 | MODULE_EXTENSION_SPEC.md |
| 索引结构、数据流、通用化设计 | 系统设计文档.md |
| 索引与查询配置说明 | 基础配置指南.md |
| 搜索/索引 API 完整说明 | 搜索API对接指南.md |
| 搜索 API 参数速查 | 搜索API速查表.md |
| 首次部署、新机器环境 | 环境配置说明.md |
| 运维、日志、多环境、故障 | Usage-Guide.md |
| 索引模块职责与 Java 对接 | indexer/README.md |
| 向量模块与 clip-as-service | embeddings/README.md |
10.2 仓库内入口
- README.md:项目简介、快速命令、文档索引。
- CLAUDE.md:面向 AI 助手的项目说明与命令汇总,与本指南互补。
- 本指南(docs/DEVELOPER_GUIDE.md):面向人的全貌与规范入口。
本文档旨在让所有后续开发在预知框架全貌的前提下,在规范内迭代,减少分叉与冗余,提升可维护性。如有结构或规范变更,请同步更新本指南及相关专项文档。