Maxime Rivest 在学术出版领域工作了一年,用 DSPy 搭了两套 pipeline:一个是每周处理约 1 亿条科学文献分类的系统(用 vLLM + Llama 8B + Qwen embeddings + DSPy,成本只有 ChatGPT 的 1/8000),另一个是解析数百万份扫描 PDF 的pipeline。
他刚刚提交了第一个 DSPy 官方 PR——把 DSPy 的五个关键组件之间的契约关系形式化。这篇文章就是他对这五个层次的理解。
AI 工程的五个层次
1. Evals(评估)
自动改变你的提示词或模型权重来提升 eval 表现。核心是你必须先有 eval,才能优化。没有评估的迭代是盲目的。
不要过早建立大型漂亮的 eval 数据集。很多任务在起步阶段连一个例子都不 work。先手工 eval:交互,看数据和 trace,检查渲染、请求、解析哪里出了问题。之后再做小数据集开始自动优化。
2. Interface(接口)
定义任务的输入输出,用最高层次的方式描述,而不是被具体实现细节淹没。
接口需要稳定——因为它就是你的真实任务所在。把接口和下面的渲染、分解、优化层隔离开来。先定义签名,然后在内层折腾。
3. Inference(推理)
你的 pipeline 如何跑在不同的 provider 和 model 上。
最有效的方式是:目标一个特定的通用格式,然后在所有 provider 和 model 上只映射一次,把它们的响应也映射回这个通用格式。
模型更新极快,prompt、渲染和调用图必须都是即插即用的。
4. Call Graph(调用图)
把任务分解成多次 LLM 调用,每次调用委托给合适的模型。
你可以调用同一个模型多次,可以用专门的 guard 模型,可以用多个最佳模型组合,可以用 AI 加传统代码,可以混合推理和工具。
这叫 Compound AI System,是改变 cost/performance/latency profile 最有效的方式。
5. Rendering(渲染)
这是最不被理解的一层,也是最被低估的。
渲染指的是:如何把指令和输入渲染给模型,以及如何指导模型渲染它的输出。
比如你要结构化输出,选择 XML 标签是一种渲染策略,选择 JSON 是另一种,选择 BAML、CSV 或自定义分隔符也都可以。这些都是推理策略,与具体任务无关。
模型提供商会给你默认选项,但通常不是最优的。你选什么格式,模型就用什么格式响应。
对于图片:可以转 SVG,可以两步走(一个模型描述,一个模型只接收描述),可以降低分辨率或平铺多个图。对于 reasoning:可以用 <thinking> 标签,可以在代码前加 #REASONING: 注释,可以用贯穿输出的思考标签。
三大 AI 提供商最近的进展——reasoning、structured outputs、tool calls——本质上都在解决渲染层的问题。
为什么这些层次都要分开
任何 AI 程序都需要这五个组件。大多数框架只有其中几个,很少有框架(DSPy 几乎是唯一)把所有五个都形式化并让它们独立优化。
当这五个维度被分开处理,你可以在任何一个上深入研究,而不用太担心其他四个——同时整个社区可以共享最佳实践。
这个框架的价值不只在于 DSPy 本身,而在于它提供了一种谈论 AI 工程的方式,让不同背景的人能够交流具体问题。