文章目录
Prompt提示词模版和模型调用方法
Prompt提示词
简介
Prompt是引导AI模型生成特定输出的输入格式,Prompt的设计和措辞会显著影响模型的响应。
Prompt最开始只是简单的字符串 ,随着时间的推移,Prompt逐渐开始包含特定的占位符 ,例如AI模型可通过将多个消息字符串分类为不同的角模型可以识别的"USER:"、"SYSTEM:"等。模型可通过多个消息字符串分类为不同的角色,然后再由AI模型处理,为prompt引入了更多结构。每条消息都分配有特定的角色,这些角色对消息进行分类,明确AI模型提示的每个部分的上下文和目的。这种结构化方法增强了与AI沟通的细微差别和有效性,因为prompt 的每个部分在交互中都扮演着独特且明确的角色。
发展过程
- 简单纯字符串:最初的Prompt只是简单的文本字符串
- 占位符:引入占位符类似于${it}以动态插入内容
- 多角色消息:
- SystemMessage:系统消息,type="system",为AI设定角色、行为边界和输出规则,是高质量的第一步,并不是所有模型提供商都支持这个消息类型。
- HumanMessage:人类消息,type="user",表示来自用户输入。
- AIMessage:表示模型输出的内容类型,type="ai",这可以是文本,也可以是调用工具的请求。
- TooIMessage:工具消息,type="tool",用于函数调用结果的消息类型
python
messages = [
SystemMessage(content="你是Python助手"),
HumanMessage(content="python简介"),
AIMessage(content="我是一名大模型助手"),
ToolMessage(
content="我是一名大模型助手",
tool_call_id="tool_call_id")
]
PromptTemplate-文本提示词模版
文本生成模型提示词模版,是LangChain提供的最基础的模板,通过格式化字符串生成提示词,在执行invoke时将变量格式化到提示词模板中。
简介
在与大语言模型交互时,通常不会直接将用户的原始输入直接传递给大模型,而是会先行一系列包装、组织和格式化操作。这样做的目的是更清晰地表达用户意图,更好地利用模型能力,这套结构化的提示词构建方式,就是LangChain中的提示词模板(PromptTemplate)。
在应用开发中,一个关键的考量是提示词不能是一成不变的。其原因在于,应用开发需要适应多变的用户需求和场景。固定的提示词限制了模型的灵活性和适用范围。所以,PromptTemplate是一个模板化的字符串,可以用来生成特定的提示(prompts)。
你可以将变量插入到模板中,从而创建出不同的提示。这对于重复生成相似格式的提示非常有用
参数
| 参数 | 说明 |
|---|---|
| template | 提示模板,包括变量占位符 |
| input_variables | 列表,需要将其值作为提示输入的变量名称列表 |
| partial_variables | 字典,提示模板携带的部分变量的字典。使用部分变量预先填充模板,无需后续在每次调用时再传递这些变量 |
| 方法 | 说明 |
| format() | 使用输入格式化提示 |
创建方式
- 构造方法
python
prompt_template = PromptTemplate(
template="你是一个专业的{role},请回答我的问题:{question}",
input_variables=["role", "question"]
)
- form_template方法
python
prompt_template = PromptTemplate.from_template(
"你是一个专业的{role},请回答我的问题:{question}"
)
- 部分提示词模版:允许你预先固定部分变量,而保留其他变量在后续动态填充。例如:先预设系统参数,然后等用户输入后再补齐提示词模板
python
# 写法1
prompt_template = PromptTemplate.from_template(
"当前时间: {time}, 你是一个专业的{role},请回答我的问题:{question}",
partial_variables={
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
)
# 写法2
prompt_template = PromptTemplate(
template="当前时间: {time}, 你是一个专业的{role},请回答我的问题:{question}",
input_variables=["time", "role", "question"],
partial_variables={
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
)
- 组合提示词模版:通过将多个子提示(Prompt)按一定逻辑顺序或层级组合起来,形成一个复杂任务的整体Prompt。例如实现多消息对话、多阶段任务、多输入源组合等场景
python
# 1.提示词模版1
prompt_template_a = PromptTemplate.from_template("请用一句话介绍:{topic}")
# 2.提示词模版2
prompt_template_b = PromptTemplate.from_template("要求内容不超过{length}个字")
# 3.组合提示词
prompt_template = prompt_template_a + prompt_template_b
prompt = prompt_template.format(topic="python", length="10")
print(f'prompt: {prompt}')
主要方法
- format:格式化提示词模板为字符串
- invoke:格式化提示词模板为PromptValue,可以用.to_string()或.to_messages()查看内容
- partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化
ChatPromptTemplate-对话提示词模版
简介
ChatPromptTemplate是LangChain中专门用于结构化聊天对话提示的核心组件,它比普通PromptTemplate更适合处理多角色、多轮次的对话场景。为与现代聊天模型的交互提供了一种上下文丰富和会话友好的方式。
消息模版包括ChatMessagePromptTemplate、SystemMessagePromptTemplate、HumanMessagePromptTemplate、AIMessagePromptTemplate
参数

python
# 1.tuple构成的列表,格式为[("role", "content"), ("role", "content")]
# 2.dict构成的列表,格式为[{"role": "content"}, {"role": "content"}]
# 3.Message类构成的列表,格式为[Message(role="content"), Message(role="content")]
创建方式
- 构造方法
python
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from config import OPENAI_API_KEY
# 功能:3种入参、3种方法
# 构造方法的入参:
# tuple构成的列表,格式为[("role", "content"), ("role", "content")]
# dict构成的列表,格式为[{"role": "content"}, {"role": "content"}]
# Message类构成的列表,格式为[Message(role="content"), Message(role="content")]
# 1.构造方法实例化提示词模版1:元组
chat_prompt_template = ChatPromptTemplate(
[
("system", "你是一个专业的AI工程师,你的名字是:{name}"),
("ai", "我能开发python"),
("human", "请回答:{user_input}"),
]
)
# 2.构造方法实例化提示词模版1:字典
# chat_prompt_template = ChatPromptTemplate(
# [
# {"role": "system", "content": "你是一个专业的AI工程师,你的名字是:{name}"},
# {"role": "ai", "content": "我能开发python"},
# {"role": "human", "content": "请回答:{user_input}"}
# ]
# )
# 3.构造方法实例化提示词模版1:Message
# chat_prompt_template = ChatPromptTemplate(
# [
# SystemMessage(content="你是一个专业的AI工程师,你的名字是:{name}"),
# HumanMessage(content="请回答:{user_input}")
# ]
# )
# 1.使用format_messages方法格式化生成具体的提示词
# 2.使用invoke方法格式化生成具体的提示词
# 3.使用format方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.format_messages(name='朱鹏', user_input='简述python发展历史')
# chat_prompt = chat_prompt_template.invoke({"name": "朱鹏", "user_input": "简述python发展历史"})
# chat_prompt = chat_prompt_template.format(name='朱鹏',user_input='简述python发展历史')
print(f'chat_prompt: {chat_prompt}')
- from_messages()
python
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from config import OPENAI_API_KEY
# 功能:3种入参、3种方法
# from_messages方法实例化提示词模版
# 1.rom_messages方法实例化提示词模版1:元组
chat_prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一个专业的AI工程师,你的名字是:{name}"),
("human", "请回答:{user_input}")
]
)
# 2.rom_messages方法实例化提示词模版2:字典
# chat_prompt_template = ChatPromptTemplate.from_messages(
# [
# {"role": "system", "content": "你是一个专业的AI工程师,你的名字是:{name}"},
# {"role": "human", "content": "请回答:{user_input}"}
# ]
# )
# 3.rom_messages方法实例化提示词模版3:Message
# chat_prompt_template = ChatPromptTemplate.from_messages(
# [
# SystemMessage(content="你是一个专业的AI工程师,你的名字是:{name}"),
# HumanMessage(content="请回答:{user_input}")
# ]
# )
# 1.使用format_messages方法格式化生成具体的提示词
# 2.使用invoke方法格式化生成具体的提示词
# 3.使用format方法格式化生成具体的提示词
# chat_prompt = chat_prompt_template.format_messages(name='朱鹏', user_input='简述python发展历史') # 关键字占位传参
# chat_prompt = chat_prompt_template.format_messages(**{"name": "朱鹏", "user_input": "简述python发展历史"}) # 解包
# chat_prompt = chat_prompt_template.invoke({"name": "朱鹏", "user_input": "简述python发展历史"})
chat_prompt = chat_prompt_template.format(name='朱鹏', user_input='简述python发展历史')
print(f'chat_prompt: {chat_prompt}')
- MessageHolder:消息占位符提示词模版
python
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from config import OPENAI_API_KEY
# 功能:MessageHolder显式调用
# 1.from_messages方法实例化提示词模版
chat_prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一个专业的AI工程师,你的名字是:{name}"),
MessagesPlaceholder("memory"), # 占位符显式调用,用于填充历史对话记录(如多轮对话上下文)
("human", "请回答:{user_input}")
]
)
# 2.使用format_messages方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.invoke({
"memory": [
("human", "你叫什么名字"),
("ai", "我叫朱鹏")
],
"name": "朱鹏",
"user_input": "简述python发展历史"
})
print(f'chat_prompt: {chat_prompt}')
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from config import OPENAI_API_KEY
# 功能:MessageHolder隐式调用
# 1.from_messages方法实例化提示词模版
chat_prompt_template = ChatPromptTemplate.from_messages(
[
("placeholder", "{memory}"),
("system", "你是一个专业的AI工程师,你的名字是:{name}"),
("human", "请回答:{user_input}")
]
)
# 2.使用format_messages方法格式化生成具体的提示词
chat_prompt = chat_prompt_template.invoke({
"memory": [
("human", "你叫什么名字"),
("ai", "我叫朱鹏")
],
"name": "朱鹏",
"user_input": "简述python发展历史"
})
print(f'chat_prompt: {chat_prompt}')
外部加载Prompt
python
from langchain_core.prompts import load_prompt
# 从外部yaml文件加载Prompt
prompt = load_prompt("../prompt/prompt.yaml", encoding="utf-8")
print(prompt.format(name="张三", story="一次冒险"))
模型调用方法

普通调用(同步/异步)
invoke:同步将单个输入转为输出,普通调用,等待每条输入,等待LLM完全推理完成后再返回调用结果
python
# init_chat_model创建一个语言模型
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage
from config import OPENAI_API_KEY
llm = init_chat_model(
model='deepseek-chat',
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
messages = [
SystemMessage(content="你是Python助手"),
HumanMessage(content="python简介"),
]
# 调用语言模型
response = llm.invoke(messages)
print(f'type(response): {type(response)}')
print("response.content", response.content)
ainvoke:异步将单个输入转为输出,异步调用,用于在异步环境(async/await)中高效并行地执行模型推理,让你同时调用多个模型请求而不阻塞主线程-特别适合大批量请求或web服务场景(如FastAPI)
python
import asyncio
from langchain.chat_models import init_chat_model
from config import OPENAI_API_KEY
llm = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
# 声明异步接口
async def main():
response = await llm.ainvoke("Python简介")
print(f'响应类型:{type(response)}')
print(response.content)
# 运行异步函数
if __name__ == '__main__':
asyncio.run(main())
流式调用
stream:**流式调用,**同步将单个输入流式输出,是一种逐步返回大模型生成结果的技术,生成一点返回一点,允许服务器将响应内容分批次实时传输给客户端,而不是等待全部内容生成完毕后再一次性返回。
python
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage
from config import OPENAI_API_KEY
llm = init_chat_model(
model='deepseek-chat',
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
messages = [
SystemMessage(content="你是Python助手"),
HumanMessage(content="python简介"),
]
# 流式调用语言模型
response = llm.stream(messages)
print(f'type(response): {type(response)}')
for chunk in response:
print(chunk.content, end='', flush=True)
astream:**异步流式调用,**异步将单个输入流式输出
python
import asyncio
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.messages import SystemMessage
from config import OPENAI_API_KEY
llm = init_chat_model(
model='deepseek-chat',
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
messages = [
SystemMessage(content="你是Python助手"),
HumanMessage(content="python简介"),
]
# 异步流式调用
async def async_stream_call():
# astream返回一个异步生成器 无需await修饰
response = llm.astream(messages)
print(f'type(response) = {type(response)}')
# 异步迭代生成器必须使用await修饰
async for chunk in response:
print(chunk.content, end='', flush=True)
if __name__ == "__main__":
asyncio.run(async_stream_call())
批量调用
batch:同步批量将多个输入转为输出,批量调用,一次性向模型提交多个输入并并行处理,从而显著提升吞吐量
python
from langchain.chat_models import init_chat_model
from config import OPENAI_API_KEY
llm = init_chat_model(
model='deepseek-chat',
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
questions = [
"什么是redis",
"python简介",
"java是什么"
]
# 批量调用大模型
response = llm.batch(questions)
print(f'type(response): {type(response)}')
for q, r in zip(questions, response):
print(f'问题:{q} \n 回答: {r.content}')
abatch:异步批量将多个输入转为输出
python
import asyncio
from langchain.chat_models import init_chat_model
from config import OPENAI_API_KEY
llm = init_chat_model(
model='deepseek-chat',
model_provider="deepseek",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
questions = [
"什么是redis",
"python简介",
"java是什么"
]
# 异步批量调用大模型
async def async_batch_call():
response = await llm.abatch(questions)
print(f'type(response): {type(response)}')
for q, r in zip(questions, response):
print(f'问题:{q} \n 回答: {r.content}')
if __name__ == '__main__':
asyncio.run(async_batch_call())
总结:带有"a"前缀的方法是异步的,需要与asyncio和await语法一起使用以实现并发。