langchain:Prompt在手,天下我有
简介
prompts是大语言模型的输入,他是基于大语言模型应用的利器。没有差的大语言模型,只有差的prompts。
写好prompts才能发挥大语言模型300%的功力。
理论上,要写好prompts其实不是那么容易的,但是langchain把这个理论变成了现实,一起来看看吧。
好的prompt
有时候,不是我们使用的语言模型不够好,而是因为我们写的prompt不够优秀。
以下是一些写好大语言模型的prompts的几条原则:
具体和详细:prompts应该具有明确的问题或任务,同时包含足够的细节和背景信息,以便大语言模型能够理解和回答。
可理解和可回答:prompts应该明确清晰,让大语言模型能够理解并且回答。避免使用过于抽象、模糊或带有攻击性的语言。
有情境和背景:prompts应该包含足够的情境和背景信息,让大语言模型能够理解问题的重要性和意义,并在回答中提供有意义的信息。
有目标和方向:prompts应该明确问题或任务的目标和方向,以便大语言模型能够为需要的信息提供清晰和有用的答案。
可扩展和可定制:prompts应该设计成易于扩展和定制,以适应不同的应用场景和用户需求。
因为很多时候,在类似的场景中,我们的prompts的大体结构是一样的,只有具体的细节描述有所不同,这时候,就需要用到prompt template.
什么是prompt template
prompt template就是一个prompt的模板,通过prompt template,我们可以快速的生成多个prompt。
基本上prompt template已经帮我们描述好了场景,要做的事情。我们只需要填入具体的内容即可。
下面是一个prompt template的简单例子:
from langchain import PromptTemplate
template = """/
假如你是一个金融公司的理财经理,请你分析一下{stock}这只股票。
"""
prompt = PromptTemplate.from_template(template)
prompt.format(stock="腾讯控股")
假如你是一个金融公司的理财经理,请你分析一下腾讯控股这只股票。
这样,对于用户来说,只需要输入需要问询的股票名称即可。其他的一长串文字就不需要了,大大节省了prompt构建的时间。
当然,这只是一个非常简单的例子,你还可以在prompt template中设置回答的格式,提供具体的例子等等,从而得到更好的回复。
在langchain中创建prompt template
简单点说prompt template就是一个格式化输入的东西。在langchain中,对应的工具类叫做PromptTemplate。
上面的简单例子中,我们已经大体看到了如何使用PromptTemplate。
在上例中,我们调用了PromptTemplate.from_template方法,传入了一个template的字符串。
在template的字符串中,我们用括号定义了一个变量。最后调用prompt.format方法,指定变量的名称和值,完成prompt的最终创建。
另外,prompt template中还可以指定多个变量:
template = "请告诉我一个关于{personA}的{thingsB}"
prompt_template = PromptTemplate.from_template(template)
prompt_template.format(personA="小张", thingsB="故事")
只需要在format中指定变量名称即可。
除了是用PromptTemplate.from_template方法之外,我们还可以直接使用PromptTemplate的构造函数来创建prompt。
PromptTemplate的构造函数可以接受两个参数:input_variables和template。
input_variables是template中的变量名字,它是一个数组。
template就是模板的具体内容,是个字符串。
比如,我们可以构造无变量的模板:
no_input_prompt = PromptTemplate(input_variables=[], template="这是一个无参数模板。")
no_input_prompt.format()
我们还可以构造带参数模板:
one_input_prompt = PromptTemplate(input_variables=["stock"], template="假如你是一个金融公司的理财经理,请你分析一下{stock}这只股票。")
one_input_prompt.format(stock="腾讯控股")
还有多个参数的模板:
multiple_input_prompt = PromptTemplate(
input_variables=["personA", "thingsB"],
template="请告诉我一个关于{personA}的{thingsB}"
)
multiple_input_prompt.format(personA="小张", thingsB="故事")
Chat特有的prompt template
之前在介绍langchain的时候有跟大家提到过,chat虽然是基于LLM的,但是和基本的LLM还有有区别的。
最主要的区别在于,chat消息是不同角色的。比如在openai中,chat消息就可以被分为AI, human或者system这几种角色。
这样做虽然复杂了一点,但是可以更好的对消息进行分类处理。
我们看下langchain中关于chat的PromptTemplate有哪些:
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
和普通的prompt template一样,我们可以调用MessagePromptTemplate的from_template来创建对应的prompt:
template="现在你的角色是{role},请按该角色进行后续的对话."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
当然你可以通过构造函数来创建prompt:
prompt=PromptTemplate(
template="现在你的角色是{role},请按该角色进行后续的对话.",
input_variables=["role"],
)
有了一个或者多个MessagePromptTemplates之后,就可以使用这些MessagePromptTemplates来构建ChatPromptTemplate了:
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_prompt(role="医生", text="帮我看看我的颜值还行吗?").to_messages()
总结
好了, 基本的langchain中的prompt template已经介绍完毕。大家去试试看吧。
langchain:Prompt在手,天下我有的更多相关文章
- [LeetCode] Palindrome Partitioning II 拆分回文串之二
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- Pyqt在QListWidget中添加右键菜单
Pyqt 的资料奇少, 攻破难点之后, 就在这里记一下笔记. QListWidget 是继承 QWidget 的, 所以 QListWidget 是有右键菜单的, 从文档上可以找到 QWidget 上 ...
- js-day05-JSON-jQuery初体验
JSON数据格式 JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧.易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)JSON是JavaSc ...
- Mysql高级查询 内连接和外连接详解
一.内连接(INNER JOIN) 1.等值连接 概述:指使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录. 语法: SELECT 列 FRO ...
- App工程结构
在经过千辛万苦各种填坑终于安装好了Android Studio之后,在其自带的模拟器上成功运行了第一个APP(hello world),通过这个APP首先研究了一下APP基本的工程结构,从而使后面的开 ...
- 至少你要了解RSS
本文概要: 1.RSS是什么,有什么作用? 2.是不是所有的网站都有RSS功能? 3.没有RSS功能的网站如何订阅? 4.RSS是否已经过时? 5.推荐一些热门的RSS订阅地址 1.RSS是什么,有什 ...
- 老板让只懂Java基本语法的我,基于AQS实现一个锁
10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...
- ArrayPool 源码解读之 byte[] 也能池化?
一:背景 1. 讲故事 最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数 ...
- C# ArrayPool 源码解读之 byte[] 池化
一:背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数组 ...
- Ceph在手,天下我有
有人问我,你是如何做到统一存储的?我微微一笑,大声告诉他:Ceph在手,天下我有. Ceph是一个统一的分布式存储系统,旨在实现出色的性能,可靠性和可扩展性.认了OpenStack做大哥之后更是一发不 ...
随机推荐
- Podman Desktop安装与使用-Windows10
Podman Desktop安装与使用-Windows10 下载 containers/podman 地址 Podman Desktop Downloads 地址 我这里演示的是podman-v4.4 ...
- c/c++快乐算法第二天
c/c++感受算法乐趣(2) 开始时间2023-04-15 22:26:49 结束时间2023-04-16 00:18:16 前言:首先我们来回忆一下昨天接触了些什么算法题,1.1百钱百鸡问题,1.2 ...
- spring boot过滤器实现项目内接口过滤
spring boot过滤器实现项目内接口过滤 业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统. 现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务. ...
- OpenCv单模版多目标匹配
OpenCv单模版多目标匹配 单模版匹配出现的问题 一. 关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确. 我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征 ...
- vue本地开发配置及项目部署
一, 二,本地模拟配置代理,请求qq音乐的接口数据 三,axios请求头封装 参考http://www.axios-js.com/zh-cn/docs/#%E4%BB% ...
- FFmpeg开发笔记(二)搭建Windows系统的开发环境
由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...
- vCenter报错:Log Disk Exhaustion on 10
vCenter报错:Log Disk Exhaustion on 10 1.问题现象: 巡检时发现 vCenter Server 中,错误显示为:Log Disk Exhaustion on 10(字 ...
- 【Vue2】编程式路由导航
在Vue Router中,除了使用 创建 a 标签来定义导航链接之外,还可以使用Vue Router通过编写代码来实现导航. 他提供的三个实例方法:router.push.router.replace ...
- 2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109
2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值. 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109 ...
- Element-DatePicker的宽度
Element如何修改DatePicker的宽度 方法/步骤 1 打开一个vue文件,添加DatePicker日期选择器组件,设置默认日期为null.如图 2 在组件上添加style样式属性,设置wi ...