欢迎来到我的LangChain系列,假如您也和我相同,想经过学习LangChain开始AI使用开发。那就请一起来学习它的各个功能模块和demo实例。 LangChain 一 hello LLM – (juejin.cn)

LangChain 二 模型 – (juejin.cn)

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 四 Prompts

  从打印成果,能够感觉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的复用性。期待与详细事务的结合。

参考资料