RAG 系统
RAG(Retrieval-Augmented Generation,检索增强生成)是 KnowledgeRAG 的核心功能,结合了信息检索和生成式 AI 技术。
工作原理
RAG 系统的工作流程分为三个阶段:
1. 索引阶段
将知识库中的文档转换为向量表示并存储到向量数据库:
文档 → 文本提取 → 分块处理 → 向量化(Embedding) → FAISS 向量数据库2. 检索阶段
根据用户查询从向量数据库中检索相关信息:
用户查询 → 查询分析 → 混合检索(BM25 + FAISS) → RRF 融合排序 → Top-K 相关文档3. 生成阶段
使用大语言模型结合检索到的信息生成最终答案:
查询 + 相关文档 → Prompt 构建 → Ollama LLM → 生成回答 → 引用溯源两种 RAG 模式
系统提供两种 RAG 实现方式,可通过 Tab 切换:
模式一:LangChain RAG(推荐)
基于 LangChain 框架实现的标准 RAG 管道。
接口:POST /api/RAG/RAG_query
请求参数:
json
{
"query": "你的问题",
"docs_dir": "local-KLB-files/<知识库 ID>",
"use_hybrid": true
}工作流程:
用户提问 → 文档向量化(/ingest) → 混合检索 → OllamaLLM 生成回答 → SSE 流式返回模式二:原生 RAG
不依赖 LangChain 的原生实现。
接口:
- 向量化:
POST /api/RAG/native_ingest - 问答:
POST /api/RAG/native_query
适用场景:对 LangChain 依赖有顾虑的场景
混合检索机制
系统采用 BM25 + FAISS 双路检索策略:
┌─────────────────┐
│ 用户查询 │
└────────┬────────┘
│
┌────────────────┴────────────────┐
│ │
┌───────▼────────┐ ┌────────▼────────┐
│ BM25 关键词检索 │ │ FAISS 向量检索 │
│ (词汇匹配) │ │ (语义相似度) │
└───────┬────────┘ └────────┬────────┘
│ │
└────────────────┬────────────────┘
│
┌──────────▼──────────┐
│ RRF 倒排融合排序 │
│ score = Σ 1/(k+rank)│
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ Top-K 文档块 │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ LLM 生成回答 │
└─────────────────────┘BM25 关键词检索
- 基于词频和逆文档频率的经典算法
- 擅长精确匹配关键词
- 对专业术语和特定名词敏感
FAISS 向量检索
- Facebook AI Similarity Search
- 高效的近似最近邻搜索
- 理解语义相似性
- 支持同义词和相关概念
RRF 融合排序
Reciprocal Rank Fusion(RRF)公式:
score(d) = Σ 1 / (k + rank_i(d))其中 k=60,rank_i(d) 是文档在第 i 个检索结果中的排名。
向量化操作
文档向量化
接口:POST /api/RAG/ingest
- SSE 流式显示进度
- 嵌入模型:
all-MiniLM-L6-v2(384 维) - 异步处理,不阻塞主线程
向量缓存优化
VectorStoreManager 采用全局字典缓存(_vsm_cache):
- 以
docs_dir为 key 缓存向量存储 - 同一知识库首次加载后缓存
- 避免重复加载 embedding 模型
- 首次加载约 1-3 秒,后续请求毫秒级响应
AI 回答引用溯源
聊天组件(chat-main-unit.vue)对每条 AI 回答展示来源气泡:
功能特性
- 来源展示:显示引用的文件名和相关度得分
- 片段查看:点击展开查看具体引用片段
- 折叠/展开:支持折叠/展开所有来源
- 高亮标记:关键信息高亮显示
示例格式
根据知识库内容,人工智能(AI)是计算机科学的一个分支...
[来源]
📄 人工智能概述.pdf (相关度:0.82)
"人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论..."
📄 机器学习基础.docx (相关度:0.75)
"机器学习是人工智能的核心领域,通过数据训练模型..."性能优化
缓存机制
- Embedding 模型全局缓存
- 向量存储字典缓存
- 查询结果短期缓存
异步处理
- 文档上传异步分块
- 向量化任务异步执行
- SSE 流式返回结果
批量处理
- 支持批量文档向量化
- 一次性处理多个文档
- 减少模型加载次数
最佳实践
提高回答质量
- 文档质量:确保上传文档内容准确、结构清晰
- 文档数量:每个知识库至少 5-10 个相关文档
- 定期更新:及时更新过时内容
- 启用状态:只启用高质量文档参与检索
优化检索效果
- 明确查询:使用具体、明确的查询语句
- 关键词组合:结合专业术语和通俗表达
- 上下文提供:在对话中提供足够的背景信息
- 调整阈值:根据需要调整检索相关性阈值
性能调优
- 合理分块:文档分块大小适中(512-1024 tokens)
- Top-K 设置:根据场景调整返回文档数量(默认 5-10)
- 模型选择:根据硬件条件选择合适的 embedding 模型
- 缓存利用:充分利用向量缓存机制
常见问题
Q: 为什么有时回答不准确?
A: 可能的原因:
- 知识库中缺少相关文档
- 文档质量不高或内容过时
- 查询表述不够清晰
- 检索参数需要调整
Q: 如何提高检索速度?
A: 建议:
- 确保向量缓存已生效
- 减少单个知识库的文档数量(可拆分知识库)
- 降低 Top-K 值
- 使用性能更好的硬件
Q: 引用溯源不显示怎么办?
A: 检查:
- 是否启用了引用溯源功能
- 检索是否成功返回文档
- 文档是否处于启用状态
- 前端组件是否正常加载
相关 API
POST /api/RAG/ingest- 文档向量化POST /api/RAG/RAG_query- 普通 RAG 问答POST /api/RAG/RAG_query_sync- 同步问答(测试用)POST /api/RAG/native_ingest- 原生 RAG 向量化POST /api/RAG/native_query- 原生 RAG 问答