Model I/O
在LangChain中,
Model I/O
被称为:模型的输入与输出
,其有输入提示(Format)
、调用模型(Predict)
、输出解析(Parse)
等三部分组成。
1 | makefile复制代码1.提示模板: LangChain的模板允许动态选择输入,根据实际需求调整输入内容,适用于各种特定任务和应用。 |
提示模板
在LangChain的Model I/O中,提示模板是其组成之一,这里也主要申明记录
提示模板(Format)
的使用。
概述
语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助模型理解上下文并生成相关且连贯的基于语言的输出,例如回答问题、完成句子或参与某项活动、对话。
“提示”指的是模型的输入,这个输入很少是硬编码的,而是通常从多个组件构建而成的,恰哈提示模板就是负责构建这个输入的。
LangChain提示模板特点:
1 | makefile复制代码1.清晰易懂的提示: 提高提示文本的可读性,使其更易于理解,尤其是在处理复杂或涉及多个变量的情况下。 |
类型
在LangChain中,可以看到以下类型的提示模板:
1 | python复制代码1.LLM提示模板 PromptTemplate:常用的String提示模板 |
模板导入方式如下:
1 | python复制代码from langchain.prompts.prompt import PromptTemplate |
设置环境变量
1 | python复制代码import os |
PromptTemplate提示模板
创建提示模板
创建一个PromptTemplate提示模板,有2种方式来创建。
1.通过from_template方法从字符串模板中创建提示模板
1 | python复制代码# 导入LangChain中的提示模板 |
提示模板的具体内容如下:
1 | python复制代码input_variables=['text'] template='您是一位专业的文案写手。\n对于信息 {text} 进行简短描述' |
2.直接生成提示模板
通过提示模板类的构造函数,在创建模板时手工指定input_variables
1 | python复制代码from langchain.prompts import PromptTemplate |
使用提示模板
调用语言模型,让模型帮写文案,并返回文案结果。
将模板实例化,将 {text}
替换为 "猪八戒吃人参果"
,形成具体的提示:“您是一位专业的文案写手。对于信息 猪八戒吃人参果 进行简短描述”
1 | python复制代码# 导入LangChain中的OpenAI模型接口 |
1 | python复制代码猪八戒是一位贪吃的神仙,他最爱的美食就是人参果。每当他闻到人参果的香味,就会忍不住大快朵颐,吃得津津有味。然而,人参果却是一种珍稀的仙果,吃多了会让猪八戒变得更加贪婪和暴躁,甚至会影响他的神仙身份。因此,猪八戒每次都要克制自己的食欲,才能保持神仙的本性。尽管如此,每当有人提起人参果,他仍然会忍不住流口水,渴望再次品尝这种美味的禁果。 |
复用提示模板
复用提示模板,可以同时生成多个结果。
1 | python复制代码# 导入LangChain中的OpenAI模型接口 |
模型输出如下:
1 | python复制代码猪八戒是一位贪吃的妖怪,但他最爱吃的不是普通的食物,而是人参果。这种奇特的水果具有神奇的功效,能够增强生命力,让人变得更加健康强壮。但如果被猪八戒吃掉,可能会让他变得更加凶猛可怕。 |
ChatPromptTemplate聊天提示模板
LangChain提供了几个相关的提示模板,以便轻松构建和处理提示。在使用聊天模型时,建议使用这些与聊天相关的提示模板,而不是PromptTemplate,以充分发挥基础聊天模型的潜力。
PromptTemplate创建字符串提示的模板。默认情况下,使用Python的str.format语法进行模板化。而ChatPromptTemplate是创建聊天消息列表的提示模板。
创建一个ChatPromptTemplate提示模板,模板的不同之处是它们有对应的角色。
基本使用
通过from_messages方法,传入简单的聊天列表数据,以此创建提示模板
1 | python复制代码from langchain.prompts.chat import ChatPromptTemplate |
1 | python复制代码content='我喜欢编程。' response_metadata={'token_usage': {'completion_tokens': 8, 'prompt_tokens': 48, 'total_tokens': 56}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_b28b39ffa8', 'finish_reason': 'stop', 'logprobs': None} id='run-365c447e-f3d7-4d07-b5f2-7953752d4ba6-0' |
进阶使用
LangChain提供不同类型的MessagePromptTemplate.最常用的是AIMessagePromptTemplate、 SystemMessagePromptTemplate和HumanMessagePromptTemplate,分别创建人工智能消息、系统消息和人工消息。
要创建与角色相关联的消息模板,可以使用MessagePromptTemplate。
1 | python复制代码# 导入聊天消息类模板 |
更直接地构建MessagePromptTemplate,可以在外部创建一个PromptTemplate,然后将其传递进去
1 | python复制代码prompt=PromptTemplate( |
少量样本示例的提示模板
基于LLM模型与聊天模型,可分别使用FewShotPromptTemplate或FewShotChatMessagePromptTemplate,两者使用基本一致。
这里主要使用FewShotPromptTemplate,它是一个复杂的提示模板,它包含多个示例和一个提示。这种模板可以使用多个示例来指导模型生成对应的输出。
使用FewShotPromptTemplate类来创建使用少量样本示例的提示模板,此类要么接受一组示例,要么接受一个ExampleSelector对象。
创建示例集
创建一些提示样本,每个示例都是一个字典,其中键是输入变量,值是输入变量的值。
1 | python复制代码examples = [ |
创建提示模板
配置一个格式化程序,将Few-shot示例格式化为字符串。这个格式化程序应该是一个PromptTemplate对象。
1 | python复制代码from langchain.prompts import PromptTemplate |
创建FewShotPromptTemplate对象
创建一个FewShotPromptTemplate对象。这个对象接受Few-shot示例和Few-shot示例格式化程序
1 | python复制代码# 创建一个FewShotPromptTemplate对象 |
使用
初始化大模型,然后调用
1 | python复制代码from langchain_openai import OpenAI |
示例选择器
概述
LangChain提供示例选择器来提高效率,避免一次性发送所有示例给模型,同时减少使用的Token数量。
如果有大量示例,可能需要选择要包含在提示中的示例,示例选择器是负责执行此操作的类。
LangChain有几种不同类型的示例选择器。
名称 | 描述 |
---|---|
SemanticSimilarityExampleSelector | 使用输入和示例之间的语义相似性来决定选择哪些示例。 |
MaxMarginalRelevanceExampleSelector | 使用输入和示例之间的最大边际相关性来决定选择哪些示例。 |
LengthBasedExampleSelector | 根据一定长度内可以容纳的数量来选择示例 |
NGramOverlapExampleSelector | 使用输入和示例之间的 ngram 重叠来决定选择哪些示例。 |
这里使用SemanticSimilarityExampleSelector示例选择器,基于少量样本示例的提示模板结合示例选择器进行使用,具体使用参考如下
安装Chroma向量数据库
示例选择器使用向量相似度比较,需要安装向量数据库。这里使用了开源的Chroma。
安装Chroma
1 | python复制代码pip install chromadb |
定义示例集
1 | python复制代码# 定义包含的示例 |
创建提示模板
1 | python复制代码from langchain.prompts import PromptTemplate |
示例选择器
不直接将示例馈送到FewShotPromptTemplate对象中,而是将其馈送到ExampleSelector对象中
1 | python复制代码# 导入FewShotPromptTemplate对象 |
创建FewShotPromptTemplate对象
创建一个FewShotPromptTemplate对象。该对象接受示例选择器和few shot示例的格式化程序。
1 | python复制代码# 创建一个使用示例选择器的FewShotPromptTemplate对象 |
使用
1 | python复制代码# 调用大模型 |
PipelinePromptTemplate提示模板
概述
LangChain 包含一个抽象 PipelinePromptTemplate,当想要重用部分提示时,它会很有用。
PipelinePrompt 由两个主要部分组成:
1 | 复制代码最终提示:返回的最终提示 |
最终提示
创建要给最终提示模板,它由多个提示模板构成最终模板。
1 | python复制代码from langchain_core.prompts.prompt import PromptTemplate |
多个提示
创建多个提示模板,由这些模板构成最终完整的提示模板,这些单个提示模板可以实现复用的效果。
1 | python复制代码# 创建一个介绍模板 |
管道提示
组合单个可复用提示模板成一个管道提示模板
1 | python复制代码from langchain_core.prompts.pipeline import PipelinePromptTemplate |
使用
1 | python复制代码# 提示模板所需的变量名称列表 |
执行日志如下
1 | python复制代码['example_q', 'person', 'input', 'example_a'] |
部分提示模板
概述
“部分”提示模板是有意义的,例传递所需值的子集,以创建仅需要剩余值子集的新提示模板。
LangChain通过两种方式支持这一点:
1 | 复制代码1.使用字符串值进行部分格式化 |
基本使用
先使用字符串值部分化提示模板,然后传递部分化的提示模板
1 | python复制代码from langchain_core.prompts import PromptTemplate |
在初始化提示模板时,使用字符串值部分化变量
1 | python复制代码prompt = PromptTemplate( |
使用返回字符串值的函数进行部分处理,适用于总是想以一种常见的方式获取一个变量时
1 | python复制代码from datetime import datetime |
本文转载自: 掘金