1. 有 ES 吗 ------ 有,但只有一个用途
src/es/(3 个文件)+ 共享库 yzliteclaw_infra 的 ESClient / EmbeddingFactory:
| 文件 | 职责 |
|---|---|
src/es/cache.py |
EsIntentCache.lookup():混合检索 + rerank + 硬命中判定 |
src/es/rerank.py |
纯函数加权 rerank + 意图签名抽取 |
src/es/factory.py |
build_es_intent_cache():双开关 + Fail-Safe |
接线:src/main.py 构建 → src/graph.py:406,443 → src/nodes/intent.py:485(在 llm_intent 之前拦截)。
2. 现状
配置 (config/supervisor.yaml)
- 索引
supervisor-agent-intent-cache-v1 - Embedding:TokenHub
kinfra-text-embedding-4b,2560 维 - 阈值:向量召回
0.8/ 硬命中0.95/ 向量权重0.5/ TopM10/ TopK3/ 超时1000ms es_prompt_version: "prompt-v2.1"------ 检索 filter 用它,改 prompt 必须 bump
部署开关(关键)
| 环境 | ES_ENABLED |
INTENT_ES_CACHE_ENABLED |
ES_URL |
|---|---|---|---|
| base | false |
--- | 占位 192.168.255.245:9200 |
| dev | true | true | http://elasticsearch:9200 |
| test | 值写 true,但注释写「明确不上 ES、双开关均显式 false」 |
true |
elastic.svc:9200(注释说"仅占位不生效") |
→ test overlay 的注释和取值自相矛盾(注释说关、值写的开),这是个真实的不一致,得确认哪个是意图。
数据现状(最要紧的) :种子文件 scripts/es_seed_data.json 只有 1 条 (我要去云海大厦1栋 → transport-agent),而设计文档要求「每类意图示例记录 >10 」。→ 索引数据远未达标,缓存命中率≈0,ES 层实际几乎不生效。
本地调试看不到它:
evals/intent/run_intent_node.py强制es_cache=None(保证真走 LLM),我这几轮验证都是绕过 ES 的。
3. 实现了什么功能
意图缓存(语义缓存),不是知识库:
query → embedding(2560d)
├─ ES 全文 BM25(ik_max_word / ik_smart 中文分词)→ Top10
└─ ES kNN 向量(cosine, num_candidates=50)→ Top10,再按 ≥0.8 过滤
→ 应用层 rerank:rerank = ft_norm×(1-0.5) + vec×0.5(BM25 用 top2 截顶归一化)
→ 硬命中判定:① TopK(3) 内存在 rerank ≥ 0.95
② 这些高分候选的「意图签名」(agent 集合)完全相同
→ 命中:直接复用缓存的 intents_payload + plan_payload,跳过 LLM(resolved_by=ES_HIT)
→ 未命中 / 超时 / 异常:静默降级 → LLM → KEYWORD 责任链
索引里存的是 intents_payload(意图 JSON)+ plan_payload(计划),object enabled:false(只存不索引)。设计文档原文目标:"优化意图识别效率,实现首 Token 输出 <2S"。
4. 能不能达到传统 RAG 效果 ------ 不能,它也不是 RAG
| 维度 | 传统 RAG | 本项目的 ES |
|---|---|---|
| 索引内容 | 知识文档 chunk | 意图 + 计划 payload(路由答案) |
| 命中后动作 | 召回内容 → 喂给 LLM 生成答案 | 直接返回缓存结果,不生成 |
| 生成环节 | 有(核心) | 无 |
| 目标 | 知识问答 / 事实接地 | 省 LLM 调用、降延迟、结果一致 |
相同点 :检索技术栈与 RAG 高度一致(中文分词 BM25 + dense_vector kNN + 混合召回 + 应用层 rerank + 阈值 + Fail-Safe 降级)------所以它是**"RAG 式检索"但不含"生成"**,工程上就是 semantic cache。
真正的知识型 RAG 不在 supervisor :docs/dd/supervisor/8_env.yaml 明确写「v4 解耦:supervisor 不再使用 Elasticsearch 」「向量库 / RAG 知识库」elasticsearch: {};知识检索在各子 Agent 内部(如 query-agent 自建 Wiki RAG ES 索引),supervisor 只做路由与编排。
⚠️ 三个要提醒你的点
- 改 prompt 必须 bump
es_prompt_version(当前prompt-v2.1)。你让我这几轮改intent_recognition.md都没 bump ------ 若 dev 的 ES 里有对应旧缓存且命中,就会出现"改了不生效"(虽然目前只种了 1 条、影响面小,但这个机制坑是存在的)。 - test overlay 注释与取值矛盾,建议统一(要么改值、要么改注释)。
- 索引数据几乎为空(1 条 vs 设计要求每类 >10),ES 层的收益目前等于没有;要用起来得先补种子数据。
与文档的矛盾
8_env.yaml 说「supervisor 不再使用 Elasticsearch」,但代码里 ES 意图缓存明确存在、dev 也已开启 ------ 文档没随实现更新(或者说 ES 意图缓存是解耦后以"缓存"形态回归的)。
需要我做什么吗?(补种子数据 / 修 test overlay 一致性 / 对齐文档 / 还是只是了解现状)