DSPy 基础概念 #
安装与配置 #
安装 DSPy #
bash
# 使用 pip 安装
pip install dspy-ai
# 安装完整版(包含更多功能)
pip install dspy-ai[all]
# 使用 poetry 安装
poetry add dspy-ai
验证安装 #
python
import dspy
print(dspy.__version__)
配置语言模型 #
DSPy 支持多种语言模型后端,配置方式统一且简单。
OpenAI 配置 #
python
import dspy
lm = dspy.LM('openai/gpt-4o', api_key='your-api-key')
dspy.configure(lm=lm)
Claude 配置 #
python
import dspy
lm = dspy.LM('anthropic/claude-3-opus-20240229', api_key='your-api-key')
dspy.configure(lm=lm)
本地模型配置 #
python
import dspy
# Ollama
lm = dspy.LM('ollama/llama3', api_base='http://localhost:11434')
dspy.configure(lm=lm)
# vLLM
lm = dspy.LM('vllm/meta-llama/Llama-3-70b', api_base='http://localhost:8000')
dspy.configure(lm=lm)
环境变量配置 #
python
import os
import dspy
os.environ['OPENAI_API_KEY'] = 'your-api-key'
os.environ['ANTHROPIC_API_KEY'] = 'your-api-key'
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
核心概念概览 #
text
┌─────────────────────────────────────────────────────────────┐
│ DSPy 核心概念 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 签名 (Signature) │ │
│ │ 定义模块的输入输出接口 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 模块 (Module) │ │
│ │ 实现具体的功能逻辑 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 优化器 (Optimizer) │ │
│ │ 自动优化模块性能 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 评估器 (Metric) │ │
│ │ 评估模块输出质量 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
签名(Signature) #
签名是 DSPy 中最基础的概念,它定义了模块的输入和输出。
签名的定义 #
python
import dspy
class QuestionAnswer(dspy.Signature):
"""根据问题给出答案"""
question = dspy.InputField(desc="用户的问题")
answer = dspy.OutputField(desc="问题的答案")
签名的组成 #
text
┌─────────────────────────────────────────────────────────────┐
│ 签名的组成 │
├─────────────────────────────────────────────────────────────┤
│ │
│ class MySignature(dspy.Signature): │
│ """文档字符串:描述签名的用途""" │
│ input_field = dspy.InputField(desc="输入描述") │
│ output_field = dspy.OutputField(desc="输出描述") │
│ │
│ 组成部分: │
│ 1. 类名:签名名称,应具有描述性 │
│ 2. 文档字符串:描述签名的功能 │
│ 3. 输入字段:定义输入参数 │
│ 4. 输出字段:定义输出结果 │
│ │
└─────────────────────────────────────────────────────────────┘
多输入多输出 #
python
class SummarizeDocument(dspy.Signature):
"""将文档总结为摘要并提取关键词"""
document = dspy.InputField(desc="需要总结的文档")
max_length = dspy.InputField(desc="摘要最大长度")
summary = dspy.OutputField(desc="文档摘要")
keywords = dspy.OutputField(desc="关键词列表")
字段描述的重要性 #
python
class Translate(dspy.Signature):
"""翻译文本"""
text = dspy.InputField(desc="需要翻译的文本")
source_lang = dspy.InputField(desc="源语言,如 '中文'")
target_lang = dspy.InputField(desc="目标语言,如 '英文'")
translation = dspy.OutputField(desc="翻译结果,保持原文风格和语气")
内联签名 #
python
# 使用字符串定义简单签名
signature = "question -> answer"
predictor = dspy.Predict(signature)
# 带描述的内联签名
signature = "question: str -> answer: str (简洁准确的回答)"
模块(Module) #
模块是签名的具体实现,封装了处理逻辑。
Predict 模块 #
最基础的预测模块:
python
import dspy
class QA(dspy.Signature):
"""回答问题"""
question = dspy.InputField()
answer = dspy.OutputField()
qa = dspy.Predict(QA)
result = qa(question="什么是机器学习?")
print(result.answer)
ChainOfThought 模块 #
带思维链的预测模块:
python
import dspy
class MathProblem(dspy.Signature):
"""解决数学问题"""
problem = dspy.InputField()
answer = dspy.OutputField()
solver = dspy.ChainOfThought(MathProblem)
result = solver(problem="如果 x + 5 = 12,那么 x 是多少?")
print(result.answer)
print(result.rationale)
ReAct 模块 #
推理-行动模块,支持工具调用:
python
import dspy
class SearchQA(dspy.Signature):
"""搜索并回答问题"""
question = dspy.InputField()
answer = dspy.OutputField()
def search_tool(query):
return f"搜索结果: {query}"
react = dspy.ReAct(SearchQA, tools=[search_tool])
result = react(question="Python 的创始人是谁?")
自定义模块 #
python
import dspy
class RAG(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()
self.retrieve = dspy.Retrieve(k=num_passages)
self.generate = dspy.ChainOfThought(GenerateAnswer)
def forward(self, question):
context = self.retrieve(question).passages
return self.generate(context=context, question=question)
class GenerateAnswer(dspy.Signature):
"""根据上下文回答问题"""
context = dspy.InputField(desc="相关上下文")
question = dspy.InputField(desc="用户问题")
answer = dspy.OutputField(desc="基于上下文的回答")
第一个 DSPy 程序 #
简单问答程序 #
python
import dspy
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
class QA(dspy.Signature):
"""回答用户问题"""
question = dspy.InputField()
answer = dspy.OutputField()
qa = dspy.Predict(QA)
result = qa(question="Python 的创始人是谁?")
print(result.answer)
带思维链的问答 #
python
import dspy
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
class ReasoningQA(dspy.Signature):
"""分析并回答问题"""
question = dspy.InputField()
reasoning = dspy.OutputField(desc="思考过程")
answer = dspy.OutputField(desc="最终答案")
qa = dspy.ChainOfThought(ReasoningQA)
result = qa(question="为什么天空是蓝色的?")
print(f"推理: {result.reasoning}")
print(f"答案: {result.answer}")
多步骤流水线 #
python
import dspy
lm = dspy.LM('openai/gpt-4o-mini')
dspy.configure(lm=lm)
class Analyze(dspy.Signature):
"""分析文本情感"""
text = dspy.InputField()
sentiment = dspy.OutputField(desc="情感:正面/负面/中性")
class Summarize(dspy.Signature):
"""总结文本"""
text = dspy.InputField()
summary = dspy.OutputField(desc="简短摘要")
class TextPipeline(dspy.Module):
def __init__(self):
super().__init__()
self.analyze = dspy.Predict(Analyze)
self.summarize = dspy.ChainOfThought(Summarize)
def forward(self, text):
sentiment = self.analyze(text=text).sentiment
summary = self.summarize(text=text).summary
return dspy.Prediction(sentiment=sentiment, summary=summary)
pipeline = TextPipeline()
result = pipeline(text="今天天气真好,阳光明媚,心情很愉快!")
print(f"情感: {result.sentiment}")
print(f"摘要: {result.summary}")
检索器配置 #
DSPy 内置了检索器支持,可以轻松构建 RAG 应用。
ColBERTv2 检索器 #
python
import dspy
rm = dspy.ColBERTv2(url='http://localhost:8893/api/search')
dspy.configure(rm=rm)
retrieve = dspy.Retrieve(k=3)
results = retrieve("什么是机器学习?")
print(results.passages)
自定义检索器 #
python
import dspy
class CustomRetriever(dspy.Retrieve):
def __init__(self, k=3):
super().__init__(k=k)
def forward(self, query):
results = my_search_function(query, k=self.k)
return dspy.Prediction(passages=results)
dspy.configure(rm=CustomRetriever(k=5))
向量数据库集成 #
python
import dspy
from dspy.retrieve import ChromideRM
rm = ChromideRM(
collection_name="my_docs",
persist_directory="./chroma_db",
embedding_function=my_embedding_func
)
dspy.configure(rm=rm)
示例(Example) #
DSPy 使用 Example 类来表示训练数据。
创建示例 #
python
from dspy import Example
qa_example = Example(
question="Python 的创始人是谁?",
answer="Python 的创始人是 Guido van Rossum"
)
print(qa_example.question)
print(qa_example.answer)
示例与输入字段 #
python
# 指定输入字段
qa_example = Example(
question="Python 的创始人是谁?",
answer="Python 的创始人是 Guido van Rossum"
).with_inputs("question")
# 只有 question 是输入,answer 是标签
创建训练集 #
python
trainset = [
Example(question="Python 的创始人是谁?", answer="Guido van Rossum").with_inputs("question"),
Example(question="JavaScript 的创始人是谁?", answer="Brendan Eich").with_inputs("question"),
Example(question="Linux 的创始人是谁?", answer="Linus Torvalds").with_inputs("question"),
]
评估指标(Metric) #
评估指标用于衡量模型输出的质量。
定义评估指标 #
python
def validate_answer(example, pred, trace=None):
return example.answer.lower() == pred.answer.lower()
def semantic_similarity(example, pred, trace=None):
return compute_similarity(example.answer, pred.answer)
使用评估器 #
python
from dspy.evaluate import Evaluate
evaluator = Evaluate(
devset=testset,
metric=validate_answer,
num_threads=4,
display_progress=True
)
score = evaluator(my_program)
print(f"准确率: {score}")
调试与日志 #
查看调用历史 #
python
import dspy
lm = dspy.LM('openai/gpt-4o-mini', cache=False)
dspy.configure(lm=lm)
qa = dspy.Predict("question -> answer")
result = qa(question="测试问题")
lm.inspect_history(n=1)
启用详细日志 #
python
import dspy
dspy.settings.configure(trace=True)
qa = dspy.Predict("question -> answer")
result = qa(question="测试问题")
dspy.inspect_trace()
缓存控制 #
python
import dspy
lm = dspy.LM('openai/gpt-4o-mini', cache=True)
dspy.configure(lm=lm)
qa = dspy.Predict("question -> answer")
result = qa(question="测试问题")
dspy.clear_cache()
最佳实践 #
1. 签名设计 #
python
class GoodSignature(dspy.Signature):
"""清晰的文档字符串,描述签名用途"""
input = dspy.InputField(desc="详细的输入描述")
output = dspy.OutputField(desc="详细的输出描述,包括格式要求")
2. 模块组织 #
python
class WellOrganizedModule(dspy.Module):
def __init__(self):
super().__init__()
self.step1 = dspy.Predict(Step1Signature)
self.step2 = dspy.ChainOfThought(Step2Signature)
self.step3 = dspy.Predict(Step3Signature)
def forward(self, input_data):
result1 = self.step1(input=input_data)
result2 = self.step2(input=result1.output)
result3 = self.step3(input=result2.output)
return result3
3. 错误处理 #
python
class RobustModule(dspy.Module):
def forward(self, question):
try:
result = self.predict(question=question)
return result
except Exception as e:
return dspy.Prediction(answer="抱歉,处理出错", error=str(e))
下一步 #
现在你已经掌握了 DSPy 的基础概念,接下来学习 签名详解,深入了解签名的各种用法!
最后更新:2026-03-30