@MaximeRivest: https://x.com/MaximeRivest/status/2055293570119065875

X AI KOLs Following 工具

摘要

MaximeRivest解释了DSPy的五个核心组件——Optimizers、Signatures、LMs、Modules和Adapters——并认为有效的AI工程需要掌握这些要素,同时强调了结构化输出渲染这一常常被忽视的作用。

https://t.co/7CEdeQqEpK
查看原文
查看缓存全文

缓存时间: 2026/05/15 15:05

一次简单的解释:DSPy能教你关于AI工程的那些事

整整一年前,我第一次尝试了DSPy。那感觉就像魔法。我花了一整年去深入了解它,直到某个早上我终于坐下来,真正运行了入门文档里的示例代码片段。这些示例短得让人觉得“不够”——但它们确实够了。总之,今天这篇文章重点不在于DSPy有多么神奇,而在于DSPy做了哪些不同的事情,使得它对AI融入社会的未来如此重要。

为什么听我讲? 在过去的一年里,当我为一家大型学术出版社工作时,我使用DSPy构建了一个管道,该管道几乎处理全球所有科学出版物——大约每周1亿次——彻底让数据分析师从创建自定义科学分类的繁琐任务中解放出来。如果用ChatGPT,每周要花费40万美元。而使用vLLM、Llama 8B、Qwen嵌入和DSPy,成本仅为50美元。我还构建了一个管道,以人类水平质量解析数百万份扫描的PDF,同时速度提高10倍。此后我离职,现在全职从事开源AI工程。我创建了几个DSPy社区库,现在也是DSPy的贡献者。就在今天早上,我向DSPy提交了我的第一个PR,我们正在朝着将DSPy的五个关键组件之间的契约形式化迈出第一步。这五个组件正是我想教给你的。

优化器、签名、语言模型、模块和适配器

我用DSPy的命名列出它们,并按人们通常接触的顺序排列。

  • 优化器:自动更改你的提示和/或模型权重,以在评估上提高性能。
  • 签名:一种高级方式,用于指定输入和输出的名称和类型,从而将细节留给自动优化。
  • 语言模型:DSPy与外部世界的连接——这是生成令牌的地方。
  • 模块:编程、推理策略和多次LLM调用可以组合成一个计算图,作为一个系统(复合AI系统)协同工作。
  • 适配器:存放与任务无关、与类型和结构相关的推理策略的地方。它们将任务输入和优化后的指令渲染为文本提示和请求参数。

任何有效的AI编程都需要这些组件。许多AI框架拥有其中几个;但很少有(除了DSPy外几乎没有)拥有全部。我最喜欢的是适配器——也是最被低估的一个。让我们用更通用的术语重命名它们。

AI工程师的工作将围绕:

  • 评估:评估和改进
  • 接口:在最高层定义你的任务及其输入和输出
  • 推理:让你的管道在不同的提供商和模型上运行
  • 调用图:考虑你如何分解任务(如果分解的话),对AI做什么,在代码或传统机器学习中做什么,是否使用推理,是否使用工具
  • 渲染:如何将特定领域的提示以及输入/输出类型渲染、格式化和解析为实际的完整请求

渲染

这可能是大多数读者最不明显的部分,所以我们从这里开始。

渲染是关于如何将你的指令和输入渲染给模型,以及如何指示模型渲染其输出。这两者通常相辅相成。如果你告诉模型使用XML标签,你会在提示中使用XML标签。JSON和自定义分隔符也是如此。当你决定使用XML标签要求结构化输出时,你就是在使用一种推理策略。该推理策略与你的任务无关——它关乎你如何渲染提示给模型看,以及你如何要求它渲染输出,以便你可以解析。

要获得结构化输出,XML只是众多选项之一。其他选项包括:JSON、原生结构化输出、自定义分隔符、BAML、CSV等等。结构化输出只是渲染的一个维度。你如何渲染推理、图像、工具调用、视频、PDF和引用——这些都是你需要做出的与渲染相关、与任务无关的推理策略。你可以保持简单,只使用提供商“原生”的方式,但这很少是最佳选择。这仅仅是把这个决定委托给了他们。

例如,JSON工具调用现在是默认的,但还有许多其他(通常更优越的)方式来渲染工具使用请求。你可以解析并运行所有以#!run开头的Markdown代码单元格。你可以解析并运行分隔符内的文本,等等。对于PDF,你可以使用传统OCR提取文本,同时提供文档的图像。你可以只提供文本、只提供图像,或者提供二进制数据(成功概率可能很低),等等。对于图像,如果是标志,你可以将其转换为SVG并只提供SVG。你可以分两步:一个模型描述它,另一个模型只接收描述。你可以降低分辨率或将多个图像拼贴成一个等等。对于推理,你可以在文档顶部使用标签。你可以要求模型在任何代码行之前添加#REASONING:注释。你可以在输出中贯穿思考标签,等等。

这很简单。如果你不自己动手,它已经被为你完成了。大型AI提供商最近三大进步都与渲染有关:推理、结构化输出和工具调用。

调用图

将任务分解为对LLM的多个子调用,并将每个子调用委托给合适的模型,是改变AI管道成本、性能和延迟特性最有效的方法之一。你可以多次调用同一个模型。你可以使用专用模型(守卫)。你可以调用最佳模型并组合它们的响应。你可以用多种不同的语言和程序完成一项任务,并取多数响应。你可以有“专用”模型角色,每个角色专注于不同元素。你可以将AI调用与代码和传统编程混合。所有这一切都在模块内部完成,你应该有一种独立于分解方式的端到端调用方式。这些就是复合AI系统——它们很强大。

推理

你需要货比三家并不断演进。现在几乎每天都有开源和商业模型发布。你需要你在提示、渲染和调用图上的所有工作能够轻松地即插即用于任何提供商和模型。最有效的方法是针对一个通用的AI请求格式,然后将该格式一次性地映射到你想要尝试的所有提供商和模型,并将它们的响应映射回你的管道可以解析、评估、渲染等的通用格式。

接口

为了有用且产生影响力,你的AI程序需要与世界交互。它需要被应用程序调用。它需要每天运行在某个数据流上,等等。该接口需要稳定——因为它就是你真正的任务。你必须保持它独立并抽象,远离你在底层为了达到满意的成本、性能和准确性而进行的各种黑客、调整、优化、分解和渲染工作。定义一次你的系统签名,然后在内部进行调整。

评估

如果你不努力提高性能,以上一切都毫无意义。你需要评估你的工作。但是,不要过早构建庞大而漂亮的评估集。在许多任务上,一个明显的例子甚至可能不起作用。一旦你的程序从零开始到能处理几个工作示例,只需手动评估:交互,查看你的数据和追踪。渲染有bug吗?在向语言模型请求时有bug吗?解析有bug吗?等等。之后,制作一个小数据集——这足以运行自动提示优化。然后投入生产,收集你的输入和输出,这样你就有了真实的数据分布,甚至可能足以进行微调!

结论

AI工程有五个重要组件。对于任何给定的任务,其中一部分会更值得关注,但它们始终存在——你可能只是将决策委托给了他人和环境。DSPy让我可以专注其中任何一个,而不用过多担心其他方面,它让我们所有人都能分享最佳实践以及这些问题的通用解决方案。

相似文章