LangChain 四 Prompts

欢迎来到我的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 提出的问题
ini 复制代码
# 引入提示词模板类
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很像吧!

我们再来看个例子。

ini 复制代码
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为我们提供了相关提示词模板。

python 复制代码
# 我们引入了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()

输出为

vbnet 复制代码
[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

ini 复制代码
# 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"))

输出结果为:

vbnet 复制代码
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的复用性。期待与具体业务的结合。

参考资料

相关推荐
说私域29 分钟前
互联网生态下赢家群体的崛起与“开源AI智能名片链动2+1模式S2B2C商城小程序“的赋能效应
人工智能·小程序·开源
董厂长4 小时前
langchain :记忆组件混淆概念澄清 & 创建Conversational ReAct后显示指定 记忆组件
人工智能·深度学习·langchain·llm
墨风如雪7 小时前
告别“面目全非”!腾讯混元3D变身“建模艺术家”,建模效率直接起飞!
aigc
G皮T7 小时前
【人工智能】ChatGPT、DeepSeek-R1、DeepSeek-V3 辨析
人工智能·chatgpt·llm·大语言模型·deepseek·deepseek-v3·deepseek-r1
九年义务漏网鲨鱼7 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
元宇宙时间8 小时前
Playfun即将开启大型Web3线上活动,打造沉浸式GameFi体验生态
人工智能·去中心化·区块链
开发者工具分享8 小时前
文本音频违规识别工具排行榜(12选)
人工智能·音视频
产品经理独孤虾8 小时前
人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像
人工智能·机器学习·ai·大模型·产品经理·商品画像·商品工业属性
老任与码8 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
蹦蹦跳跳真可爱5898 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉