Akke · 资料入库 · 2026-08-05
甲方交上来的一张检测报告、一份配置清单、一张实拍图,中间要过 国内中转 → 私有桶 → 台账 → 分档 → 公网图库/知识库 → 向量 才轮得到 AI 说出口。 这页把三个入口、每一次中转、每一个岔路都摆在一张图上——东西现在停在哪、下一步谁来推,看图就知道。
主线是「甲方点开一条 token 链接 → 传文件 → 我们记一笔台账」。看着简单,但国内网络逼出了两处绕行: 页面要 Fly 代开,文件也常常要 Fly 代传。
*.supabase.co 在国内连 DNS 都解析不了,所以文件先 PUT 给 Fly、由 Fly 代传——签名地址必须过三条校验才转发,不是开放代理。
文字类资料(价目口径这种甲方手上没现成文件的)不走弧线,直接走 ⑤ 写台账。
台账不是终点,是停车场。每 15 分钟有一趟 cron 来把车分成绿黄红三档: 只有绿灯自动开走,黄红两档原地不动、只推一张 Lark 卡点名让人来处理。
triaged_at——只读一次、只提醒一次;
代价是黄红档不会重复催,没人处理就是没人处理,要重新提醒得手工把 triaged_at 清空。
/upload/<token> 是另一条独立链路——销售传聊天截图,当场 OCR、当场给反馈、当场蒸馏成知识/话术候选。
和门户共用一个 Fly 中转的招数,但用的是另一张 token 表、另一个桶、另一套闸。
「我传的资料到底在哪」——按这张表从上往下找,每一格都能查得到、也都能说清为什么在这停。
| 停靠点 | 存的是什么 | 为什么在这停 | 怎么查 / 怎么推走 |
|---|---|---|---|
| Fly worker portal_relay · upload_relay |
什么都不存(纯过路) | Vercel 和 Supabase 在国内打不开,页面和文件都要有人代跑一趟 | 只转发固定上游单一 host,不是开放代理;出问题看 Fly 日志 |
| Supabase 私有桶 portal-materials |
甲方交的原件<org>/<类目>/<sha256>.<ext> |
原件必须留底,日后口径打架要拿它核对 | 私有,链接会过期;portal-inbox.ts --download 拉到本地 |
| 台账表 client_material_submissions |
谁在什么时候交了哪一类、状态走到哪 | 刻意不自动进库——一份写错的价目表进库,线上所有报价一起错 | pnpm tsx scripts/portal-inbox.ts 看待处理 |
| 案例台账 enterprise_case_uploads |
每张案例截图的处理结果 pending / ingested / rejected_empty / failed |
OCR 可能读空、可能读崩,得有地方记一笔好重跑 | 按 status 查;原图还在桶里,可以后补识别 |
| 候选暂存 case_distill_candidates |
蒸馏出来还没上线的知识/话术 | 涉价、口径冲突、说话人标反的一律不敢自动上 | 运营审过才进正式库;判官驳回的记 rejected |
| 门店事实08-05 补 sw_documents · sw_facts |
店长在工作台屏 01 粘进来的口径,抽成的 125 条事实 | 这一格没有闸——抽完直接可用,原件和上传人都没记(见第 07 节) | 屏 01 逐条看;停用改 status=expired |
| 话术标注池08-05 补 reply_annotation_cases |
红蓝对抗低分、实盘 AI 打太极、店长标「这句不对」的问答,现 100 条 | 要经人工复核才准进范例池——改错一句污染全线上 | 甲方标注台 /annotate/<token>;工作台屏 03 / 06 也往这里写 |
| R2 图库 公网 URL |
实拍图、效果图的长期可访问地址 | 私有桶链接会过期,AI 发给客户的图必须一直打得开 | 红灯档(含个人信息的)绝不允许进这一格 |
| 正式库 kb_chunks · knowledge_documents · conversation_examples |
AI 真正读得到的那一份 | 到这一格才算「资料变成了 AI 会说的话」 | 图靠向量召回;事实拼进 system prompt;话术靠三个 tag 命中 |
下面每一条都对应线上真实发生过一次,改动这条链路之前先扫一眼。
Vercel serverless 请求体上限 4.5MB,超了平台直接掐断连接、不返回任何 body——用户看到的就是「点了一直转圈」。所以文件一律走签名地址直传。
API 白名单放宽到 20 种格式,桶的 allowed_mime_types 只开了三种图,照样全退。代码怎么读都是对的,甲方看到的却是「存的时候出错了」。桶设置不归 migration 管,换环境要手工建。
检索查的是 kb_chunks,kb_entries.embedding 那一列根本没人查。库里一度有 88 条孤儿条目,拿「有没有检测报告」去问一条都召不回。
甲方一口气交 60 份全判黄灯,老写法每 15 分钟把这 60 份重新送进 VL 读一遍图(烧真钱、结论一样),Lark 还每 15 分钟重推一张卡。现在处理完就盖 triaged_at。
叫「498配置」的图,里面印的是 798;标「同户型完工案例」的九张其实是高端样板间。所以分档必须跑在 VL 读出来的内容上。
客户姓名、手机号、车牌、住址、支付单号都在截图里。自动传 R2 就等于隐私上公网,这类一律红灯留人工,价值改以脱敏文字形式进话术库。
enterprise_knowledge 里那份价格档位把「其余地区」写成 798/498(正确是 868/568),躺了两个多月。因为没有任何代码读它,错也不会有客户来问。一接线就全暴露——是运营逐条核才抓出来的。
判据是「同一个 key、两条 value 不同」,而 key 是模型每份资料现取的名字。同一个「568」被 5 个不同 key 登记了 5 遍,一条都没报冲突;798/498 那个真冲突也因为 key 不同溜过去了。「待处理冲突 0 条」不等于没冲突。
第三个入口是运营自己灌的:scripts/r2/upload-kb.ts 这类批量脚本,把 22G 的家装宝典 / 效果图 / 知识图集直接推到 R2 再登记进库。它不经过门户、不进台账,属于「我们自己准备的料」,不是甲方交的。
前面三条都是「甲方或运营把东西交上来」。还有一条走的是完全不同的门: 店长在门店工作台屏 01 直接把口径粘进去,过一次模型抽成事实, 再由「桥」喂给 AI。它和门户那条互不知道对方存在。
file_url 5 份全空,因为是粘正文进来的)、没有「谁上传的」这一列、
抽完事实直接就是 active——没有绿黄红分档,也没有人工闸。
2026-08-05 逐条核对时抓出 14 处错(798/498、免费量房、终身免费保养、内部纪律混进对客资料……),
全靠人一条条看出来,系统一条都没拦住。
「谁上传-什么原件-哪些处理-落到哪」这件事,门户那条已经全有了,缺的正是这一条。
这是上面那条平行入口带来的直接后果,也是08-05 所有错的总根源: 同一件事(比如「其余地区多少钱一平」)在三张表里各有一份,而三份不一定一致。
| 这一份 | 多少条 | 谁在读 | 它现在是什么角色 |
|---|---|---|---|
| knowledge_documents | 74 | 线上 AI 每一轮都读 | 事实上的「准的那一份」——但没人正式这么定过 |
| sw_facts | 125 | 桥打开才读(现在关着) | 门店工作台自己抽的,出处指向粘进去的正文,不是原件 |
| enterprise_knowledge | 5 份 JSON | 没有任何代码读 | 2026-06-01 存进来的甲方原始档,建表注释写着「暂不直接接进线上,需要时再单独蒸馏导入」——那一步两个多月没人做 |
798/498 那个错就是这么发生的:
enterprise_knowledge 里躺着一份写错的价格档位(其余地区 798/498)sw_facts,还顺手写进了机器人的说话规则所以第一件该做的事不是搬数据,是先定「哪一份是准的」。不定这个,后面每一步都在搬可能是错的东西。
前面几节讲的都是「资料怎么进来」。还有一类东西是用出来的—— 店长在日常检查里做的判断,本身就是最好的话术素材。这三条今天才接上,之前写完没有任何下游会读。
| 店长做了什么 | 接到哪 | 然后呢 |
|---|---|---|
| 屏 07 改常问问题的标准答案 改完跑 3 种问法测试 |
conversation_examples打 client-approved / verbatim-ok |
线上命中相似度 ≥0.88 就原文直发、跳过模型——问法变体一起送,不然换个说法就命中不了 |
| 屏 06 标某段聊天「答得不对,应该这么说」 | reply_annotation_cases |
接甲方审定话术那条已有通路:人工复核 → conversation_examples。刻意不直接进——改错一句污染全线上 |
| 屏 03 给机器人回答打分 + 写正确说法 | 回写题目的来源行 题本来就是从标注池挑的 |
同上,走人工复核那道闸 |
前面所有格子都是单向的,只有进没有退。而 08-05 这一天就撤了 24 条。
错的、过时的、内部纪律混进来的、重复的,改成 expired 即从可用集消失。原件和历史都还在,能追回来是谁什么时候撤的。
打了 client-approved 的问答会被原文直发。撤回靠的是 tag 能一条 SQL 全删——所以 tag 必须打全(来源屏、批次、通道),否则撤都不知道撤哪些。
fly secrets unset 秒级生效,不改代码也不重新部署。这是整条链路上唯一一个「一键全撤」的位置。