如何用DSPy优化RAG prompt示例

探索DSPy的复合示例应用,包括问答、情感分类、RAG系统等。

https://blog.csdn.net/liliang199/article/details/155860692

这里通过DSPy优化RAG prompt,示例DSPy优化prompt过程。

1 定义RAG系统

1.1 定义LLM

首先是LLM模型设置,这里配置LLM模型ollama/gemma3n:e2b,示例代码如下。

import dspy # 1. 配置语言模型 (这里以OpenAI为例,需提前设置API密钥) lm = dspy.LM(model="ollama/gemma3n:e2b", api_base="http://localhost:11434") dspy.configure(lm=lm)

1.2 定义检索器

然后是定义检索器,这里构建模拟知识库,通过计算查询词在文档中出现的次数在匹配相关文档。

实际项目中,应该用真实向量数据库替代这里的基于频次的retriever文档匹配逻辑。

示例代码如下所示。

import dspy import json # ===== 2. 构建模拟知识库(实际项目中替换为真实向量数据库) ===== class SimpleRetriever: """一个简单的内存检索器,模拟向量数据库功能""" def __init__(self, documents): # documents格式: [{"text": "...", "id": 1}, ...] self.documents = documents def retrieve(self, query, k=3): """简单关键词匹配检索(实际应用应使用向量检索)""" query_lower = query.lower() scored_docs = [] for doc in self.documents: text = doc["text"].lower() # 简单评分:计算查询词在文档中出现的次数 score = sum(1 for word in query_lower.split()[0] if word in text) if score > 0: scored_docs.append((score, doc["text"])) # 按分数排序并返回前k个 scored_docs.sort(reverse=True, key=lambda x: x[0]) return [text for _, text in scored_docs[:k]] # 创建示例知识库(你的实际文档数据) knowledge_base = [ {"id": 1, "text": "爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。"}, {"id": 2, "text": "光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。这一发现对量子力学的发展至关重要。"}, {"id": 3, "text": "阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。"}, {"id": 4, "text": "诺贝尔物理学奖是根据阿尔弗雷德·诺贝尔的遗嘱设立的,旨在表彰在物理学领域做出杰出贡献的科学家。"}, {"id": 5, "text": "1921年的诺贝尔物理学奖颁奖典礼于1922年举行,因为1921年没有候选人被认为符合获奖标准。"}, ] # 初始化检索器 retriever = SimpleRetriever(knowledge_base) question = "什么是光电效应?" num_passages = 3 contexts = retriever.retrieve(question, k=num_passages) print(contexts)

输出测试示例如下

['爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。', '光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。这一发现对量子力学的发展至关重要。', '阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。']

1.3 定义RAG系统

首先,通过DSPy签名定义RAG系统的输入输出。

即RAG系统输入: 问题上下文,问题本身;RAG的输出: 基于上下文给出简洁准确的答案。

其次,结合DSPy签名定义RAG模块,比如:

在检索阶段,如何获取相关文档

在生成阶段,基于检索到的上下文生成答案。

最后,返回答案,包括context上下文,answer答案,原因reasoning。

示例代码如下所示。

# ===== 3. 定义DSPy签名 ===== class GenerateAnswer(dspy.Signature): """基于给定上下文回答问题。""" context = dspy.InputField(desc="相关背景信息") question = dspy.InputField() answer = dspy.OutputField(desc="简洁、准确的答案,基于上下文") # ===== 4. 构建RAG模块 ===== class RAG(dspy.Module): def __init__(self, retriever, num_passages=3): super().__init__() self.retriever = retriever self.num_passages = num_passages # 使用ChainOfThought让模型先推理再回答 self.generate_answer = dspy.ChainOfThought(GenerateAnswer) def forward(self, question): # 1. 检索阶段:获取相关文档 contexts = self.retriever.retrieve(question, k=self.num_passages) context_str = "\n---\n".join(contexts) # 2. 生成阶段:基于检索到的上下文生成答案 prediction = self.generate_answer( context=context_str, question=question ) # 返回完整结果 return dspy.Prediction( contexts=contexts, answer=prediction.answer, reasoning=prediction.reasoning # ChainOfThought提供的推理过程 ) # ===== 5. 初始化RAG系统 ===== rag_system = RAG(retriever, num_passages=2) user_question = "爱因斯坦在哪年获得诺贝尔奖?" result = rag_system(user_question) print(result)

示例输出如下所示

Prediction(
contexts=['爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。', '1921年的诺贝尔物理学奖颁奖典礼于1922年举行,因为1921年没有候选人被认为符合获奖标准。'],
answer='1921',
reasoning='根据上下文,爱因斯坦在1921年获得诺贝尔物理学奖。上下文还提到1921年没有候选人被认为符合获奖标准,但奖颁奖典礼在1922年举行。'
)

2 RAG优化对比

2.1 DSPy优化前RAG

这里运行优化钱的RAG系统。

# ===== 6. 测试RAG系统 ===== def test_rag_system(): """测试RAG系统的示例问题""" test_questions = [ "爱因斯坦因什么获得诺贝尔奖?", "什么是光电效应?", "谁创立了相对论?" ] for question in test_questions: print(f"\n{'='*60}") print(f"问题: {question}") print(f"{'='*60}") # 获取答案 result = rag_system(question) # 打印检索到的上下文 print("检索到的上下文:") for i, ctx in enumerate(result.contexts, 1): print(f"{i}. {ctx[:100]}...") # 只显示前100字符 # 打印推理过程(如果有) if hasattr(result, 'reasoning') and result.reasoning: print(f"\n模型推理: {result.reasoning}") # 打印最终答案 print(f"\n最终答案: {result.answer}") print("RAG问答系统启动...") # 测试基础版本 test_rag_system()

输出如下所示

RAG问答系统启动...

============================================================
问题: 爱因斯坦因什么获得诺贝尔奖?
============================================================
检索到的上下文:
1. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...
2. 1921年的诺贝尔物理学奖颁奖典礼于1922年举行,因为1921年没有候选人被认为符合获奖标准。...

模型推理: The context states that Einstein received the Nobel Prize in Physics in 1921 for his contributions to theoretical physics, particularly for discovering the law of the photoelectric effect. The additional information mentions the award ceremony was held in 1922 because no candidate was deemed suitable for the award in 1921.

最终答案: Einstein won the Nobel Prize in Physics for discovering the law of the photoelectric effect.

============================================================
问题: 什么是光电效应?
============================================================
检索到的上下文:
1. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...
2. 光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。这一发现对量子力学的发展至关重要。...

模型推理: 光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。

最终答案: 光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。

============================================================
问题: 谁创立了相对论?
============================================================
检索到的上下文:
1. 阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。...
2. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...

模型推理: The context states that Albert Einstein was the founder of the theory of relativity.

最终答案: Albert Einstein

2.2 DSPy优化后RAG

这里通过BootstrapFewShot优化RAG系统的提示。

即通过准备少量训练例字和评估自理,优化RA个系统的提示词。

训练示例如下

# 准备训练示例
trainset = [
dspy.Example(
question="爱因斯坦的诺贝尔奖贡献是什么?",
contexts=[
"爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。",
"光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。"
],
answer="发现光电效应定律"
).with_inputs('question'),

dspy.Example(
question="谁创立了相对论?",
contexts=[
"阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人。",
"爱因斯坦是相对论的创始人,也是量子力学的重要奠基人之一。"
],
answer="阿尔伯特·爱因斯坦"
).with_inputs('question'),
]

测试示例如下

# 定义评估指标
def validate_answer(example, prediction, trace=None):
# 简单验证:预测答案是否包含关键词
correct_keywords = {
"爱因斯坦的诺贝尔奖贡献是什么?": ["光电效应"],
"谁创立了相对论?": ["爱因斯坦"]
}

question = example.question
if question in correct_keywords:
return any(keyword in prediction.answer for keyword in correct_keywords[question])
return True

通过查看发现,训练和测试例,通过分析问题和问题上下文,倾向于输出阶段凝练的信息。

示例代码如下

# ===== 7. 优化RAG系统(可选:使用BootstrapFewShot) ===== def optimize_rag_system(): """使用少量示例优化RAG提示""" from dspy.teleprompt import BootstrapFewShot # 准备训练示例 trainset = [ dspy.Example( question="爱因斯坦的诺贝尔奖贡献是什么?", contexts=[ "爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。", "光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。" ], answer="发现光电效应定律" ).with_inputs('question'), dspy.Example( question="谁创立了相对论?", contexts=[ "阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人。", "爱因斯坦是相对论的创始人,也是量子力学的重要奠基人之一。" ], answer="阿尔伯特·爱因斯坦" ).with_inputs('question'), ] # 定义评估指标 def validate_answer(example, prediction, trace=None): # 简单验证:预测答案是否包含关键词 correct_keywords = { "爱因斯坦的诺贝尔奖贡献是什么?": ["光电效应"], "谁创立了相对论?": ["爱因斯坦"] } question = example.question if question in correct_keywords: return any(keyword in prediction.answer for keyword in correct_keywords[question]) return True # 创建优化器 teleprompter = BootstrapFewShot( metric=validate_answer, max_bootstrapped_demos=2, max_labeled_demos=2 ) # 优化RAG系统 print("正在优化RAG系统...") optimized_rag = teleprompter.compile(RAG(retriever), trainset=trainset) return optimized_rag user_question = "爱因斯坦在哪年获得诺贝尔奖?" opt_reg = optimize_rag_system() result = opt_reg(user_question) print(result)

输出示例如下

正在优化RAG系统...
100%|██████████| 2/2 [00:53<00:00, 26.74s/it]
Bootstrapped 2 full traces after 1 examples for up to 1 rounds, amounting to 2 attempts.
Prediction(
contexts=['爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。', '1921年的诺贝尔物理学奖颁奖典礼于1922年举行,因为1921年没有候选人被认为符合获奖标准。', '阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。'],
answer='1921',
reasoning='The question asks for the year Albert Einstein received the Nobel Prize, based on the provided context. The context states that Einstein received the Nobel Prize in 1921 for his contributions to theoretical physics, particularly for discovering the photoelectric effect law. It also mentions that the award ceremony was held in 1922 because no candidates met the criteria in 1921. Therefore, the Nobel Prize was awarded in 1921.'
)

2.3 DSPy优化后RAG测试

这里用优化后的RAG系统opt_rag,运行test_rag_system()的所有测试问题。

测试代码示例如下。

# ===== 6. 测试RAG系统 ===== def test_opt_rag_system(): """测试RAG系统的示例问题""" test_questions = [ "爱因斯坦因什么获得诺贝尔奖?", "什么是光电效应?", "谁创立了相对论?" ] for question in test_questions: print(f"\n{'='*60}") print(f"问题: {question}") print(f"{'='*60}") # 获取答案 result = opt_reg(question) # 打印检索到的上下文 print("检索到的上下文:") for i, ctx in enumerate(result.contexts, 1): print(f"{i}. {ctx[:100]}...") # 只显示前100字符 # 打印推理过程(如果有) if hasattr(result, 'reasoning') and result.reasoning: print(f"\n模型推理: {result.reasoning}") # 打印最终答案 print(f"\n最终答案: {result.answer}") print("opt RAG问答系统启动...") # 测试优化版本 test_opt_rag_system()

输出如下所示,

可见相比优化前的回答,优化后RAG系统的回答更集中和简短凝练。

opt RAG问答系统启动...

============================================================
问题: 爱因斯坦因什么获得诺贝尔奖?
============================================================
检索到的上下文:
1. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...
2. 1921年的诺贝尔物理学奖颁奖典礼于1922年举行,因为1921年没有候选人被认为符合获奖标准。...
3. 阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。...

模型推理: The question asks what Albert Einstein was awarded the Nobel Prize for, based on the provided context. The context explicitly states that he received the Nobel Prize in 1921 for his contributions to theoretical physics, particularly for discovering the law of the photoelectric effect.

最终答案: 光电效应定律

============================================================
问题: 什么是光电效应?
============================================================
检索到的上下文:
1. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...
2. 光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。这一发现对量子力学的发展至关重要。...
3. 阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。...

模型推理: The question asks for a definition of the photoelectric effect, based on the provided context. The context defines the photoelectric effect as the phenomenon where electrons are emitted from a metal surface when light shines on it. It also states that this discovery is crucial for the development of quantum mechanics.

最终答案: 当光照射到金属表面时,会从金属中发射出电子的现象。

============================================================
问题: 谁创立了相对论?
============================================================
检索到的上下文:
1. 阿尔伯特·爱因斯坦(1879-1955)是德裔理论物理学家,相对论的创始人,也是量子力学的重要奠基人之一。...
2. 爱因斯坦在1921年因对理论物理的贡献,特别是发现光电效应定律而获得诺贝尔物理学奖。...
3. 光电效应是指当光照射到金属表面时,会从金属中发射出电子的现象。这一发现对量子力学的发展至关重要。...

模型推理: The question asks who founded the theory of relativity. The context states that Albert Einstein is a theoretical physicist and the founder of the theory of relativity.

最终答案: 阿尔伯特·爱因斯坦

reference

---

如何用DSPy生成prompt示例

https://blog.csdn.net/liliang199/article/details/155860692

prompt自主生成框架 - DSPy

https://blog.csdn.net/liliang199/article/details/155614507

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249722.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年河南管城区代理记账公司权威推荐榜单:新密代理记账‌/郑东新区代理记账‌/巩义代理记账‌源头公司精选

随着河南省营商环境的持续优化与数字经济的高速发展,企业财税服务市场正经历深刻的智能化与规范化变革。行业数据显示,河南省中小企业对代理记账服务的需求近年来保持稳定增长。在这一背景下,选择一家具备专业资质、…

IDEA(2020版)sevlet+session实现购物车功能

IDEA(2020版)sevlet+session实现购物车功能查看全文:IDEA(2020版)sevlet+session实现购物车功能 – 每天进步一点点 【任务目标】 通过所学Session知识以及购物车的访问流程,以购买蛋糕为例,模拟实现购物车功能。 …

​降血脂降血压产品前十推荐,长期深受三高问题困扰遇新发现!个人真实分享

如果你身边也有人在为血压忽高忽低发愁、为体检报告上的胆固醇红字叹气、或是每天爬楼都会心慌气短,那么你一定能理解—— 心脑血管的事,从来不是“小事”。过去一年,我把注意力放在了十款热度极高的营养补充剂上,…

2025年储罐订做厂家权威推荐榜:贮罐厂商/化工储罐/不锈钢储罐源头厂家精选

在现代化工、能源、供热及众多工业生产流程中,储罐作为核心的存储与缓冲设备,其设计与制造质量直接关系到生产安全、物料品质、能源效率和环境合规。无论是储存腐蚀性化学品、高温导热油,还是作为采暖系统的关键部件…

element-ui的table跨行合并

效果图代码<template><el-container class="car-head"><el-header height="auto"><el-form :inline="true":model="formObj"@submit.native.preventlab…

2025 年 12 月红木家具/东方红木家居权威推荐榜:传承经典,匠心独运的品质之选!

2025 年 12 月红木家具/东方红木家居权威推荐榜:传承经典,匠心独运的品质之选! 随着人们对生活品质追求的不断提升,红木家具因其独特的文化内涵和精湛的工艺,越来越受到消费者的青睐。为了帮助筛选红木家居/红木家…

2025年佛山床垫品牌源头厂家精选推荐

在选择合适的硬底护脊床垫时,了解不同品牌和厂家提供的服务至关重要。本篇文章深入探讨了佛山地区多个知名床垫品牌,包括大森林电子商务有限公司和冬熊家居等。这些厂家不仅注重产品的质量,还提供灵活的定制服务,以…

2025年LED灯供应商综合推荐榜单:万圣节南瓜灯/酒吧氛围灯/酒吧装饰灯源头厂家精选

随着固态照明技术的成熟与普及,LED照明已成为全球主流照明方案。根据行业数据,LED灯具相较于传统照明产品,可实现50%至80% 的节能效果,其平均寿命可达25,000至50,000小时,远超白炽灯或荧光灯。在绿色制造与节能…

【2025最新】TranslucentTB下载安装及使用教程:任务栏透明神器全面解析(详细步骤 + 常见问题)

本文是 2025 年最新的 TranslucentTB下载安装及使用教程,涵盖任务栏透明、美化模式设置、开机自启配置、托盘菜单使用方法以及常见问题解决方案。提供了经过安全认证的最新版下载地址,并通过图文步骤讲解从安装到进阶…

2025年上海圆锯机企业年度排名:宏萌圆锯机的配件质量好

TOP1 推荐:上海宏萌机械设备有限公司 推荐指数:★★★★★ 口碑评分:长三角精密圆锯机企业 专业能力:上海宏萌机械设备有限公司扎根浙江缙云锯床之乡产业底蕴,融合上海创新资源,打造以精准耐用智联为核心的圆锯机…

2025年中国十大专业版权音乐企业推荐:服务不错的版权音乐公

本榜单依托全维度市场调研与真实行业口碑,深度筛选出十家标杆企业,为企业及创作者选型提供客观依据,助力精准匹配适配的版权音乐服务伙伴。 TOP1 推荐:猴子音悦(上海)网络科技有限公司 推荐指数:★★★★★ 口碑…

2025 年 12 月文创/非遗/艺术品推荐榜单:匠心独运的文化瑰宝与艺术精品深度解析

2025 年 12 月文创/非遗/艺术品推荐榜单:匠心独运的文化瑰宝与艺术精品深度解析 随着文化产业的蓬勃发展,文创、非遗和艺术品市场日益繁荣。为了帮助筛选出优质的品牌,特此发布权威推荐榜单,该榜单也已在行业协会官…

2025 年 12 月红木办公家具权威推荐榜单:精选红木办公桌/老板桌/大班台,办公椅,书桌椅,书房套装,文件柜品牌!

2025 年 12 月红木办公家具权威推荐榜单:精选红木办公桌/老板桌/大班台,办公椅,书桌椅,书房套装,文件柜品牌! 随着红木家具市场的不断发展,越来越多的企业和消费者开始关注红木办公家具。红木办公桌、红木老板桌…

必玩十大网上【小程序休闲游戏】单人易操作不占内存 摸鱼解压全靠它!

忙碌的日常中,谁不需要几款轻松上手、不占内存又能随时摸鱼解压的小游戏呢?今天为大家推荐十款单人易操作、打开即玩的小程序游戏,无需下载、不占空间,适合各种场景轻松休闲! 第一名:《新弹弹堂》 经典弹射竞技游…

聚宽策略想实盘?这个开源项目让你一行代码不改直接跑

聚宽策略想实盘?这个开源项目让你一行代码不改直接跑写了个量化策略,回测年化30%,然后呢?实盘的坑比你想象的多得多。故事的开始 两年前,我遇到了和很多聚宽用户一样的问题:策略回测效果不错,但实盘很麻烦。聚宽…

2025年泉州蹲便疏通打孔公司权威推荐榜单:疏通蹲便‌/蹲便器疏通‌/蹲便疏通口‌源头公司精选

在泉州地区,因长期使用、管道老化或杂物堵塞导致的蹲便器问题是家庭及商业场所中常见的生活难题。根据行业经验,超过80% 的卫生间堵塞问题发生在马桶和蹲便器部位。选择一家技术可靠、响应迅速的专业公司,是快速恢复…

十大爆款小程序休闲游戏:易上手不占空间,摸鱼解压打发时间好伙伴

在快节奏的现代生活中,利用碎片化时间玩上一把轻松有趣的小游戏成了许多人的解压选择。小程序游戏凭借其无需下载、不占空间、即开即玩的特点,迅速成为摸鱼、解压、打发时间的神器。今天,就为大家盘点十款热门的小程…

IDEA(2020版)实现JSP基本语法

IDEA(2020版)实现JSP基本语法查看全文:IDEA(2020版)实现JSP基本语法 – 每天进步一点点在JSP文件中可以嵌套很多内容,例如JSP的脚本元素和注释等,这些内容的编写都需要遵循一定的语法规范。本节将对JSP的基本语法进…

2025 年 12 月码垛机厂家权威推荐榜单:多样板材/倒板/分拣/上料/下料码垛机,全自动与半自动解决方案精选!

2025 年 12 月码垛机厂家权威推荐榜单:多样板材/倒板/分拣/上料/下料码垛机,全自动与半自动解决方案精选! 随着工业自动化技术的不断进步,码垛机在现代制造业中的应用越来越广泛。从多样板材码垛机到倒板码垛机、分…

2025年AI培训权威推荐榜:深度评测与趋势前瞻

引言 AI培训领域鱼龙混杂,课程质量参差不齐,企业如何精准筛选真正优质的培训机构成为一大难题。本榜单从技术实力、课程体系、师资团队、服务保障、实战案例等多维度严格筛选,为您推荐5家标杆机构,助力精准决策。 …