DSPy优化提示词
1 简单介绍
DSPy(Declarative Self-improving Language Programs)是一个用于构建和优化基于大语言模型(LLM)应用的编程框架。它的核心目标是将提示工程(prompt engineering)、微调(fine-tuning)和推理流程(reasoning pipelines)从手工、经验驱动的方式转变为可声明、可组合、可自动优化的程序化方法。核心组件是签名(Signatures)、模块(Modules)、优化器(Optimization )和评估(Evaluation )。
1.1 签名(Signatures)
签名(Signature)是 DSPy 模块输入/输出行为的声明式规范。可用于指导大语言模型(LM)需要完成什么任务,而不是具体规定应该如何向模型提问来实现该任务。
在 DSPy 中,签名(Signature) 可以用简短的字符串形式定义,其中包含输入和输出的参数名称,以及可选的类型注解,用于明确各字段的语义角色。
基础签名:
- 问答(Question Answering) :
"question -> answer",等价于"question: str -> answer: str",默认类型始终为str。 - 情感分类(Sentiment Classification) :
"sentence -> sentiment: bool",例如,若句子情感为正面,则输出True。 - 文本摘要(Summarization) :
"document -> summary"
多字段输入/输出(支持类型注解):
- 检索增强问答(Retrieval-Augmented Question Answering) :
"context: list[str], question: str -> answer: str",表示模型接收一个字符串列表(如检索到的上下文段落)和一个问题,输出答案。 - 带推理的多选题问答(Multiple-Choice QA with Reasoning) :
"question, choices: list[str] -> reasoning: str, selection: int",模型需先生成推理过程(reasoning),再返回所选选项的索引(selection,从 0 开始)。
1.2 模块(Modules)
- dspy.Predict:基础预测器。不修改签名本身,负责处理学习的核心形式(例如:存储指令、示例以及对语言模型的更新),是最基础的形式。
- dspy.ChainOfThought:引导语言模型在给出最终响应前,先进行逐步推理(即"思维链"),强调分步推理。
- dspy.ProgramOfThought:引导语言模型生成代码,通过执行该代码的结果来决定最终响应,用可执行代码代替自然语言推理。
- dspy.ReAct:一种具备工具调用能力的智能体(agent),可利用外部工具来实现指定的签名功能,支持调用外部工具,适合需要与环境交互的任务。
- dspy.MultiChainComparison:可运行多个 ChainOfThought 推理路径,并对它们的输出进行比较,从而生成最终预测,通过多路径推理+比较提升结果质量。
1.3 优化器(Optimization )
可以用DSPy优化器来调整程序中的提示或权重.
(1)自动少样本学习( Automatic Few-Shot Learning)
该优化器通过先将自动生成和优化后的示例包含在提示中,再发送给模型,从而扩展了提示的签名,实现了少样本学习(few-shot learning)。少样本学习包括:LabeledFewShot、BootstrapFewShot、BootstrapFewShotWithRandomSearch、KNNFewShot。
LabeledFewShot:直接从标注数据中随机选取固定数量的示例作为少样本提示;
BootstrapFewShot:利用教师模型在训练集上生成并验证示例,只保留正确的演示构建提示。
BootstrapFewShotWithRandomSearch:多次运行 BootstrapFewShot 并结合随机搜索,从中选出性能最优的提示配置。
KNNFewShot:对每个输入,基于相似度从训练集中检索最相关的示例用于构建动态少样本提示。
(2)自动指令优化(Automatic Instruction Optimization)
该优化器专注于自动优化提示中的指令(instructions),通过迭代生成、评估和改进提示内容,利用训练集、模型反馈或贝叶斯搜索等策略,提升 DSPy 程序在目标任务上的性能。
COPRO:通过坐标上升法(基于指标和训练集)迭代生成并优化每一步的提示指令,逐步提升效果。
MIPROv2:结合数据与示例信息,使用贝叶斯优化联合搜索最优的指令和少样本示例组合。
SIMBA:通过小批量采样识别高不确定性样本,引导大模型自我分析失败原因并生成改进规则或补充成功示例。
GEPA:让大模型反思程序执行轨迹,总结成败经验以提出针对性提示改进建议,并可融入领域文本反馈加速优化。
(3)自动微调(Automatic Finetuning)
该优化器用于微调底层大模型。
BootstrapFinetune:将一个基于提示(prompt-based)的 DSPy 程序实现权重更新。输出是一个具有相同步骤的 DSPy 程序,但其中每个步骤均由微调后的模型执行,而非通过提示语言模型来完成。
(4)程序变换(Program Transformations)
Ensemble:将一组 DSPy 程序进行集成,并可选择使用全部程序,或从中随机采样一个子集,组合成单个程序。
参考地址
# 官网地址
https://dspy.ai/
# Github地址
https://github.com/stanfordnlp/dspy
2 简单使用
2.1 结构化输出
代码
python
from typing import List
import dspy
from dspy import Signature, InputField, OutputField
class KeywordInfo(Signature):
# 1 输入的内容
text: str = InputField()
# 2 输出的内容
keywords: List[str] = OutputField(desc="关键词列表")
entities: list[dict[str, str]] = OutputField(desc="实体信息列表")
def extract_tech():
llm = dspy.LM(
# 注意:openai是固定的协议,llm-v1是vLLM创建的模型名称
model="openai/llm-v1",
api_base="http://192.168.0.106:8000/v1",
api_key="Empty"
)
# 配置大模型
dspy.configure(lm=llm)
# 模型预测
module = dspy.Predict(KeywordInfo)
# 模型内容
print(module)
# 执行返回值
response = module(text="河南大学创立于1912年,始名河南留学欧美预备学校,首任校长为林伯襄先生,校园选建于河南贡院 旧址之上。后历经中州大学 、 国立开封中山大学 ( 又称国立第五中山大学 )、省立河南大学 等阶段 ,1942年升格为国立河南大学 。 1952年院系调整 ,部分院系或独立建校或并入兄弟高校,校本部更名为河南师范学院 。后又经开封师范学院 、河南师范大学 等阶段,1984年恢复河南大学 校名。 2008年10月,学校进入省部共建高校行列。2017年9月,学校入选首批国家"双一流"建设高校。2022年2月,学校再次入选国家"双一流"建设高校。 113年来,学校恪守"明德新民,止于至善"的校训,形成"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神,培养70多万名各类人才,为教育振兴、科技创新、文化传承、社会进步和人类文明作出突出贡献。")
print(response)
if __name__ == '__main__':
extract_tech()
输出
Predict(KeywordInfo(text -> keywords, entities
instructions='Given the fields `text`, produce the fields `keywords`, `entities`.'
text = Field(annotation=str required=True json_schema_extra={'__dspy_field_type': 'input', 'prefix': 'Text:', 'desc': '${text}'})
keywords = Field(annotation=List[str] required=True json_schema_extra={'desc': '关键词列表', '__dspy_field_type': 'output', 'prefix': 'Keywords:'})
entities = Field(annotation=list[dict[str, str]] required=True json_schema_extra={'desc': '实体信息列表', '__dspy_field_type': 'output', 'prefix': 'Entities:'})
))
Prediction(
keywords=['河南大学', '1912年', '河南留学欧美预备学校', '林伯襄', '河南贡院', '中州大学', '国立开封中山大学', '国立第五中山大学', '省立河南大学', '国立河南大学', '1952年院系调整', '河南师范学院', '开封师范学院', '河南师范大学', '1984年', '省部共建高校', '双一流建设高校', '明德新民', '止于至善', '团结勤奋严谨朴实', '百折不挠自强不息', '70多万人才'],
entities=[{'name': '河南大学', 'type': 'institution'}, {'name': '河南留学欧美预备学校', 'type': 'institution'}, {'name': '林伯襄', 'type': 'person'}, {'name': '河南贡院', 'type': 'location'}, {'name': '中州大学', 'type': 'institution'}, {'name': '国立开封中山大学', 'type': 'institution'}, {'name': '国立第五中山大学', 'type': 'institution'}, {'name': '省立河南大学', 'type': 'institution'}, {'name': '国立河南大学', 'type': 'institution'}, {'name': '河南师范学院', 'type': 'institution'}, {'name': '开封师范学院', 'type': 'institution'}, {'name': '河南师范大学', 'type': 'institution'}, {'name': '1912年', 'type': 'date'}, {'name': '1942年', 'type': 'date'}, {'name': '1952年', 'type': 'date'}, {'name': '1984年', 'type': 'date'}, {'name': '2008年10月', 'type': 'date'}, {'name': '2017年9月', 'type': 'date'}, {'name': '2022年2月', 'type': 'date'}, {'name': '明德新民', 'type': 'phrase'}, {'name': '止于至善', 'type': 'phrase'}, {'name': '团结勤奋严谨朴实', 'type': 'phrase'}, {'name': '百折不挠自强不息', 'type': 'phrase'}, {'name': '70多万人才', 'type': 'statistic'}]
)
2.2 思维链
代码
python
import dspy
def response_answer():
llm = dspy.LM(
model="openai/llm-v1",
api_base="http://192.168.0.106:8000/v1",
api_key="Empty"
)
# 配置大模型
dspy.configure(lm=llm)
# 构建模型
module = dspy.ChainOfThought("context, question -> response")
# 模型内容
print(module)
# 执行返回值
text = "河南大学创立于1912年,始名河南留学欧美预备学校,首任校长为林伯襄先生,校园选建于河南贡院 旧址之上。后历经中州大学 、 国立开封中山大学 ( 又称国立第五中山大学 )、省立河南大学 等阶段 ,1942年升格为国立河南大学 。 1952年院系调整 ,部分院系或独立建校或并入兄弟高校,校本部更名为河南师范学院 。后又经开封师范学院 、河南师范大学 等阶段,1984年恢复河南大学 校名。 2008年10月,学校进入省部共建高校行列。2017年9月,学校入选首批国家"双一流"建设高校。2022年2月,学校再次入选国家"双一流"建设高校。 113年来,学校恪守"明德新民,止于至善"的校训,形成"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神,培养70多万名各类人才,为教育振兴、科技创新、文化传承、社会进步和人类文明作出突出贡献。"
response = module(context=text, question="首先梳理河南大学的发展历史,然后分段简单介绍河南大学")
# 打印返回内容
print(response)
print(llm.history[0])
if __name__ == '__main__':
response_answer()
输出
predict = Predict(StringSignature(context, question -> reasoning, response
instructions='Given the fields `context`, `question`, produce the fields `response`.'
context = Field(annotation=str required=True json_schema_extra={'__dspy_field_type': 'input', 'prefix': 'Context:', 'desc': '${context}'})
question = Field(annotation=str required=True json_schema_extra={'__dspy_field_type': 'input', 'prefix': 'Question:', 'desc': '${question}'})
reasoning = Field(annotation=str required=True json_schema_extra={'prefix': "Reasoning: Let's think step by step in order to", 'desc': '${reasoning}', '__dspy_field_type': 'output'})
response = Field(annotation=str required=True json_schema_extra={'__dspy_field_type': 'output', 'prefix': 'Response:', 'desc': '${response}'})
))
Prediction(
reasoning='根据提供的背景信息,首先需要梳理河南大学的发展脉络,从其创立到现代发展,按时间顺序进行清晰划分。河南大学起源于1912年,最初名为河南留学欧美预备学校,之后历经多个阶段,包括中州大学、国立开封中山大学、省立河南大学,1942年升格为国立河南大学。1952年院系调整后,校本部更名为河南师范学院,随后经历开封师范学院、河南师范大学等阶段,1984年恢复"河南大学"校名。2008年进入省部共建高校行列,2017年和2022年两次入选国家"双一流"建设高校。在这一过程中,学校始终秉持"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和"百折不挠、自强不息"的大学精神,培养了大量人才,为社会进步和文化传承作出贡献。随后,将这些发展历史按阶段进行分段介绍,使内容条理清晰、易于理解。',
response='河南大学的发展历史可大致分为以下几个阶段:\n\n1. **创立与早期发展(1912年--1942年)** \n 河南大学创立于1912年,始名为"河南留学欧美预备学校",首任校长为林伯襄先生。学校选址于河南贡院旧址,旨在培养赴欧美留学的人才。此后,学校历经中州大学、国立开封中山大学(又称国立第五中山大学)、省立河南大学等阶段,1942年正式升格为"国立河南大学",标志着其在高等教育中的地位提升。\n\n2. **院系调整与转型(1952年--1984年)** \n 1952年,全国范围内开展院系调整,河南大学的部分院系被独立建校或并入其他高校,校本部因此更名为"河南师范学院"。此后,学校经历了"开封师范学院""河南师范大学"等发展阶段,办学重点逐步转向师范教育。\n\n3. **恢复校名与现代发展(1984年至今)** \n 1984年,学校正式恢复"河南大学"校名,重新确立其综合性大学的定位。2008年10月,学校进入省部共建高校行列,办学层次和综合实力显著提升。2017年9月,学校入选首批国家"双一流"建设高校,2022年2月再次入选"双一流"建设高校,标志着其在国家高等教育体系中的重要地位。\n\n4. **精神与人才培养** \n 113年来,河南大学始终恪守"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神。学校累计培养了70多万名各类人才,为教育振兴、科技创新、文化传承和社会进步作出了突出贡献。'
)
{'prompt': None, 'messages': [{'role': 'system', 'content': 'Your input fields are:\n1. `context` (str): \n2. `question` (str):\nYour output fields are:\n1. `reasoning` (str): \n2. `response` (str):\nAll interactions will be structured in the following way, with the appropriate values filled in.\n\n[[ ## context ## ]]\n{context}\n\n[[ ## question ## ]]\n{question}\n\n[[ ## reasoning ## ]]\n{reasoning}\n\n[[ ## response ## ]]\n{response}\n\n[[ ## completed ## ]]\nIn adhering to this structure, your objective is: \n Given the fields `context`, `question`, produce the fields `response`.'}, {'role': 'user', 'content': '[[ ## context ## ]]\n河南大学创立于1912年,始名河南留学欧美预备学校,首任校长为林伯襄先生,校园选建于河南贡院 旧址之上。后历经中州大学 、 国立开封中山大学 ( 又称国立第五中山大学 )、省立河南大学 等阶段 ,1942年升格为国立河南大学 。 1952年院系调整 ,部分院系或独立建校或并入兄弟高校,校本部更名为河南师范学院 。后又经开封师范学院 、河南师范大学 等阶段,1984年恢复河南大学 校名。 2008年10月,学校进入省部共建高校行列。2017年9月,学校入选首批国家"双一流"建设高校。2022年2月,学校再次入选国家"双一流"建设高校。 113年来,学校恪守"明德新民,止于至善"的校训,形成"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神,培养70多万名各类人才,为教育振兴、科技创新、文化传承、社会进步和人类文明作出突出贡献。\n\n[[ ## question ## ]]\n首先梳理河南大学的发展历史,然后分段简单介绍河南大学\n\nRespond with the corresponding output fields, starting with the field `[[ ## reasoning ## ]]`, then `[[ ## response ## ]]`, and then ending with the marker for `[[ ## completed ## ]]`.'}], 'kwargs': {}, 'response': ModelResponse(id='chatcmpl-aea5ab4ca72f448c928520461f661dc9', created=1769262917, model='llm-v1', object='chat.completion', system_fingerprint=None, choices=[Choices(finish_reason='stop', index=0, message=Message(content='[[ ## reasoning ## ]]\n根据提供的背景信息,首先需要梳理河南大学的发展脉络,从其创立到现代发展,按时间顺序进行清晰划分。河南大学起源于1912年,最初名为河南留学欧美预备学校,之后历经多个阶段,包括中州大学、国立开封中山大学、省立河南大学,1942年升格为国立河南大学。1952年院系调整后,校本部更名为河南师范学院,随后经历开封师范学院、河南师范大学等阶段,1984年恢复"河南大学"校名。2008年进入省部共建高校行列,2017年和2022年两次入选国家"双一流"建设高校。在这一过程中,学校始终秉持"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和"百折不挠、自强不息"的大学精神,培养了大量人才,为社会进步和文化传承作出贡献。随后,将这些发展历史按阶段进行分段介绍,使内容条理清晰、易于理解。\n\n[[ ## response ## ]]\n河南大学的发展历史可大致分为以下几个阶段:\n\n1. **创立与早期发展(1912年--1942年)** \n 河南大学创立于1912年,始名为"河南留学欧美预备学校",首任校长为林伯襄先生。学校选址于河南贡院旧址,旨在培养赴欧美留学的人才。此后,学校历经中州大学、国立开封中山大学(又称国立第五中山大学)、省立河南大学等阶段,1942年正式升格为"国立河南大学",标志着其在高等教育中的地位提升。\n\n2. **院系调整与转型(1952年--1984年)** \n 1952年,全国范围内开展院系调整,河南大学的部分院系被独立建校或并入其他高校,校本部因此更名为"河南师范学院"。此后,学校经历了"开封师范学院""河南师范大学"等发展阶段,办学重点逐步转向师范教育。\n\n3. **恢复校名与现代发展(1984年至今)** \n 1984年,学校正式恢复"河南大学"校名,重新确立其综合性大学的定位。2008年10月,学校进入省部共建高校行列,办学层次和综合实力显著提升。2017年9月,学校入选首批国家"双一流"建设高校,2022年2月再次入选"双一流"建设高校,标志着其在国家高等教育体系中的重要地位。\n\n4. **精神与人才培养** \n 113年来,河南大学始终恪守"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神。学校累计培养了70多万名各类人才,为教育振兴、科技创新、文化传承和社会进步作出了突出贡献。\n\n[[ ## completed ## ]]', role='assistant', tool_calls=None, function_call=None, provider_specific_fields={'refusal': None}), provider_specific_fields={'stop_reason': None, 'token_ids': None})], usage=Usage(completion_tokens=670, prompt_tokens=481, total_tokens=1151, completion_tokens_details=None, prompt_tokens_details=None), service_tier=None, prompt_logprobs=None, prompt_token_ids=None, kv_transfer_params=None), 'outputs': ['[[ ## reasoning ## ]]\n根据提供的背景信息,首先需要梳理河南大学的发展脉络,从其创立到现代发展,按时间顺序进行清晰划分。河南大学起源于1912年,最初名为河南留学欧美预备学校,之后历经多个阶段,包括中州大学、国立开封中山大学、省立河南大学,1942年升格为国立河南大学。1952年院系调整后,校本部更名为河南师范学院,随后经历开封师范学院、河南师范大学等阶段,1984年恢复"河南大学"校名。2008年进入省部共建高校行列,2017年和2022年两次入选国家"双一流"建设高校。在这一过程中,学校始终秉持"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和"百折不挠、自强不息"的大学精神,培养了大量人才,为社会进步和文化传承作出贡献。随后,将这些发展历史按阶段进行分段介绍,使内容条理清晰、易于理解。\n\n[[ ## response ## ]]\n河南大学的发展历史可大致分为以下几个阶段:\n\n1. **创立与早期发展(1912年--1942年)** \n 河南大学创立于1912年,始名为"河南留学欧美预备学校",首任校长为林伯襄先生。学校选址于河南贡院旧址,旨在培养赴欧美留学的人才。此后,学校历经中州大学、国立开封中山大学(又称国立第五中山大学)、省立河南大学等阶段,1942年正式升格为"国立河南大学",标志着其在高等教育中的地位提升。\n\n2. **院系调整与转型(1952年--1984年)** \n 1952年,全国范围内开展院系调整,河南大学的部分院系被独立建校或并入其他高校,校本部因此更名为"河南师范学院"。此后,学校经历了"开封师范学院""河南师范大学"等发展阶段,办学重点逐步转向师范教育。\n\n3. **恢复校名与现代发展(1984年至今)** \n 1984年,学校正式恢复"河南大学"校名,重新确立其综合性大学的定位。2008年10月,学校进入省部共建高校行列,办学层次和综合实力显著提升。2017年9月,学校入选首批国家"双一流"建设高校,2022年2月再次入选"双一流"建设高校,标志着其在国家高等教育体系中的重要地位。\n\n4. **精神与人才培养** \n 113年来,河南大学始终恪守"明德新民,止于至善"的校训,形成了"团结、勤奋、严谨、朴实"的校风和以"百折不挠、自强不息"为核心的大学精神。学校累计培养了70多万名各类人才,为教育振兴、科技创新、文化传承和社会进步作出了突出贡献。\n\n[[ ## completed ## ]]'], 'usage': {'completion_tokens': 670, 'prompt_tokens': 481, 'total_tokens': 1151, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'cost': None, 'timestamp': '2026-01-24T21:55:29.805593', 'uuid': 'b2518834-7ea8-4c38-9638-383786c37c18', 'model': 'openai/llm-v1', 'response_model': 'llm-v1', 'model_type': 'chat'}