当前位置: 首页 > news >正文

langchain学习笔记之小样本提示词Few-shot Prompt Template

引言

本节将介绍通过小样本提示词 ( 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-keyend-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。在FewShotPromptTemplatequestion_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与大模型进行交互,对应结果表示如下:

"""
问题:梁思成和林徽因谁的寿命更长?
"""
梁思成(1901420日-197219日),享年70岁。
林徽因(1904610日-195541日),享年50岁。
因此,梁思成的寿命更长。

很明显,语义没有任何问题,只是格式并不是我们想要的格式;如果使用example_selectorFewShotPromptTemplate处理后的prompt,它的对应结果表示如下:

"""
问题: 穆罕默德·阿里和艾伦·图灵谁的寿命更长? 这里需要跟进问题吗?是的跟进: 穆罕默德·阿里去世时多大?中间答案: 穆罕默德·阿里去世时74岁跟进: 艾伦·图灵去世时多大?中间答案: 艾伦·图灵去世时41岁最终答案: 穆罕默德·阿里问题:梁思成和林徽因谁的寿命更长?
"""为了回答这个问题,我们需要了解梁思成和林徽因各自的寿命。跟进: 梁思成去世时多大?
中间答案: 梁思成出生于1901420日,去世于197219日,享年70岁。跟进: 林徽因去世时多大?
中间答案: 林徽因出生于1904610日,去世于195541日,享年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&#xf…...

稀土抑烟剂——为纺织品安全加持,保护您的每一寸触感

一、稀土抑烟剂的基本概念 稀土抑烟剂是基于稀土元素(如稀土氧化物和稀土金属化合物)研发的一类新型阻燃材料。它能够有效提高纺织品的阻燃性,抑制火灾发生时产生的烟雾和有害气体,减少火灾对人体的危害。稀土抑烟剂具有更强的稳…...

如何使用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(虚拟文件描述符,将在后续学习&#xf…...

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&#xff0c;因为它会将类型信息嵌入到数据块中&#xff0c;所以在调用 API 时不需要显式指定类型。 MessagePackSerializer.Typeless 是 Serialize/Deserialize<object>(TypelessContractlessStandardResolver.In…...

2.【BUUCTF】bestphp‘s revenge

进入题目页面如下 进行代码审计 <?php // 1. 高亮显示当前PHP文件的源代码&#xff0c;方便开发者查看代码内容&#xff0c;在生产环境中不应使用此函数&#xff0c;可能会导致代码泄露。 highlight_file(__FILE__);// 2. 定义变量 $b &#xff0c;其值为字符串 implode &…...

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-23- 操作鼠标拖拽 - 番外篇(详细教程)

拉票 亲爱的小伙伴们或者童鞋们&#xff0c;喜欢宏哥文章的&#xff0c;请动动你们发财小手&#xff0c;给我投投票票 。 祝2025小伙伴们工作顺利&#xff0c;家庭和睦&#xff0c;心想事成&#xff0c;财源滚滚&#xff01; 我的票还有7票&#xff0c;互票的朋友私信给我。 投…...

Netty源码解析之异步处理(二):盛赞Promise中的集合设计

前言 在阅读Netty源码的过程中&#xff0c;我越来越相信一句话&#xff1a;“Netty的源码非常好&#xff0c;质量极高&#xff0c;是Java中质量最高的开源项目之一”。如果认真研究&#xff0c;会有一种遍地黄金的感觉。 本篇文件我将记录一下鄙人在Promise的实现类DefaultPr…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...