简介

prompts是大语言模型的输入,他是基于大语言模型应用的利器。没有差的大语言模型,只有差的prompts。

写好prompts才能发挥大语言模型300%的功力。

理论上,要写好prompts其实不是那么容易的,但是langchain把这个理论变成了现实,一起来看看吧。

好的prompt

有时候,不是我们使用的语言模型不够好,而是因为我们写的prompt不够优秀。

以下是一些写好大语言模型的prompts的几条原则:

  1. 具体和详细:prompts应该具有明确的问题或任务,同时包含足够的细节和背景信息,以便大语言模型能够理解和回答。

  2. 可理解和可回答:prompts应该明确清晰,让大语言模型能够理解并且回答。避免使用过于抽象、模糊或带有攻击性的语言。

  3. 有情境和背景:prompts应该包含足够的情境和背景信息,让大语言模型能够理解问题的重要性和意义,并在回答中提供有意义的信息。

  4. 有目标和方向:prompts应该明确问题或任务的目标和方向,以便大语言模型能够为需要的信息提供清晰和有用的答案。

  5. 可扩展和可定制: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在手,天下我有的更多相关文章

  1. [LeetCode] Palindrome Partitioning II 拆分回文串之二

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  2. Pyqt在QListWidget中添加右键菜单

    Pyqt 的资料奇少, 攻破难点之后, 就在这里记一下笔记. QListWidget 是继承 QWidget 的, 所以 QListWidget 是有右键菜单的, 从文档上可以找到 QWidget 上 ...

  3. js-day05-JSON-jQuery初体验

    JSON数据格式 JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧.易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)JSON是JavaSc ...

  4. Mysql高级查询 内连接和外连接详解

    一.内连接(INNER JOIN) 1.等值连接 概述:指使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录. 语法: SELECT 列 FRO ...

  5. App工程结构

    在经过千辛万苦各种填坑终于安装好了Android Studio之后,在其自带的模拟器上成功运行了第一个APP(hello world),通过这个APP首先研究了一下APP基本的工程结构,从而使后面的开 ...

  6. 至少你要了解RSS

    本文概要: 1.RSS是什么,有什么作用? 2.是不是所有的网站都有RSS功能? 3.没有RSS功能的网站如何订阅? 4.RSS是否已经过时? 5.推荐一些热门的RSS订阅地址 1.RSS是什么,有什 ...

  7. 老板让只懂Java基本语法的我,基于AQS实现一个锁

    10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...

  8. ArrayPool 源码解读之 byte[] 也能池化?

    一:背景 1. 讲故事 最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数 ...

  9. C# ArrayPool 源码解读之 byte[] 池化

    一:背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数组 ...

  10. Ceph在手,天下我有

    有人问我,你是如何做到统一存储的?我微微一笑,大声告诉他:Ceph在手,天下我有. Ceph是一个统一的分布式存储系统,旨在实现出色的性能,可靠性和可扩展性.认了OpenStack做大哥之后更是一发不 ...

随机推荐

  1. kali linux 基本渗透测试流程

    渗透测试流程 1. 信息收集阶段 网络拓扑结构分析 使用nmap扫描目标网络,获取目标主机IP地址和开放端口信息 使用whois查询目标域名的注册信息和DNS服务器信息 使用nslookup查询目标域 ...

  2. 微服务为什么要用到 API 网关?

    本文介绍了 API 网关日志的价值,并以知名网关 Apache APISIX 为例,展示如何集成 API 网关日志. 作者程小兰,API7.ai 技术工程师,Apache APISIX Contrib ...

  3. 2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

    4月22日,2023首届云数据库技术沙龙 MySQL x ClickHouse 专场,在杭州市海智中心成功举办.本次沙龙由玖章算术.菜根发展.良仓太炎共创联合主办.围绕"技术进化,让数据更智 ...

  4. Html/css 列表项 区分列表首尾

    列表项,有时需要判断列表首尾,来筛选设置样式 如上图,三个项有间隔,怎么保证设置了列表项之间的距离后,整体还水平居中显示呢? .item:not(:first-child) { margin-left ...

  5. java中的 \r——字符串消失了

    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 使用Integer.parseInt( ...

  6. prism journal导航按钮的可用性探索记录

    prism使用导航功能的时候,跳了几个坑,记录一下. 1.导航记录的产生,是在区域导航过程中产生的. _regionManager.Regions[PrismManager.MainViewRegio ...

  7. ai问答:vue3+pinia+WebSocket 封装断线重连(实战)

    把socket实例 挂载到全局 为方便梳理,请忽略typescript # main.ts import {createApp} from 'vue' import App from './App.v ...

  8. React笔记-组件通信(六)

    React笔记-组件通信(六) props概念 props是组件之间通讯的纽带 props也是组件中内置的一个属性 通过父级组件传入 在类组件里 可以直接通过this.props获取 注意: prop ...

  9. 2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor

    2023-04-17:设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词. 实现 WordFilter 类: WordFilter(string[] words) 使用词典中的单词 wor ...

  10. 2022-09-23:整数数组 stations 表示 水平数轴 上各个加油站的位置。给你一个整数 k 。 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数

    2022-09-23:整数数组 stations 表示 水平数轴 上各个加油站的位置.给你一个整数 k . 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数 ...