Skip to content

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=60rank_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 流式返回结果

批量处理

  • 支持批量文档向量化
  • 一次性处理多个文档
  • 减少模型加载次数

最佳实践

提高回答质量

  1. 文档质量:确保上传文档内容准确、结构清晰
  2. 文档数量:每个知识库至少 5-10 个相关文档
  3. 定期更新:及时更新过时内容
  4. 启用状态:只启用高质量文档参与检索

优化检索效果

  1. 明确查询:使用具体、明确的查询语句
  2. 关键词组合:结合专业术语和通俗表达
  3. 上下文提供:在对话中提供足够的背景信息
  4. 调整阈值:根据需要调整检索相关性阈值

性能调优

  1. 合理分块:文档分块大小适中(512-1024 tokens)
  2. Top-K 设置:根据场景调整返回文档数量(默认 5-10)
  3. 模型选择:根据硬件条件选择合适的 embedding 模型
  4. 缓存利用:充分利用向量缓存机制

常见问题

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 问答

本文档站基于 VitePress 构建