欢迎来到我的LangChain系列,如果您也和我一样,想通过学习LangChain开始AI应用开发。那就请一起来学习它的各个功能模块和demo实例。
LangChain 三 Data Connections – 掘金 (juejin.cn)
前言
如果在做后端开发的时候,需要提前设计数据库。那么,在开发AI应用时,先需要设计Prompt。Prompt提示词工程,已经成为AI应用工程的重要环节。这篇,让我们一起来学习LangChain
为提示词工程提供的流程和便利…
提示词
提示词即Prompt, 指向模型提供的输入。就好像SQL由几部分构成, 在设计中要遵守一些范式一样,Prompt也有它自己的设计哲学,并在快速成长为一门挖金显学….
LangChain
提供了一系列的类和函数,简化了构建和处理提示词的过程。
提示词模板
提示词模板,大家可以类比Vue模板(非前端不适应sorry,我是前端老狗),它可以接受传参,像vue模板一样,具备重用性。这对于我们的AI应用是非常重要的,我们的一些应用也许在交互的时候就是以几套Prompt模板构成。每套模板都能独当一面。
一个提示模板包括以下几部分:
- 对语言模型的指令
- 一组少样本示例,以帮助语言模型生成更好的回复,即few shots
- 向llm 提出的问题
# 引入提示词模板类
from langchain import PromptTemplate
# 模板中包含参数 src_lang dst_lang
template = """
你精通多种语言,是专业的翻译官。你负责{src_lang}到{dst_lang}的翻译工作。
"""
# 由PromptTemplate的from_template方法来生成pormpt
prompt = PromptTemplate.from_template(template)
# 调用format方法生成模板字符串
print(prompt.format(src_lang="英文", dst_lang="中文"))
从打印结果,可以感觉PromptTemplate有点类似于字符串模板编译。先定义模块,再传参,format编译。
PromptTemplate类是LangChain提供的模板基础类,它接收两个参数
- input_variable 输入变量
- template 模板
模板通过{}来引用输入的变量,和vue/react很像吧!
我们再来看个例子。
multiple_input_prompt = PromptTemplate(
input_variables=["color", "animal"],
template="A {color} {animal} ."
)
multiple_input_prompt.format(color="black", animal="bear")
这个例子和上个例子写法不同, 但是一回事。上面的例子是通过PromptTemplate.from_template(template)方法先传prompt创建模板,这个例子是真是直接通过PromptTemplate构建函数实例化的过程创建,我们通过input_variables指定了参数为color和animal,它的类型是数组,再通过template设置了模板。
聊天提示词模板
以OpenAI为例,AI聊天应用中的消息由角色、内容等构成。LangChain
为我们提供了相关提示词模板。
# 我们引入了ChatPromptTemplate 以及各种角色聊天模板
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
# 消息schema
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
# 制作system_template 聊天应用系统角色为翻译专家。
system_template="You are a professional translator that translates {src_lang} to {dst_lang}."
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
# 用户聊天模板就是简单的用户聊天内容
human_template="{user_input}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
# chat_prompt 统一system_message_prompt和human_message_prompt
# 我们向其传入两种模板
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_prompt(
src_lang="English",
dst_lang="Chinese",
user_input="Did you eat in this morning?"
).to_messages()
输出为
[SystemMessage(content='You are a professional translator that translates English to Chinese.', additional_kwargs={}),
HumanMessage(content='Did you eat in this morning?', additional_kwargs={}, example=False)]
样本选择器
在LLM应用开中,业务中,可能会有一个总的样本数据中心,就像数据中心或配置中心一样,我们的某项业务,可能只需要其中的一部分样本。LangChain
提供了样本选择器的基础接口类 BaseExampleSelector
,每个选择器类必须实现的函数为 select_examples
。
# PromptTemplate
from langchain.prompts import PromptTemplate
# 少量样本模板
from langchain.prompts import FewShotPromptTemplate
#
from langchain.prompts.example_selector import LengthBasedExampleSelector
# These are a lot of examples of a pretend task of creating antonyms.
examples = [
{"input": "happy", "output": "sad"},
{"input": "tall", "output": "short"},
{"input": "energetic", "output": "lethargic"},
{"input": "sunny", "output": "gloomy"},
{"input": "windy", "output": "calm"},
]
# PromptTemplate 输入变量为input、output
example_prompt = PromptTemplate(
input_variables=["input", "output"],
# 模板格式为如下:
template="Input: {input}nOutput: {output}",
)
# 基于长度的样本选择器
example_selector = LengthBasedExampleSelector(
# 可选的样本数据
examples=examples,
# 提示词模版
example_prompt=example_prompt,
# 格式化的样本数据的最大长度,通过get_text_length函数来衡量
max_length=25
)
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"))
输出结果为:
Give the antonym of every input
Input: happy
Output: sad
Input: tall
Output: short
Input: energetic
Output: lethargic
Input: sunny
Output: gloomy
Input: windy
Output: calm
Input: big
Output:
总结
- 我们学习了LangChain对Prompt提示词工程提供的一些基础类和开发流程
- 提示词即用户的AI需要模板,可以接受用户输入,我们为用户提供Prompt模板,降低用户的Prompt门槛,提升Prompt的复用性。期待与具体业务的结合。