谈到做 AI 应用总是绕不开 langchain 和 llamaindex 两个著名的工具,过去两年我做过一个 AI 聊天应用和一个 RAG 搜索应用,都有仔细考查过两个项目,但最终都没有选择使用,原因很简单,封装的层级太多,自造概念太多,导致原本简单的事情变得复杂。有意思的是,它们的卖点之一是能让原本复杂的事情变得简单,比如从 text embedding, vector store 到 retrieve, rerank 的完整工作流,只需要数行代码就能写完。对于刚刚接触 LLM 的人,这真的是非常有诱惑力,但事实真的如此吗,事情真的变容易了吗?在我看来,除非你只是为了做一个简单的 demo, 不会再继续深入扩展做出正式的产品,否则引入它们一定是弊大于利的。首先光是看那些混乱的文档就会让人迷失方向,而当你复制粘贴的代码没有按照预期工作,想要查出问题更是天方夜谈。更何况,我真没有觉得开发 LLM 应用有多么复杂(至少对于这两个库所封装的流程来说),核心的概念和流程并不难懂,只需要一定的耐心将其捋顺,要怎么做都是非常灵活和清晰的(当然,最好是没有受到这些巨型封装库的干扰,否则它们的私有概念会成为你弄清通用概念的绊脚石)。就像玩乐高那样,你得先熟悉每个积木块的形状、性质、如何与其他积木交互的「接口」等等,而不是一开始就拿到一个巨大而紧凑的完成品,连拆开研究都无从下手。

扯远了,实际上我主要是想称赞下 Vercel AI SDK 的 API 设计,封装的程度恰到好处,既提供了便利,也没有对原本的流程和概念造成干扰,比如在这篇 release note [^1] 中介绍的 useObject 函数,它能够让 streaming 的结果以所传递的 schema 格式输出,在利用 LLM 处理结构化数据时很有用,但不会对你的代码造成侵入式的影响,因为这是一个通用的 pattern。而如果用 llamaindex 几行代码完成了一个 RAG 应用,就会丧失了对核心流程中细节的掌控能力,或者你只能按照它的方式来自定义。而当你终于赤石吃透了 llamaindex 的接口并进行了高度的自定义,你就会发现,它除了徒增复杂度和出错点没有任何价值——这些自定义的代码如果抛开 llamaindex 自己写,不仅代码量会更少,可维护性也会有质的差别。别问我是怎么知道的。

综上,Vercel AI SDK 看起来是一个很好的开发 AI 应用的工具库,我准备在下一次已有项目的改善或新项目的实现中尝试它。

[^1]: https://vercel.com/blog/vercel-ai-sdk-3-3-3OnRtxG6a0rwvcJVu3qADv Vercel AI SDK 3.3 - Vercel
 
 
Back to Top
OKHK