DSPy作者揭秘:AI工程的五个核心组件
Maxime Rivest是DSPy的贡献者,也是AI工程领域的实践者。他曾用DSPy搭建了一个每周处理近1亿篇科学出版物的流水线,如果用ChatGPT做这件事每周需要40万美元,而用vLLM + Llama 8B + Qwen embeddings + DSPy,成本只要50美元。
他从DSPy的架构中提炼出了AI工程的五个核心组件,这五个组件在任何有效的AI编程中都存在——你可能只是在把它们外包给框架或环境。
五个核心组件
| 通用名称 | DSPy名称 | 职责 |
|---|---|---|
| Evals | Optimizers | 评估和改进性能 |
| Interface | Signatures | 定义任务的输入输出接口 |
| Inference | LM | 连接模型提供商,生成token |
| Call Graph | Modules | 将多个LLM调用组合成计算图 |
| Rendering | Adapters | 将任务输入渲染成实际请求 |
Rivest认为**Rendering(渲染)**是最被低估的组件。
Rendering:最被低估的AI工程表面
Rendering关乎你如何向模型渲染指令和输入,以及如何指示模型渲染输出以便你解析。
结构化输出只是Rendering的一个维度。 其他维度包括:
- 推理:用
<thinking>标签、代码前的#REASONING:注释 - 图片:提供SVG而非位图、先描述再处理、降低分辨率或拼接
- PDF:OCR文本+图片、仅文本、仅图片
- 工具调用:除了JSON,还可以用
#!run标记的Markdown代码块、<toolcall>标签等
"三大AI提供商最近的进步——推理、结构化输出、工具调用——全都与Rendering相关。"
Call Graph:分解任务的艺术
将任务分解为多个LLM子调用,并委托给合适的模型,是改变AI流水线成本、性能和延迟的最有效方式。
你可以:
- 多次调用同一模型
- 使用专门模型(守卫模型)
- 调用最佳模型并组合响应
- 混合AI调用与传统编程
这就是复合AI系统(Compound AI Systems),而Module提供了端到端的调用方式,独立于你的分解策略。
Inference:提供商无关性
开源和商业模型几乎每天都在发布。你需要所有关于提示、渲染和调用图的工作都能轻松插拔到任何提供商和模型。
最有效的方式:针对一个通用格式编写,然后一次性映射到所有提供商,再把响应映射回通用格式。
Interface:稳定的外部契约
你的AI程序需要与世界交互——被应用调用、在数据流上每日运行。这个接口需要稳定,因为它就是你的真实任务。
把它与底层的各种hack、优化、分解和渲染隔离开。定义一次系统的签名,然后在内部随意折腾。
Evals:没有评估就没有进步
但别太早构建大而美的评估集。很多时候一个明显的例子都跑不通。
渐进式评估路径:
- 手动评估:交互、查看数据和trace
- 小数据集:足够运行自动提示优化
- 生产数据:收集真实输入输出分布
- 微调:当数据量足够时
核心启示
AI工程的五个组件始终存在,你可能只是在把它们外包给别人和环境。
DSPy的价值在于让你可以在任何一个组件上深入钻研,而不必太担心其他组件,同时让所有人都能分享最佳实践和通用解决方案。
对于任何给定任务,其中某个子集会更重要——但它们始终都在那里。