langchain学习笔记之小样本提示词Few-shot Prompt Template
langchain学习笔记之小样本提示词
引言
本节将介绍通过小样本提示词 ( Few-shot Prompt Templates ) (\text{Few-shot Prompt Templates}) (Few-shot Prompt Templates)进行提示词追加的方法。
Few-shot Prompt Templates \text{Few-shot Prompt Templates} Few-shot Prompt Templates简单介绍
提示词中添加交互样本的作用是为了模型能够更好地理解用户的想法,从而在回答问题/执行任务中,其结果能够更加满足用户的要求。而小样本提示词模板 ( Few-shot Prompt Templates ) (\text{Few-shot Prompt Templates}) (Few-shot Prompt Templates)旨在使用一组少量的示例来指导模型处理新的输入。
这些少量示例可以用来训练模型,并让模型更好地理解和回答类似的问题。
示例集创建
假设我们提出的问题是:梁思成和林徽因谁的寿命更长 ? ? ? 在对大模型进行提问之前,先准备一个示例数组examples,其里面包含若干个问答样例:
为节省篇幅,这里仅使用两个问答样例。
examples = [{"question": "穆罕默德·阿里和艾伦·图灵谁的寿命更长?","answer": """这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里"""},{"question": "《大白鲨》和《007:皇家赌场》的导演都来自同一个国家吗?","answer": """这里需要跟进问题吗?是的跟进: 《大白鲨》的导演是谁?中间答案: 《大白鲨》的导演是Steven Spielberg跟进: Steven Spielberg来自哪里?中间答案: 美国跟进: 《007:皇家赌场》的导演是谁?中间答案: 007:皇家赌场》的导演是Martin Campbell跟进: Martin Campbell来自哪里?中间答案: 新西兰最终答案: 不是"""}
]
观察上述样例,我们发现:在样例的 answer \text{answer} answer部分,用户对模型的回答结果存在具体格式。例如:
- 开头部分:这里需要跟进问题吗?是的 这样一个开头描述;
- 推理过程中的格式:跟进,中间答案 等格式字样;
- 结论部分格式:最终答案 格式字样。
创建 ExamplePrompt \text{ExamplePrompt} ExamplePrompt与 ExampleSelector \text{ExampleSelector} ExampleSelector
创建一个example_prompt,将用户给出的示例格式进行优化,用于后续FewShotPromptTemplate使用:
from langchain.prompts.prompt import PromptTemplate
example_prompt = PromptTemplate(input_variables=["question", "answer"],template="问题: {question} \n {answer}"
)
原始结果(示例):
{"question": "穆罕默德·阿里和艾伦·图灵谁的寿命更长?","answer": """这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里"""
}
优化结果
问题: 穆罕默德·阿里和艾伦·图灵谁的寿命更长? 这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里
出现一个新的问题,由于大模型的上下文长度有限,这意味着:输入的提示信息有限。基于该情况,一个朴素的想法是:从冗长示例中选择若干个相似示例作为最终的提示结果。
如上例中:问题:梁思成与林徽因谁的寿命更长 ? ? ? 对应的示例明显是第一个:穆罕默德·阿里和艾伦·图灵谁的寿命更长 ? ? ? 因为它们之间描述的语义相似,只是名字部分有所区别。
如何找到与问题相似的示例信息 ? ? ? 需要创建一个示例选择器 ( ExampleSelector ) (\text{ExampleSelector}) (ExampleSelector)来执行这个操作:
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
一个示例选择器的具体格式示例如下:
from langchain_community.vectorstores import DashVector
from langchain_community.embeddings import DashScopeEmbeddingsexample_selector = SemanticSimilarityExampleSelector.from_examples(examples=examples,embeddings=DashScopeEmbeddings(),vectorstore_cls=DashVector,vectorstore_kwargs={"endpoint": DASHVECTOR_ENDPOINT,"api_key": DASHVECTOR_API_KEY},k=1
)
这是一个通过计算问题与各示例样本之间的语义相似度的方式来获取示例样本的选择器。其中:
examples:可供选择的示例列表。embedding:用于生成 embedding \text{embedding} embedding的类,由于我们使用的 Qwen \text{Qwen} Qwen模型,因此使用DashScopeEmbedding将问题以及示例中的文字进行向量化处理;vectorstore_cls:与 Qwen \text{Qwen} Qwen匹配,使用DashVector对 Embedding \text{Embedding} Embedding结果进行存储以及相似度检索工作的vectorstore类。vectorstore_kwargs:阿里云的向量检索服务需要申请相应的api-key和end-points使向量检索正常运行。
其中api-key可以从阿里云百炼中进行申请;end-points可以在阿里云的向量检索服务中创建 Cluster \text{Cluster} Cluster进行获取,有免费使用额度。k:表示example_selector要生成的示例数。
这个选择器就可以通过语义相似度找出与问题相关的示例信息:
select_res = example_selector.select_examples({"question": question_input})
在本例中如果将question_input中加入上述问题:梁思成与林徽因谁的寿命更长 ? ? ?,其最终返回的是examples中的第一个样本。
- 由于
example_selector中参数k=1的缘故,因而select_examples方法返回的select_res列表中仅包含一个样本,结合我们提供的示例长度,以及 llm \text{llm} llm支持的上下文长度,适当地调整k值,以便得到更满足要求的问答结果。
{'question': '穆罕默德·阿里和艾伦·图灵谁的寿命更长?', 'answer': '\n 这里需要跟进问题吗?是的\n 跟进: 穆罕默德·阿里去世时多大?\n 中间答案: 穆罕默德·阿里去世时74岁\n 跟进: 艾伦·图灵去世时多大?\n 中间答案: 艾伦·图灵去世时41岁\n 最终答案: 穆罕默德·阿里\n '}
创建 FewShotPromptTemplate \text{FewShotPromptTemplate} FewShotPromptTemplate
至此,已经通过example_selector找到相似的示例信息,需要将示例信息与问题进行整合,并生成新的prompt:
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,suffix=f"问题:{question_input}",
其中:
example_selector:上面建立的样本选择器;example_prompt:将选择出的样本进行使用example_prompt进行格式上的优化;suffix:输入我们要提问的问题question_input。在FewShotPromptTemplate中question_input执行了两个动作:一个是提供给example_selector找出语义相似的样本信息(example_selector自身不包含问题信息);另一个是将格式优化好的prompt信息与问题进行整合。
最终生成的prompt表示如下:
print(prompt.format(input="梁思成和林徽因谁的寿命更长"))"""
问题: 穆罕默德·阿里和艾伦·图灵谁的寿命更长? 这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里问题:梁思成和林徽因谁的寿命更长?
"""
将上述结果分成 3 3 3个部分,前 2 2 2个部分是example_selector找到的语义相似的示例样本并使用example_prompt优化后的效果;最后一个部分是我们提出的问题。上述结果作为最终的 prompt \text{prompt} prompt与大模型进行交互。
比对结果
如果没有example_selector产生的信息,仅将问题部分作为prompt与大模型进行交互,对应结果表示如下:
"""
问题:梁思成和林徽因谁的寿命更长?
"""
梁思成(1901年4月20日-1972年1月9日),享年70岁。
林徽因(1904年6月10日-1955年4月1日),享年50岁。
因此,梁思成的寿命更长。
很明显,语义没有任何问题,只是格式并不是我们想要的格式;如果使用example_selector和FewShotPromptTemplate处理后的prompt,它的对应结果表示如下:
"""
问题: 穆罕默德·阿里和艾伦·图灵谁的寿命更长? 这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里问题:梁思成和林徽因谁的寿命更长?
"""为了回答这个问题,我们需要了解梁思成和林徽因各自的寿命。跟进: 梁思成去世时多大?
中间答案: 梁思成出生于1901年4月20日,去世于1972年1月9日,享年70岁。跟进: 林徽因去世时多大?
中间答案: 林徽因出生于1904年6月10日,去世于1955年4月1日,享年51岁。最终答案: 梁思成的寿命更长。
这次结果的语义正确,并且格式上也和示例中的格式非常相似。这是因为处理后的prompt为 llm \text{llm} llm提供了更丰富的上下文信息。
完整代码
"""
样本交互:
若Human单独地提出一个prompt,assistant的回答结果 -> 可能是[宽泛]的
这里的[宽泛]是指:回答结果的语义/格式和Human想要的结果之间存在差异朴素策略:
通过一系列对话的方式引导assistant反馈给我们更精准/更满足条件的答案
[一系列对话]会给assistant提供上下文的记忆(memory)或者说,在prompt之前,Human主动提供一些示例 -> 供assistant参考
可以看作是一种[微型的]finetune操作
"""
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import DashVector
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi# 自行申请相应的api-key和end-point
DASHVECTOR_API_KEY = 'YOUR_DASHVECTOR_API_KEY'
DASHVECTOR_ENDPOINT = 'YOUR_DASHVECTOR_ENDPOINT'examples = [{"question": "穆罕默德·阿里和艾伦·图灵谁的寿命更长?","answer": """这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里"""},{"question": "《大白鲨》和《007:皇家赌场》的导演都来自同一个国家吗?","answer": """这里需要跟进问题吗?是的跟进: 《大白鲨》的导演是谁?中间答案: 《大白鲨》的导演是Steven Spielberg跟进: Steven Spielberg来自哪里?中间答案: 美国跟进: 《007:皇家赌场》的导演是谁?中间答案: 007:皇家赌场》的导演是Martin Campbell跟进: Martin Campbell来自哪里?中间答案: 新西兰最终答案: 不是"""}
]def langchain_few_shot_interaction(question_input):example_selector = SemanticSimilarityExampleSelector.from_examples(examples=examples,embeddings=DashScopeEmbeddings(),vectorstore_cls=DashVector,vectorstore_kwargs={"endpoint": DASHVECTOR_ENDPOINT,"api_key": DASHVECTOR_API_KEY},k=1)example_prompt = PromptTemplate(input_variables=["question", "answer"],template="问题: {question} \n {answer}")prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,suffix=f"问题:{question_input}",)return (example_selector.select_examples({"question": question_input}),prompt.format(input=question_input))def console(question_input, model_input):select_res, template = langchain_few_shot_interaction(question_input)template_original = question_inputprompt_original = PromptTemplate.from_template(template_original)prompt = PromptTemplate.from_template(template)# 仅将question_input作为prompt# chain_original = prompt_original | model_input# result = chain_original.stream({# "question": question_input# })chain = prompt | model_inputresult = chain.stream({"question": question_input})return resultif __name__ == '__main__':q = "梁思成和林徽因谁的寿命更长?"llm = Tongyi(model_name="tongyi-7b-chinese",temperature=0.5,max_tokens=100,)res = console(q, llm)for chunk in res:print(chunk, end="", flush=True)
相关文章:
langchain学习笔记之小样本提示词Few-shot Prompt Template
langchain学习笔记之小样本提示词 引言 Few-shot Prompt Templates \text{Few-shot Prompt Templates} Few-shot Prompt Templates简单介绍示例集创建创建 ExamplePrompt \text{ExamplePrompt} ExamplePrompt与 ExampleSelector \text{ExampleSelector} ExampleSelector创建 Fe…...
【CS.SE】优化 Redis 商户号池分配设计:高并发与内存管理
优化 Redis 商户号池分配设计:高并发与内存管理 背景 在分布式交易系统中,商户号池管理是核心模块之一。传统的商户号生成方式,依赖数据库预分配号段,导致大量号段浪费,并且在高并发请求下,性能难以满足需…...
5、《Spring Boot自动配置黑魔法:原理深度剖析》
Spring Boot自动配置黑魔法:原理深度剖析 一、引言:为什么Spring Boot能“开箱即用”? Spring Boot的核心理念是**“约定优于配置”,开发者只需引入一个spring-boot-starter-web依赖,就能直接编写RESTful API…...
稀土抑烟剂——为纺织品安全加持,保护您的每一寸触感
一、稀土抑烟剂的基本概念 稀土抑烟剂是基于稀土元素(如稀土氧化物和稀土金属化合物)研发的一类新型阻燃材料。它能够有效提高纺织品的阻燃性,抑制火灾发生时产生的烟雾和有害气体,减少火灾对人体的危害。稀土抑烟剂具有更强的稳…...
如何使用CSS画一个三角形,原理是什么?
如何用 CSS 画一个三角形?原理和实战指南 一、核心原理 CSS 画三角形的本质是利用边框(border)的叠加特性。当一个元素的宽高为 0 时,其边框会以对角线形式相交,形成四个独立的三角形区域。通过控制某一边的边框颜色为…...
Docker拉不下来镜像问题解决法案
打开docker的设置界面 配置如下: vi /etc/docker/daemon.json {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["…...
DeepSeek 多模态大模型Janus-Pro本地部署教程
1.部署环境配置 我个人用的是Mac的m1pro 16512配置,我跑了1B的版本很流畅,7B的也可以跑起来,稍微感觉有一些卡顿。 需要安装Git-lfs,访问官网下载安装包安装,这个工具是用于下载大型文件必备的软件,这里用…...
笔记8——模式匹配 match语句(仅在Python 3.10及以上版本中可用)
文章目录 模式匹配 match语句(仅在 Python 3.10及以上版本 中可用)基本语法基本匹配操作应用场景 模式匹配 match语句(仅在 Python 3.10及以上版本 中可用) Python 3.10 及以上版本中才引入了 match 语句用于简化复杂的条件判断和数据解构;类似于其他语言中的 swit…...
maven-antrun-plugin插件的用法
maven-antrun-plugin 是 Maven 中一个非常强大的插件,它允许你在 Maven 构建过程中运行 Apache Ant 任务。通过这个插件,你可以在 Maven 构建的各个阶段(如 compile、package 等)中执行自定义的 Ant 任务,比如复制文件…...
iOS主要知识点梳理回顾-4-运行时类和实例的操作
类和实例的操作 iOS 运行时(Objective-C Runtime)提供了丰富的 API 来对类进行动态操作,包括创建类、修改类的结构、添加方法、替换方法等。这对于实现动态特性、AOP(面向切面编程)、方法拦截等功能非常重要。以下举例…...
vue2和vue3生命周期的区别通俗易懂
用最直白的对比帮你理解 Vue2 和 Vue3 生命周期的区别,就像对比手机系统的升级: 一、生命周期阶段对比表(老手机 vs 新手机) 阶段Vue2(老系统)Vue3(新系统)变化说明初始化beforeCre…...
使用 meshgrid函数绘制网格点坐标的原理与代码实现
使用 meshgrid 绘制网格点坐标的原理与代码实现 在 MATLAB 中,meshgrid 是一个常用函数,用于生成二维平面网格点的坐标矩阵。本文将详细介绍如何利用 meshgrid 函数生成的矩阵绘制网格点的坐标,并给出具体的代码实现和原理解析。 实现思路 …...
postgresql源码学习(59)—— 磁盘管理器 SMGR
一、 定义及作用 PostgreSQL 的磁盘管理器(Storage Manager,简称 SMGR)是数据库系统中负责管理底层存储的核心模块。磁盘管理器并非直接操作磁盘上的文件,而是通过VFD(虚拟文件描述符,将在后续学习…...
Spring Boot(8)深入理解 @Autowired 注解:使用场景与实战示例
搞个引言 在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…...
UE_C++ —— Structs
目录 一,实现一个UStruct 二,Struct Specifiers 三,最佳做法与技巧 结构体(Struct)是一种帮助组织和操作相关属性的数据结构;在引擎中,结构体会被引擎反射系统识别为 UStruct,但不…...
ArcGISPro 新建shp+数据结构
import arcpy# 设置工作空间和 Shapefile 存放路径 shp_path r"C:\path\to\your\folder\PolygonZY.shp" # Shapefile 存放路径 fields [("CHBH", "TEXT", 20),("ZCMC", "TEXT", 100),("ZCLX", "TEXT"…...
DeepSeek教unity------MessagePack-06
无类型 Typeless 无类型的 API 类似于 BinaryFormatter,因为它会将类型信息嵌入到数据块中,所以在调用 API 时不需要显式指定类型。 MessagePackSerializer.Typeless 是 Serialize/Deserialize<object>(TypelessContractlessStandardResolver.In…...
2.【BUUCTF】bestphp‘s revenge
进入题目页面如下 进行代码审计 <?php // 1. 高亮显示当前PHP文件的源代码,方便开发者查看代码内容,在生产环境中不应使用此函数,可能会导致代码泄露。 highlight_file(__FILE__);// 2. 定义变量 $b ,其值为字符串 implode &…...
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)
拉票 亲爱的小伙伴们或者童鞋们,喜欢宏哥文章的,请动动你们发财小手,给我投投票票 。 祝2025小伙伴们工作顺利,家庭和睦,心想事成,财源滚滚! 我的票还有7票,互票的朋友私信给我。 投…...
Netty源码解析之异步处理(二):盛赞Promise中的集合设计
前言 在阅读Netty源码的过程中,我越来越相信一句话:“Netty的源码非常好,质量极高,是Java中质量最高的开源项目之一”。如果认真研究,会有一种遍地黄金的感觉。 本篇文件我将记录一下鄙人在Promise的实现类DefaultPr…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
