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

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:基础知识]

分类目录:《自然语言处理从入门到应用》总目录


语言模型以文本作为输入,这段文本通常被称为提示(Prompt)。通常情况下,这不仅仅是一个硬编码的字符串,而是模板、示例和用户输入的组合。LangChain提供了多个类和函数,以便轻松构建和处理提示。

提示模板的概念

提示模板是指一种可复制的生成提示的方式。它包含一个文本字符串(模板),可以从最终用户处接收一组参数并生成提示。提示模板可能包含以下内容:

  • 对语言模型的指令
  • 少量示例,以帮助语言模型生成更好的回复
  • 对语言模型的问题

以下代码片段是包含了一个提示模板的示例:

from langchain import PromptTemplatetemplate = """
我希望你能充当新公司的命名顾问。
一个生产{product}的公司的好名字是什么?
"""prompt = PromptTemplate(input_variables=["product"],template=template,
)
prompt.format(product="彩色袜子")
# -> 我希望你能充当新公司的命名顾问。
# -> 一个生产彩色袜子的公司的好名字是什么?

创建提示模板

我们可以使用PromptTemplate类创建简单的硬编码提示。提示模板可以接受任意数量的输入变量,并且可以进行格式化以生成提示。

from langchain import PromptTemplate
# 没有输入变量的提示示例
no_input_prompt = PromptTemplate(input_variables=[], template="给我讲个笑话。")
no_input_prompt.format()
# -> "给我讲个笑话。"# 一个输入变量的提示示例
one_input_prompt = PromptTemplate(input_variables=["adjective"], template="给我讲个{adjective}的笑话。")
one_input_prompt.format(adjective="有趣的")
# -> "给我讲个有趣的笑话。"# 多个输入变量的示例提示
multiple_input_prompt = PromptTemplate(input_variables=["adjective", "content"], template="给我讲一个{adjective}的关于{content}的笑话。"
)
multiple_input_prompt.format(adjective="有趣的", content="小鸡")
# -> "给我讲一个有趣的关于小鸡的笑话。"

如果我们不想手动指定input_variables,还可以使用from_template类方法创建PromptTemplate。LangChain将根据传递的template自动推断input_variables

template = "给我讲一个{adjective}的关于{content}的笑话。"
prompt_template = PromptTemplate.from_template(template)
prompt_template.input_variables
# -> ['adjective', 'content']
prompt_template.format(adjective="有趣的", content="小鸡")
# -> 给我讲一个有趣的关于小鸡的笑话。

我们可以创建自定义的提示模板,以任何您想要的方式格式化提示。

模板格式

默认情况下,PromptTemplate将提供的模板视为Python f-string。我们可以通过template_format参数指定其他模板格式:

# 在运行此代码之前,请确保已安装jinja2jinja2_template = "告诉我一个{{ adjective }}的笑话,关于{{ content }}"
prompt_template = PromptTemplate.from_template(template=jinja2_template, template_format="jinja2")prompt_template.format(adjective="有趣的", content="鸡")
# -> 告诉我一个有趣的笑话,关于鸡

目前,PromptTemplate仅支持jinja2f-string模板格式。如果您希望使用其他模板格式,我们可以在GitHub页面上提交需求。

验证模板

默认情况下,PromptTemplate将通过检查input_variables是否与模板中定义的变量匹配来验证template字符串。您可以通过将validate_template设置为False来禁用此行为。

template = "我正在学习LangChain,因为{reason}。"prompt_template = PromptTemplate(template=template, input_variables=["reason", "foo"])  # 由于存在额外的变量而引发ValueError
prompt_template = PromptTemplate(template=template, input_variables=["reason", "foo"], validate_template=False)  # 不会引发错误

序列化模板

我们可以将PromptTemplate保存到本地文件系统中的文件中。LangChain将通过文件扩展名自动推断文件格式。目前,LangChain支持将模板保存为YAML和JSON文件。

prompt_template.save("awesome_prompt.json")  # 保存为JSON文件
from langchain.prompts import load_prompt
loaded_prompt = load_prompt("awesome_prompt.json")assert prompt_template == loaded_prompt

LangChain还支持从LangChainHub加载提示模板,其中包含一系列我们可以在项目中使用的有用提示。

from langchain.prompts import load_promptprompt = load_prompt("lc://prompts/conversation/prompt.json")
prompt.format(history="", input="1 + 1等于多少?")

向模板添加Few Shot示例

Few Shot示例是一组可以帮助语言模型生成更好响应的示例。要使用Few Shot示例生成提示,可以使用FewShotPromptTemplate。此类接受PromptTemplate和Few Shot示例列表。然后,它使用Few Shot示例格式化提示模板。

在下面示例中,我们将创建一个生成单词反义词的提示。

from langchain import PromptTemplate, FewShotPromptTemplate# 首先,创建Few Shot示例列表
examples = [{"word": "happy", "antonym": "sad"},{"word": "tall", "antonym": "short"},
]# 接下来,我们指定用于格式化示例的模板。
# 我们使用`PromptTemplate`类来实现这个目的。
example_formatter_template = """Word: {word}
Antonym: {antonym}
"""example_prompt = PromptTemplate(input_variables=["word", "antonym"],template=example_formatter_template,
)# 最后,创建`FewShotPromptTemplate`对象。
few_shot_prompt = FewShotPromptTemplate(# 这些是我们要插入到提示中的示例。examples=examples,# 这是我们在将示例插入到提示中时要使用的格式。example_prompt=example_prompt,# 前缀是出现在提示中示例之前的一些文本。# 通常,这包括一些说明。prefix="Give the antonym of every input\n",# 后缀是出现在提示中示例之后的一些文本。# 通常,这是用户输入的地方。suffix="Word: {input}\nAntonym: ",# 输入变量是整个提示期望的变量。input_variables=["input"],# 示例分隔符是我们将前缀、示例和后缀连接在一起的字符串。example_separator="\n",
)# 现在,我们可以使用`format`方法生成一个提示。
print(few_shot_prompt.format(input="big"))
# -> Give the antonym of every input
# -> 
# -> Word: happy
# -> Antonym: sad
# ->
# -> Word: tall
# -> Antonym: short
# ->
# -> Word: big
# -> Antonym:

选择用于提示模板的示例

如果您有大量示例,可以使用ExampleSelector选择一部分对语言模型来说最具信息量的示例。这将帮助您生成更有可能获得良好回应的提示。下面,我们将使用LengthBasedExampleSelector,它根据输入的长度选择示例。当我们担心构建的提示会超过上下文窗口的长度时,这将非常有用。对于较长的输入,它会选择较少的示例进行包含,而对于较短的输入,它会选择更多的示例。我们将继续使用前面部分的示例,但这次我们将使用LengthBasedExampleSelector来选择示例。

from langchain.prompts.example_selector import LengthBasedExampleSelector# 这里是一些虚构任务的大量示例,该任务是创建反义词。
examples = [{"word": "happy", "antonym": "sad"},{"word": "tall", "antonym": "short"},{"word": "energetic", "antonym": "lethargic"},{"word": "sunny", "antonym": "gloomy"},{"word": "windy", "antonym": "calm"},
]# 我们将使用`LengthBasedExampleSelector`来选择示例。
example_selector = LengthBasedExampleSelector(# 这些是可供选择的示例。examples=examples, # 这是用于格式化示例的PromptTemplate。example_prompt=example_prompt, # 这是格式化示例的最大长度。max_length=25# 这是用于获取字符串长度的函数,用于确定包含哪些示例。在这里被注释掉,因为如果没有指定,默认提供了该函数。# get_text_length: Callable[[str], int] = lambda x: len(re.split("\n| ", x))
)# 现在,我们可以使用`example_selector`创建`FewShotPromptTemplate`。
dynamic_prompt = FewShotPromptTemplate(# 我们提供一个ExampleSelector而不是示例。example_selector=example_selector,example_prompt=example_prompt,prefix="给出每个输入的反义词",suffix="单词:{input}\n反义词:",input_variables=["input"],example_separator="\n\n",
)# 现在,我们可以使用`format`方法生成提示。
print(dynamic_prompt.format(input="big"))
# -> 给出每个输入的反义词
# ->
# -> 单词:happy
# -> 反义词:sad
# ->
# -> 单词:tall
# -> 反义词:short
# ->
# -> 单词:energetic
# -> 反义词:lethargic
# ->
# -> 单词:sunny
# -> 反义词:gloomy
# ->
# -> 单词:windy
# -> 反义词:平静
```python
print(dynamic_prompt.format(input="big"))
# -> 给出每个输入的反义词
# ->
# -> 单词:happy
# -> 反义词:sad
# ->
# -> 单词:tall
# -> 反义词:short
# ->
# -> 单词:energetic
# -> 反义词:lethargic
# ->
# -> 单词:sunny
# -> 反义词:gloomy
# ->
# -> 单词:windy
# -> 反义词:calm
# ->
# -> 单词:big
# -> 反义词:平静
相反,如果我们提供一个非常长的输入,LengthBasedExampleSelector会选择较少的示例包含在提示中。long_string = "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else"
print(dynamic_prompt.format(input=long_string))
# -> 给出每个输入的反义词
# ->
# -> 单词:happy
# -> 反义词:sad
# ->
# -> 单词:big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else
# -> 反义词:平静

LangChain附带了一些示例选择器供我们使用,有关如何使用示例选择器,可以参考《自然语言处理从入门到应用——LangChain:提示(Prompts)》系列的后续文章。除此之外,我们还可以创建自定义示例选择器,根据我们想要的任何条件选择示例。

参考文献:
[1] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[2] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

相关文章:

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:基础知识]

分类目录:《自然语言处理从入门到应用》总目录 语言模型以文本作为输入,这段文本通常被称为提示(Prompt)。通常情况下,这不仅仅是一个硬编码的字符串,而是模板、示例和用户输入的组合。LangChain提供了多个…...

OpenPCDet调试出现的问题

Open3d遇到的问题,解决方案 1.ModuleNotFoundError: No module named ‘pcdet’ 原因:没有编译安装pcdet。 解决:进入openpcdet项目根目录,修改setup.py权限,并编译: sudo chmod 777 setup.py python set…...

【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】

4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…...

VBA技术资料MF34:检查Excel自动筛选是否打开

【分享成果,随喜正能量】聪明人,抬人不抬杠;傻子,抬杠不抬人。聪明人,把别人抬得很高,别人高兴、舒服了,看你顺眼了,自然就愿意帮你!而傻人呢?不分青红皂白&a…...

spring扩展点

在Spring框架中,有多个扩展点(Extension Point)可用于自定义和扩展应用程序的行为。这些扩展点允许开发人员介入Spring的生命周期和行为,并提供了灵活性和可定制性。以下是一些常见的Spring扩展点: BeanPostProcessor&…...

Skin Shader 使用自动生成的Thickness

Unity2023.2的版本,Thickness 自动化生成,今天测试了一把,确实不错。 1.Render 设置 在Project Settings->Graphics->HDRP Global Settings中 Frame Setting->Rendering->Compute Thickness 打开 2.Layer设置 2.1添加Layer&…...

Docker中的网络

文章目录 网络网桥(bridge)创建网桥接口hostnonecontaineroverlayoverlay底层原理 网络 网桥(bridge) 在Docker中,网桥(Bridge)是一种网络驱动,用于实现Docker容器之间和容器与宿主…...

SRS开源代码框架,协程库state-threads的使用

本章内容解读SRS开源代码框架,无二次开发,以学习交流为目的。 SRS是国人开发的流媒体服务器,C语言开发,本章使用版本:https://github.com/ossrs/srs/tree/5.0release。 目录 SRS协程库ST的使用源码ST协程库测试SrsAut…...

【QT 网络云盘客户端】——登录界面功能的实现

目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面,将数据 输入 到 用户名,昵称,密码,确认密码,手机,邮箱 的输入框中, 点…...

【复盘与分享】第十一届泰迪杯B题:产品订单的数据分析与需求预测

文章目录 题目第一问第二问2.1 数据预处理2.2 数据集分析2.2.1 训练集2.2.2 预测集 2.3 特征工程2.4 模型建立2.4.1 模型框架和评价指标2.4.2 模型建立2.4.3 误差分析和特征筛选2.4.4 新品模型 2.5 模型融合2.6 预测方法2.7 总结 结尾 距离比赛结束已经过去两个多月了。 整个过…...

X - Transformer

回顾 Transformer 的发展 Transformer 最初是作为机器翻译的序列到序列模型提出的,而后来的研究表明,基于 Transformer 的预训练模型(PTM) 在各项任务中都有最优的表现。因此,Transformer 已成为 NLP 领域的首选架构&…...

ubuntu下畅玩Seer(via wine)

第一步:安装wine 部分exe文件的运行需要32位的指令集架构,需要向Ubuntu系统中添加一个新的架构(i386),以支持32位的软件包。因为在64位的Ubuntu系统中,默认情况下只能安装和运行64位的软件。 通过添加i386…...

第五章:Spring下

第五章&#xff1a;Spring下 5.1&#xff1a;AOP 场景模拟 创建一个新的模块&#xff0c;spring_proxy_10&#xff0c;并引入下面的jar包。 <packaging>jar</packaging><dependencies><dependency><groupId>junit</groupId><artifactI…...

在CSDN学Golang云原生(Kubernetes基础)

一&#xff0c;k8s集群安装和升级 安装 Golang K8s 集群可以参照以下步骤&#xff1a; 准备环境&#xff1a;需要一组 Linux 服务器&#xff0c;并在每台服务器上安装 Docker 和 Kubernetes 工具。初始化集群&#xff1a;使用 kubeadm 工具初始化一个 Kubernetes 集群。例如&…...

给APK签名—两种方式(flutter android 安装包)

前提&#xff1a;给未签名的apk签名&#xff0c;可以先检查下apk有没有签名 通过命令行查看&#xff1a;打开终端或命令行界面&#xff0c;导入包含APK文件的目录&#xff0c;并执行以下命令&#xff1a; keytool -printcert -jarfile your_app.apk 将 your_app.apk替换为要检查…...

观察者模式、中介者模式和发布订阅模式

观察者模式 定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都将得到通知&#xff0c;并自动更新 观察者模式属于行为型模式&#xff0c;行为型模式关注的是对象之间的通讯&#xff0c;观察者模式…...

PHP-Mysql图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页phpStudy 设置导数据库后台的管理界面数据库表结构项目目录如图&#xff1a;代码部分&#xff1a;主页的head 配套资源作业&#xff1a; 本系列校训 用免费公开视频&am…...

网络传输层协议:UDP和TCP

背景知识 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序&#xff1b; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -…...

ElementUI Select选择器如何根据value值显示对应的label

修改前效果如图所示&#xff0c;数据值状态应显示为可用&#xff0c;但实际上仅显示了状态码1&#xff0c;并没有显示其对应的状态信息。在排查了数据类型对应关系问题后&#xff0c;并没有产生实质性影响&#xff0c;只好对代码进行了如下修改。 修改前代码&#xff1a; <…...

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪&#xff0c;今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数&#xff1f; 内联函数 的语义很简单&#xff1a;把函数体复制粘贴到函数调用处 。使用起来也毫无困难&#xff0c;用 inline关键字修饰函数即可。 语法&a…...

ESP32多任务水位监测:从Arduino到ESP-IDF的FreeRTOS实战

1. 项目概述&#xff1a;从Arduino到ESP-IDF的跃迁去年我在做毕业设计时&#xff0c;为了搭建一个ESP32的传感器节点演示程序&#xff0c;第一次深入使用了FreeRTOS。那段时间&#xff0c;我几乎天天和任务调度、队列、信号量打交道&#xff0c;从最初的一头雾水到后来能流畅地…...

全球无障碍宣传日:iOS 26 辅助功能大升级,这些实用小功能你用过吗?

辅助功能发展与升级很多人对辅助功能的印象还停留在 "小白点"&#xff0c;但随着 iPhone 进入全面屏时代&#xff0c;它逐渐变得陌生。实际上&#xff0c;Apple 每年都会为其增添功能&#xff0c;方便身体有障人士使用 iPhone。而且&#xff0c;这些功能不仅惠及有障…...

什么情况下会核销贷款

贷款核销的核心前提是&#xff1a;贷款被认定为 “损失类” 且经 “穷尽追偿” 仍无法收回&#xff0c;银行按监管与会计规则从账面冲销&#xff0c;但债权不消灭、仍可追偿。一、核心认定条件&#xff08;满足其一即可&#xff09;破产 / 注销 / 吊销&#xff1a;借款人和担保…...

我们公司全员把 Cursor 换成了自研的 全开源AtomCode

【引子】这是一篇实录——一位 CTO 用 28 天,用 Claude GLM 双模型调度,造出了一个让全公司放弃 Cursor 的工具。然后我意识到我们正在经历的事情,比"换工具"大得多。【读者承诺】接下来 15 分钟,你会拿到三件东西:一个真实案例(28 天 1,146 commits 是怎么做出来的…...

企业云盘签章技术方案:从数字签名原理到工程落地

背景 电子签章在企业云盘中的落地&#xff0c;不只是一个"上传盖章图片"的功能实现。本质上&#xff0c;它是一套涉及数字签名、PKI基础设施、文档完整性校验的综合性技术方案。本文从技术选型角度&#xff0c;说清楚企业云盘内置签章需要解决哪些问题、主流实现方案…...

对比按量计费与Token Plan套餐的实际成本差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比按量计费与Token Plan套餐的实际成本差异 在构建和运营基于大模型的应用时&#xff0c;成本控制是一个核心的工程考量。Taotok…...

掌握OpenCore Legacy Patcher:3步让老旧Mac焕发新生的实用指南

掌握OpenCore Legacy Patcher&#xff1a;3步让老旧Mac焕发新生的实用指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款开源…...

免费岛屿设计工具终极指南:Happy Island Designer 完整教程 [特殊字符]️

免费岛屿设计工具终极指南&#xff1a;Happy Island Designer 完整教程 &#x1f3dd;️ 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友…...

2026苹果芯片级数据恢复:揭秘唯一原厂技术真相

在数字生活高度依赖移动设备的今天&#xff0c;数据安全已成为每位用户的核心关切。尤其是苹果生态用户&#xff0c;当遭遇设备无法开机、系统崩溃或物理损坏时&#xff0c;“苹果芯片级数据恢复”便成为最后的一线希望。然而&#xff0c;市面上众多宣称“原厂技术”的服务商&a…...

终极PDF对比指南:3分钟掌握diff-pdf高效文档核对技巧

终极PDF对比指南&#xff1a;3分钟掌握diff-pdf高效文档核对技巧 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 还在为PDF文档版本混乱而烦恼吗&#xff1f;diff-pdf作为一款开…...