杂记 | Langchain中few-shot提示词模板的使用(给提示词添加示例)

2023-09-22 15:15:58


Langchain是一个集成多个大语言模型的开源框架,可以使用它来快速开发大语言模型应用。

本文的代码使用到的模块:

from typing import List, Dict
from langchain import PromptTemplate, FewShotPromptTemplate, LLMChain, OpenAI

01 普通的提示词模板

先来看看普通的提示词模板如何使用,效果如何:

# 创建大语言模型对象 这里使用gpt-3.5最新的指令模型
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0)

# 设置提示词模板 其中的{input}为等待用户填充问题的插槽
template = "我会给你一种物品名称的输入,你需要输出该类物品的一种具体事物,且使用量词开头。\nInput: {input}"

# 提示词模板对象 指定接收参数的参数名为input 也就是上述插槽中的内容
prompt = PromptTemplate(input_variables=["input"], template=template)

# 大语言模型 + 提示词模板对象 -> 生成一个chian
chain = LLMChain(llm=llm, prompt=prompt)

# 执行chain并查看结果
print(chain.run(input="手机"))

在这个示例中,对大模型的输入为:

我会给你一种物品名称的输入,你需要输出该类物品的一种具体事物,且使用量词开头。
Input: 手机

大模型的输出为:

Output: 一部手机

可以看到输出并不能很好地满足我们的需求,因为我希望输出的是该类物品的一件具体的事物,例如:一部华为手机,而它只是简单的给我添加了个量词就完事了。而且它还自己添加了output前缀。

02 few-shot提示词模板

下面使用few-shot提示词模板试试:

# 创建大语言模型
llm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0)

# 创建一个实例列表
examples: List[Dict[str, str]] = [
    {"input": "水果", "output": "一个苹果"},
    {"input": "宠物", "output": "一只猫"},
    {"input": "家电", "output": "一台冰箱"}
]

# 创建提示词模板对象 该对象中的template部分插槽需要与示例中的键对应
example_prompt = PromptTemplate(input_variables=["input", "output"], template="Input: {input}\n{output}")

# 合成few-shot提示词模板对象
prompt = FewShotPromptTemplate(
    prefix="我会给你一种物品名称的输入,你需要输出该类物品的一种具体事物,且使用量词开头。",  # 示例提示词之前添加的内容
    examples=examples,  # 示例列表
    example_prompt=example_prompt,  # 容纳示例的提示词模板对象
    suffix="Input: {input}",  #  示例提示词之后添加的内容
    input_variables=["input"]  # 等待用户输入的参数插槽
)

# 创建一个chain
chain = LLMChain(llm=llm, prompt=prompt)

# 执行chain并查看结果
print(chain.run(input="手机"))

使用few-shot提示词模板后,对大模型的输入为:

我会给你一种物品名称的输入,你需要输出该类物品的一种具体事物,且使用量词开头。

Input: 水果
一个苹果

Input: 宠物
一只猫

Input: 家电
一台冰箱

Input: 手机

大模型的输出为:

一部iPhone

比起无示例版本,输出结果有了明显改观。

更多推荐

few shot目标检测survey paper笔记(迁移学习)

paper:Few-ShotObjectDetection:AComprehensiveSurvey(CVPR2021)metalearning需要复杂的情景训练,而迁移学习仅需在一个single-branch结构上做两步训练。常用的结构是FasterR-CNN,下面是FasterR-CNN的结构图。RPN的修改当样本

数据结构---单链表

单链表单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)+指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。如图是一个结点​多个结点加上head(头结点)指针(指向了第一个结点的位置

kafka知识点汇总

kafka是什么?Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。消息队列

将本地前端工程中的npm依赖上传到Nexus

【问题背景】用Nexus搭建了内网的依赖仓库,需要将前端工程中node_modules中的依赖上传到Nexus上,但是node_modules中的依赖已经是解压后的状态,如果直接机械地将其简单地打包上传到Nexus,那么无法通过npminstall下载使用。故有此文。【解决思路】前端工程中的所有npm依赖信息已经记录在

我的创作纪念日

机缘不知不觉已经过去蛮久了,为何我会到csdn中来写博客呢?最开始我只是想对于我这样的应届生如果有一个自己的博客网站对于找工作会是一个加分的项。写了20篇之后呢我就觉得我的目的不是那么功利了,因为我在学习的过程中遇到了太多的困难,都是通过别人的分享去获得解决的办法的,从别人那里去获取我便也想给别人出一份力,对于没有导师

vue前端 router路由hash和history模式区别

vue-router路由有两种方式,hash模式和history模式,接下来浅谈一下两者区别模式通俗解释兼容原理hashurl尾巴后的#号及后面的字符都是hash模式兼容IE8及以上于hash值变化不会导致浏览器向服务器发出请求,而且hash改变会触发hashchange事件(hashchange只能改变#后面的url

改写paddledetection为cmake版(c++)

下载源代码官方地址:https://gitee.com/paddlepaddle/PaddleDetection网盘:paddledetection链接:https://pan.baidu.com/s/1g0z5SYQNDR1pwe9iAtvR3A?pwd=ktl6提取码:ktl6paddleocr链接:https:/

腾讯云OCR - 降低客服财务运营成本

说明:参与中秋活动一、前言:随着图片时代的飞速发展,大量的文字内容为了优化排版和表现效果,都采用了图片的形式发布和存储,这为内容的传播和安全性带来了很大的便利,需要做重复性劳动。OCR文字扫描工具也逐渐的应运而生,主要是为了帮助用户解决了内容编辑的难题。二、OCR是什么?OCR全称是OpticalCharacterRe

ELK 企业级日志分析系统 ELFK

目录一、概述二、组件介绍2.1、ElasticSearch2.2、Kiabana2.3、Logstash2.4、可以添加的其它组件:Filebeat2.5、缓存/消息队列(redis、kafka、RabbitMQ等)2.6、Fluentd三、ELK工作原理四、实例演示1.ELK之部署"E"Elasticsearch2.

视频号视频怎么下载(视频号如何下载里面的视频)

根据大家分享出来的视频号如何下载里面的视频的相关提供的下载方案,我们特别总结了多款可以下载视频号视频怎么下载的办法!如果你还不会提取视频号里的视频,赶快来看看视频号里的视频怎么保存到相册的吧!1:视频下载缓存该方法仅针对安卓手机,具体操作方式打开手机的文件管理,找到手机的本地储存空间;在文件中依次找到Android—d

软件测试技术之地图导航的测试用例

外观测试屏幕显示不能有花屏、黑点和闪屏,清晰度、亮度、颜色要正常。检测所有按键都能起到相应作用,是否手感不良。UI显示状态、颜色、清晰度、效果。控制:放大,缩小,音量调节功能测试。交叉路口查询测试,点击交叉路口查询后能正确输入城市名称吗。关键字查询:点击关键字查询后搜索道路能正确的输入城市名称和关键字进行道路查询吗。6

热文推荐