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

一、前言

在大模型应用开发中,提示词(Prompt)是核心 ,而可复用、可扩展的通用提示词模板能大幅提升开发效率,尤其在需要多轮对话、角色设定、上下文记忆的场景下至关重要。

本文基于一段LangChain + 阿里云通义千问的实战代码,讲解如何搭建标准化提示词模板,实现带对话历史的AI作诗功能,并提炼通用设计思路,方便迁移到客服、文案、问答等各类场景。


二、环境依赖与API配置

1. 核心依赖库

代码主要依赖以下两个核心包:

python 复制代码
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)需要通过环境变量传入密钥:

python 复制代码
os.environ["DASHSCOPE_API_KEY"] = "sk-apikey"

注意:实际开发中,API Key建议通过.env文件管理,避免硬编码泄露。


三、通用提示词模板(ChatPromptTemplate)核心设计

1. 模板整体结构

代码中使用ChatPromptTemplate.from_messages构建结构化多角色提示模板,这是LangChain中最通用、最推荐的提示词组织方式:

python 复制代码
chat_prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个边塞诗人,可以作诗"),
        MessagesPlaceholder("history"),
        ("human", "请再来一首边塞诗"),
    ]
)

2. 三大核心模块解析

(1)System 系统角色设定

arduino 复制代码
("system", "你是一个边塞诗人,可以作诗")
  • 作用:定义AI身份、能力边界、输出风格。
  • 通用性 :可替换为"客服""翻译""代码助手""文案策划"等任意角色,是通用提示词的身份基座

(2)MessagesPlaceholder 历史消息占位符

scss 复制代码
MessagesPlaceholder("history")
  • 这是通用多轮对话模板的关键,用于动态注入对话历史,实现上下文记忆。
  • 无需手动拼接历史,LangChain自动解析history变量,兼容多轮用户/AI消息。

(3)Human 用户当前提问

arduino 复制代码
("human", "请再来一首边塞诗")
  • 用户本轮输入指令,可根据场景动态替换。
  • 在通用模板中,可进一步抽离为变量,实现完全动态化。

四、对话历史(history_data)格式规范

代码中定义了标准的多轮对话历史格式:

python 复制代码
history_data = [
    {"role": "human", "content": "你来作一首唐诗"},
    {"role": "ai", "content": "床前明月光..."},
    {"role": "human", "content": "再来作一首唐诗"},
    {"role": "ai", "content": "锄禾日当午..."},
]
  • 格式:[{"role":"human/ai", "content":"内容"}, ...]
  • 该格式高度通用,可直接对接LangChain、OpenAI、通义千问等主流大模型。
  • 优势:多轮对话可无限追加,模板无需修改,扩展性极强。

五、提示词模板调用与渲染

python 复制代码
prompt_text = chat_prompt_template.invoke({"history": history_data})
print(prompt_text.to_string())
  • invoke():传入history变量,完成模板填充。
  • to_string():将结构化消息转为字符串,便于调试查看完整Prompt。
  • 这一步是通用模板的核心价值:一次定义,多次调用,自动拼接上下文。

六、大模型流式调用(stream)

python 复制代码
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模板

python 复制代码
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开发效率。

相关推荐
冬奇Lab15 小时前
Agent系列(八):上下文工程——让每个 Token 都用在刀刃上
人工智能·agent
宋哥转AI19 小时前
Spring AI Graph:从0到Supervisor(一)RAG子图+Supervisor路由踩坑全记录
java·agent
嘻嘻仙人19 小时前
从原理到代码,拆解AgentScope框架开发实践
agent
倾颜20 小时前
Agent 不一定要自由规划:我给 Tasklist Agent 加了一次受控决策
agent
阿里云云原生21 小时前
可观测性的终局?从“面向数据”到“面向对象”,UModel 如何为 AI Agent 注入认知地图
云原生·agent
LienJack21 小时前
《Re0 Build Harness》第一章 Agent 基础定义:它为什么不是一句 Prompt?
aigc·agent
青云计划21 小时前
Host 组件:从混乱到秩序的多Agent系统总指挥
agent
Puslar1 天前
Agent系列二:项目架构设计
agent·全栈
PPPHUANG1 天前
我把 MacBook 的 Touch Bar,改造成了 AI "摸鱼状态灯"
openai·agent·ai编程
SelectDB1 天前
- 别把懂语义和查事实混为一谈:企业级 Agent 真正缺的是什么?
数据库·数据分析·agent