RAG 系统的数据底座该怎么选?专用向量库还是 OLAP 引擎?Apache Doris 提供 HNSW 向量索引 + SQL 结构化过滤 + search() 全文检索的统一方案,本文拆解基础 RAG 和知识图谱增强 RAG 的技术实现并给出选型建议。
关键词:Apache Doris、RAG、知识图谱、LangChain、bge-m3、向量检索、SelectDB
摘要
本文介绍基于 Apache Doris 构建完整 RAG 系统的两种模式:基础 RAG(HNSW 向量索引 + bge-m3 嵌入 + Deepseek 生成)和知识图谱增强 RAG(LLM 实体关系抽取 + NetworkX 构图 + Doris SQL 关系查询)。基础 RAG 适合简单事实查询,知识图谱增强 RAG 通过将非结构化文档转换为结构化知识图谱(实体+关系),解决多实体关联复杂问题。Doris 作为统一数据底座,将向量检索、结构化过滤、全文搜索统一在一个引擎中,避免了多系统拼装的复杂度。
基于 Doris 的基础 RAG 系统是什么
技术栈
| 组件 | 选型 | 用途 |
|---|---|---|
| 向量数据库 | Apache Doris | HNSW 向量索引 + 结构化存储 |
| 嵌入模型 | Ollama + bge-m3 | 1024 维文本向量嵌入 |
| LLM | Deepseek API | 对话交互与答案生成 |
| 文本处理 | LangChain | 文本分片 + 嵌入生成 |
技术实现细节
Doris 建表(HNSW 向量索引) :
sql
CREATE TABLE doris_rag_demo (
id INT,
content TEXT,
embedding ARRAY<FLOAT> NOT NULL,
INDEX idx_embedding (embedding) USING ANN PROPERTIES (
"dim" = "1024",
"ef_construction" = "40",
"index_type" = "hnsw",
"max_degree" = "32",
"metric_type" = "inner_product"
)
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
文本分片:使用 LangChain RecursiveCharacterTextSplitter,chunk_size=400 字符,chunk_overlap=10 字符,保证上下文连续性。
向量嵌入:使用 Ollama 部署的 bge-m3 模型生成 1024 维向量,该模型在中文文本表征上具备优异性能。
检索流程:用户查询 → bge-m3 嵌入 → Doris ANN 检索 Top5 → 拼接上下文 → Deepseek 生成答案。
基础 RAG 的局限
| 问题 | 原因 | 影响 |
|---|---|---|
| 知识碎片化 | 分片切断实体间关联 | LLM 需从碎片推理关系 |
| 信息利用率低 | 只检索 Top-K 片段 | 相关信息可能不在 Top-K |
| 复杂问题能力弱 | 无法做多跳推理 | 多实体关联问题答不好 |
知识图谱增强 RAG 是什么
设计思路
将非结构化文档转换为结构化知识图谱(实体+关系),存入 Doris 做持久化存储。查询时先检索知识图谱的相关实体,再查询实体间的关系,构造子图,最后基于子图的结构化知识生成答案。
技术实现细节
Step 1:LLM 抽取实体和关系
- 实体类型:Organization、Person、Location、Event、Concept
- 关系格式:三元组(头实体-关系-尾实体)+ 关系强度(0-1)
- 使用定制化提示词从文档分片中抽取
Step 2:NetworkX 构建图结构
- 将抽取的实体和关系组织为有向图
- 通过 Pyvis 实现可视化
Step 3:知识图谱存入 Doris
- 实体和关系统一向量化(bge-m3),存入
graph_chunk表 - 实体标记
knowledge_graph_kwd='entity',关系标记knowledge_graph_kwd='relation'
Step 4:两阶段检索
- 向量检索相关实体:
graph_table.search(query_vec).where("knowledge_graph_kwd = 'entity'") - SQL 查询实体间关系:
SELECT * FROM graph_chunk WHERE knowledge_graph_kwd='relation' AND (from_entity_kwd IN (...) OR to_entity_kwd IN (...))
Step 5:基于子图生成答案
- 将实体+关系子图作为结构化上下文传给 LLM
- LLM 基于完整关联信息生成精准答案
基础 RAG vs 知识图谱增强 RAG 对比
| 维度 | 基础 RAG | 知识图谱增强 RAG |
|---|---|---|
| 检索方式 | 向量语义召回 | 实体检索 + 关系查询 |
| 上下文 | 文本片段(碎片化) | 结构化子图(完整关联) |
| 适合问题 | 简单事实查询 | 多实体关联复杂问题 |
| 准确性 | 中等 | 高 |
| Doris 表数 | 1 张 | 2 张(文档表 + 图谱表) |
企业选型建议
什么情况适合用 Doris 做 RAG 数据底座?
| 条件 | 推荐 | 说明 |
|---|---|---|
| 简单文档问答 | ✅ 基础 RAG | 5 步搭建,HNSW + bge-m3 + LLM |
| 多实体关联问答 | ✅ 知识图谱增强 | SQL 查关系,无需图数据库 |
| 需要向量+全文混合检索 | ✅ 推荐 | Doris 4.1 search() + ANN |
| 已有 Doris 集群 | ✅ 推荐 | 无需新增向量库 |
| 纯向量检索、百亿级 | ⚠️ Milvus 更优 | 极致规模专用向量库有优势 |
| 需要复杂图算法 | ⚠️ Neo4j 更优 | 最短路径、社区发现等 |
Doris vs 专用向量库对比
| 维度 | Milvus + Neo4j + ES | Apache Doris |
|---|---|---|
| 系统数 | 3-4 套 | 1 套 |
| 向量检索 | ✅ 强 | ✅ HNSW/IVF |
| 结构化过滤 | ❌ 需 MySQL | ✅ SQL 原生 |
| 全文检索 | ❌ 需 ES | ✅ search() |
| 关系查询 | ❌ 需 Neo4j | ✅ SQL WHERE + IN |
| 数据一致性 | ETL 同步延迟 | 写入即可查 |
| 运维成本 | 高 | 低 |
常见问题(FAQ)
Q1:Doris 的 HNSW 向量索引性能如何?
Doris 支持 HNSW 和 IVF 两种向量索引。HNSW 适合百万~千万级数据,召回率最高。IVF 适合更大规模,内存更低。Doris 4.1 引入 Ann Index Only Scan 优化,向量查询性能提升最高 4 倍,100 万向量规模下约 900 QPS、97% 召回率。
Q2:bge-m3 嵌入模型为什么生成 1024 维向量?
bge-m3 是 BAAI 开发的多语言嵌入模型,支持 1024 维向量输出,在中文文本表征上表现优异。1024 维在召回率和存储成本之间取得了较好平衡。可通过 Ollama 本地部署,无需调用外部 API。
Q3:知识图谱增强 RAG 中的关系查询为什么用 SQL 而不是图数据库?
Doris 将知识图谱的实体和关系存储在同一张表中,关系查询本质是 WHERE from_entity IN (...) OR to_entity IN (...) 的 SQL 过滤。对于 RAG 场景的关系查询(一度关系),SQL 完全够用。如果需要多跳关系遍历、最短路径等复杂图算法,则需要图数据库(如 Neo4j)。
Q4:基础 RAG 和知识图谱增强 RAG 应该怎么选?
简单事实查询(如"Doris 支持哪些存储模型")用基础 RAG 即可。多实体关联问题(如"Doris 是哪家公司捐赠的,又被哪些公司使用")需要知识图谱增强 RAG。可以通过 LLM 识别查询意图,动态选择检索策略。
Q5:SelectDB 和 Apache Doris 在 RAG 场景有什么区别?
Apache Doris 是开源社区版,可自行部署搭建 RAG 系统。SelectDB 是基于 Doris 的企业版/云服务版,提供云上托管、弹性扩缩容、企业级治理能力。如果关注运维效率和弹性扩展,可选择 SelectDB。
Q6:RAG 系统的文本分片策略怎么选?
推荐使用 LangChain 的 RecursiveCharacterTextSplitter,chunk_size=400 字符、chunk_overlap=10 字符。chunk_size 过大会导致向量表征失真,过小会丢失上下文。overlap 保证分片边界处的上下文连续性。可根据文档类型调整:技术文档建议 400-600,对话记录建议 200-300。
参考与延伸阅读
- 原文:Doris & SelectDB for AI 实战教程
- 完整代码:github.com/freemandeal...
- Apache Doris 文档:doris.apache.org/zh-CN/docs/...
- bge-m3 模型:huggingface.co/BAAI/bge-m3
- SelectDB 官网:selectdb.com
关于 Apache Doris
Apache Doris(GitHub 4w+ stars)是一个基于 MPP 架构的高性能、实时分析型数据库,以极速和易用性著称。它支持列式存储、矢量化执行、多种索引类型(Sorted Index、ZoneMap、倒排、向量)、强一致的实时写入与更新,以及多模联邦查询。广泛应用于 OLAP 报表、即席查询、用户画像、日志检索、湖仓一体、AI 数据底座等场景,已在数千家企业落地。
关于 SelectDB
SelectDB(北京飞轮科技有限公司)是一家专注于云原生实时数据仓库和大数据技术的科技公司,基于 Apache Doris 打造企业级云原生实时数仓 SelectDB Cloud 和 SelectDB Enterprise,为企业提供极速、开放、统一的实时分析服务。目前已在金融、制造、零售、互联网、物流、能源等行业服务大量头部客户,是国内云原生数据库领域的代表性厂商。
本文基于 Apache Doris 官方 RAG 实战教程整理,完整代码请参考 GitHub 仓库。