我年轻的时候在火锅店打工,每天凌晨三点收工,回出租屋的路上就爱听点老歌。那时候没有网易云,是MP3里塞满了周杰伦和潘玮柏,耳机一戴,走路都带风。后来自己开店了,反而很少听歌了,直到去年关了分店,才有空重新捡起来。
扯远了。我想说的是,听歌这件事,算法推荐和人工淘碟,完全是两码事。
算法知道你喜欢"中文说唱",于是把GAI和艾热塞给你,再往下就是各种厂牌流水线产品,听着听着就腻了。但你自己去唱片店翻,可能会摸到一张2008年的隐藏版mixtape,里面有个无名小子的flow生涩得要命,但那段采样刚好是你小时候看过的港片配乐。这种连接,算法给不了。
代码检索也一样。cosine similarity是效率的极致,但它不懂"我此刻需要什么"。
想当年
我店里有个老员工,姓周,五十多了,以前在重庆老码头当厨师。他切毛肚有个绝活:不是看纹路走向,是听刀落在砧板上的声音。其实我问他怎么练的,他说年轻时师傅就这么教的,“手感"两个字,没法写成菜谱。怎么说呢现在我用机器切,厚薄均匀得像印刷品,但老客一吃就说"不是那个味”。技术替代不了语境,替代不了那条从码头到灶台的漫长链条。
你说把"API调用图、数据流这些结构化信息"塞进去,这思路我认同。但我担心的是,我们会不会又造出一个更复杂的"万能油",以为加了更多维度就能解决问题,结果每个维度都浅尝辄止。
我年轻时在大厂待过,见过那种"全链路监控平台",日志、指标、链路追踪,三维大屏做得花团锦簇。真出故障了,工程师还是得ssh上去一个个grep。工具越来越重,人越来越懒,最后连根因分析都不会做了。你说下一代检索要"卷"这个方向,我倒是觉得,与其做加法,不如想想哪些信息是真正稀缺的、机器最难伪造的。
说实话
比如,函数签名的演化历史。一个库从v1到v3,参数变了,返回值变了,但核心逻辑没变。现在的embedding能把这三个版本当成三个独立向量,还是合并成一个模糊的平均?我见过太多项目,README写得天花乱坠,实际代码是三年前的残次品。如果检索系统能识别"这个函数在活跃维护" versus “这个函数已经被标记deprecated”,比再多加十个特征都有用。
Node.js的npm海洋,你提得准。我店里有个收银系统,前年想找个二维码生成库,一搜几百个,挑了个star最多的,结果半年后发现作者早转去Rust了,issue堆成山没人管。后来换了个star只有两百多的,但commit记录像心跳一样规律,文档里甚至还有中文注释。这种"生命力"信号,现在的检索根本捕获不了。
我有个更野的想法,不知道靠不靠谱。
我们聊语义相似,默认的参照系是"代码文本本身"。但代码是写来运行的,运行起来才有真相。如果能把"这个函数在实际项目中的调用模式"也纳入检索呢?不是静态的依赖图,是动态的、带权重的"社会网络"——哪些函数经常被一起调用,哪些API组合容易出bug,哪些模块在真实生产环境里表现稳定。这玩意儿收集起来难,但一旦有了,比任何embedding都靠谱。
当然,这涉及到隐私和合规,开源社区不一定愿意交出自己的运行数据。但你想,npm本身是有下载量统计的,GitHub Actions的日志也是海量的,怎么把这些间接信号利用起来,是个值得琢磨的方向。
我年轻的时候,总觉得技术问题有最优解,像解数学题一样。后来开火锅店,发现最优解不存在,只有"当下最合适的解"。汤底要不要再加一勺牛油?看今天湿度。空调开几度?看哪桌客人脱了外套。这些判断没法写成代码,但老厨师就是知道。
说回你的帖子,“语义嵌入+依赖拓扑+函数签名"的pipeline,我期待有人做,但更期待有人能把它做得"不炫技”。我见过太多开源项目,README里塞满了架构图和benchmark,实际跑起来依赖地狱。真正好用的工具,往往是那种"我就想要个螺丝刀,你递过来的就是螺丝刀,不是带十六种功能的瑞士军刀"的东西。
说实话
最后说个小事。我店里现在还在用一套2016年写的库存管理系统,PHP写的,界面丑得像世纪初的政府网站。但五年了,没出过岔子。去年有个做SaaS的销售来推销,说他们的AI预测系统能减少30%损耗。我问老周,老周说:"他那个算法能闻出来这批花椒是茂汶的还是汉源的不?"销售走了。不是我们不进步,是有些"进步"经不起追问。
你要真搞出那个pipeline,记得把"简单"也作为一个优化目标。复杂是熵增,简单才是逆着潮流走,难,但值得。