👋 动态记录 & 转发分享 ✨ https://tg.okhk.net/ ✌️
谈到做 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 的 API 设计,封装的程度恰到好处,既提供了便利,也没有对原本的流程和概念造成干扰,比如在这篇 release note [^1] 中介绍的 useObject 函数,它能够让 streaming 的结果以所传递的 schema 格式输出,在利用 LLM 处理结构化数据时很有用,但不会对你的代码造成侵入式的影响,因为这是一个通用的 pattern。而如果用 llamaindex 几行代码完成了一个 RAG 应用,就会丧失了对核心流程中细节的掌控能力,或者你只能按照它的方式来自定义。而当你终于
综上,Vercel AI SDK 看起来是一个很好的开发 AI 应用的工具库,我准备在下一次已有项目的改善或新项目的实现中尝试它。
[^1]: https://vercel.com/blog/vercel-ai-sdk-3-3-3OnRtxG6a0rwvcJVu3qADv
https://addr.okhk.net/
https://github.com/Adonis142857/Real-Address-Generator
一个地址生成器,能生成不同国家地图上的真实随机地址,以及手机号、姓名和性别,支持 Cloudflare Workers 部署。
https://github.com/Adonis142857/Real-Address-Generator
一个地址生成器,能生成不同国家地图上的真实随机地址,以及手机号、姓名和性别,支持 Cloudflare Workers 部署。
月圆之夜的豫园,上海,中国 (© zyxeos30/Gettyimages)
原图:https://www.bing.com/th?id=OHR.MidAutumnFestival2024_ZH-CN9096556094_UHD.jpg
https://github.com/Ucas-HaoranWei/GOT-OCR2.0
一个端到端的开源 OCR 模型,号称 OCR 2.0!
基于 QWen2 0.5B 模型
支持场景文本、文档、音符、图表、数学公式等内容识别,拿到了 BLEU 0.972 高分。
效果据说不错,值得试试
一个端到端的开源 OCR 模型,号称 OCR 2.0!
基于 QWen2 0.5B 模型
支持场景文本、文档、音符、图表、数学公式等内容识别,拿到了 BLEU 0.972 高分。
效果据说不错,值得试试
wt.reg
用于添加 COM 注册信息,需要手动修改其中 exe 和 dll 的路径。rm_wt.reg
用于删除 COM 注册信息。defterm.reg
用于将默认终端设置成 Windows Terminal。因为卸载 MSIX 版 Windows Terminal 之后,设置里就不可选择 Windows Terminal 作为默认终端了。
经过一番调查,发现原因是这样的:Windows 替换默认终端,是由系统内置的 Console Host 通过 COM 去启动替换后的目标终端,并使用 COM 接口传递数据。
Microsoft Store 中的 Windows Terminal 使用 MSIX 打包,COM 注册信息是写在 AppXManifest.xml 中的,在安装 MSIX 包时系统会自动注册,并不是手动写入注册表。
但是当进程是管理员身份运行时,COM 相关服务会忽略由 MSIX 注册的信息,于是就无法启动 Windows Terminal 了。
https://github.com/microsoft/terminal/issues/10276#issuecomment-852215012
目前可能唯一可行的解决办法是,不要使用 MSIX 版本的 Windows Terminal,使用未打包版本的 Windows Terminal (可以在 release 页面下载到),然后手动添加注册表。
日出时的小袋鼠,阿德莱德河,北领地,澳大利亚 (© Jeremy Woodhouse/Getty Images)
原图:https://www.bing.com/th?id=OHR.SunriseWallabies_ZH-CN8725891401_UHD.jpg
https://yaak.app/
yaak 麻雀虽小,五脏俱全,用起来可以。
之前使用的是 insomnia ,后面加入云服务后就告别了,
在 Mac 上原生的 Paw(已更名为 Rapid API)体验也不错。
同类型还有 Postman、Hoppscotch 、Bruno 等
yaak 麻雀虽小,五脏俱全,用起来可以。
之前使用的是 insomnia ,后面加入云服务后就告别了,
在 Mac 上原生的 Paw(已更名为 Rapid API)体验也不错。
同类型还有 Postman、Hoppscotch 、Bruno 等
精简的可自托管书签管理器
https://github.com/sissbruecker/linkding
https://github.com/sissbruecker/linkding
阿科马尼奥海滩,卡拉布里亚,意大利 (© Alessio de Cicco/Getty Images)
原图:https://www.bing.com/th?id=OHR.CalabriaPeperoncino_ZH-CN8603617212_UHD.jpg