让企业知识库 AI 不瞎编:三层"真数据"入库 + 本地 RAGFlow 五个暗坑

1 阅读7分钟

一、问题场景:AI 一本正经地"编价格"

做商务茶礼定制顾问/客服 AI 时,客户最常问三句话:

  • "金骏眉礼盒市面上大概多少钱?"
  • "你们定制价贵不贵?"
  • "我想找靠谱货源,去哪批采购?"

如果把这些问题丢给一个纯靠参数的 LLM,它会非常流畅地给你编一串"八九不离十"的价格——看着专业,实则没有一个数字能对账。LLM 的参数里根本没有"今天在售的真实价格",它只是把训练语料里见过的高频价外推给你,这就是企业知识库 AI 最大的信任危机:答得越溜,错得越隐蔽。

结论很朴素:答案的根必须扎在真实、可查、可溯源的素材上,而不是模型的直觉。本文用一个"商务茶礼定制"演示库讲清楚怎么做,以及在这过程中踩到的 RAGFlow 本地 API 暗坑。

二、方法论核心:素材真实性"三层分层",谁也不冒充谁

企业库想答得靠谱,靠的不是"多灌资料",而是把不同来源、不同可信度的素材分层入库,并明确标注每层的身份,让"虚构"和"真实"永不互相冒充。

三层素材对照

素材内容来源性质标注/免责AI 用途
虚构定制层门店自营产品目录与报价规则纯虚构演示底料标注"本司定制/报价规则"报价、定制、下单主流程
真实市场行情层知乎行情文(品牌分档价、口粮茶推荐)真实社区内容注明"市场行情参考、非本司定制报价"帮客户了解"市面上大概什么价"
真实货源层1688 B2B 批发采样真实在售批价注明来源 + "议价参考、报价以规则为准"回答"去哪批采购、批发价"
真实零售锚点层京东自营/天猫超市/老字号零售价真实在售零售价注明"采样价、随活动波动"给客户一个可感知的零售坐标

以本演示库为例,四类文件大致长这样:

  • 虚构目录:门店自营产品目录.md —— 定制价、起订量、包装选项,纯自己定的规则。
  • 行情文:知乎行情综述.md —— 某老字号龙井、某普洱标杆饼、白毫银针的分档价位,文首写明"市场行情参考,非本司报价"。
  • 货源采样:1688 批发价采样.md —— 大红袍礼盒 15~82 元/套、金骏眉高端礼盒约 94 元/盒(成交数千笔)、普洱熟饼约 32 元/片,逐条带来源标注与"议价参考"免责。
  • 零售锚点:电商零售价采样.md —— 八马金骏眉 160g 罐约 99~128 元、张一元茉莉毛尖 200g 约 150 元等。

关键纪律:虚构的自营目录绝对不能冒充真实行情来源。两层底料要分文档、分标注、可追溯——这样检索回来的每段内容都自带"出身",AI 引用时才不会张冠李戴。

三、采集层的坑:验证码墙怎么绕

要做"真实货源/零售层",第一步采集就撞墙:

  • m.1688.com 聚合详情页京东商品页经常被滑块验证码拦下,常规网页抓取(web_extract)直接被拒。
  • 硬刚验证码既不优雅也不合规。

可靠绕行两招:

  1. 走搜索引擎检索片段——不抓整页,只取搜索返回的"商品 + 价格 + 成交笔数"快照点,真实在售信息已经有了。
  2. 抓聚合比价站——"什么值得买(smzdm)"这类聚合电商实时价的站能抓通,能直接带出京东/天猫超市的券后实价。

无论走哪条路,都诚实标注"采样价、随活动波动",入库文档的免责声明本身就是防编造的一部分——它告诉 AI 也告诉读者:这价是会变的参考,不是合同承诺。

四、本地跑 RAGFlow 的硬依赖:embedding 引擎必须先醒

环境:Windows 本机 Docker 跑 RAGFlow + 9002 门户壳;embedding 用本地 Ollama 的 qwen3-embedding:0.6b(不出域,数据安全)。

头号坑:新文档解析 run=FAIL、chunks=0。 八成根因不是文档格式,而是本地 embedding 引擎没在跑,向量化连不上。RAGFlow 解析到向量化一步时找不到 Ollama,就整条解析失败。

解法:写一键启动脚本,先 ollama serve,再轮询 http://127.0.0.1:11434/api/tags,等模型就绪后才开始解析:

ollama serve &
until curl -s http://127.0.0.1:11434/api/tags | grep -q qwen3-embedding; do
  sleep 2
done
echo "embedding ready, 开始解析..."

先保 embedding,再谈解析,顺序错了全白忙。

五、Windows 反斜杠文件名坑

第二个坑在门户 seed 文档时:上传函数用 split("/")[-1] 只切正斜杠,而 Windows 临时路径是 C:\Users\...\Temp\tmpXXX\产品目录.md 这种反斜杠,于是整串完整临时路径被当成了文件名,丑名文档就这么进去了。

核对与修复:检索结果字段里看文档名(docnm_kwd),若发现带反斜杠的脏名字,删掉该文档后用纯文件名重传即可。真名只留"产品目录.md"。

六、文档删改 API 暗坑对照(本 build 实测)

这块最坑,文档删改的 API 设计不直观,实测如下:

操作你以为的端点实测结果正确做法
改名PUT 单文档405 不支持删旧传新,或走支持改名的高层接口
删单篇DELETE /datasets/{id}/documents/{did}405 不支持改用集合端点
删多篇DELETE /datasets/{id}/documents,body 带 {"ids":[...]},返回 code:0data.deleted:N

删除后立刻回读列表可能仍是旧态,要等 3~5 秒再查,别急着断言删除失败。

登录加密链

RAGFlow 登录是 RSA 加密:RSA-PKCS1v15 加密 base64(明文密码) 后再 base64 一层。公钥从容器里拿:

docker exec docker-ragflow-cpu-1 cat /ragflow/conf/public.pem

登录成功后,token 在响应头 authorization 里,后续请求带上即可。

七、验证:AI 到底答得靠不靠谱

种好四层文档后,用最刁钻的问题验证:

  • 问"金骏眉礼盒市面上多少钱"——AI 应回零售锚点层的八马区间价,并补一句"具体看店铺与活动"。
  • 问"你们定制价贵不贵"——AI 引用虚构目录的自营报价规则做对比,不拿批发价冒充零售价。
  • 问"去哪批采购"——AI 落到货源层的 1688 批发采样,带来源标注与"议价参考"免责。

判据:每一句带数字的回答,都能往回追到某个具体文档层的某条原文。追不回去的数字,就是编造,得修。

八、工程化可复现

  • 全部文档种进两份 teagift.json 的 seed 清单,重建库也能一键复现,不用手工点门户。
  • RAGFlow 追加文档直接走 API,门户的 /api/init 幂等,已存在的库会自动跳过,不会重复种。

小结

企业知识库 AI 不编造,靠的不是更聪明的提示词,而是:真数据分层入库 + 每层可溯源 + 免责标注到文。本地的坑(embedding 先醒、反斜杠脏名、删改 API 405、删除后延迟)则是把流程跑顺的必修课。照着这套走,你也能让顾问/客服 AI 报的每个价都"有据可查"。

补充说明:以上价位均为演示库采样的真实在售参考价,随电商活动波动,实际以各平台当日为准;RAGFlow 细节以官方文档为准。