介绍

LangChain框架中的提示词模板是构建和管理与大语言模型交互的核心工具,它允许开发者将提示内容参数化,从而实现灵活、可复用的提示设计。在开发过程中,对于提示词通常不能直接硬编码,不利于提示词管理,而是通过提示词模板进行维护,类似于开发过程中遇到的短信模板、邮件模板等等

在 LangChain 的 Model I/O 中,提示模板是其组成之一,语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助模型理解上下文并生成相关且连贯的基于语言的输出,例如回答问题、完成句子或参与某项活动、对话

PromptTemplates 是 LangChain 中的一个概念,通过接收原始用户输入,并返回一个准备好传递给语言模型的信息 (即提示词 prompt)

通俗点说,prompt template 是一个模板化的字符串,可以用来生成特定的提示 (prompts)。你可以将变量插入到模板中,从而创建出不同的提示。这对于重复生成相似格式的提示非常有用,尤其是在自动化任务中

LangChain 提示模板特点

1. 清晰易懂的提示:提高提示文本的可读性,使其更易于理解,尤其是在处理复杂或涉及多个变量的情况下。

2. 增强可重用性:使用模板,可以在多个地方重复使用,简化代码,无需重复构建提示字符串。

3. 简化维护:使用模板后,如果需要更改提示内容,只需修改模板,无需逐个查找所有用到该提示的地方。

4. 智能处理变量:模板可以自动处理变量的插入,无需手动拼接字符串。

什么是提示词模板?

提示词模板本质上跟平时大家使用的邮件模板、短信模板没什么区别,就是一个字符串模板,模板可以包含一组模板参数,通过模板参数值可以替换模板对应的参数。
一个提示词模板可以包含下面内容:

发给大语言模型(LLM)的指令。
一组问答示例,以提醒AI以什么格式返回请求。
发给语言模型的问题。

提示词模版类型

1.LLM 提示模板 PromptTemplate:常用的 String 提示模板

2. 聊天提示模板 ChatPromptTemplate:常用的 Chat 提示模板,用于组合各种角色的消息模板,传入聊天模型。消息模板包括:ChatMessagePromptTemplate、HumanMessagePromptTemplate、AllMessagePromptTemplate、SystemMessagePromptTemplate 等

3. 样本提示模板 FewShotPromptTemplate:通过示例来教模型如何回答

4. 部分格式化提示模板:提示模板传入所需值的子集,以创建仅期望剩余值子集的新提示模板。

5. 管道提示模板 PipelinePrompt:用于把几个提示组合在一起使用。

6. 自定义模板:允许基于其他模板类来定制自己的提示模板。

LLM 提示模板 PromptTemplate

第一个例子

# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate
# 定义一个提示词模板,包含text模板变量,模板变量使用{}包括起来
template = "您是一位专业的程序员。\n对于信息 {text} 进行简短描述"
# 通过提示词模板参数格式化提示模板
prompt = PromptTemplate.from_template(template)
# 打印langChain提示模板的内容
print(prompt)
print("="*50)
print(prompt.format(text="langchain"))

结果

第二个例子

根据提示词,调用大模型生成回答

# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)
# 创建原始模板
template = "请根据下面的主题写一篇小红书营销的短文:{topic}"
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
input = prompt.format(topic="康师傅绿茶")
output = llm.invoke(input)
print(output)

 

第三个例子

调用模型,让模型写答案,并返回结果
# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)
# 创建原始模板
template = "您是一位专业的程序员。\n对于信息 {text} 进行简短描述"
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
input = prompt.format(text="langchain")
output = llm.invoke(input)
print(output)

ChatPromptTemplate 聊天提示模板

PromptTemplate 创建字符串提示的模板。默认情况下,使用 Python 的 str.format 语法进行模板化。而 ChatPromptTemplate 是创建聊天消息列表的提示模板。

创建一个 ChatPromptTemplate 提示模板,模板的不同之处是它们有对应的角色。

聊天模型(Chat Model)以聊天消息列表作为输入,这个聊天消息列表的消息内容也可以通过提示词模板进行管理。这些聊天消息与原始字符串不同,因为每个消息都与“角色(role)”相关联

例如,在OpenAI的Chat Completion API中,Openai的聊天模型,给不同的聊天信息定义了三种角色类型,分别是助手(assiatant/ai)、人类(human/user)或系统(system)角色:

助手(assiatant/ai)或AI 消息指的是当前消息是AI回复的内容
人类(human/user)消息指的是你发给AI的内容
系统(system)消息通常是用来给AI身份进行描述。

第一个例子

from langchain_core.prompts import ChatPromptTemplate  
  
# 通过一个消息数组创建聊天信息模板  
# 数组每一个元素代表一条消息,每个消息元祖,第一个元素代表消息角色(也成为消息类型),第二个元素代表消息内容  
# 消息角色,system代表系统消息,human代表用户消息,ai代表模型回复的消息  
# 下面消息定义了2个模板参数name和user_input  
chat_template = ChatPromptTemplate.from_messages(  
    [  
        ("system", "你是一位人工智能助手,你的名字是{name}"),  
        ("human", "你好"),  
        ("AI", "我很好,谢谢!"),  
        ("human", "{user_input}"),  
    ]  
)  
  
# 通过模板参数格式化模板内容  
messages = chat_template.format_messages(name="Bob", user_input="你的名字叫什么?")  
print(messages)  
  
# 输出:  
# [SystemMessage(content='你是一位人工智能助手,你的名字是Bob', additional_kwargs={}, response_metadata={}), HumanMessage(content='你好', additional_kwargs={}, response_metadata={}), AIMessage(content='我很好,谢谢!', additional_kwargs={}, response_metadata={}), HumanMessage(content='你的名字叫什么?', additional_kwargs={}, response_metadata={})]

第二个例子

# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
# 创建模型实例
model = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)

template = "你是一个数学家,你可以计算任何算式"
human_template = "{text}"
chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])
# 输入提示
messages = chat_prompt.format_messages(text="我今年18岁,我的舅舅今年38岁,我的爷爷今年72岁,我和舅舅一共多少岁了?")
# 得到模型的输出
print(messages)
output = model.invoke( messages);
print(output.content)

第三个例子

import os

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
from langchain_core.prompts import ChatPromptTemplate
#提示词
load_dotenv()

llm = ChatOpenAI(
    base_url="https://api.deepseek.com/v1",
    model="deepseek-chat",
    api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
prompt_template = ChatPromptTemplate.from_messages([
 ("system","您是JAVA程序员"),
 ("user","{input}")
])
print(prompt_template)
chain = prompt_template | llm
# 直接调用大模型

response = chain.invoke({"input": "什么是JAVA?"})
print(response.content)

LangChain 提供不同类型的 MessagePromptTemplate,最常用的是 AIMessagePromptTemplate,SystemMessagePromptTemplate和 HumanMessagePromptTemplate,分别创建人工智能消息、系统消息和人工消息。

第四个例子

# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
# 创建模型实例
model = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)
# 模板的构建
system_template = "你是一个翻译专家,擅长将 {input_language} 语言翻译成 {output_language}语言."
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# 格式化提示消息生成提示
prompt = prompt_template.format_prompt(input_language="英文", output_language="中文",
                                      text="I love Large Language Model.").to_messages()
# 打印模板
print("prompt:", prompt)
result = model.invoke(prompt)
print("result:", result);

少量提示词模版

提示词中包含交互样本的作用是为了帮助模型更好地理解用户的意图,从而更好地回答问题或执行任务。小样本提示模板是指使用一组少量的示例来指导模型处理新的输入。这些示例可以用来训练模型,以便模型可以更好地理解和回答类似的问题。

基于 LLM 模型与聊天模型,可分别使用 FewShotPromptTemplate 或 FewShotChatMessagePromptTemplate,两者使用基本一致

创建示例集:创建一些提示样本,每个示例都是一个字典,其中键是输入变量,值是输入变量的值

第一个例子

创建提示词模版
# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
# 创建模型实例
model = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)
examples = [
    {"input": "2+2", "output": "4", "description": "加法运算"},
    {"input": "5-2", "output": "3", "description": "减法运算"},]
# 创建提示模板,配置一个提示模板,将一个示例格式化为字符串
prompt_template = "你是一个数学专家,算式: {input} 值: {output} 使用: {description}"
# 这是一个提示模板,用于设置每个示例的格式
prompt_sample = PromptTemplate.from_template(prompt_template)

# input="2+2", output="4", description="加法运算"
# print(prompt_sample.format_prompt(**examples[0]))
# print(prompt_sample.format_prompt(input="2+2", output="4", description="加法运算"))
from langchain_core.prompts.few_shot import FewShotPromptTemplate

prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=prompt_sample,
    suffix="你是一个数学专家,算式: {input} 值: {output}",  # 表示你在生成的提示模板末尾会加入这段话
    input_variables=["input", "output"]
)
print(prompt.format(input="2*5", output="10"))  # 你是一个数学专家,算式: 2*5 值: 10

第二个例子

实例2
# 导入LangChain中的提示模板
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
load_dotenv()
from langchain_core.prompts.few_shot import FewShotPromptTemplate
# 创建模型实例
model = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-plus",
    api_key=SecretStr(os.environ["DASHSCOPE_API_KEY"]),
)
examples = [
    {"input": "开心", "output": "伤心"},
    {"input": "高", "output": "矮"},
    {"input": "精力充沛", "output": "没精打采"},
    {"input": "粗", "output": "细"}

]
example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}",
)


dynamic_prompt = FewShotPromptTemplate(
    # 可供选择的示例。
    examples=examples,
    # PromptTemplate 用于格式化示例。
    example_prompt=example_prompt,
    # 长度由下面的 get_text_length 函数测量。
    # 用于获取字符串长度的函数,使用
    # 确定要包含哪些示例。被注释掉是因为
    # 如果未指定,则将其作为默认提供。
    # get_text_length: Callable[[str], int] = lambda x: len(re.split("\n| ", x))
    prefix="给出每个输入的反义词",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"],
)
result = model.invoke(dynamic_prompt.format(adjective="big"))
print(result)
print(result.content)

 

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐