惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
Apple Machine Learning Research
Apple Machine Learning Research
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
腾讯CDC
B
Blog RSS Feed
H
Help Net Security
J
Java Code Geeks
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
博客园 - Franky
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
Martin Fowler
Martin Fowler

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
15. 别再硬写提示词了!LangChain ChatPromptTemplate核心实战
老陈说编程 · 2026-05-15 · via 博客园_首页

在使用LangChain与AI交互时,想要让对话更有条理、适配多角色、多轮次的沟通场景,ChatPromptTemplate这个工具绝对少不了。它本质上就是一个用来构建聊天消息列表的提示模板,能帮我们规范AI的交互逻辑,让每一次对话都更贴合预期。

如果你喜欢看视频学习,就看 《15. LangChain ChatPromptTemplate核心实战》

prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("你是AI开发助手{name},擅长编程开发。"),
    HumanMessagePromptTemplate.from_template("你能帮我做什么?"),
    AIMessagePromptTemplate.from_template("我可以帮你写代码、改bug。"),
    HumanMessagePromptTemplate.from_template("{user_question}")
])

使用这个模板时,写法可以灵活调整。如果只是简单传递消息内容,不需要额外附带参数,用字符串别名的写法会特别简洁,省去不少冗余操作。

prompt_template = ChatPromptTemplate.from_messages([
    ("system", "你是AI开发助手{name},擅长编程。"),
    ("user", "你能帮我做什么?"),
    ("ai", "我可以帮你写代码、改bug。"),
    ("user", "{user_question}")
])

但如果追求更高的清晰性和可扩展性,想兼容一些高级功能,那字典写法就比元组简写更合适,后续维护和修改也会更方便。

prompt_template = ChatPromptTemplate.from_messages([
    {"role": "system", "content": "你是AI开发助手{name},擅长编程。"},
    {"role": "user", "content": "你能帮我做什么?"},
    {"role": "ai", "content": "我可以帮你写代码、改bug。"},
    {"role": "user", "content": "{user_question}"}
])

这里要重点说一下不同字符串别名的用法,它们对应着不同的消息类,各有明确的用途和使用规则,记清楚这些能避免很多操作失误。

字符串别名

对应消息类

用途

使用规则

system

SystemMessage

给AI设定人设、规则和上下文

必在开头只能有1个

user/human

HumanMessage

代表用户的输入

与“ai”交替,不能连续出现2个

ai/assistant

AIMessage

表示AI的输出约束

跟在“user”后,不能连续出现2个

了解完这些基础规则,就到了实战环节,其实操作步骤很简单,一步步来就能上手。首先要做的就是导入ChatPromptTemplate类,这是所有后续操作的基础。接着,用from_messages方法创建这个类的实例,这个方法需要接收一个消息列表作为参数,列表里的每条消息都是包含role和content字段的字典,其中content里用大括号包裹的部分,就是我们后续要填充的变量占位符。通过system、user、ai这三种角色的搭配,我们就能轻松定义出完整的对话上下文,甚至可以加入回答范例,让AI更清楚该如何响应。

创建好实例后,调用invoke方法,传入一个包含具体填充值的字典,它就会自动替换掉所有的占位符,生成一个完整的PromptValue提示词对象。最后,把这个PromptValue对象传入已经初始化好的大语言模型的invoke方法,就能完成一次规范的AI交互了。

from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages([
    {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
    {"role": "user", "content": "你能帮我做什么?"},
    {"role": "ai","content": "我可以帮你写代码、改bug、设计技术方案。"},
    {"role": "user", "content": "{user_question}"}
])
prompt_value = prompt_template.invoke(
    {
        "name": "神算子",
        "user_question": "用Python写一个简单的计算器程序"
    }
)
res = llm.invoke(prompt_value, config=config)
print(res.content)

除此之外,还有一个实用小技巧可以记一下。如果我们需要预先定义部分变量,不用每次都完整传入所有参数,借助partial方法就能轻松指定,后续使用时只需要补充剩余变量即可。

from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages([
    {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
    {"role": "user", "content": "你能帮我做什么?"},
    {"role": "ai", "content": "我可以帮你写代码、改bug、设计技术方案。"},
    {"role": "user", "content": "{user_question}"}
])
partial_prompt = prompt_template.partial(name="神算子")
prompt_value = partial_prompt.invoke(
    {
        "user_question": "用Python写一个简单的计算器程序"
    }
)
res = llm.invoke(prompt_value, config=config)
print(res.content)

要是想在模板中嵌入消息列表,比如多轮对话的历史消息,就可以使用MessagesPlaceholder,它的字符串别名是placeholder,用起来特别便捷,能很好地适配多轮交互场景。

from langchain_core.prompts import ChatPromptTemplate

prompt_template = ChatPromptTemplate.from_messages([
    {"role": "system", "content": "你是AI开发助手{name},擅长编程开发和技术问题解答。"},
    {"role": "placeholder", "content": "{chat_history}"},
    {"role": "user", "content": "你能帮我做什么?"},
    {"role": "ai", "content": "我可以帮你写代码、改bug、设计技术方案。"},
    {"role": "user", "content": "{user_question}"}
])
partial_prompt = prompt_template.partial(name="神算子")
prompt_value = partial_prompt.invoke(
    {
    "user_question": "用Python写一个简单的计算器程序",
    "history": [
    {"role": "user", "content": "我想做个编程工具"},
    {"role": "ai", "content": "我来帮你实现"}
    ]
    }
)
res = llm.invoke(prompt_value, config=config)
print(res.content)