目录:

  1. 咱们为什么需要DSPy?
  2. DSPy到底是个啥?
  3. DSPy的核心概念
  4. DSPy vs 传统Prompt工程
  5. 实战代码示例
  6. 本文小结
  7. 思考题

一、咱们为什么需要DSPy?

大家平时开发AI应用的时候,是不是经常遇到这样的场景:

为了调好一个Prompt,你熬夜到凌晨三点。改了十几版,好不容易在GPT-4上跑通了,第二天一换模型,全废了。是不是很崩溃?

更扎心的是,你精心调好的Prompt,同事稍微改一个字,效果就天差地别。然后你就开始怀疑人生:到底哪里出问题了?

说实话,这个问题困扰了整个AI行业好几年。直到斯坦福大学NLP实验室搞出了DSPy框架,这个局面才彻底改变。

简单来说,DSPy让AI开发从"手工艺"变成了"工业化"。


二、DSPy到底是个啥?

DSPy(Declarative Self-improving Language Programs,声明式自改进语言程序)是斯坦福大学开发的一个框架,核心理念就一句话:

用代码写AI,而不是用Prompt写AI。

咱们来打个比方:

传统Prompt工程 = 你是个手艺人,每个作品都要手工雕琢,换个人做效果就不一样了。

DSPy = 你是个工厂老板,设定好标准流程,机器自动生产,产品稳定可靠。

是不是一下子就明白了?

DSPy不是帮你写Prompt的,而是根本不需要你写Prompt。它通过以下方式工作:

  1. 你用代码定义任务(比如"我需要检索增强生成")
  2. DSPy自动生成和优化Prompt
  3. 根据验证集自动调整

说白了,DSPy就是你的AI开发助手,它不仅帮你干活,还帮你"思考"怎么干最好。


三、DSPy的核心概念

DSPy有几个核心概念,咱们一个个来看。

3.1 签名(Signature)

签名就是定义你的输入输出。

啥意思呢?举个例子:

# 传统方式:你需要写长篇Prompt
prompt = """
你是一个专业的客服助手。用户会问你问题,你需要友好地回答。
注意:
1. 使用礼貌用语
2. 提供准确信息
3. 如果不知道就说不知道
"""


# DSPy方式:只需要定义签名
class CustomerService(dspy.Signature):
    """处理客户咨询"""
    question = dspy.InputField(desc="用户的问题")
    answer = dspy.OutputField(desc="友好的回答")

看到了吗?DSPy不需要你写那些啰嗦的Prompt,只需要说清楚:输入是什么,输出是什么

3.2 模块(Module)

模块 就像积木,你可以组合使用。

# 创建一个RAG(检索增强生成)模块
class RAG(dspy.Module):
    def __init__(self):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=3)
        self.generate = dspy.ChainOfThought(CustomerService)

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

这里RAG模块组合了两个基础模块:检索生成。就像搭积木一样简单!

3.3 优化器(Optimizer)

优化器 是DSPy的大脑,它自动帮你调优。

# 定义评估标准
def accuracy_metric(gold, pred, trace=None):
    return gold.answer == pred.answer

# 自动优化
optimizer = dspy.BootstrapFewShot(metric=accuracy_metric)
optimized_rag = optimizer.compile(RAG(), trainset=train_data)

你只需要提供训练数据和评估标准,DSPy会自动尝试各种Prompt组合,找到最优方案。

听起来很绕?别急,咱们用一张图来展示一下:

alt

四、DSPy vs 传统Prompt工程

咱们用一张表来对比一下:

对比项 传统Prompt工程 DSPy
工作方式 手工编写和调整Prompt 用代码定义任务,自动生成Prompt
可移植性 换个模型可能需要重写 模型无关,自动适配
可维护性 Prompt藏在字符串里,难以维护 代码结构清晰,易于维护
优化方式 靠经验和直觉 基于数据自动优化
团队协作 难以标准化,效果因人而异 标准化流程,结果可复现

举个实际例子

假设你要做一个问答系统:

传统方式:

# 你需要写这样的Prompt
prompt = """
你是一个专业的问答助手。请根据以下上下文回答用户问题。

上下文:{context}

问题:{question}

要求:
1. 只使用上下文中的信息
2. 如果上下文没有相关信息,说"我不知道"
3. 回答要简洁明了
"""


# 然后不断尝试修改,测试,再修改...

DSPy方式:

# 定义签名
class QASignature(dspy.Signature):
    """根据上下文回答问题"""
    context = dspy.InputField(desc="相关文档片段")
    question = dspy.InputField(desc="用户问题")
    answer = dspy.OutputField(desc="基于上下文的回答")

# 创建模块
qa = dspy.ChainOfThought(QASignature)

# 自动优化
optimizer = dspy.BootstrapFewShot(metric=your_metric)
optimized_qa = optimizer.compile(qa, trainset=train_data)

哪种方式更清晰、更易维护?相信大家心里都有数了。


五、实战代码示例

咱们来做一个完整的例子:构建一个RAG问答系统

import dspy

# 1. 配置LLM
lm = dspy.OpenAI(model="gpt-4")
dspy.settings.configure(lm=lm)

# 2. 定义签名
class GenerateAnswer(dspy.Signature):
    """根据上下文回答问题"""
    context = dspy.InputField(desc="相关文档片段")
    question = dspy.InputField(desc="用户问题")
    answer = dspy.OutputField(desc="基于上下文的回答")

# 3. 定义RAG模块
class RAG(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=num_passages)
        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)

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

# 4. 准备训练数据
trainset = [
    dspy.Example(
        question="什么是DSPy?",
        answer="DSPy是斯坦福开发的声明式自改进语言程序框架"
    ),
    # ...更多训练数据
]

# 5. 定义评估指标
def validate_answer(example, pred, trace=None):
    return example.answer.lower() in pred.answer.lower()

# 6. 自动优化
from dspy.teleprompt import BootstrapFewShot

optimizer = BootstrapFewShot(metric=validate_answer)
optimized_rag = optimizer.compile(RAG(), trainset=trainset)

# 7. 使用优化后的模型
question = "DSPy有什么优势?"
result = optimized_rag(question=question)
print(result.answer)

这个例子展示了DSPy的完整工作流程:定义→优化→使用。简单、清晰、可维护。


六、本文小结

今天咱们主要讲了以下几点:

  1. DSPy是什么:斯坦福开发的AI编程框架,核心理念是"用代码写AI,不是用Prompt写AI"

  2. 核心概念

    • 签名:定义输入输出
    • 模块:可组合的组件
    • 优化器:自动调优的大脑
  3. 相比传统Prompt工程的优势:可移植、可维护、可优化、可协作

  4. 2026年的趋势:手动调Prompt的时代正在过去,系统化、自动化的AI开发才是未来


七、思考题

今天留一个思考题:

如果让你用DSPy重构你现在的AI项目,你会怎么设计?会遇到哪些挑战?

大家先思考思考,欢迎在评论区分享你的想法!


相关资源:

关注我,一起探索AI开发的新范式!

本文由 mdnice 多平台发布

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐