基于 Apache Doris 搭建 RAG 系统:从基础 RAG 到知识图谱增强的完整实现与选型指南

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:两阶段检索

  1. 向量检索相关实体:graph_table.search(query_vec).where("knowledge_graph_kwd = 'entity'")
  2. 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。

参考与延伸阅读


关于 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 仓库。

相关推荐
SelectDB2 小时前
SelectDB Enterprise 4.0.5:企业级实时分析与 AI 数据底座怎么选?安全合规配置指南
apache
lsh曙光1 天前
Apache服务
apache
Norris Huang2 天前
Icevue:为 Apache Iceberg REST Catalog 打造一个轻量、只读的可视化入口
apache
ajassi20003 天前
AI语音智能体开发日记(三)解决小程序配网中的蓝牙命名与MAC地址获取问题
ai·apache·ai编程
SelectDB技术团队3 天前
当 PostgreSQL 面临性能瓶颈:80TB 电商业务迁移至 Apache Doris 的实践思考
数据库·postgresql·apache
sbjdhjd3 天前
安全初级 | Upload 文件上传漏洞实操
android·经验分享·安全·网络安全·开源·php·apache
阿里云云原生4 天前
RocketMQ-A2A 创新论文入选 ACM FSE,定义 AI Agent 可靠协作新范式
apache·rocketmq
味悲6 天前
Apache HTTP 服务器配置
服务器·http·apache
万岳科技系统开发7 天前
AI赋能互联网医院小程序开启智慧医疗新时代
人工智能·小程序·apache