一、前言
在大模型应用开发中,提示词(Prompt)是核心,而可复用、可扩展的通用提示词模板能大幅提升开发效率,尤其在需要多轮对话、角色设定、上下文记忆的场景下至关重要。
本文基于一段LangChain + 阿里云通义千问的实战代码,讲解如何搭建标准化提示词模板,实现带对话历史的AI作诗功能,并提炼通用设计思路,方便迁移到客服、文案、问答等各类场景。
二、环境依赖与API配置
1. 核心依赖库
代码主要依赖以下两个核心包:
import os
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_models.tongyi import ChatTongyi
langchain_core:LangChain核心库,提供提示词模板、消息占位符等基础能力。langchain_community:社区集成模块,封装通义千问等第三方大模型调用接口。os:用于配置环境变量,传入通义千问API Key。
2. 通义千问API Key配置
通义千问(DashScope)需要通过环境变量传入密钥:
os.environ["DASHSCOPE_API_KEY"] = "sk-apikey"
注意:实际开发中,API Key建议通过
.env文件管理,避免硬编码泄露。
三、通用提示词模板(ChatPromptTemplate)核心设计
1. 模板整体结构
代码中使用ChatPromptTemplate.from_messages构建结构化多角色提示模板,这是LangChain中最通用、最推荐的提示词组织方式:
chat_prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一个边塞诗人,可以作诗"),
MessagesPlaceholder("history"),
("human", "请再来一首边塞诗"),
]
)
2. 三大核心模块解析
(1)System 系统角色设定
("system", "你是一个边塞诗人,可以作诗")
- 作用:定义AI身份、能力边界、输出风格。
- 通用性:可替换为“客服”“翻译”“代码助手”“文案策划”等任意角色,是通用提示词的身份基座。
(2)MessagesPlaceholder 历史消息占位符
MessagesPlaceholder("history")
- 这是通用多轮对话模板的关键,用于动态注入对话历史,实现上下文记忆。
- 无需手动拼接历史,LangChain自动解析
history变量,兼容多轮用户/AI消息。
(3)Human 用户当前提问
("human", "请再来一首边塞诗")
- 用户本轮输入指令,可根据场景动态替换。
- 在通用模板中,可进一步抽离为变量,实现完全动态化。
四、对话历史(history_data)格式规范
代码中定义了标准的多轮对话历史格式:
history_data = [
{"role": "human", "content": "你来作一首唐诗"},
{"role": "ai", "content": "床前明月光..."},
{"role": "human", "content": "再来作一首唐诗"},
{"role": "ai", "content": "锄禾日当午..."},
]
- 格式:
[{"role":"human/ai", "content":"内容"}, ...] - 该格式高度通用,可直接对接LangChain、OpenAI、通义千问等主流大模型。
- 优势:多轮对话可无限追加,模板无需修改,扩展性极强。
五、提示词模板调用与渲染
prompt_text = chat_prompt_template.invoke({"history": history_data})
print(prompt_text.to_string())
invoke():传入history变量,完成模板填充。to_string():将结构化消息转为字符串,便于调试查看完整Prompt。- 这一步是通用模板的核心价值:一次定义,多次调用,自动拼接上下文。
六、大模型流式调用(stream)
model = ChatTongyi(model="qwen3-max")
response = model.stream(input=prompt_text)
for chunk in response:
print(chunk.content, end="", flush=True)
- 使用
ChatTongyi加载通义千问qwen3-max模型。 stream()流式输出:逐字返回结果,提升用户体验,适用于长文本生成。- 该流式调用逻辑通用,可无缝迁移到其他LLM。
七、通用提示词模板提炼(可直接复用)
基于本段代码,我们可以抽离出适用于所有场景的通用Prompt模板:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 通用多轮对话提示词模板
prompt = ChatPromptTemplate.from_messages([
# 1. 系统角色(可自定义)
("system", "你是一个专业的{role},请按照要求完成任务"),
# 2. 动态历史消息占位符
MessagesPlaceholder(variable_name="chat_history"),
# 3. 用户当前提问
("human", "{user_input}"),
])
# 调用方式
formatted_prompt = prompt.invoke({
"role": "边塞诗人",
"chat_history": history_data,
"user_input": "请创作一首边塞诗"
})
模板优势
- 高度通用:支持任意角色、任意任务。
- 支持多轮对话:自动管理上下文。
- 易维护:结构清晰,便于扩展系统规则。
- 兼容主流大模型:LangChain生态无缝对接。
八、完整代码运行效果
执行代码后,模板会自动拼接系统提示+历史对话+当前指令,通义千问将基于边塞诗人设定,结合历史对话风格,流式输出一首新的边塞诗。
示例输出(仅供参考):
大漠风沙卷戍楼,寒星冷月照边州。 男儿仗剑安家国,不破匈奴誓不休。
九、总结与扩展
- 本文核心:讲解了LangChain
ChatPromptTemplate的通用用法,实现带上下文的提示词工程。 - 适用场景:智能客服、AI写作、代码生成、翻译、教育答疑等。
- 扩展方向:
- 加入
Few-Shot案例提示。 - 增加输出格式约束(JSON/诗歌/散文)。
- 接入向量数据库实现长文档记忆。
- 加入
- 最佳实践:提示词模板化、历史消息标准化、API密钥环境化。
本文代码可直接运行,只需替换自己的DASHSCOPE_API_KEY即可快速体验。提示词模板是大模型应用的基础,掌握这种通用结构,能极大提升LLM开发效率。