【Agent智能体项目实战七】ChatPromptTemplate的使用

5 阅读4分钟

一、前言

在大模型应用开发中,提示词(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": "请创作一首边塞诗"
})

模板优势

  1. 高度通用:支持任意角色、任意任务。
  2. 支持多轮对话:自动管理上下文。
  3. 易维护:结构清晰,便于扩展系统规则。
  4. 兼容主流大模型:LangChain生态无缝对接。

八、完整代码运行效果

执行代码后,模板会自动拼接系统提示+历史对话+当前指令,通义千问将基于边塞诗人设定,结合历史对话风格,流式输出一首新的边塞诗。

示例输出(仅供参考):

大漠风沙卷戍楼,寒星冷月照边州。 男儿仗剑安家国,不破匈奴誓不休。


九、总结与扩展

  1. 本文核心:讲解了LangChain ChatPromptTemplate 的通用用法,实现带上下文的提示词工程。
  2. 适用场景:智能客服、AI写作、代码生成、翻译、教育答疑等。
  3. 扩展方向
    • 加入Few-Shot案例提示。
    • 增加输出格式约束(JSON/诗歌/散文)。
    • 接入向量数据库实现长文档记忆。
  4. 最佳实践:提示词模板化、历史消息标准化、API密钥环境化。

本文代码可直接运行,只需替换自己的DASHSCOPE_API_KEY即可快速体验。提示词模板是大模型应用的基础,掌握这种通用结构,能极大提升LLM开发效率。