DSPy 技术详解:从 Prompt 工程到编程式大模型应用
DSPy 框架如何解决大模型应用中的提示词脆弱性问题。通过编程范式替代手工 Prompt 工程,DSPy 利用签名(Signature)、模块(Module)和提词器(Teleprompter)实现自动化优化。文章涵盖了环境搭建、核心概念解析及实战问答系统构建,对比了其与 LangChain 的差异,强调了其在构建稳定、可维护 LLM 管道中的优势。

DSPy 框架如何解决大模型应用中的提示词脆弱性问题。通过编程范式替代手工 Prompt 工程,DSPy 利用签名(Signature)、模块(Module)和提词器(Teleprompter)实现自动化优化。文章涵盖了环境搭建、核心概念解析及实战问答系统构建,对比了其与 LangChain 的差异,强调了其在构建稳定、可维护 LLM 管道中的优势。

随着大语言模型(LLM)的普及,开发者面临着新的挑战。传统的 Prompt 工程往往需要耗费大量精力去调整提示词的结构和措辞,且效果不稳定;而基于 RAG(检索增强生成)的方案虽然引入了知识库,但数据清洗、索引构建和维护成本高昂。
在这种背景下,DSPy(Declarative Self-improved Language Programs)应运而生。它旨在通过编程范式来解决基于语言模型的应用程序中的脆弱性问题,让开发者不再依赖手工调优的提示词,而是通过代码逻辑来定义和优化模型行为。
DSPy 是一个 Python 框架,其核心理念是将提示词(Prompt)转化为编程语言的一部分。它允许开发者通过声明式的签名(Signature)和模块(Module)来构建 LLM 管道,并利用编译器自动优化这些组件。
一句话定性:它是一个旨在通过优先编程而不是 prompt 来解决基于语言模型 (LM) 的应用程序中的脆弱性问题的框架。
DSPy 强调编程而非提示,使构建基于 LM 的管道远离操作提示而更接近编程。这意味着开发者可以像编写传统软件一样编写 AI 应用,利用版本控制、调试工具和单元测试来管理 AI 逻辑。
在使用 DSPy 之前,需要安装相关依赖库。推荐使用 Python 3.8+ 环境。
pip install dspy-ai
确保已配置好 API Key(如 OpenAI),并在代码中初始化 DSPy 的配置。
import dspy
from dotenv import load_dotenv
load_dotenv() # 加载环境变量中的 API_KEY
# 初始化 DSPy 配置
dspy.configure(
lm=dspy.LM('openai/gpt-4o', api_key='YOUR_API_KEY'),
trace=True
)
在 DSPy 程序中,每次调用语言模型时,都必须采用自然语言签名(Signature),而不是传统的手写提示。签名是一个简短的函数或类,用来明确说明转换的目标,而不是指导 LM 的提示方式。
签名包含 LLM 要解决的子任务的最小描述,包括输入字段的描述和输出字段的描述。
class GenerateAnswer(dspy.Signature):
"""Answer questions with short factoid answers."""
context = dspy.InputField(desc="may contain relevant facts")
question = dspy.InputField()
answer = dspy.OutputField(desc="often between 1 and 5 words")
与常规提示语相比,签名可以通过引导示例编译成自完善和自适应管道的 prompt 或 fine-tune。这种结构化的定义使得模型更容易理解任务的边界和期望的输出格式。
在 DSPy 中,通过模板化和参数化来抽象提示技术。开发者可以使用内置模块来处理不同的推理需求。
# Option 1 : Pass minimal signature to ChainOfThought module
generate_answer = dspy.ChainOfThought("context, question -> answer")
# Option 2 : Or pass full notation signature to ChainOfThought module
generate_answer = dspy.ChainOfThought(GenerateAnswer)
# Call the module on a particular input.
pred = generate_answer(
context="Which meant learning Lisp, since in those days Lisp was regarded as the language of AI.",
question="What programming language did the author learn in college?"
)
print(pred.answer)
从以上代码看,DSPy 签名传递给 ChainOfThought 模块,然后使用输入字段 context 和 question 的值进行调用。
DSPy 内置了多个常用模块,分别有不同的作用:
dspy.Predict:基本预测变量,直接根据签名生成输出。dspy.ChainOfThought:教 LLM 在对 Signatures 响应之前逐步思考,提高复杂推理能力。dspy.ProgramOfThought:教 LLM 输出代码,适用于数学计算或逻辑验证场景。dspy.ReAct:能够实现某个 Signatures 功能的代理,利用工具(如搜索、计算器)辅助回答。dspy.MultiChainComparison:可以比较多个 ChainOfThought 输出以产生最终预测,提升准确率。模块的优势在于它灵活的集成在管道之中,是参数化的,包括提示细节等,模块根据签名处理输入,返回输出。
DSPy 还有一个关键武器,就是 Teleprompters(提词器)。提词器使用特定度量,与编译器协同工作,学习和引导有效提示,从而优化 DSPy 程序的各个模块。
DSPy 内置了多种提词器,用于不同的优化目标:
dspy.LabeledFewShot:使用少量标记数据进行微调。dspy.BootstrapFewShot:自动生成少样本示例并优化。dspy.BootstrapFewShotWithRandomSearch:结合随机搜索策略优化提示。dspy.BootstrapFinetune:结合微调策略优化。dspy.Ensemble:集成多个模型或路径的结果。不同的提词器在优化成本和质量等方面提供了不同的平衡。例如,对于资源受限的场景,可以选择 FewShot 方案;对于追求极致准确率的场景,可以使用 BootstrapFinetune。
下面是一个完整的 DSPy 问答系统示例,展示了如何定义签名、使用模块以及进行优化。
首先,我们需要定义一个用于提取信息的签名。
class ExtractInfo(dspy.Signature):
"""Extract specific information from the given text."""
text = dspy.InputField(desc="The source text to analyze")
entity_type = dspy.InputField(desc="Type of entity to extract (e.g., Person, Date)")
extracted_info = dspy.OutputField(desc="List of extracted entities")
使用 dspy.Predict 或 dspy.ChainOfThought 创建模块实例。
extractor = dspy.ChainOfThought(ExtractInfo)
input_text = "Elon Musk was born on June 28, 1971, in South Africa. He is the CEO of Tesla."
result = extractor(text=input_text, entity_type="Person")
print(result.extracted_info)
为了进一步提升效果,我们可以引入提词器进行优化。
from dspy.teleprompt import BootstrapFewShot
# 准备一些训练数据
trainset = [
dspy.Example(text="Apple Inc. was founded in 1976.", extracted_info=["Apple Inc."]).with_inputs("text"),
dspy.Example(text="Google was established in 1998.", extracted_info=["Google"]).with_inputs("text"),
]
teleprompter = BootstrapFewShot(metric=lambda x, y: x == y)
optimized_extractor = teleprompter.compile(extractor, trainset=trainset)
通过编译,DSPy 会自动生成最佳的提示词组合,无需人工干预。
LangChain 和 DSPy 都是构建 LLM 应用的流行框架,但侧重点不同。
简单来说,LangChain 的 RAG 技术是让提示词更详细、丰富,形成标准模板;而 DSPy 则是从编程的角度去跟大模型交流,通过签名和编译器自动优化提示。
DSPy 代表了 LLM 应用开发的一个重要方向:将提示词工程转化为编程问题。它把传统的提示词工程通过一些语法糖进行了优雅的封装。
它可以解决基于语言模型的应用程序脆弱性问题的框架;优先考虑编程而不是提示,允许重新编译整个流水线以优化任务。
实现原理是前文提到的:引入了签名、模块和提词器等概念来抽象提示和微调;编译器可以自动优化程序,根据任务需求生成高质量的提示。
对于希望构建稳定、可维护的大模型应用的开发者来说,掌握 DSPy 将是提升工程效率的关键技能。未来,随着 DSPy 生态的成熟,它将更好地支持多模态、长上下文等复杂场景的开发。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online