开之前要知道的两件事
一、语气会被稀释。知识块会冲淡人设、输出客服腔——当年就是为此把注入从 3000 字砍到 1500。建议开完当天翻几条真实回复看语气。
二、闸门用 0.6 更稳。会滤掉 0.602 / 0.622 那两条边缘命中。回滚就是删这个 env。
R2 里的资料、效果图与视频,如何被企业微信和视频产线更高效地调用——盘完代码后的结论是:能力已建约七成,卡在最后一公里,而且不需要训练任何模型。
// 实测 + 代码盘点口径 · 未核实项在页尾明确挂账
今天用 Cloudflare API 直接查了 akke-kb 桶的用量,和项目文档里记的家底差了近 5 倍。这不是谁没维护——而是人工维护的清单追不上一个天天在写入的对象存储。
// 桶在两周内长了近 5 万个对象,体积从 22.21 G 到 58.55 GiB。那份「素材家底与调用口径」是 07-26 更新的,四天就失真。
三个真实后果:① 运营答不准客户「你们有什么资料」;② AI 回复可能承诺一份实际不存在的素材(编造的一种);③ 「R2 里的视频」这件事,用现有台账无法确认——文档明确写着 13130 个文件里只有 1 个 mp4、「不构成视频库」,但那是 07-26 的快照,而桶此后又长了 4.8 倍。视频可能就在新增的那批里。
要按类型分解那 63429 个对象需要 R2 的 S3 密钥。本机 .env.local 里没有,Cloudflare API token 只能拿总量、列不了对象,wrangler 也没有 r2 object list 子命令。所以「视频有多少、在哪个前缀下」这条不下结论。补齐凭据后一条命令即可核实:
aws s3api list-objects-v2 --bucket akke-kb \
--endpoint-url https://<account-id>.r2.cloudflarestorage.com \
--query 'Contents[].Key' --output text | tr '\t' '\n' \
| awk -F. '{print tolower($NF)}' | sort | uniq -c | sort -rn
// 已知素材构成(07-26 口径,量级参考非现状):第三方资料 314 份 · 效果图 11265 张 · 知识图集 726 张 · 原创图文 48 篇 · 官方海报 11 张。
盘完代码,「把素材调出来」已经有三套机制,成熟度差别很大——缺的不是能力,是把它们接通。
| 通路 | 机制 | 覆盖 | 状态 |
|---|---|---|---|
| 海报确定性投递 | enterprise_posters.triggers[] + GIN 索引,客户话里命中词 → 取 public_url 发图 |
11 张 | 生产在跑 唯一真正在服务客户的图片投递 |
| pgvector 语义检索 | kb_entries 362 条 / kb_chunks 482 块 · bge-small-zh-v1.5 · 512 维 |
314 文档精要 + 48 图文 |
建完没开 线上 0 次调用 |
| 关键词 → 资料投递 | L1 确定性词典 + L2 LLM 判断题兜底 + 投递状态机防重发 | 设计覆盖全量 | spec 定稿未实施 07-13 设计稿 |
| 效果图图集站 | 风格(源目录标签)× 空间(视觉补标)二维筛选 | 11265 张 | 人工可用 AI 侧未接 |
2026-07-20 有人做过一次很扎实的验证。结论值得重复,因为它意味着一笔已经付过的投入正躺着不产出。
// 命中的全是真问题:「我预算就 3 万,110 平全屋柜子能做下来吗」0.666 · 「两万九只是基础价吧」0.719 · 「你们是什么牌子的板子」0.602。寒暄类全部正确未命中——闸门是准的。
「0 命中」本身不算证据——开着但没命中同样是 0。按 35% 命中率,97 次里本应约 34 次带注入,实际 0 次 ⇒ 不是没命中,是没开。缺的就是 Vercel 上一个 KB_RETRIEVAL 环境变量。
一、语气会被稀释。知识块会冲淡人设、输出客服腔——当年就是为此把注入从 3000 字砍到 1500。建议开完当天翻几条真实回复看语气。
二、闸门用 0.6 更稳。会滤掉 0.602 / 0.622 那两条边缘命中。回滚就是删这个 env。
buildKbSection 把 KbHit.file_url 丢掉了——即使检索命中,模型也看不见文件链接,所以它发不出资料。
这意味着「问 X 发 X」在当前代码下不可能实现,跟检索质量无关。修法是仿企微 matchPosters 加一个确定性投递分支。src/lib/llm.ts 属高危路径,必须走 PR。
效果图 11265 张、知识图集 726 张,都是纯图片,没有可切块的文本。这里有一条已经用钱和时间买到的教训,不要重犯。
| 维度 | 视觉打标 | 实测结果 | 该怎么做 |
|---|---|---|---|
| 空间 客厅 / 卧室 / 厨房… |
可用 | qwen2.5-vl 给 7679 张补标成功,成本约 $1 | 已完成,图集站已按此筛选 |
| 风格 现代简约 / 新中式… |
不可用 | 判风格全塌成「现代简约」;7 张工业风只对 1 张。缩略图和全分辨率都塌 | 用源目录标签,别视觉打标 |
| 面积 / 户型 | 未做 | — | 核心缺口,支撑「113 平 → ±15 平」 |
// 视觉补标出来的空间分布(7679 张「按风格」图)。这是可用的那一半——风格维度同样试过,塌了。
真实调用场景的锚点是「客户报 113 平 → 调 ±15 平的方案图」——这是一个 SQL 范围查询,语义向量帮不上任何忙。同理「只要现代简约的卫生间」是两个标签的交集,不是相似度排序。
把「风格(源目录)× 空间(已补标)× 面积/户型(待补)」做成结构化列 + 索引,检索走 WHERE 过滤。多模态 embedding 当前不值得上——它解决的是「找一张海边日落空镜」这种开放语义检索,而这里的查询维度都是可枚举的。
这是本次评估里最有价值的一个连接,目前没人接。
产线投产后反馈「可灵效果一般」(画质、真实感、跨镜一致性)。但当时的链路是「AI 生图 → 图生视频」,喂进去的是假图——不能就此给引擎定罪。为此立了 M1 图源对照实验(真图 vs AI 图盲评),脚本 ad-studio/tryout/arm_i2v.py 已就绪但一直没跑,因为 jobs.json 里还是占位 URL,缺真实图源。
而 R2 里躺着 11265 张真实效果图,那正是占位 URL 缺的东西。用 xiaoguotu/v2/… 的真图填进 jobs.json,M1 立刻能跑——图已有、脚本已有、零新增采购,就能回答「假图是不是根因」这个决定视频产线走向的问题。
效果图不只是「发给客户的素材」,它同时是视频产线的原料。现在这两个系统各自把 R2 当仓库用,但没有共享的素材索引,所以一边缺图、一边有图,互相不知道。考虑到已决定不再为可灵新增花费,先花近乎零的成本把归因搞清楚,明显优于换引擎重试。
企微「客服 kf 回调」和「自建应用接收消息 API」都要求回调域名已 ICP 备案、且备案主体 = 企业营业执照主体。*.fly.dev / *.vercel.app / 裸 IP 全部被 Domain entity verification failed 拦下,连握手都到不了。
不能绕。.ai 是安圭拉国别域,不在工信部可备案 TLD 名单内——不是没去备,是备不了。
检索结果里的文件链接没进 prompt,模型看不见 → 发不出资料。
能修。一个小 PR 即可,属高危路径需走 PR 流程。它是「打开检索」那个动作的收益放大器——不修的话,检索开了也只能「说」不能「发」。
备案是行政前置、周期不可控,不要让它挡住其他事。先把不依赖备案的部分(检索开关、file_url、台账、M1 实验)全部推进,备案通了再接回调。
不新增任何供应商——pgvector 在这个量级远未到瓶颈,多一个向量库就多一份会静默烧钱的账单。
MIN_SIM 用 0.6 更稳matchPosters 那套确定性套路是对的| # | 动作 | 成本 | 收益 |
|---|---|---|---|
| 01 | 打开 pgvector 检索 Vercel 设 KB_RETRIEVAL=on · KB_RETRIEVAL_MIN_SIM=0.6 |
一个 env | 35% 的真实客户消息立刻获得知识注入。已验证过的能力,目前零产出 |
| 02 | 修 buildKbSection 保留 file_url |
小 PR | 让「问 X 发 X」从不可能变为可能。是 01 的收益放大器 |
| 03 | 拿真图跑 M1 盲评 用 xiaoguotu/v2 填 jobs.json 占位 URL |
近零 | 回答「假图是否为可灵效果差的根因」,直接决定视频产线走向 |
| 04 | 建素材台账表 + 定时对账 | 中 | 止住 4.8× 漂移;「有什么素材」可被准确回答;两个系统开始共享素材视图 |
| 05 | 效果图补面积 / 户型标签 | 小额打标 | 支撑「113 平 → ±15 平方案图」核心场景。只补可判维度,风格别碰 |
| 06 | 完成 C 方案:抽全文 314 份现在只索引了一句话精要 |
中 | 让「生成清单」有真原料。现状靠一句话精要生成 = 编造发生器 |
| 07 | 企微备案域名 | 行政 · 不可控 | 解锁企微回调。并行推进,不要挡住 01–06 |
① xlrd 未装,而 67 份 xls 恰恰是清单类内容最密集的,不能跳;② 11 份 pdf 是扫描件(pdftotext 无效),且恰是最像干货书的几本,要么 OCR 要么明确挂账,别静默跳过;③ bge-small-zh-v1.5 上限 512 token,单块正文必须卡在 450 字符内,超了静默截断;④ 灌完全文必须重新标定 MIN_SIM——0.5 / 0.6 是拿摘要块标的,全文块相似度分布不同。
每一条都对应一个已经踩过或算过的坑。
微调 / 训练任何模型。这里没有一个需求是训练能解决的。资料改一次就要重训,事实准确率还不如直接检索。
为图片检索上多模态 embedding。查询维度是可枚举的(风格 / 空间 / 面积),结构化过滤更准更便宜。而且风格维度的视觉打标已实测不可用。
新增向量库供应商。pgvector 在这个量级(482 → 预计 4000–6000 chunk)远未到瓶颈。
为可灵新增花费来「再试试」。先用 R2 真图把归因做掉(动作 03),再决定要不要花钱。
在抖音私信发外链或我方微信号。风控红线,现有代码已经守住了,新增投递逻辑不要破坏它。
把「有什么素材」写死在文档里。这次的 4.8 倍漂移已经证明人工快照必然失真——要么查台账,要么别答。