LangChain入门学习笔记(三)—— Model I/O之Prompts

如果说LCEL是粘合剂,那么它需要粘合起来的要素就是各种组件。其中最核心的要素就是LangChain官方文档中定义的Model I/O:Prompts、Chat Models、LLMs和Output Parsers。这4个基本组件,可以处理基本的用户输入并通过大模型处理后按要求输出。

这一章主要介绍第一个组件:Prompts,即用户输入的提示语。

使用示例模板

简单str.format语法

在实际应用中,LLM应用并不直接处理用户的输入,这是因为用户的输入大多数情况并不全面,或者并不规范。所以在实际开发中会使用提示语模板(Prompt Templates),将用户的输入作为其中的一部分填入模板产生最终的提示语后再输入给大模型进行处理。

最简单的用法就像Python中str的format方法:

PromptTemplate.from_template("Write a short poem about {topic}").format(topic="bear")

模板"Write a short poem about {topic}"将用户的输入("bear")作为topic的替换,最终结果是:

局部Prompt模板(Partial Prompt Templates)

有时候提示语模板中的变量不是同时获得的,所以无法一并将模板中的变量进行赋值。LangChain提供了分步给模板进行赋值的方法,通过多次赋值获得最终的提示语。

prompt = PromptTemplate.from_template("{var1}{var2}{var3}")
partial_prompt1 = prompt.partial(var1="foo")
partial_prompt2 = partial_prompt1.partial(var2="baz")
print(partial_prompt2.format(var3="Zzz"))

上面代码中先定义了模板"{var1}{var2}{var3}",然后第一步通过partial()方法给"{var1}"赋值了"foo",这个中间变量再次通过partial()方法给"{var2}"赋值了"baz",最后通过format给第3个变量"{var3}"赋值"Zzz"后产生最终的提示语字符串输出:

给Prompt提供样例

为了生成更加精准的结果,在输入的时候可以提供样例(examples),提示大模型按照样例形式给出相应内容。FewShotPromptTemplate用于进行带样例提示语的封装,主要参数有:

  • examples: 提供样例。
  • example_prompt:样例提示语的模板,该模板中的input_variables定义了template中使用的变量。
  • prefix:在样例提示语之前的自定义内容。
  • suffix:在样例提示语后的自定义内容。
  • input_variables:该带样例的提示语中用到的变量。

来看下面代码示例:

from langchain_community.llms.ollama import Ollama
from langchain_core.prompts.few_shot import FewShotPromptTemplate
from langchain_core.prompts.prompt import PromptTemplate# template参数提供样例模板, input_variables指定模板中期望的变量名称列表
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}"
)# 提供的样例列表
examples = [{"question": "Who lived longer, Muhammad Ali or Alan Turing?","answer": """
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
""",},{"question": "When was the founder of craigslist born?","answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952
""",},{"question": "Who was the maternal grandfather of George Washington?","answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball
""",},{"question": "Are both the directors of Jaws and Casino Royale from the same country?","answer": """
Are follow up questions needed here: Yes.
Follow up: Who is the director of Jaws?
Intermediate Answer: The director of Jaws is Steven Spielberg.
Follow up: Where is Steven Spielberg from?
Intermediate Answer: The United States.
Follow up: Who is the director of Casino Royale?
Intermediate Answer: The director of Casino Royale is Martin Campbell.
Follow up: Where is Martin Campbell from?
Intermediate Answer: New Zealand.
So the final answer is: No
""",},
]# 定义带少样例(few-shot)的提示语模板
prompt = FewShotPromptTemplate(examples=examples,  # 提供样例example_prompt=example_prompt,  # 提示语模板prefix="Answer questions like examples below:",  # 提示语之前的自定义内容suffix="Question: {input}",  # 提示语最后的输入内容模板input_variables=["input"],
)# 初始化打模型
model = Ollama(model="llama3", temperature=0)chain = prompt | model# 传入input生成最终的提示语并调用chain
print(chain.invoke({"input": "Who was the father of Mary Ball Washington?"}))

当输入"input"的内容后,调用llama3大模型的chain,得到下面输出:

可以看出回复是根据样例中的内容给出。

挑选需要的样例

由于各种原因,我们可能需要从提供的样例中挑选合适的部分内容填入提示语。LangChain提供了样例选择器(Example Selector)用来选择合乎要求的内容,BaseExampleSelector主要定义了两个抽象方法:

  • add_example:添加字典类型的候选样例。
  • select_examples:通过定义的规则选择合适的样例。
class BaseExampleSelector(ABC):"""Interface for selecting examples to include in prompts."""@abstractmethoddef select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""Select which examples to use based on the inputs."""@abstractmethoddef add_example(self, example: Dict[str, str]) -> Any:"""Add new example to store."""

LangChain提供了一些常用的选择类:

  • LengthBasedExampleSelector:根据样例的长度选择样例,确保所选样例的总长度不超过指定的最大长度限制。
  • SemanticSimilarityExampleSelector:根据样例与输入的语义相似度选择最相关的样例。它使用向量存储(如Chroma)来存储样例的嵌入向量,并基于余弦相似度进行匹配。
  • MaxMarginalRelevanceExampleSelector:根据样例与输入的语义相似度选择最相关的样例,同时还考虑了样例之间的多样性。与SemanticSimilarityExampleSelector不同的地方是MaxMarginalRelevanceExampleSelector通过最大边际相关性(MMR)算法惩罚与已选择样例过于相似的样例来达到所选样例多样性的目的。
  • NGramOverlapExampleSelector:根据样例与输入的n-gram重叠分数(0-1之间的相似度分数)选择和排序样例。

开发者也可以自定义样例选择类,只要继承BaseExampleSelector类,并重写select_examples方法和add_example方法即可。

class CustomExampleSelector(BaseExampleSelector):def __init__(self, examples):self.examples = examplesdef add_example(self, example):self.examples.append(example)def select_examples(self, input_variables):...

以长度挑选样例的LengthBasedExampleSelector举例来说,代码如下:

from langchain_core.example_selectors import LengthBasedExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate# 提供输入的样例
examples = [{"input": "happy", "output": "sad"},{"input": "tall", "output": "short"},{"input": "energetic", "output": "lethargic"},{"input": "sunny", "output": "gloomy"},{"input": "windy", "output": "calm"},
]example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)
example_selector = LengthBasedExampleSelector(# 传入样例examples=examples,# 传入样例模板example_prompt=example_prompt,# 样例的最大长度,由LengthBasedExampleSelector的get_text_length计算长度。不超过max_length长度情况下,用例被选入。max_length=20,
)# FewShotPromptTemplate中传入example_selector进行样例过滤
dynamic_prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,prefix="Give the antonym of every input",suffix="Input: {adjective}\nOutput:",input_variables=["adjective"],
)print(dynamic_prompt.format(adjective="big"))

与直接使用FewShotPromptTemplate不同的是,这里传入了example_selector,而这里的example_selector正是基于长度进行样例选择的LengthBasedExampleSelector。经过最大长度过滤后的结果如下截图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有超头、最低价的视频号618战况如何?有何趋势变化?| 视频号618观察

转眼618大促已接近尾声,今年的你有剁手哪些好物吗?对618的整体感觉又是如何呢? 这是12年来,第一个电商平台没有预售付定金的618,当然或许此后的双11、每一次大促也将逐渐回归传统,回归本质。 而对于视频号来…

拒绝吸烟,远离慢阻肺——朗格力复合营养素助力守护肺部健康

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 你知道吗?慢阻肺这一疾病在我国的患者数量已突破亿级大关,尤其在40岁以上的成年人中,平均每7个人中就有1位可能受其困扰。然而,很多人对慢阻肺的严重性认识不足,常常将其视为一种普通的咳嗽或喘息,忽视了它潜在的危…

js 将日期转换成大写格式

最近做了个需求将日期转换成大写汉字,网上搜的不对。进行改正后如下: function dateToChinese(date) {var chinese [零, 一, 二, 三, 四, 五, 六, 七, 八, 九];var y date.getFullYear().toString();var m date.getMonth().toString();var d date.g…

Java——访问修饰符

一、访问修饰符是什么 Java中的访问修饰符用于控制类、接口、构造函数、方法和数据成员(字段)的可见性和访问级别。 Java提供了四种访问修饰符: 访问修饰符同一类内同一包内不同包的子类不同包的非子类适用对象public可见可见可见可见类、…

gorm存储json

在一些存储配置文件的场景下,我们需要在mysql中存储json。最直接的方法是在存储时通过json.Marshall()序列化方法将需要存储的对象转化为json字符串,然后再存入mysql中。需要使用时,从mysql中取出,再进行json.Unmarshall()。具体操…

fataadmin导出Exel文件图片太大

// 导出图片过大处理 exportOptions: {ignoreColumn: [0, operate],onBeforeSaveToFile: function (data, fileName, type, charset, encoding, bom) {return $.fn.bootstrapTable.defaults.extend.savestatus;},onCellHtmlHyperlink: function ($cell, rowIndex, colIndex, hr…

Pytorch Geometric(PyG)入门

PyG (PyTorch Geometric) 是建立在 PyTorch 基础上的一个库,用于轻松编写和训练图形神经网络 (GNN),适用于与结构化数据相关的各种应用。官方文档 Install PyG PyG适用于python3.8-3.12 一般使用场景:pip install torch_geometric 或conda …

AI大模型部署Ubuntu服务器攻略

一、下载Ollama 在线安装: 在linux中输入命令curl -fsSL https://ollama.com/install.sh | sh 由于在linux下载ollama需要经过外网,网络会不稳定,很容易造成连接超时的问题。 离线安装: 步骤一: 下载Ollama离线版本…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一, 文档描述二, Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一, 文档描述 RT600的启动模式共支持4种: 1&am…

【jdk】jdk11 jdk17 jdk21的新特性

前言:按照博主的个人理解,一般来说 除了jdk8时代 说jdk8的新特性是特指jdk8这一个版本的特性,之后例如jdk11 jdk17新特性 都是泛特性 什么意思呢? 比如jdk11新特性,一般是指jdk9——jdk11 这一个泛版本的所有新特性&am…

第十五届蓝桥杯Python大学B组国赛/决赛 I题题解

大概题目 某国王要给n个岛之间修桥,桥是双向的,国王可以将a岛和b岛连接起来,也可以将两座岛的桥炸掉,国王想知道经过一系列操作之后两座岛之间是否连接。 输入:岛屿数量n,每行第一个数是选择,…

【C++】类的六个默认成员函数

文章目录 类的六个默认成员函数一、构造函数二、析构函数三、拷贝构造函数四、赋值运算符重载五、const成员六、取地址及const取地址操作符重载 类的六个默认成员函数 如果一个类中什么成员都没有,称为空类。空类中真的什么都没有吗?并不是,…

CRMEB 多店商品详情页装修说明

一、功能介绍 商家可调整商品详情各板块样式,可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息,排行榜 控制商品详情页面会员信息及排行榜的…

SRM供应商管理系统是什么?企业为何都非常重视供应商管理?

企业与供应商之间的关系就像一张错综复杂的网,维系着生产的顺利进行。但是,这张网也时常让企业感到焦虑和困扰。例如, 如何准确地评估供应商的信誉和实力? 如何高效地与众多供应商沟通,确保信息的及时传递和反馈&…

自动驾驶车辆路径规划

在自动驾驶领域,轨迹搜索(Trajectory Searching)和轨迹生成(Trajectory Generation)是两个密切相关但有所不同的概念,它们都是自动驾驶车辆规划其行驶路径的关键步骤。 轨迹搜索(Trajectory Se…

虚拟机安装镜像文件时候报错VT-x

在虚拟机(VM)安装操作系统时,特别是在 VMware 或 VirtualBox 中,常见的需要修改 BIOS 设置的情况包括启用硬件虚拟化和调整启动顺序等。这些设置对于确保虚拟机能够正常启动和操作非常重要。 常见需要修改的 BIOS 设置包括&#…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1,预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

基于DPU的云原生裸金属服务快速部署及存储解决方案

1. 背景介绍 1.1. 业务背景 在云原生技术迅速发展的当下,容器技术因其轻量级、可移植性和快速部署的特性而成为应用部署的主流选择,但裸金属服务器依然有其独特的价值和应用场景,是云原生架构中不可或缺的一部分。 裸金属服务器是一种高级…

主机游戏也可以上云桌面玩了?

最近steam夏季促销活动也快到了,对于很多钟情于主机游戏的小伙伴们,是不是也在摩拳擦掌了? 但有时候现实想愉快地玩到自己想玩的游戏实在是太难了! 当你一直关注的新游戏终于上线Steam时,你的钱包是这样的… 而游戏的…

前端新手小白的Vue3入坑指南

昨天有同学说想暑假在家学一学Vue3,问我有没有什么好的文档,我给他找了一些,然后顺带着,自己也写一篇吧,希望可以给新手小白们一些指引,Vue3欢迎你。 目录 1 项目安装 1.1 初始化项目 1.2 安装初始化依…