一个维修技师在台面上放着一台微波炉,症状是"门锁不上,只咔哒响"。他把这句话敲进搜索框,系统返回了五台洗衣机。这不是段子,是CaseJog作者在演示里贴出的真实基线输出——纯余弦相似度、不做任何过滤,前五条全是洗衣机门锁故障,分数从0.805排到0.788,一条比一条自信。
![]()
问题出在措辞上。"门锁不上"这句话在洗衣机案例里出现得更密集,余弦相似度一头扎进洗衣机堆里,压根不知道技师手里拿的是微波炉。作者把这条查询称为"英雄查询",因为它就是整个项目要解决的那个场景。
把家电类型作为过滤条件融进检索之后,同一个查询的结果换了一副面孔:五条全是微波炉门开关联锁故障,分数0.864到0.851,每张卡片都带着真实工单编号、日期和75美元的收费记录。稳态检索耗时72毫秒,首次请求要付一次性的模型加载成本。
这就是CaseJog的全部野心:不做诊断,只做回忆。技师输入眼前的症状,选一下手里的家电,系统从他自己过去的工单里排出最接近的几条,每条附上根因、零件、工时、价格和来源引用。所有计算在本地跑,案例历史不出机器。
作者算过一笔账:单人维修店每月在RepairDesk这类CRM或iFixit Pro订阅上花29到80美元以上,但这些工具都不做那件最关键的事——当新客户用完全不同的词描述同一个故障时,帮你找到自己当年那次修复。他举了个化名Marcus的例子:十一年工龄,用笔记本不用CRM,为微波炉门锁故障烧掉四十分钟,才想起一年前在另一个品牌上修过同一个毛病,当时记的是"门关着不启动"。同一个门开关联锁,不同的词,那次修复他已经赚过一遍,又用 lost time 付了第二遍。
关键词搜索救不了他,因为词永远对不上。"不转""滚筒卡住""不搅拌"是同一个故障的三种写法。技师需要的不是更聪明的诊断,而是自己的旧案例按接近程度排好,仅此而已。
混合检索的另一半在错误码出现时才露脸。"冰箱不冷,代码5E"过滤到冰箱后,三条结果的最终分是1.024、1.022、1.018,其中向量分约0.87,剩下0.150是精确5E匹配打上来的加成。意义加精确信号,才能在语义上同样接近但根因错误的案例面前保住正确的那条。
作者先写了纯余弦基线,只因为混合方案赢了才留下重的那条路。在28条留出症状上跑一次、从未调参,precision@k的结果是:k=1时混合0.893对基线0.857,k=3时0.869对0.738,k=5时0.814对0.657。每个k都赢,且差距随深度拉大。作者自己标注了n=28,这些差距是提示性的,不是p值。
技术栈上,开源AI的核心是一个开放权重嵌入模型BAAI/bge-small-en-v1.5,通过fastembed在ONNX上本地跑CPU;检索引擎是MongoDB Atlas向量搜索。作者守的纪律很明确:嵌入和Atlas负责捞候选,代码负责排序,没有任何模型去写修复方案,答案路径里不存在生成式模型。一张卡片永远是一条你能打开核对的真实旧工单。
可替换性做在了一个函数上:所有嵌入都走embed(),由单个环境变量EMBED_MODEL选择,换模型只改一行,管线其余部分不动。另一处是离线余弦兜底——app.py默认走Atlas检索器,Mongo连不上就降级到内存余弦基线,并在响应里说明。作者特意把兜底范围限定在Mongo连接错误,好让真正的bug浮出来而不是藏在"兜底"这个词后面。
过滤器是写在$vectorSearch阶段内部的,不是后置过滤。这一点决定了微波炉查询是本来就对,而不是先捞回四台错洗衣机再扔掉才对。
作者主动交代了两条限制。第一,他抓到自己在评测里作弊:最初的留出集和语料共享措辞,两个检索器都拿到约0.96的虚高分,等于自己批自己的作业。他重新保留措辞、重新生成、只重跑一次,数字掉到上面那些诚实的值。第二,这是回忆不是诊断,是硬上限。CaseJog从不说哪里坏了,只显示哪些旧工单看起来最近,逼你自己打开看。一个历史上从未出现过的新故障,返回的会是最近的旧东西,可能完全不是答案,所以"人来核对"是设计,不是免责声明。
他还试过一个2B决策模型做逐候选置信门,最后搁置了。本地冒烟测试里,它自信地误标了错误码加成已经搞对的那个"近但错"的案例,吐出两个伪装成概率的数值,CPU上每对耗时约20秒,会把亚秒级搜索变成100秒级。它会让演示更慢更不准,所以没进代码。
整个构建通过SSH在一台小云主机上由AI编码代理跑完:脚手架、合成语料、Atlas本地向量索引、基线与混合的对比、评测,每一步都真跑并把输出存进仓库的NOTES.md。最关键的一轮是评测复审,代理抓出了上面那个措辞泄漏,逼出了那次诚实重跑。
线上演示挂在Render上,模型在构建时预热,避免首次查询冷加载;公开端点按IP限流并限制查询大小,防止一个开放无鉴权的演示被当成算力水槽。但作者说得很清楚:真正给单人维修店跑的是本地免费那版,托管演示只是让你能点一下。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.