李博!你上周跟我提的那个LLM库大重构,我回去研究了一下,越看越觉得有意思。
哦你真去看了?我还以为你随口说说呢。
得了吧,我可是认真的好吗。Simon Willison这个人我之前就关注,Datasette那个项目也是他做的对吧。
对对对,就是他。这次LLM库发了个0.32的alpha版,说实话我看完release notes的第一反应是——这哥们胆子真大。
怎么说?
你想啊,这个库两年前设计的时候,核心抽象就是「文本进、文本出」。2023年4月那会儿,ChatGPT刚火半年,这个建模方式完全没问题。
但AI这个领域太残酷了,你的核心抽象可能十八个月就从「恰到好处」变成「严重过时」。多模态、工具调用、推理token、图像生成全来了,原来那个文本管道完全不够用。
嗯这个我懂,就像我们做产品,最怕的就是底层数据模型一开始没设计好,后面要改就是伤筋动骨。
没错,而且他还给自己加了个超高难度的约束——向后兼容。老用户的代码一行不改就得能继续跑。
等等,这不就是在高速公路上换轮胎吗?
哈哈比喻到位。而且他这个库通过插件系统支持几千种模型,你的抽象层越通用,就越难跟上最前沿的能力边界。大多数开源项目的死法就是在旧抽象上不断打补丁,他选择了直接动刀。
好,那具体改了啥?我看了半天,感觉最直观的变化是对话不再是一条文本了?
对,这是第一个核心变更。以前的prompt就是一个字符串传进去,现在变成了消息序列——用messages数组传入完整对话历史。
这个我太有感触了!我们之前做AI产品的时候,想构建一个OpenAI兼容的API代理,结果发现老版本只能从头构建对话,不能注入已有的对话历史,别扭死了。
就是这个痛点。老架构有个致命假设——对话是线性的、从零开始的。新版本引入了llm.user()和llm.assistant()这些构建函数,把对话从「过程」变成了「数据」。
而且旧的prompt参数还能用,后台自动帮你升级成单条消息数组。这就是向后兼容的精髓。
还有一个我注意到的,他把SQLite存储层解耦了?
这个点特别好。之前CLI工具通过SQLite持久化对话,但这个机制从来没成为稳定API。本质上就是把「日志」和「业务逻辑」混为一谈了,新设计彻底拆开。
好,那第二个大变更呢?你之前说那个流式类型化部件是最有远见的?
我跟你说,这个设计是真的厉害。以前模型响应就是一坨纯文本流对吧?但你想想现在前沿模型一个响应里可能有什么——
推理过程、正式回答、工具调用、执行结果……
甚至还有图像和音频!这些东西交织出现,如果你的抽象层只能表达「文本块」,那你就永远在做hack。
所以他现在把响应建模成了带类型标签的事件流?
对,新的stream_events方法返回的每个事件都有type和chunk属性。text、tool_call_name、tool_call_args这些都是不同的事件类型。你可以把它想象成Server-Sent Events那种模式。
诶但是我有个担心——事件类型本身不也是一种新的抽象约束吗?万一下一代模型搞出个实时视频流什么的……
你这个问题问到点上了。
这确实是个隐忧,事件类型的枚举能不能足够可扩展,还得看后续。不过至少现在这一步是对的方向。
还有个细节我特别喜欢——CLI里推理文本输出到stderr,不影响管道传输。
教科书级的Unix哲学!现在AI工具普遍不管命令行管道兼容性,他这种对Unix传统的尊重,让LLM工具能真正融入开发者工作流,而不是成为一个孤岛。
你们搞技术的就喜欢这种。
你们产品经理就知道用户体验!这就是用户体验啊!开发者的用户体验!
哈哈好好好,算你说得对。那工具调用那块呢?我看他选择了让开发者显式控制执行循环,而不是搞自动agent loop。
这是一个非常克制且正确的选择。自动化循环看起来很酷,但在生产环境你需要的是可控性、可审计性和可中断性。
这个我太同意了,我们线上出过事故就是因为agent自己跑飞了没人能拦住。
还有一个看似不起眼但影响最深远的变更——响应序列化。新增了to_dict和from_dict方法。
这个……听起来好像就是个工具方法?
不不不,你想深一层。序列化意味着响应不再是只活在内存里的临时对象了,它变成了一等公民——可以存Redis、发消息队列、写Parquet做离线分析、测试里做快照比对。
真的假的,这么一说确实打开了好大一片可能性。
而且他选了TypedDict而不是Pydantic,更轻量更少依赖。这是「库作者」而不是「框架作者」的选择——保持最小依赖,把复杂性留给用户。
诶他后面路线图里说要把对话存储改成图结构?像Git的DAG那种?
对,这是最令人兴奋也最危险的部分。你想啊,chat completions API每次请求都要发完整历史,线性存储的话同一段前缀会被重复存无数次。图结构可以解决这个问题,还能自然表达对话分支和回溯。
但复杂度会爆炸吧。
Simon自己也在犹豫放0.32还是0.33,这种犹豫本身就说明他意识到了风险。
其实聊到最后我最大的感受是——这个库的命运不取决于核心设计多优雅,而是插件生态能不能跟上。
一针见血。他现在同步异步两套API,插件作者工作量直接翻倍。如果生态跟不上,再好的设计也是纸上谈兵。
嗯,不过先发alpha让真实用户和插件来暴露问题,这个节奏是对的。
这就是整个AI工具链生态的缩影啊——底层模型以季度为单位颠覆自身能力,上层抽象要么学会在奔跑中换骨架,要么就等着被从零开始的竞争者取代。
在奔跑中换骨架,这个说法好。Simon选了最难的那条路,希望他能跑赢模型进化的速度吧。