diff --git a/config/config.yaml b/config/config.yaml index abf5cb9..ebdbc16 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -31,9 +31,9 @@ field_boosts: category_path: 1.5 category_name_text: 1.5 tags: 1.0 - option1_values: 0.5 - option2_values: 0.5 - option3_values: 0.5 + option1_values: 0.6 + option2_values: 0.4 + option3_values: 0.4 # Query Configuration(查询配置) query_config: diff --git a/docs/TODO.txt b/docs/TODO.txt index f5fee8a..5e6eaea 100644 --- a/docs/TODO.txt +++ b/docs/TODO.txt @@ -245,6 +245,17 @@ config/environments/.yaml + + +检索相关性优化: +原始搜索词和翻译的词,都需要有对应的主干分析 +这个主干可以根据词性简单提取名词即可 +在搜索时,原始词和主干都成对地出现,原始词和trunk_keywords一起组成一个或查询。 +有一种方案是把原始词和主干词拼接起来。但是bm25要调tf系数。 + + + + nllb-200-distilled-600M性能优化 已完成(2026-03) - CTranslate2 迁移 + float16 转换 diff --git a/docs/搜索API对接指南-07-微服务接口(Embedding-Reranker-Translation).md b/docs/搜索API对接指南-07-微服务接口(Embedding-Reranker-Translation).md index a8d4545..300d0db 100644 --- a/docs/搜索API对接指南-07-微服务接口(Embedding-Reranker-Translation).md +++ b/docs/搜索API对接指南-07-微服务接口(Embedding-Reranker-Translation).md @@ -264,9 +264,9 @@ curl "http://localhost:6007/health" - 如果是en-zh互译、期待更高的速度,可以考虑`opus-mt-zh-en` / `opus-mt-en-zh`。(质量未详细评测,一些文章说比blib-200-600m更好,但是我看了些case感觉要差不少) **实时翻译选型建议**: -- 在线 query 翻译如果只是 `en/zh` 互译,优先使用 `opus-mt-zh-en` 或 `opus-mt-en-zh`,它们是当前已测本地模型里延迟最低的一档。 +- 在线 query 翻译如果只是 `en/zh` 互译,优先使用 `opus-mt-zh-en` 或 `opus-mt-en-zh`。 - 如果涉及其他语言,或对质量要求高于本地轻量模型,优先考虑 `deepl`。 -- `nllb-200-distilled-600m` 不建议作为在线 query 翻译默认方案;我们在 `Tesla T4` 上测到 `batch_size=1` 时,`zh -> en` p50 约 `292.54 ms`、p95 约 `624.12 ms`,`en -> zh` p50 约 `481.61 ms`、p95 约 `1171.71 ms`。 +- `nllb-200-distilled-600m` 不建议作为在线 query 翻译默认方案;我们在 `Tesla T4` 上测到 `batch_size=1` 时,根据query长短,耗时大概在70-150ms之间。 **Batch Size / 调用方式建议**: - 本接口支持 `text: string[]`;离线或批量索引翻译时,应尽量合并请求,让底层 backend 发挥批处理能力。 diff --git a/docs/相关性检索优化说明.md b/docs/相关性检索优化说明.md index 8b4ddeb..f23c2f7 100644 --- a/docs/相关性检索优化说明.md +++ b/docs/相关性检索优化说明.md @@ -17,9 +17,9 @@ 查询链路(文本相关): 1. `QueryParser.parse()` - 输出 `detected_language`、`query_text_by_lang`、`search_langs`、`index_languages`、`source_in_index_languages`。 + 输出 `detected_language`、`query_text_by_lang`、`search_langs`、`index_languages`、`source_in_index_languages`;另输出 `contains_chinese` / `contains_english`(仅服务混写辅助召回,见 §4 末)。 2. `ESQueryBuilder._build_advanced_text_query()` - 按 `search_langs` 动态拼接 `title/brief/description/vendor/category_*` 的 `.{lang}` 字段,叠加 shared 字段(`tags`、`option*_values`)。 + 按 `search_langs` 动态拼接 `title/brief/description/vendor/category_*` 的 `.{lang}` 字段,叠加 shared 字段(`tags`、`option*_values`);若命中混写辅助条件,在同一子句内并入另一语种列(§4 末)。 3. `build_query()` 统一走文本策略,不再有布尔 AST 枝路。 @@ -40,14 +40,20 @@ 3. 若第 2 步翻译部分失败或全部失败: 对缺失翻译的 `index_languages` 字段,追加“原文低权重兜底”子句,避免完全丢失这些语种索引面的召回机会。 -### 3.2 翻译等待策略 +### 3.2 翻译与向量:并发提交与共享超时 -`QueryParser.parse()` 中: +`QueryParser.parse()` 内(Stage 4–6)对**离线调用**采用线程池提交 + **一次** `concurrent.futures.wait`: -- 当源语种不在 `index_languages`:使用 `translate_multi_async(...)` 并等待 futures 收敛 -- 当源语种在 `index_languages`:使用 `translate_multi(..., async_mode=True)`,优先缓存命中,未命中可后台补齐 +- **翻译**:对 `index_languages` 中除 `detected_language` 外的每个目标语种各提交一个 `translator.translate` 任务(多目标时并发执行)。 +- **查询向量**(若开启 `enable_text_embedding` 且域为 default):再提交一个 `text_encoder.encode` 任务。 +- 上述任务进入**同一** future 集合;例如租户索引为 `[zh, en]` 且检测语种**不在**索引内时,常为 **2 路翻译 + 1 路向量,共 3 个任务并发**,共用超时。 -这保证了“必须翻译才能检索”的场景不会直接空跑。 +**等待预算(毫秒)**由 `detected_language` 是否属于租户 `index_languages` 决定(`query_config`): + +- **在索引内**:`translation_embedding_wait_budget_ms_source_in_index`(默认较短,如 80ms)— 主召回已能打在源语种字段,翻译/向量稍慢可容忍。 +- **不在索引内**:`translation_embedding_wait_budget_ms_source_not_in_index`(默认较长,如 200ms)— 翻译对可检索文本更关键,给足时间。 + +超时未完成的任务会被丢弃并记 warning,解析继续(可能无部分译文或无数向量)。 ## 4. 统一文本召回表达式 @@ -68,8 +74,16 @@ 最终按 `bool.should` 组合,`minimum_should_match: 1`。 +> **附 — 混写辅助召回** +> 当中英(或多脚本)混写时,为略抬召回:`QueryParser` 用 `contains_chinese`(文中有汉字)、`contains_english`(分词中有长度 ≥3 的纯英文 token)打标;`ESQueryBuilder` 在某一语言的 `multi_match` 上,按规则把**另一语种**的同类字段并入同一 `fields`(受 `index_languages` 限制),并入列的 boost 为配置值再乘 **`mixed_script_merged_field_boost_scale`(默认 0.8,`ESQueryBuilder` 构造参数)**。`fallback_original_query_*` 同样适用。字段在内部以 `(path, boost)` 列表合并后再格式化为 ES 字符串。 + ## 5. 关键配置项(文本策略) +`query_config` 下与解析等待相关的项: + +- `translation_embedding_wait_budget_ms_source_in_index` +- `translation_embedding_wait_budget_ms_source_not_in_index` + 位于 `config/config.yaml -> query_config.text_query_strategy`: - `base_minimum_should_match` @@ -137,6 +151,7 @@ - `query_text_by_lang` - `source_in_index_languages` - `index_languages` + - `contains_chinese` / `contains_english` - `ESQueryBuilder` 负责“表达式展开”: - 动态字段组装 - 子句权重分配 -- libgit2 0.21.2