知识库(Knowledge Base)
License 提示
"知识库"编排器需要 orchestrator.knowledge_base (PROFESSIONAL)。知识库本身(创建 / 上传 / 检索)当前未单独按 License 网关,但通常和上述编排器或 Agent 检索一起被消费。
Sira 的知识库每条都同时承载两条内容流,由查询时的 mode 决定调用哪条:
| 流 | 存什么 | 查什么 |
|---|---|---|
| 文档 RAG 流 | 上传的文件解析后切块,向量 + 知识图谱 | 模糊语义提问、长文档摘要、跨段落推理 |
| QA 对流 | 结构化的问答对 + 双向量索引 | 标准答案、政策口径、客服 FAQ |
重要事实更新
之前的文档说知识库由 RAG-Anything + LightRAG 双引擎 构成。代码里 RAG-Anything 已被移除(参见 services/rag_wrapper.py:1-7),当前使用:
- LightRAG —— 唯一的检索引擎(向量 + 图谱混合)
- 文档解析器 ——
auto(默认)/markitdown/vlm/mineru四选一(在创建 KB 时配置;Docling 已于 2026-05 移除)
旧文档若提到 "RAG-Anything",按本说明为准。
数据模型一图
KnowledgeBase ──┬── kb_documents ──→ LightRAG (PG 多 namespace)
│ ├─ KV (chunk 文本)
│ ├─ pgvector
│ ├─ 知识图谱 (实体 + 关系)
│ └─ doc_status
│
└── qa_pairs ──→ question_vector + answer_vector
│ (pgvector + ivfflat)
└─ qa_categories (树形)kb_documents 是平台元数据;切片 / 向量 / 图谱实际存在 LightRAG 用 PG 命名空间隔离的表里。qa_pairs 是 Sira 自己管理的结构化表。
查询模式(mode 参数)
| Mode | 走哪条流 | 何时用 |
|---|---|---|
hybrid(默认) | QA 优先,未命中走 LightRAG mix | 大多数场景 |
qa_only | 仅 QA 对 | 严格答案场景(合规口径) |
doc_only | 仅 LightRAG | 自由文本提问、研究类 |
mix | LightRAG 混合(向量 + 图谱) | 主要给 doc_only 走,自由调用 |
local / global / naive / bypass | LightRAG 原生模式 | 调试 / 高级用法 |
混合模式的"先 QA 后 RAG"逻辑:
向量化 query
│
▼
QA 对 pgvector 余弦搜 (threshold = 0.7 召回)
│
├─ 最高相似度 ≥ 0.9 → 直接返回 QA 答案(短路)
│
└─ 否则 → 调 LightRAG (mix 模式) 检索文档片段
│
├─ 可选 rerank(KB 配了 rerank_model_id 时启用)
│
▼
用 KB 配置的 LLM 融合两路结果生成最终回复阈值不可配
0.7 / 0.9 阈值是 services/hybrid_kb_service.py 里的硬编码常量,不是配置项。如需精确"必须用 QA 答案",请用 mode=qa_only。
创建知识库
进入 /knowledge-base → "新建",表单字段:
| 字段 | 说明 |
|---|---|
name / display_name / description | 标识 |
llm_model_id | 检索结果融合用的 LLM |
embedding_model_id | 向量化模型(必选) |
vision_model_id | 文档里图片识别(可选) |
rerank_model_id | 检索结果重排(可选) |
parser_type | auto(默认,按文件类型自动选)/ markitdown / vlm / mineru(多模态最强,唯一支持 "i" 图像分析) |
enable_image_processing | 是否对文档内图片调用 vision 模型 |
mineru_config | lang / backend / device / source / vlm_url / formula / table |
chunking_strategy | length(默认)/ outline(按大纲) / semantic(语义边界) |
chunking_config | 默认 1024 tokens chunk + 128 overlap,按 \n 切 |
language | 主语言(影响切分) |
不存在"QA 库" vs "文档库"的类型选择——任何知识库都既能放文档也能加 QA 对。
文档摄入
上传途径
| 方式 | 端点 | 说明 |
|---|---|---|
| 单文件上传 | POST /knowledge-bases/{id}/documents | multipart |
| 单页 URL | /documents/from-url | 抓单 URL |
| 站点地图 | /documents/from-sitemap | 最多 500 页 |
支持的格式
.pdf .docx .doc .xlsx .xls .pptx .ppt .txt .md
不支持独立上传图片 / 音频 / 视频
图片 / 音频 / 视频不能作为单独文件上传到知识库。文档内嵌的图片可由 MinerU + vision 模型识别提取,但 .png / .mp3 / .mp4 直接上传会被拒。
切分策略对比
| 策略 | 适用 |
|---|---|
length | 通用、最快。默认 1024 token + 128 overlap |
outline | 文档有清晰章节结构(手册、政策) |
semantic | 长篇议论 / 研究文献,按语义边界切 |
处理流程
文件落到本地 RAG_WORKDIR_BASE/{kb_dir}/(默认 /app/data/rag_workdir/,非 MinIO),然后投递到 Celery 的 kb_queue_{kb_id} 队列处理:
upload → kb_documents.status=pending
│
▼ Celery worker
parse (auto / markitdown / vlm / mineru)
│
▼
chunk
│
▼
embed
│
▼
存入 LightRAG 命名空间
│
▼
kb_documents.status = completed (或 failed + processing_error)失败重试
POST /knowledge-bases/{kb_id}/documents/{doc_id}/retry仅当 status == failed 时允许。
QA 对管理
字段
| 字段 | 说明 |
|---|---|
question / answer | 必填 |
question_vector / answer_vector | 双向量(默认 Vector(1024)) |
category_id | 关联到 qa_categories 树 |
channel | all / pc / mobile / hotline,做渠道隔离 |
tags | TEXT[](不是 JSONB) |
priority | 整数(不是 high/medium/low 枚举) |
status | active / archived / draft |
view_count / match_count / feedback_score / last_matched_at | 命中统计 |
批量导入 CSV
POST /knowledge-bases/{kb_id}/qa-pairs/batch-import-csvCSV 列(确切支持的):question、answer、tags(管道或逗号分隔)、priority(整数)、source_id。
CSV 不识别这些列
category/category_name:CSV 不解析;如需归类请通过端点的category_idquery 参数指定channel:CSV 不解析;通过 query 参数或导入后批量更新
类目树
qa_categories 用 parent_id + path(形如 /1/3/7)实现树形:
GET /knowledge-bases/{kb_id}/qa-categories/tree返回完整树状结构。
检索 API
POST /knowledge-bases/{kb_id}/query
{
"query": "...",
"mode": "hybrid",
"top_k": 5,
"max_tokens": 2048,
"temperature": 0.3,
"vlm_enhanced": false,
"multimodal_content": null
}返回包含 similarity 字段(不是 score)的检索片段 + LLM 融合后的最终回复。
单 KB 单查询
当前 /query 端点只支持 单个 KB。多 KB 联合检索发生在 Agent 层(见下方)。
让智能体使用知识库
每个 Agent 可以挂多个 KB:
{
"knowledge_base_ids": ["kb-uuid-1", "kb-uuid-2"],
"retrieval_config": {
"mode": "hybrid",
"top_k": 5,
"similarity_threshold": 0.7,
"as_tool": false
}
}两种检索模式
Passive 注入(as_tool=false,默认)
每次对话先检索所有挂载的 KB,把命中片段拼到用户消息前面,再交给 LLM。Agent 完全不知情、不能选择是否检索。
在 Supervisor 编排器里,passive 模式会被自动跳过——只有 tool 模式有效。
Tool 模式(as_tool=true)
注入一个名为 search_knowledge_base 的工具(统一名字,不是按 KB 分别命名),LLM 自主决定调不调、传什么 query。
工具命名是固定的
旧文档里写"系统会按 KB 名生成 search_企业微信文档 这种工具"——不正确。代码里所有 KB 的检索工具统一叫 search_knowledge_base,跨 KB 通过工具内部参数 knowledge_base_ids 选择。
知识库编排器
OrchestrationType 第 8 项 KNOWLEDGE_BASE 用于"直答型"场景——不调度任何 Agent,进来的消息直接走 KB 检索 → 返回结果,端到端最快、最便宜。
配置:
{
"kb_id": "...",
"mode": "hybrid",
"top_k": 5,
"vlm_enhanced": false,
"max_tokens": 2048,
"temperature": 0.3
}注:每个知识库编排器只能绑 一个 KB;需要跨多个 KB 的请用 Agent + multi-KB。
知识图谱
LightRAG 在文档摄入时会自动构建实体 + 关系图。Sira 暴露给前端:
| 端点 | 用途 |
|---|---|
/graph/data | 整图节点 + 边 |
/graph/stats | 节点 / 边数量 |
/graph/search?q= | 按关键词找子图 |
/graph/community/{id} | 查看社区聚类 |
/knowledge-base/[id] 详情页有"知识图谱"标签可视化(基于 vis-network)。
前端页面结构
/knowledge-base/[id] 的标签:
| 标签 | 内容 |
|---|---|
documents | 已上传文件列表,状态、操作 |
qa | QA 对管理 + 类目树 |
graph | 知识图谱可视化 |
query | 查询 playground,可视化测试 mode / top_k |
config | 修改 KB 设置(解析器、切分策略、模型等) |
"chunks" 标签不存在
旧文档提过的 "chunks 标签 / 切片预览 UI" 在代码里没有。切片实际存在 LightRAG 内部,平台不暴露细粒度的切片浏览。
限制与未实现
| 项 | 状态 |
|---|---|
| 每组织最大 KB 数 | (none found) |
| 单 KB 总大小上限 | (none found),total_size_bytes 仅作统计 |
| 单文档大小上限 | 未在 /documents 端点强制 |
| 站点抓取页数 | 上限 500 页 |
| 关键字 / 全文检索(无向量化) | 不支持 —— 全部走向量 + 可选 rerank |
| QA 完全字面匹配 | 不支持 —— 所有匹配都是向量 |
| QA 版本管理 / 审核流 | 不支持 —— status 是自由文本枚举 |
| 多语言 QA 同义合并 | 不支持 |
| 检索结果缓存配置 | 不支持 |
相关文档
- QA 问答对管理 —— 深入讲 QA 流(已按代码事实更正)
- DeepAgents 编排 —— Skill + KB 一起用最强
- 模板变量 —— prompt 中引用 KB 的字段
- License v2 → 知识库编排
