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

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…Header6chunk_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 ASTRepoGraphBuilderCodeGraphStore代码图谱表
结构(无——检索时才建)检索时按 HeaderN 元数据建 DocTreeIndex

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

索引

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

索引index_methods同步时建?能给你什么
向量VectorStoreembedding + 余弦的语义相似度排序
关键词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 只产出 containsdefines。调用链/继承遍历只有在别的 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