一、问题场景: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)直接被拒。
- 硬刚验证码既不优雅也不合规。
可靠绕行两招:
- 走搜索引擎检索片段——不抓整页,只取搜索返回的"商品 + 价格 + 成交笔数"快照点,真实在售信息已经有了。
- 抓聚合比价站——"什么值得买(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:0 与 data.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 细节以官方文档为准。