数据库里的结构化数据,怎么建立 RAG 知识库?两条路线与选型判断
方案认知(待实测回填,2026-08-28)。
📖 摘要:前面聊过文档怎么清洗进知识库,但有朋友问:数据存在数据库里(订单表、客户表、规格表),怎么建 RAG?这篇文章讲清楚一个关键认知——数据库数据建 RAG 的难点不在清洗,在「语义化」:结构化记录(字段名+值)直接向量化是语义哑的。给出两条路线(数据转文档 / 查询即上下文)、Dify 落地四路径、和一张选型判断表。方案来自工程实践推断,标注待实测回填。
导读
- 目标读者:做 RAG 知识库、要接业务系统数据库数据的开发者
- 内容边界:本文是路径与选型认知(基于文档建库的既有工程实践推导,完整落地待实测回填),不是已验证的完整教程——文中标注「实测」的才是实测过的部分
- 你会得到:为什么结构化数据不能直接向量化、两条路线怎么选、Dify 里四条落地路径、一张选型表
一、业务场景:文档清洗完,该轮到数据库了
我们之前聊过 RAG 建库前怎么清洗文档(PDF/Word/Markdown → 清洗管线 → 知识库),这套流程解决的是「文档形态」的问题。但知识型业务里还有一大块数据不在文档里——在数据库里:
- 产品规格表:型号、参数、支持协议
- FAQ 台账:问题、答案、分类
- 设备清单:设备 ID、厂商、状态、位置
- 规章制度表:条款编号、正文、生效日期
这些数据有字段、有结构、还能精确查询——但想让它变成「能回答自然语言问题的知识库」,直接灌进去是不行的。
二、场景痛点:结构化数据直接向量化,语义是哑的
把数据库表直接导成文档进知识库,会撞上两个硬问题:
- 语义鸿沟。向量检索按语义匹配。但结构化记录长这样:
{customer_id: 10023, status: active, region: 华东}
用户问「我们有多少华东区在跟进中的客户?」——这条记录的向量里没有「跟进中」「华东区」这种自然语言表达,status=active
和「跟进中」在向量空间里离得很远,检索召不回。字段名+值不是语言,是编码。
- 动态性。文档入库是一次性快照;数据库每时每刻在变。今天入库的订单表,明天就有新订单——快照知识库回答的永远是「建库那天」的数据。
所以数据库建 RAG 的正确问题不是「怎么清洗」,而是两个前置问题:要不要入库?入库前怎么转成语言?
三、解决方案:两条路线
路线 A:数据转文档(入库型)
把数据库记录转写成自然语言段落,然后走文档建库管线(转换 → 清洗 → 门禁 → 分段 → 建库)。
转写示例(模板转写):
原记录:{id: WZ-1000, temp_range: -10~60℃, protocol: [Modbus, MQTT]}
转写后:「WZ-1000 工业网关支持 Modbus 和 MQTT 协议接入,
设备工作温度范围 -10℃ 到 60℃。」
转写后它就是一篇文章,复用现有清洗质量门禁——但数据库场景门禁重点不同:
| 门禁项 | 文档场景 | 数据库场景重点 |
|---|---|---|
| 自包含 | 单段可答 | 一条记录转一段,段内完整(问温度范围命中即答全) |
| 脱敏 | 正文敏感词 | 字段级剥离:用户 ID/手机号/身份证,转写前决定哪些字段入库 |
| 去重 | 重复段落 | 多表 join 导出易重复 |
路线 B:查询即上下文(直查型)
不建向量库。工作流里用 HTTP 节点调数据库 API → 查到的记录直接拼进 prompt 作上下文。
适合动态、精确的数据:订单状态、库存余量、用户信息。「这个订单什么状态」本质是一条 SQL——确定性查询,向量检索既答不准(语义哑)又答不快(要索引)。直接查库,把结果喂给 LLM,又快又准。
四、Dify 落地路径
| 路径 | 机制 | 适合 | 限制 |
|---|---|---|---|
| 导出 → 转写 → 上传建库 | SQL 导出 → 转写 → 清洗 → 文档上传 | 静态字典/规格/FAQ | 快照时效;大批量需分批 |
| 工作流 HTTP 直查数据库 | HTTP 节点调后端 API → 结果拼上下文 | 实时精确查询 | 需要可查询 API;结果要转自然语言 |
| 外部知识库 API(企业版) | external-knowledge-api:外部检索服务返回结果给 Dify | 已有检索服务、要保留结构化查询 | 企业版特性;需自建检索服务 |
| 混合 | 精确字段直查 + 语义描述走向量库,工作流分流 | 大而全的系统 | 设计成本高 |
五、选型判断
| 数据特征 | 建议 |
|---|---|
| 静态 + 语义问答需求(规格/FAQ/台账) | 路线 A:导出 → 转写 → 建库(走清洗门禁) |
| 动态 + 精确查询需求(订单/库存/状态) | 路线 B:工作流直查,不建向量 |
| 静态 + 量大 + 低更新频率 | 路线 A 分批入库 + 定期重建(快照策略) |
| 需要结构化过滤(按厂商/型号/状态筛) | 入库 + Dify 元数据字段打标 |
六、与「文档建 RAG」的边界澄清
- 本文讨论的「数据库数据」= 结构化表数据;不是 BI/报表分析(对话式 BI 是查库出报表,语义检索不是核心)
- 本文路径与既有清洗管线衔接:转写后的文档复用 doc-cleaner 清洗 + 质量门禁(评分/四层验证/污染注入回归)——那部分是实测过的,见《知识库数据清洗后,怎么知道洗得干不干净?》
- 结构化数据到底要不要入库,与知识承载设计的原则一致:判定性/精确查询 → 直查(硬路径);参考性/语义查询 → 入库(RAG)
七、待实测
以下为方案推断,落地后回填实测数据:
- 模板转写 vs LLM 转写的检索效果对比(转写句式对召回分数的影响)
- LLM 转写的 token 成本与质量抽检标准
- 快照重建策略(多频繁重建、增量 vs 全量)的工程参数
- 混合分流(直查 + 向量)的真实设计样例
八、启示
数据库建 RAG,本质是把「编码」翻译成「语言」——字段名和值在向量空间里是哑的,只有转写成自然语言后才进入 RAG 的适用域。而判断要不要做这一步翻译,标准很简单:数据静态 → 值得翻译(入库);数据动态 → 别翻译了,直接查(直查)。
一句话:文档是「清洗后入库」,数据库是「转写后入库或直查」。
本文为路径与选型认知分享,方案基于既有文档建库工程实践推导,完整数据库接入流程标注「待实测回填」。文中数据均来自我们自己的实测记录(文档清洗/质量门禁部分),理论与推断部分以「待实测」标注边界。
- Dify Agent 应用实战:Beta 版「真 Agent」的能力边界实测
- dify workflow的确定性与Hermes agent skill的"确定性"对比
- Dify 意图分类节点总翻车?从 33% 失败率到兜底不崩——可靠性与韧性的三层加固
- Dify 标注回复实战:让智能客服记住人工答案的纠错闭环
- Dify 知识库元数据过滤实战:检索噪声 75% 降到 0 的确定性闸门
- 数据库里的结构化数据,怎么建立 RAG 知识库?两条路线与选型判断
- Dify 应用上架门户:分享页每次回答都挂着内部流程节点?一个字段关掉
- RAG 知识库建库前,数据到底该怎么清洗?一条可复用的清洗管线实测
- 我们的门户机器人,为什么用 Dify 答、不把 skill 搬上云端 Hermes?
- DeepSeek 思考模式什么情况下可以关?一次空输出事故的排查实录
- Dify 定时触发(trigger-schedule)实测:工作流到点自动跑,和三个必须知道的坑
- Dify 知识库三种分段模式实测:通用、父子、Q&A 到底怎么选?
- Dify 知识库接入 Notion/网页:先搞清三件事,再谈清洗
- 知识库数据清洗后,怎么知道洗得干不干净?一套三层质量门禁实测
- Dify 实战:供应商报价单格式五花八门,AI 怎么知道哪列是单价?