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

0 阅读7分钟

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 DorisHNSW 向量索引 + 结构化存储
嵌入模型Ollama + bge-m31024 维文本向量嵌入
LLMDeepseek API对话交互与答案生成
文本处理LangChain文本分片 + 嵌入生成

技术实现细节

Doris 建表(HNSW 向量索引)

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 数据底座?

条件推荐说明
简单文档问答✅ 基础 RAG5 步搭建,HNSW + bge-m3 + LLM
多实体关联问答✅ 知识图谱增强SQL 查关系,无需图数据库
需要向量+全文混合检索✅ 推荐Doris 4.1 search() + ANN
已有 Doris 集群✅ 推荐无需新增向量库
纯向量检索、百亿级⚠️ Milvus 更优极致规模专用向量库有优势
需要复杂图算法⚠️ Neo4j 更优最短路径、社区发现等

Doris vs 专用向量库对比

维度Milvus + Neo4j + ESApache 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 仓库。