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…...
【认证授权FAQ】HP Anyware LLS服务器常用命令
pcoip-set-password //lls上设置管理员密码 export HISTIGNORE“export” export TERADICI_LICENSE_SERVER_PASSWORD‘Your Password’ sudo pcoip-configure-proxy -v //检查是否使用了代理 pcoip-activate-online-license -a -c //在线激活 pcoip-return-online-license -a …...
深度剖析责任链模式
一、责任链模式的本质:灵活可扩展的流水线处理 责任链模式(Chain of Responsibility Pattern)是行为型设计模式的代表,其核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这种模式完美解决了以下…...
Windows中指定路径安装DockerDesktop
Widnows中直接安装docker desktop,默认会被安装到C:/Program Files/Docker路径下,可以通过下面方式来设置安装到指定的目录下 1. 先卸载干净(如果已安装过的话) 如果未卸载干净,重装会提示 Exising installation is up to date 卸载Docker…...
Java LinkedList(单列集合)
LinkedList 是 Java 中实现了 List 接口的一个类,它属于 java.util 包。与 ArrayList 不同,LinkedList 是基于双向链表实现的,适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现:LinkedList 使用双向…...
海外服务器都有什么作用?
海外服务器具体就是指部署在中国大陆以外地区的服务器,企业选择租用海外服务器能够显著提高不同国家和地区用户的访问速度,当网站的服务器部署在目标用户所在地附近时,数据信息所传输的距离就会缩短,大大降低了网络访问的延迟度&a…...
floodfill算法系列一>岛屿的最大面积
题解 整体思路:代码设计:代码呈现: 整体思路: 代码设计: 代码呈现: class Solution {int ret,m,n,count;boolean[][] vis;public int maxAreaOfIsland(int[][] grid) {m grid.length;n grid[0].length;v…...
手机用流量怎样设置代理ip?
互联网各领域资料分享专区(不定期更新): Sheet...
2025年2月13日笔记
——自定义函数: #include<iostream> #include<bits/stdc.h> using namespace std; int a(int x,int y); int a(int x,int y){ return x*y; } int main(){ int c5; int d3; int resulta(c,d); cout<<"两数的乘积是:"&…...
游戏引擎学习第100天
仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…...
Leetcode:学习记录
一、滑动窗口 1. 找出数组中元素和大于给定值的子数组的最小长度 右指针从左到右遍历,在每个右指针下,如果去掉左边元素的元素和大于等于给定值则左指针右移一次,直到小于给定值,右指针右移一个。 2.找到乘积小于给定值的子数组…...
AT32系列微控制器低压电机控制开发板
参考:《UM0014_AT32_LV_Motor_Control_EVB_V20_User_Manual_V1.0.1_ZH.pdf》 开发板介绍 此电机开发板是一个泛用型的低压三相电机驱动器,应用雅特力科技AT32系列微控制器搭配雅特力电机函数库,可驱动直流无刷电机、交流同步电机࿰…...
如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案
MySQL 与 Redis 数据保持一致性是一个常见且复杂的问题,一般来说需要结合多种策略来平衡性能与一致性。 传统的解决策略是先读缓存,未命中则读数据库并回填缓存,但方式这种维护成本较高。 随着云数据库技术的发展,目前国内云厂商…...
Vue3(3)
一.具体业务功能实现 (1)登录注册页面 [element-plus 表单 & 表单校验] 功能需求说明: 1.注册登录 静态结构 & 基本切换 2.注册功能 (校验 注册) 3.登录功能 (校验 登录 存token) import request from /utils/request// 注册接…...
2025 西湖论剑wp
web Rank-l 打开题目环境: 发现一个输入框,看一下他是用上面语言写的 发现是python,很容易想到ssti 密码随便输,发现没有回显 但是输入其他字符会报错 确定为ssti注入 开始构造payload, {{(lipsum|attr(‘global…...
Spring Cloud + Nacos + K8S 零影响发布方案
问题描述 在生产环境中使用 springcloud 框架,由于服务更新过程中,容器服务会被直接停止,部分请求仍被分发到终止的容器,导致服务出现500错误,这部分错误请求数据占用比较少,因为Pod滚动更新都是一对一。因…...
Git命令摘录
使用 Git 升级软件通常是指通过 Git 仓库获取软件的最新版本或更新代码。以下是详细的步骤和方法: 1. 克隆软件仓库 如果这是你第一次获取软件代码,可以使用 git clone 命令将远程仓库克隆到本地。 git clone <仓库地址> 例如: git cl…...
2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)
2024年博客之星年度评选—创作影响力评审主题文章创作评审目前排名 2024年博客之星主题文章创作评审文章得分公布!2024年博客之星创作影响力评审2024年博客之星主题文章创作评审目前排名公布! 【2024博客之星】恭喜完成✅主题创作的226位博主࿰…...
unity 0基础自学2.1:unity 中button的各类状态
文章目录 1、Button的状态2、脚本中获取button的状态2.1 分析状态获取2.2 通过实现接口获取button的状态2.2.1 鼠标点击与释放2.2.2 高亮模式2.2.3 退出选中模式(高亮状态)2.2.4 选择模式selected2.2.5 退出选择模式 3、射线与UI交互设置3.1 Canvas中组件…...
《C++ Primer》学习笔记(一)
第一部分:C基础 在C和C编程语言中,main函数必须返回int类型的值。这一要求自C标准的第一次规范(C89,也叫ANSI C)开始就已经明确规定了。std::endl和\n都用于插入换行符。std::endl除了换行,还会强制刷新输…...
DedeBIZ系统审计小结
之前简单审计过DedeBIZ系统,网上还没有对这个系统的漏洞有过详尽的分析,于是重新审计并总结文章,记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip 📌DedeBIZ 系统并非基于 MVC 框架&…...
基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程
以下是一个基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程: --- ### 一、技术选型 1. **后端**:Python Flask(轻量级Web框架) 2. **前端**:HTML/CSS JavaScript&…...
作业。。。。。
顺序表按元素删除 参数:删除元素,顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …...
C#快速排序QuickSort将递归算法修改为堆栈Stack非递归方式
我们知道,方法的调用是采用Stack的方式[后进先出:LIFO], 在DeepSeek中快速搜索C#快速排序, 搜索结果如图: 我们会发现是采用递归的方式 . 递归的优点: 简单粗暴,类似于直接写数学公式,因代码量较少,易于理解.递归与循环迭代的运行次数都是一致的 递归的缺点: 占用大量的内…...
15.最大二叉树、合并二叉树、二叉搜索树
最大二叉树 就是一个提供了额外信息的中序遍历 class Solution { public:TreeNode* sol(vector<int>& nums,int start,int end){if(startend)return nullptr;int maxnums[start],indexstart;for(int istart;i<end;i){if(nums[i]>max){maxnums[i];indexi;}}Tr…...
【DeepSeek × Postman】请求回复
新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test,并创建一个关联的测试环境 DeepSeek API Env,同时定义两个变量 base_url 和 api_key 的步骤如下: 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…...
Repo命令使用
repo 命令与 git 类似,但它主要用于管理多个 Git 仓库的操作。以下是等效的 repo 命令: 1. 获取新仓库代码 克隆仓库 repo init -u <manifest_url> -b <branch_name> repo sync repo init:初始化 repo,指定远程清单…...
npm install 失败
考虑原因: node版本不符代理镜像连接失败权限不足 症状1: 卡住 尝试降低nodejs版本 症状2:报错 报错1:permission not permitted 报错2: 超时 应对方法: node版本不符 降版本 镜像失败 – 切换镜像 …...
排序算法整理(冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、计数排序、桶排序、基数排序)
排序算法是计算机科学中用于将数据元素按照特定顺序进行排列的算法,常见的排序算法有以下几类: 比较排序 冒泡排序:通过重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作…...
Kimi实战1/100 - 读接口文档,编写接口
文章目录 Kimi实战1/100 - 读接口文档,编写接口接口调用requests 调用代码说明注意事项 接口提供FastAPI 接口代码代码说明测试方法 Kimi实战1/100 - 读接口文档,编写接口 接口调用 User: 根据 接口文档 https://www.eiisys.com/home/apiDetails?id00…...
