首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DSPy —— 用程序化方式优化提示与推理链的下一代 LLM 编程框架

DSPy —— 用程序化方式优化提示与推理链的下一代 LLM 编程框架

作者头像
沈宥
发布2026-01-29 14:51:39
发布2026-01-29 14:51:39
280
举报

一句话总结: DSPy(Declarative Self-improving Language Programs)是由斯坦福 NLP 团队打造的声明式 LLM 编程框架,它彻底摒弃手工编写提示(prompt engineering)的做法,转而通过可学习的模块化组件(如 Retrieval、Generate、Predict)和自动优化器(如 BootstrapFewShot、MIPRO),让系统能根据任务指标(如准确率、F1)自动调整提示、示例甚至推理流程,实现“代码即提示,训练即优化”的范式跃迁。


一、引言:手工 Prompt Engineering 的终结?

自 2022 年 ChatGPT 爆火以来,“提示工程”(Prompt Engineering)成为连接人类意图与大模型能力的桥梁。无数开发者花费大量时间:

  • 反复调试 system prompt 的措辞;
  • 精心挑选 few-shot 示例;
  • 设计复杂的思维链(Chain-of-Thought)模板。

然而,这种做法存在根本性缺陷:

  • 脆弱性:同一提示在不同模型(如 GPT-4 vs. Claude vs. Qwen)上表现差异巨大;
  • 不可扩展:为每个新任务手动设计提示,无法规模化;
  • 黑盒性:无法像传统机器学习那样,通过损失函数和梯度优化系统。

正如斯坦福 CRFM 实验室在 DSPy 论文中所言:

“Prompting is the new programming—but it shouldn’t be artisanal.”

DSPy 的诞生,正是为了将 LLM 编程从“手工艺”带入“工程化”时代。它不把提示视为静态字符串,而是可学习、可组合、可优化的程序组件

自 2023 年开源以来,DSPy 已被 Google Research、Hugging Face、Together.ai 等机构用于构建鲁棒的 RAG 系统、问答代理和推理引擎,并在 HotPotQA、StrategyQA 等复杂 QA 基准上超越手工提示方案。

本文将深入剖析 DSPy 的核心思想、模块设计、优化机制及实战案例,展示如何用代码代替“提示调参”,构建可自我改进的 LLM 应用。


二、为什么传统提示工程不够用?

让我们看一个典型的手工提示:

代码语言:javascript
复制
prompt = f"""
You are an expert QA system.
Given the following context:
{context}

Answer the question: {question}
Be concise and only use information from the context.
"""

这种方法的问题在于:

  1. 上下文注入方式固定:无法适应不同长度或结构的检索结果;
  2. 无示例引导:模型可能忽略“仅使用上下文”的指令;
  3. 无法针对任务指标优化:你不知道这个提示在验证集上的准确率是多少,更无法自动改进。

更糟的是,当你切换到另一个模型(如从 GPT-4 切换到 Llama-3-70B),整个提示可能失效,需要重新设计。

**我们需要一个框架,让 LLM 程序具备“学习能力”**。


三、DSPy 的核心思想:声明式 + 可学习

DSPy 的设计基于两大原则:

原则 1:声明式编程(Declarative Programming)

你只需**声明“要做什么”**,而非“怎么做”。例如:

  • “我需要一个能根据上下文回答问题的模块”;
  • “我需要一个能从文档中检索相关信息的模块”。

框架负责选择合适的底层实现(如使用 BM25 还是向量检索,使用 zero-shot 还是 few-shot)。

原则 2:可学习的提示(Learnable Prompts)

提示中的关键部分(如指令、示例)不再是硬编码字符串,而是可被优化器更新的参数。优化目标是下游任务的指标(如问答准确率)。

这类似于传统 ML 中的“训练”:你提供输入-输出对,系统自动调整内部参数以最小化损失。


四、核心组件解析

DSPy 将 LLM 程序分解为一系列可组合的模块(Modules),每个模块封装一种能力。

4.1 Retrieve:智能检索模块

代码语言:javascript
复制
from dspy import Retrieve

retriever = Retrieve(k=3)  # 自动使用内置的 ColBERTv2 或 FAISS
topK_passages = retriever(query="What is quantum computing?")
  • 默认集成高效检索器;
  • 可替换为自定义向量库(如 Chroma、Pinecone)。

4.2 Predict / ChainOfThought:生成模块

代码语言:javascript
复制
from dspy import Predict, ChainOfThought

# 简单预测
predictor = Predict("question -> answer")

# 思维链推理
cot = ChainOfThought("question -> reasoning, answer")

注意:这里没有写任何提示!DSPy 会自动生成初始提示模板。

4.3 ProgramOfThought:程序化推理(高级)

对于数学或代码任务,可生成可执行的中间步骤:

代码语言:javascript
复制
from dspy import ProgramOfThought
pot = ProgramOfThought("question -> program, answer")

五、自动优化器:让系统自我改进

这是 DSPy 最革命性的部分——**优化器(Teleprompter)**。

你提供一个验证集(input-output pairs)和一个评估函数,DSPy 会自动优化你的程序。

5.1 BootstrapFewShot:自举式少样本学习

  1. 先用 zero-shot 模型在验证集上生成答案;
  2. 选择表现好的样本作为 few-shot 示例;
  3. 用这些示例构建新的提示。
代码语言:javascript
复制
from dspy.teleprompt import BootstrapFewShot

# 定义你的程序
class BasicQA(dspy.Module):
    def __init__(self):
        self.retrieve = dspy.Retrieve(k=3)
        self.generate = dspy.Predict("context, question -> answer")

    def forward(self, question):
        context = self.retrieve(question).passages
        return self.generate(context=context, question=question)

# 编译(即优化)
teleprompter = BootstrapFewShot(metric=validate_answer)  # validate_answer 是你的评估函数
compiled_qa = teleprompter.compile(BasicQA(), trainset=devset)

5.2 MIPRO:贝叶斯优化提示

MIPRO(Multivariable In-context Prompt Optimization)使用贝叶斯优化,同时调整:

  • 指令措辞;
  • 示例选择;
  • 示例顺序。

实验表明,MIPRO 在多个基准上比手工提示提升 10–20% 准确率。

5.3 Ensemble:模块集成

可自动组合多个优化后的程序,进一步提升鲁棒性。


六、实战:构建一个可优化的 RAG 系统

假设我们要在 HotPotQA(多跳问答)上构建系统。

步骤 1:准备数据

代码语言:javascript
复制
# 加载验证集(需包含 question, answer, gold_titles)
devset = [dspy.Example(question=q, answer=a).with_inputs("question") 
          for q, a in zip(questions, answers)]

步骤 2:定义程序

代码语言:javascript
复制
class MultiHopRAG(dspy.Module):
    def __init__(self):
        self.retrieve = dspy.Retrieve(k=4)
        self.generate_query = dspy.ChainOfThought("question -> search_query")
        self.answer = dspy.ChainOfThought("context, question -> answer")

    def forward(self, question):
        # 第一跳
        query1 = self.generate_query(question=question).search_query
        context1 = self.retrieve(query1).passages

        # 第二跳(基于第一跳结果生成新查询)
        query2 = self.generate_query(question=f"{question} Given: {context1}").search_query
        context2 = self.retrieve(query2).passages

        final_context = "\n".join([context1, context2])
        return self.answer(context=final_context, question=question)

步骤 3:编译优化

代码语言:javascript
复制
teleprompter = MIPRO(prompt_model=dspy.GPT3_5_Turbo(), task_model=dspy.Claude2())
optimized_rag = teleprompter.compile(MultiHopRAG(), trainset=devset)

步骤 4:评估与部署

代码语言:javascript
复制
# 在测试集上评估
score = evaluate(optimized_rag, testset, metric=exact_match)

# 部署时直接调用
response = optimized_rag(question="Who founded the company that makes TensorFlow?")

整个过程无需手动写一行提示!


七、DSPy vs. LangChain vs. LlamaIndex:范式差异

维度

LangChain / LlamaIndex

DSPy

编程范式

命令式(Imperative)

声明式(Declarative)

提示管理

手工编写、硬编码

自动优化、可学习

模型切换

需重写提示

几乎无需修改代码

优化目标

无(依赖人工)

直接优化任务指标

适用场景

快速原型、简单 RAG

需要高准确率、可复现的生产系统

关键区别

  • LangChain 告诉你“如何一步步调用 LLM”;
  • DSPy 告诉你“想要什么结果”,并自动找到最佳实现路径

八、性能与局限性

优势

  • 显著提升准确率:在 HotPotQA 上,DSPy + MIPRO 达到 68.2 EM,远超手工 CoT(59.1);
  • 模型无关性:同一套代码可在 GPT-4、Claude、Llama 3、Qwen 上运行;
  • 可复现性:优化过程完全自动化,避免“提示玄学”。

局限

  • 需要验证集:必须提供 input-output pairs 用于优化;
  • 优化耗时:MIPRO 可能需要数百次 LLM 调用;
  • 不适合简单任务:若任务 trivial,手工提示已足够。

九、社区与生态

  • GitHub: https://github.com/stanfordnlp/dspy
  • Star 数: 18k+(2026 年 1 月)
  • 许可证: MIT
  • 集成支持
    • 向量数据库:Chroma, FAISS, Weaviate
    • 模型:OpenAI, Anthropic, Together, Ollama, vLLM
    • 评估指标:Exact Match, F1, BLEU, 自定义函数

斯坦福团队正开发 DSPy Studio(可视化优化平台),未来将进一步降低使用门槛。


结语

DSPy 代表了 LLM 编程的下一个范式:从写提示到写程序,从人工调参到自动优化。它不是否定提示工程,而是将其提升到工程化、可扩展的新高度。

对于追求高准确率、强鲁棒性、跨模型兼容的 AI 应用,DSPy 提供了一条通往生产级系统的清晰路径。

正如其文档所言:

“Stop prompting. Start programming.”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 质量工程与测开技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、引言:手工 Prompt Engineering 的终结?
  • 二、为什么传统提示工程不够用?
  • 三、DSPy 的核心思想:声明式 + 可学习
    • 原则 1:声明式编程(Declarative Programming)
    • 原则 2:可学习的提示(Learnable Prompts)
  • 四、核心组件解析
    • 4.1 Retrieve:智能检索模块
    • 4.2 Predict / ChainOfThought:生成模块
    • 4.3 ProgramOfThought:程序化推理(高级)
  • 五、自动优化器:让系统自我改进
    • 5.1 BootstrapFewShot:自举式少样本学习
    • 5.2 MIPRO:贝叶斯优化提示
    • 5.3 Ensemble:模块集成
  • 六、实战:构建一个可优化的 RAG 系统
    • 步骤 1:准备数据
    • 步骤 2:定义程序
    • 步骤 3:编译优化
    • 步骤 4:评估与部署
  • 七、DSPy vs. LangChain vs. LlamaIndex:范式差异
  • 八、性能与局限性
    • 优势
    • 局限
  • 九、社区与生态
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档