LangChain系列:学习AI应用开发的提示词模板

释放双眼,带上耳机,听听看~!
学习LangChain的提示词模板,为AI应用开发提供便利和流程,优化模型生成更好的回复。

欢迎来到我的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="中文"))

LangChain系列:学习AI应用开发的提示词模板

  从打印结果,可以感觉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的复用性。期待与具体业务的结合。

参考资料

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

AI大模型Coscientist实现复杂化学反应,引发博士失业担忧

2023-12-22 14:10:00

AI教程

【2023 · CANN训练营第一季】——模型推理时数据预处理方法及归一化参数计算

2023-12-22 14:11:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索