Version 3.1 | 2026-04-08 Maritime: 91.7% (180题) | Finance: 52% (95题)
┌──────────────────────────────────────────────────────────────────┐
│ LambdaRAG v3.1 │
│ │
│ Query │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 1: Intent + Entity Extract │ 评分制分类(8类) │
│ │ 规则优先 → LLM fallback │ + 规则实体提取 │
│ └─────────────┬───────────────────────┘ │
│ │ {intent, entities, keywords} │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 2: Entity-Enhanced Fusion │ │
│ │ ┌─────┬────────┬───────┬──────┐ │ │
│ │ │BM25 │Vector │Graph │Wiki │ │ 4路并行 │
│ │ │ │bge-m3 │Entity │Pages │ │ 实体增强查询 │
│ │ └──┬──┴───┬────┴──┬────┴──┬───┘ │ compare跳过增强 │
│ │ └──────┴───────┴──────┘ │ temporal时间展开 │
│ │ │ Weighted RRF │ │
│ └──────────────┼──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 2b: Corrective RAG (P1-1) │ 检索质量门控 │
│ │ 质量不足 → 改写query → 重试1次 │ │
│ └──────────────┬──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 3: Slot Fill │ person/process/data │
│ │ person → 人员槽位 JSON │ fact等跳过(省LLM) │
│ │ process → 流程槽位 JSON │ 领域模板从instance │
│ │ data → 表格行列定位 JSON │ │
│ └──────────────┬──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 4: Build Enriched Context │ 槽位+关系+Wiki+文档 │
│ │ → 3500字符上下文 → LLM生成回答 │ │
│ └──────────────┬──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────┐ │
│ │ Step 5: Feedback Logging │ P0-3 query_log │
│ │ 查询日志 + 未找到日志 │ P0-4 missing_queries │
│ └─────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
Layer 3 Orchestration intent_entity_extract → Route → Feedback
Layer 2 Pattern fusion_search | slot_fill | corrective_retry
Layer 1 Skill bm25 | vector | graph | wiki | rrf | time_filter | table_boost
| Skill | 类型 | 依赖 | 说明 |
|---|---|---|---|
| bm25_search | 本地 | pickle索引 | 关键词倒排索引 (bigram/trigram) |
| vector_search | 本地+NPU | numpy + bge-m3 | 1024维余弦相似度 |
| graph_walk | 本地 | relations.json | BFS N跳实体图遍历 |
| wiki_read | 本地 | wiki/*.md | 编译知识页面匹配 |
| rrf_merge | 纯计算 | — | Weighted Reciprocal Rank Fusion |
| time_filter | 纯计算 | — | 时效性排序增强 |
| table_boost | 纯计算 | — | 表格chunk优先 |
| slot_fill | LLM | vLLM | 结构化信息提取 |
| quality_check | 纯计算 | — | 检索质量门控 |
| Pattern | 组成 | 何时触发 |
|---|---|---|
| fusion_search | Par(bm25, vector, graph, wiki) >> rrf | 所有查询 |
| entity_enhance | extract_entities >> expand_query >> fusion | 非compare查询 |
| slot_pipeline | fusion >> slot_fill >> build_context | person/process/data |
| corrective_retry | fusion >> quality_check >> reformulate >> retry | 质量不足时 |
| temporal_expand | expand_time_words >> fusion >> time_filter | temporal查询 |
Pipeline = Compose(
IntentEntityExtract, # 评分分类 + 实体提取
EntityEnhancedFusionSearch, # 4路并行 + 加权RRF
CorrectiveRAGCheck, # 检索质量门控
SlotFill, # 结构化提取 (按intent)
BuildEnrichedContext, # 组装上下文
FeedbackLog, # 日志记录
)
不是 first-match,而是所有规则同时评分,最高分胜出。
| 意图 | 关键词 (部分) | 权重配置 |
|---|---|---|
| person | 谁负责/找谁/电话/联系人 | bm25:0.8 vec:0.5 graph:0.3 wiki:0.5 |
| process | 怎么办/能不能报销/流程/审批 | bm25:0.7 vec:0.5 graph:0.3 wiki:0.6 |
| data | 及格率/排名/统计/收费表 | bm25:1.0 vec:0.3 graph:0.05 wiki:0.1 |
| fact | 多少/标准/税率/有效期 | bm25:1.0 vec:0.5 graph:0.1 wiki:0.1 |
| compare | 异同/区别/对比 | bm25:0.5 vec:0.8 graph:0.4 wiki:0.7 |
| relation | 隶属/依据/由谁制定 | bm25:0.5 vec:0.3 graph:0.7 wiki:0.8 |
| synthesis | 总结/梳理/体系/框架 | bm25:0.6 vec:0.5 graph:0.5 wiki:0.6 |
| temporal | 最新/修订/什么时候/截止 | bm25:1.0 vec:0.2 graph:0.05 wiki:0.2 |
所有 4 路检索对每个查询都运行,通过权重控制各路贡献:
score(doc) = Σ weight_i / (k + rank_i)
分类器调的是权重,不是选路。
Step 1 提取的实体扩展 BM25 查询词:
原始: "横向经费报销接待餐费的标准"
增强: "横向经费报销接待餐费的标准 横向经费 接待餐费 报销标准"
例外: compare 类跳过增强(两个实体名本身就是最好的关键词)
检索后检查 top-3 文档与 query 的关键词重叠率:
"近五年" → "2022年至2026年"
"近三年" → "2024年至2026年"
"最新" → "2026年最新"
| 意图 | 提取内容 | LLM调用 |
|---|---|---|
| person | 姓名/职位/部门/电话/职责 | ✅ 1次 |
| process | 流程类型/步骤/条件/政策依据 | ✅ 1次 |
| data | 数值/表格行列/来源 | ✅ 1次 |
| fact/compare/temporal | — | ❌ 跳过 |
feedback/
├── query_log.jsonl # 每次查询记录
└── missing_queries.jsonl # "未找到"的查询
用途:指导知识库补充、路由权重调优、评估改动效果。
agentexample/qaagent67lambda/ ← 代码 (版本控制)
├── agent-config.yml # 通用模板
├── scripts/ # 通用脚本 (12个)
│ ├── config.py # 统一配置加载
│ ├── search_unified.py # v3.1 统一检索
│ ├── search_engine.py # BM25
│ ├── search_engine_v2.py # Hybrid
│ ├── graph_engine.py # 实体图谱
│ ├── extract_docs.py # 多格式文档提取
│ ├── rebuild_index.py # BM25索引
│ ├── build_vector_index.py # 向量索引
│ ├── wiki_compile.py # Wiki编译
│ └── ...
└── workspace/ # 运行时产物
/home/67/knowledge/{domain}/ ← 数据 (不版本控制)
├── instance.yml # 领域配置 (覆盖通用模板)
├── raw/ # 原始文件
├── processed/ # 提取文本
├── wiki/ # Wiki编译知识
├── rag_index.pkl # BM25索引
├── rag_vectors_v2.npy # 向量索引
├── metadata.json # 元数据
└── feedback/ # 反馈日志
# agent-config.yml (通用) → instance.yml (领域覆盖)
systemPrompt: 通用助手 → 南京大学财务处知识库问答助手
prompts.classify: 通用分类 → +报销/预约/退回 关键词
prompts.person_answer: 通用 → +财务处官方风格/网址
knowledge.baseDir: ./knowledge → /home/67/knowledge/finance
| 服务 | 端口 | 用途 |
|---|---|---|
| Maritime QA | 8080 | 海事法规问答 |
| Finance QA | 8082 | 财务服务问答 |
| Travel API | 8081 | 旅行规划 (Function Calling + 高德API) |
| vLLM | 8000 | LLM推理 (NPU 3,4,5,7) |
| bge-m3 | 11435 | Embedding (NPU 0) |
新领域部署 4 步:
# 1. 文档提取 (PDF/DOCX/PPTX/XLSX/MD → TXT)
python scripts/extract_docs.py
# 2. 构建索引
python scripts/rebuild_index.py # BM25 (~30s)
python scripts/build_vector_index.py # 向量 (~2min NPU)
# 3. Wiki编译 (时间规范化 + 关系提取)
python scripts/wiki_compile.py # ~45min for 261 files
# 4. 启动服务
docker run ... python scripts/app.py
| 版本 | Unified | U:B | 关键改进 |
|---|---|---|---|
| v2 | 89.8% | 8:6 | True Fusion |
| v3 | 90.8% | 10:7 | Intent+Slot |
| v3.1 | 91.7% | 14:9 | 评分分类+CRAG+compare修复 |
| 版本 | 有效回答 | 关键改进 |
|---|---|---|
| v2 | 48% | BM25基线 |
| v3 | 55% | 实体增强+槽位填充 |
| v3.1 | 52% | 评分分类 (需排查回退) |
| 优先级 | 项目 | 预期效果 |
|---|---|---|
| P1-3 | FAIR-RAG 内联证据评估 | 减少编造 |
| P1-4 | 语义查询缓存 | 30-50%命中→0.5s延迟 |
| P2-1 | RAGAS自动评估框架 | 量化每次改动效果 |
| P2-2 | 上下文分块 (Contextual Chunking) | 向量检索+10% |
| P2-3 | 领域同义词表 | 检索召回+5% |
| P2-4 | MinerU深度文档解析 | +84个扫描PDF |
| P2-5 | 路由成功率自适应 | 自动调优权重 |