跳到主要内容
版本:v0.8.0

MS-RAG

多源增强检索增强生成框架(Multi-Source Enhanced Retrieval-Augmented Generation Framework,MS-RAG)

原理深度讲解

本页是框架参考。想先了解索引和 agentic 检索循环的"为什么",请先读设计文档:

  • 知识库索引原理——一篇文档如何变得可被检索:结构索引 / 知识图谱索引(含代码图谱) / 向量索引 / 关键词索引。
  • Agentic RAG 对话原理——一个问题如何通过 agent 驱动的检索循环变成带引用的回答。

简介

大语言模型(LLM)虽然强大,但只能基于训练数据回答。当用户需要最新或领域专属信息——比如内部文档、自建数据库、最新报告——单靠 LLM 就不够了。

检索增强生成(RAG) 通过从外部知识源检索相关信息、作为上下文喂给 LLM 再生成回答来填补这一缺口,确保回答基于真实数据而非记忆中的模式。

DB-GPT 实现的 多源 RAG(MS-RAG) 框架远超基础文档问答:它支持多种知识源(文档、URL、数据库、知识图谱、git 仓库)、多种索引策略,并与 DB-GPT 的 agent 和工作流生态深度集成。知识库对话由 agentic RAG 循环完成——agent 可以改写问题、多次检索、融合并重排结果、产出带引用的回答——而不是单次"检索-生成"。

架构

两个阶段:索引与对话​

索引(文档同步时执行)                          对话(聊天时执行)
───────────────────── ──────────────────────
知识源 → 切分 → 索引 用户问题
│ │
一次切分, ▼
多种索引: Agentic RAG 循环
• 向量 • 关键词 (改写问题 → 检索,可能多轮
• 知识图谱(三元组、 → 融合 + 重排 → 拼 prompt)
• 文档-段落、Markdown 标题、 │
• 代码 AST) ▼
LLM 生成带引用的回答

索引与对话解耦:索引在文档同步时执行一次,对话时只检索,不重新索引。

索引流水线​

构建索引是一条 ETL 流水线——一次"抽取"+ 一次"切分"喂给所有启用的索引;只有各索引自己的"转换"和"加载"不同。

抽取 Extract            转换 Transform                     加载 Load
───────────── ────────────────────── ───────────────────────
Knowledge.load() → ChunkManager.split() → 持久化进索引存储
解析数据源 → + 各索引自己的转换: · EmbeddingAssembler → 向量库
原始文本 · embedding (向量) · BM25Assembler → Elasticsearch
· 分词 (关键词/BM25) · graph store + RepoGraphBuilder
· 三元组 / 标题 / → 图存储 / 代码图谱
代码 AST (知识图谱) · SummaryAssembler → 向量库
· 摘要 (summary) · DBSchemaAssembler → 向量库
附上元数据(标题路径、
chunk_id …)供检索/引用
  1. 抽取(Extract) —— KnowledgeFactory 把每个数据源(文件/URL/文本/git 仓库)路由到对应的 Knowledge 实现,解析成原始文本(Knowledge.load())。
  2. 转换(Transform) —— ChunkManager.split() 按策略(大小/页/段落/分隔符/Markdown 标题)切分;每个索引再各自转换——embedding、BM25 分词、LLM 三元组/标题/代码 AST 抽取、摘要、schema embedding——并附上元数据(Header1…Header6、chunk_id …),后续检索和引用都靠它。
  3. 加载(Load) —— 按索引的驱动器把转换结果持久化进索引存储:向量/关键词/摘要/schema 索引分别由 EmbeddingAssembler/BM25Assembler/SummaryAssembler/DBSchemaAssembler 写入;知识图谱与代码图谱由图存储(aload_document)+ RepoGraphBuilder 构建。(结构索引不加载——它在检索时按本阶段写入的 HeaderN 元数据重建。)
  4. 检索与生成 —— 即下文的 agentic RAG 对话。

索引 ETL 流水线​

BaseAssembler 定义了统一的"抽取 → 转换 → 加载"骨架,各索引插入各自的转换+加载。一次抽取 + 一次切分喂给所有启用的索引——只有转换+加载随索引不同而不同。

Knowledge.load()  →  ChunkManager.split()  →  Assembler.persist()  →  Assembler.as_retriever()
# 抽取 # 转换 # 加载 # 检索(对话时)
索引转换加载驱动(实现)索引存储
向量chunk → embeddingEmbeddingAssembler.persist()向量库(Chroma、Milvus …)
关键词chunk → BM25 分词BM25Assembler.persist()Elasticsearch
知识图谱chunk → LLM 三元组 + 文档/标题/代码 AST 图图存储 aload_document + RepoGraphBuilderTuGraph / Neo4j / Memgraph
摘要chunk → LLM 摘要 → embeddingSummaryAssembler.persist()向量库
库表 schemaschema → embeddingDBSchemaAssembler.persist()向量库
代码图谱代码 → tree-sitter ASTRepoGraphBuilder → CodeGraphStore代码图谱表
结构(无——检索时才建)检索时按 HeaderN 元数据建 DocTreeIndex—

各 assembler 是向量/关键词/摘要/schema 索引的加载阶段驱动器;知识图谱与代码图谱分别由图存储和 RepoGraphBuilder 构建。它们消费的都是抽取+转换阶段产出的同一批 chunk——所以切分质量是所有索引的共同地基。

索引

DB-GPT 通过 index_methods(字符串列表)按知识空间选择要建哪些索引。三种索引方法是持久化的;结构索引和代码图谱是叠加在它们之上的两种形态。所有索引都作用在同一批 chunk 上,所以切分质量决定检索质量。

索引index_methods 值同步时建?能给你什么
向量VectorStore是embedding + 余弦的语义相似度排序
关键词FullText是精确词 / BM25 命中
知识图谱KnowledgeGraph是对实体、文档结构、标题、代码做图遍历
结构(检索时建树)否,查询时按 chunk 的 HeaderN 元数据重建Markdown 标题树 / 父子章节导航
代码图谱(叠加在 KnowledgeGraph;也用于 GIT_REPO 空间)是代码文件 AST,产出 function/class 节点 + defines 边
提示

知识图谱索引不是一张图,而是一组图:LLM 抽取的三元组图、文档-段落结构图、Markdown 标题层级图,以及(代码/git 仓库场景下的)代码 AST 图。它们共用一条构建链路。细节与代码图谱的 tree-sitter 解析见知识库索引原理。

对话:agentic RAG

用户在知识库上提问时,DB-GPT 不是单次"检索-生成",而是由 agent 驱动循环:

问题
│
▼
问题改写 / 多问题 ◄── LLM 扩展问题以提升召回
│
▼
检索(向量 + 关键词 + 图谱,可能多轮) ◄── 可迭代:检索 → 判断 → 再检索
│
▼
融合 + 重排
│
▼
拼上下文,生成带引用的回答

正是这个 agentic 循环——多步检索、问题改写、结果融合重排、引用——让 DB-GPT 能回答单次 RAG 应付不了的复杂或多部分问题。完整流程见 Agentic RAG 对话原理。

检索策略​

可在知识库设置里配置检索模式:

策略描述所需后端
Semantic基于 embedding 的向量相似度检索向量库
Keyword基于 BM25 的关键词匹配Elasticsearch
Hybrid向量 + 关键词,用 RRF(倒数排名融合)合并向量库 + Elasticsearch
Tree在 Markdown 标题层级上的树结构检索向量库

查询增强​

除原始检索外,agentic 循环还提供高级查询处理:

  • 问题改写(Query Rewrite) —— 用 LLM 把原问题扩展/改写成多个检索问题以提升召回,并判断是否需要再检索一轮。
  • 重排(Reranking) —— 检索后,用 reranker 重打分、重排结果再进 prompt,提升精度。

支持的重排器​

重排器类型描述
CrossEncoderRanker本地sentence-transformers CrossEncoder 模型
QwenRerankEmbeddings本地经 transformers 的 Qwen3-Reranker
OpenAPIRerankEmbeddingsAPI兼容 OpenAI 风格 rerank API
RRFRanker算法倒数排名融合,合并多源结果
DefaultRanker算法按分数简单排序

知识源

DB-GPT 支持从多种类型的源加载知识。Web UI 上传时可选数据源类型:

数据源类型​

类型描述例子
Document上传各种格式文件PDF、Word、Excel、CSV、Markdown、PowerPoint、TXT、HTML、JSON、ZIP
URL抓取并索引网页内容任意可访问 HTTP/HTTPS URL
Text直接输入原始文本在 UI 里粘贴文本
Yuque从语雀导入语雀文档链接
Git Repo克隆代码仓库并索引为代码图谱GitHub/GitLab 仓库 URL

支持的文档格式​

格式扩展名Knowledge 类
PDF.pdfPDFKnowledge
CSV.csvCSVKnowledge
Markdown.mdMarkdownKnowledge
Word (docx).docxDocxKnowledge
Word (旧版).docWord97DocKnowledge
Excel.xlsxExcelKnowledge
PowerPoint.pptxPPTXKnowledge
纯文本.txtTXTKnowledge
HTML.htmlHTMLKnowledge
JSON.jsonJSONKnowledge
代码.py .java .js .ts .go .rs .c .cpp …CodeFileKnowledge(用 tree-sitter 解析进代码图谱)

存储类型

创建知识库时选择用哪些索引存储——可多选,互补:

存储类型index_methods描述最适合
Vector StoreVectorStore存 embedding 做语义相似度检索通用文档问答
Knowledge GraphKnowledgeGraph构建图谱族(LLM 三元组 + 文档/标题/代码结构)做关系型检索实体关系复杂、含代码或结构化文档的领域知识
Full TextFullText全文/BM25 索引做关键词检索精确词匹配、关键词搜索

向量库后端​

后端描述安装 extra
ChromaDB默认嵌入式向量库,零配置storage_chromadb
Milvus生产级分布式向量库storage_milvus
PGVectorPostgreSQL 的向量扩展storage_pgvector
Valkey内存型高性能向量库,HNSW/FLAT 索引storage_valkey
Weaviate云原生向量检索引擎storage_weaviate
Elasticsearch全文 + 向量混合检索storage_elasticsearch
OceanBase云原生分布式数据库storage_oceanbase

知识图谱后端​

后端描述
TuGraph蚂蚁集团的高性能图数据库
Neo4j流行的开源图数据库
Memgraph内存型图数据库,低延迟

全文后端​

后端描述
Elasticsearch行业标准全文检索引擎
OpenSearchAWS 的搜索与分析套件

知识图谱 RAG

启用 KnowledgeGraph 索引方法时,DB-GPT 构建的是一组图,而非单张图。它们共用一条构建链路,都支持沿边检索:

  1. LLM 三元组图 —— 用 LLM 从每个 chunk 抽取 (主语, 谓词, 宾语) 三元组,以 实体 -边- 实体 形式 upsert 进图存储(TuGraph、Neo4j 或 Memgraph)。每条边记得来自哪个 chunk,所以答案仍可溯源。
  2. 文档-段落图 —— document → chunk → chunk(include/next 边)的结构骨架,让检索能从实体跳到包含它的 chunk 和文档。(启用社区汇总变体时,还会做社区检测并用 LLM 总结每个社区。)
  3. Markdown 标题图 —— 对 .md 文件建 file → H1 → H2 → H3(contains)层级。这是结构索引的图版本。
  4. 代码图谱 —— 对代码文件和 GIT_REPO 空间,用 tree-sitter 解析(Python/Java/JavaScript/TypeScript/Go/Rust/C/C++),产出 function/class/method/interface/struct… 节点和 file → defines → node 边。这让"apply_anthropic_cache_control 定义在哪?"这类代码级问题能精确命中。
备注

retriever 还支持 CALLS/INHERITS/IMPLEMENTS 边,但当前代码图谱 builder 只产出 contains 和 defines。调用链/继承遍历只有在别的 builder 产出过这些边时才有结果。完整细节与该 caveat 见知识库索引原理。

图检索子策略​

检索时 GraphRetriever 组合使用多种子策略:

  • 关键词 —— 按抽取的关键词匹配图节点
  • 向量 —— 对图节点 embedding 做语义相似度
  • 文本(Text2GQL) —— 用 LLM 把自然语言转成图查询语言
  • 文档 —— 通过文档-图关联检索

切分策略

切分是 RAG 质量的关键——它是所有索引的共同地基。DB-GPT 支持多种切分策略:

策略Splitter描述
按大小RecursiveCharacterTextSplitter按字符数切,可配大小和重叠(默认 512 / 50)
按页PageTextSplitter按页边界切(适合 PDF)
按段落ParagraphTextSplitter按段落边界切
按分隔符SeparatorTextSplitter按自定义分隔符切
按 Markdown 标题MarkdownHeaderTextSplitter按标题层级切,保留标题路径(结构索引和标题图都用它)

切分参数​

参数描述默认
chunk_size每个 chunk 最大字符数512
chunk_overlap相邻 chunk 重叠字符数50
topk每次检索取的 chunk 数5
recall_score相关度阈值0
recall_type召回策略(TopK)TopK
model使用的 embedding 模型取决于配置

Embedding 模型

DB-GPT 支持多种把文本转向量的 embedding 模型:

本地模型​

模型类描述
HuggingFaceHuggingFaceEmbeddings通用 HuggingFace 模型
BGE 系列HuggingFaceBgeEmbeddingsBAAI BGE,支持 instruction(中英)
InstructorHuggingFaceInstructEmbeddings指令跟随型 embedding

远程 API 模型​

提供方类描述
OpenAI 兼容OpenAPIEmbeddings任意 OpenAI 兼容 embedding API
JinaJinaEmbeddingsJina AI embedding 服务
OllamaOllamaEmbeddings本地 Ollama embedding 服务
通义(阿里云)TongyiEmbeddings阿里云 DashScope
千帆(百度)QianfanEmbeddings百度文心
SiliconFlowSiliconFlowEmbeddingsSiliconFlow embedding 服务

使用

创建知识库(Web UI)​

第 1 步 —— 打开知识管理​

在侧边栏进入 Knowledge。

第 2 步 —— 创建并配置​

  1. 点击 Create 新建知识库。
  2. 选择要启用的索引方法(Vector Store / Knowledge Graph / Full Text,可组合)。
  3. 选择 Embedding 模型并配置切分参数。

第 3 步 —— 上传数据​

选择数据源类型并上传内容。支持 Document(PDF、Word、Excel、CSV 等)、URL、Text、Yuque、Git Repo。

第 4 步 —— 配置切分​

选择切分策略并设置参数:

第 5 步 —— 配置检索策略(可选)​

可配置检索策略。DB-GPT 支持 Semantic / Keyword / Hybrid / Tree 等多种模式,按场景在知识库设置里选择。

第 6 步 —— 与知识库对话​

进入 Chat,点聊天输入栏的知识库图标,下拉选中你的知识库,开始提问。对话即走上述 agentic RAG 循环。

编程使用(Python API)​

from dbgpt.rag import Chunk
from dbgpt_ext.rag.assembler import EmbeddingAssembler
from dbgpt_ext.rag.knowledge import KnowledgeFactory

# 抽取:把数据源解析成原始文本
knowledge = KnowledgeFactory.create(file_path="your_document.pdf")

# 转换 + 加载:切分、embedding,并写入向量索引
assembler = await EmbeddingAssembler.aload_from_knowledge(
knowledge=knowledge,
index_store=your_vector_store,
embedding_model=your_embedding_model,
)
assembler.persist()

# 检索(对话时):向量索引回答相似度查询
retriever = assembler.as_retriever(top_k=5)
chunks = await retriever.aretrieve("What is the main topic?")

下一步

主题链接
索引原理(结构 / 知识图谱 / 代码图谱 / 向量 / 关键词)知识库索引原理
agentic RAG 对话原理Agentic RAG 对话原理
知识库 Web UI 指南Knowledge Base
RAG 概念RAG
Graph RAG 设置Graph RAG
AWEL RAG 算子AWEL
源代码GitHub