公司的logo图片,西安seo优化排名,荣县住房和城乡建设厅网站,采购公告 校园网站建设之前探索了使用DSPy的简单示例
https://blog.csdn.net/liliang199/article/details/155614507
这里进一步探索DSPy的符合应用#xff0c;包括问答、情感分类、RAG系统等。
所用示例参考和修改自网络资料。 1 DSPy基础应用 1.1 DSPy配置
首先是LLM模型设置#xff0c;这里…之前探索了使用DSPy的简单示例https://blog.csdn.net/liliang199/article/details/155614507这里进一步探索DSPy的符合应用包括问答、情感分类、RAG系统等。所用示例参考和修改自网络资料。1 DSPy基础应用1.1 DSPy配置首先是LLM模型设置这里配置LLM模型ollama/gemma3n:e2b示例代码如下。import dspy # 1. 配置语言模型 (这里以OpenAI为例需提前设置API密钥) lm dspy.LM(modelollama/gemma3n:e2b, api_basehttp://localhost:11434) dspy.configure(lmlm)另外还可以配置兼容openai接口的LLM模型过程参考如下链接。https://blog.csdn.net/liliang199/article/details/1556145071.2 DSPy测试这是一个最简流程展示了定义签名、选择模块、调用的核心步骤验证DSPy的有效性。# 2. 定义签名指定输入和输出 class BasicQA(dspy.Signature): 回答简短的事实性问题。 question: str dspy.InputField() answer: str dspy.OutputField(desc通常为1到5个词) # 3. 创建预测模块 qa_module dspy.Predict(BasicQA) # 4. 调用模块 result qa_module(question量子计算的创始人是谁) print(f答案: {result.answer})输出如下这里通过BasicQA限定输入、输出的约束。要求回答简单的事实性问题答案要求1到5个词。显然DSPy生成的回答简明扼要就Peter Shor2两个词遵循了BasicQA的要求。答案: Peter Shor2 DSPy深度应用这里考虑DSPy的进一步应用比如应用到情感分类、构建RAG系统、使用优化器提升性能。2.1 加入推理链 - 情感分类使用ChainOfThought模块让模型展示推理过程通常能得到更准确的结果。这里没有使用提示词而是通过SentimentSignature给定任务定义由DSPy生成提示词。相比直接使用提示词的方式在保持效果的前提下这种实现方式更简洁明了。import dspy from typing import Literal # 1. 定义更详细的签名 class SentimentSignature(dspy.Signature): 对文本进行情感分类。 sentence: str dspy.InputField(desc需要分类的文本) sentiment: Literal[positive, negative, neutral] dspy.OutputField(desc情感类别) # 2. 使用思维链模块 classifier dspy.ChainOfThought(SentimentSignature) # 3. 调用并查看推理过程 result classifier(sentence这部电影的视觉效果令人惊叹但剧情略显拖沓。) print(f情感: {result.sentiment}) print(f推理: {result.reasoning}) # ChainOfThought会额外提供推理字段输出如下所示这里通过SentimentSignature定义输入和输出需要分类的类别。然后使用思维链模块适配SentimentSignature。可以看出尽管没有进行模型训练DSPy对输入进行了准确分类。情感: neutral推理: 这句话表达了对电影视觉效果的积极评价但同时也指出了剧情的不足。整体而言这句话的情感倾向是复杂的既有积极的也有消极的。考虑到视觉效果的突出以及剧情的不足可以认为整体情感偏向积极。2.2 构建RAG问答系统这是DSPy的典型应用。这里提供一个RAG问答系统示例整合检索和生成。这个例子使用本地数据模拟检索能直接运行并理解DAG的核心流程。以下是RAG逻辑核心逻辑签名模块# 3. 定义DSPy签名 class GenerateAnswer(dspy.Signature): 基于给定上下文回答问题。 context dspy.InputField(desc相关背景信息) question dspy.InputField() answer dspy.OutputField(desc简洁、准确的答案基于上下文)相比直接采用提示词实现RAG检索和生成这种方式逻辑清晰简洁有效更方便编程实现。RAG整体代码示例如下。import dspy import json # 2. 构建模拟知识库实际项目中替换为真实向量数据库 class SimpleRetriever: 一个简单的内存检索器模拟向量数据库功能 def __init__(self, documents): # documents格式: [{text: ..., id: 1}, ...] self.documents documents def retrieve(self, query, k3): 简单关键词匹配检索实际应用应使用向量检索 query_lower query.lower() scored_docs [] for doc in self.documents: text doc[text].lower() # 简单评分计算查询词在文档中出现的次数 score sum(1 for word in query_lower.split() if word in text) if score 0: scored_docs.append((score, doc[text])) # 按分数排序并返回前k个 scored_docs.sort(reverseTrue, keylambda 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) # 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_passages3): 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, kself.num_passages) context_str \n---\n.join(contexts) # 2. 生成阶段基于检索到的上下文生成答案 prediction self.generate_answer( contextcontext_str, questionquestion ) # 返回完整结果 return dspy.Prediction( contextscontexts, answerprediction.answer, reasoningprediction.reasoning # ChainOfThought提供的推理过程 ) # 5. 初始化RAG系统 rag_system RAG(retriever, num_passages2) # 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}) # 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, traceNone): # 简单验证预测答案是否包含关键词 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( metricvalidate_answer, max_bootstrapped_demos2, max_labeled_demos2 ) # 优化RAG系统 print(正在优化RAG系统...) optimized_rag teleprompter.compile(RAG(retriever), trainsettrainset) return optimized_rag # 8. 主程序入口 if __name__ __main__: print(RAG问答系统启动...) # 测试基础版本 test_rag_system() # 询问是否要优化实际使用时可注释掉这部分 print(f\n{*60}) user_question input(\n请输入你的问题或直接回车使用默认问题: ).strip() if not user_question: user_question 爱因斯坦在哪年获得诺贝尔奖 # 获取答案 result rag_system(user_question) print(f\n问题: {user_question}) print(f答案: {result.answer}) if hasattr(result, reasoning) and result.reasoning: print(f推理过程: {result.reasoning}) # 显示来源 print(f\n信息来源:) for i, ctx in enumerate(result.contexts, 1): print(f[{i}] {ctx})输出如下所示RAG问答系统启动...问题: 爱因斯坦因什么获得诺贝尔奖检索到的上下文:模型推理: 爱因斯坦在1921年获得诺贝尔物理学奖获奖的原因是由于他对光电效应的解释。光电效应是光与物质相互作用时电子被激发的过程。爱因斯坦提出了光量子光子的概念来解释光电效应这在当时是一个革命性的想法。他的解释为量子力学的发展奠定了基础。最终答案: 爱因斯坦因他对光电效应的解释而获得诺贝尔奖。问题: 什么是光电效应检索到的上下文:模型推理: 光电效应是指光子与物质相互作用时电子被发射出来的现象。它揭示了光具有粒子性而不是仅仅是波动。当光子具有足够的能量时它可以激发电子从原子中脱离。最终答案: 光电效应是指光线照射到物质表面时电子被发射出来的现象。它表明光具有粒子性光子撞击原子并激发电子从原子中脱离。问题: 谁创立了相对论检索到的上下文:模型推理: 相对论是由阿尔伯特·爱因斯坦创立的。狭义相对论于1905年发表广义相对论于1915年发表。最终答案: 阿尔伯特·爱因斯坦请输入你的问题或直接回车使用默认问题:问题: 爱因斯坦在哪年获得诺贝尔奖答案: 1905推理过程: 爱因斯坦于1905年获得诺贝尔物理学奖。信息来源:3 DSPy进阶应用3.1 使用优化器提升性能对一些进阶应用DSPy需要用户给出少量标注数据辅助DSPy优化器优化prompt。DSPy优化器可以自动利用这些少量标注数据来优化提示。以下是使用BootstrapFewShot的简化流程包括1准备少量训练数据2定义评估指标比如准确率然后通过bootstrapfewshot模块变异优化给定任务的提示词。类似于模型训练分类器优化后DSPy就可以作预测了推理延迟会更小性能会更好。import dspy from dspy.teleprompt import BootstrapFewShot # 1. 定义签名和初始模块同示例二 classifier dspy.ChainOfThought(SentimentSignature) # 2. 准备少量训练数据 trainset [ dspy.Example(sentence产品非常好用强烈推荐, sentimentpositive).with_inputs(sentence), dspy.Example(sentence服务糟糕体验极差。, sentimentnegative).with_inputs(sentence), # ... 更多示例 ] # 3. 定义评估指标例如准确率 def sentiment_metric(example, prediction): # 简单比较预测情感和真实情感是否一致 return example.sentiment prediction.sentiment # 4. 创建并运行优化器 optimizer BootstrapFewShot(metricsentiment_metric, max_bootstrapped_demos2) optimized_classifier optimizer.compile(classifier, trainsettrainset) # 5. 使用优化后的模块 result optimized_classifier(sentence这本书内容一般没什么亮点。) print(f优化后的预测: {result.sentiment})输出如下100%|██████████| 2/2 [00:3800:00, 19.25s/it]Bootstrapped 0 full traces after 1 examples for up to 1 rounds, amounting to 2 attempts.优化后的预测: neutralreference---prompt自主生成框架 - DSPyhttps://blog.csdn.net/liliang199/article/details/155614507awesome-dspyhttps://github.com/ganarajpr/awesome-dspy