【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开发效率。

相关推荐
数据智能老司机5 小时前
RAG 不一定非得靠向量库:一套更偏工程落地的“结构化推理检索”方案
agent
Rick19936 小时前
RAG + Function Calling + ReAct 详细讲解
ai·agent
爱听歌的周童鞋6 小时前
Agent Skill 从使用到原理,一次讲清
agent·reference·script·skill·mcp·claude code
迷失07 小时前
基于AI多智能体的自主渗透测试框架
ai·渗透测试·agent·multi-agent·skills·渗透测试skill
写点啥呢7 小时前
最适合AOSP开发的AI编辑器——cursor
agent·ai编程·cursor
深藏功yu名8 小时前
Day25(高阶篇):RAG检索与重排序算法精研|从原理到参数调优,彻底攻克检索瓶颈
人工智能·算法·ai·自然语言处理·排序算法·agent
国家不保护废物8 小时前
Agent之Tool--手写cursor 最小版本
langchain·agent·cursor
Tony沈哲9 小时前
OpenVitamin 整体架构设计—— 一个本地 AI 推理平台是如何构建的
算法·llm·agent
MarsBighead9 小时前
OpenClaw(Docker)极简安装配置教程
ai·llm·agent·openclaw
数据智能老司机9 小时前
从"推理思考"到"智能体思考":AI 范式迁移的深度解读与产业验证
agent