AI Agent白手起家28: LangChain 五种提示词模板实战解析
内容纲要提示词模板核心概念PromptTemplate面向纯文本 LLM 的字符串模板ChatPromptTemplate面向对话模型的结构化模板MessagesPlaceholder在消息列表中动态插入内容的占位符使用SystemMessage、HumanMessage、AIMessage灵活组合模板自定义模板继承StringPromptTemplate实现特殊逻辑关键流程定义模板 → 声明变量 → 格式化format/format_messages→ 提交给 LLM涉及组件langchain_core.prompts、langchain_core.messages代码演示完整可运行的 Python 脚本涵盖所有模板类型引言在构建 AI Agent 或大语言模型应用时提示词Prompt是连接业务逻辑与模型能力的桥梁。LangChain 提供了一套丰富的提示词模板系统使开发者可以像写配置一样管理复杂的提示词结构而无需手动拼接字符串。本文将系统讲解五种最常用的提示词模板字符串模板、对话模板、消息占位符、Message 组合模板以及自定义模板并提供可直接运行的代码示例。一、字符串模板PromptTemplate字符串模板是最基础的提示词模板适用于传统的文本补全模型LLM它接收一个包含占位符的字符串通过format方法将参数注入最终生成一段完整的文本提示。核心特点输入输出均为纯文本不支持结构化消息。fromlangchain_core.promptsimportPromptTemplate# 定义模板花括号内为变量template你是一个{role}帮我起一个具有{country}特色的{gender}名字。promptPromptTemplate.from_template(template)# 传入参数格式化formattedprompt.format(role算命大师,country法国,gender女孩)print(formatted)输出你是一个算命大师帮我起一个具有法国特色的女孩名字。使用时需注意模板中声明的变量数量必须与format传入的参数完全一致否则会抛出异常。二、对话模板ChatPromptTemplate对话模板是当前应用最广泛的形式专为对话类模型Chat Model设计。它返回的是一个结构化的消息列表每条消息都带有明确的角色system、human、ai便于下游处理。fromlangchain_core.promptsimportChatPromptTemplate# 使用 from_messages 构建消息列表templateChatPromptTemplate.from_messages([(system,你是一个起名大师你的名字叫{name}。),(human,你好感觉如何),(ai,你好我状态非常好。),(human,你叫什么名字),(ai,你好我叫{name}。),(human,{user_input}),])# 注意对话模板使用 format_messages 而非 formatmessagestemplate.format_messages(name陈大师,user_input你的爸爸是谁呢)print(messages)输出将是一个包含SystemMessage、HumanMessage、AIMessage的列表每条消息都带有content字段并保留了元数据非常适合在应用中进行结构化解析和后续调用。三、消息占位符MessagesPlaceholder当需要在消息列表的特定位置动态插入一组消息例如历史聊天记录但又不确定其具体数量或类型时可以使用MessagesPlaceholder。它相当于一个“插槽”在最终调用模型前可以被替换为实际的消息列表。fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportHumanMessage# 构造带占位符的模板promptChatPromptTemplate.from_messages([(system,你是一个厉害的人工智能助手。),MessagesPlaceholder(variable_namehistory),(human,{question})])# 在调用阶段动态传入消息列表resultprompt.invoke({history:[HumanMessage(content你好请多关照)],question:今天天气如何})print(result.messages)此外也可以直接用(placeholder, {history})这种简写方式效果等价。占位符的灵活性在于它允许在invoke阶段而不一定在format阶段再确定插入的内容这对构建复杂 Agent 的多轮对话记忆非常实用。四、使用 Message 直接组合模板除了通过ChatPromptTemplate.from_messages声明式构建还可以直接用SystemMessage、HumanMessage、AIMessage等消息对象手动拼装形成消息列表。这种方式更灵活适合将公共的系统消息或用户消息进行复用组合。fromlangchain_core.messagesimportSystemMessage,HumanMessage,AIMessagefromlangchain_core.promptsimportChatPromptTemplate# 手动构建消息system_msgSystemMessage(content你是一个起名大师,additional_kwargs{大师名字:陈瞎子})human_msgHumanMessage(content请问大师叫什么)ai_msgAIMessage(content我叫陈瞎子。)# 直接拼成列表即是一个合法的消息模板chat_list[system_msg,human_msg,ai_msg]promptChatPromptTemplate.from_messages(chat_list)print(prompt.format_messages())这种方式下你可以将某个SystemMessage作为公共提示词在多个场景中复用并自由组合后续对话流程大幅提升代码的模块化程度。五、自定义提示词模板当内置的PromptTemplate和ChatPromptTemplate无法满足需求时可以通过继承StringPromptTemplate来实现自己的模板逻辑。例如创建一个“函数大师”模板输入函数名自动获取函数源代码并生成一段要求解释代码的提示词。步骤继承StringPromptTemplate重写format方法在其中实现自定义逻辑如获取源代码、拼接提示调用时和普通模板一致importinspectfromlangchain_core.promptsimportStringPromptTemplate# 定义一个示例函数defhello_world(a,b,c):测试函数print(hello world)returna,b,c# 自定义模板类classCustomCodeExplainerTemplate(StringPromptTemplate):defformat(self,**kwargs)-str:func_namekwargs[function_name]# 获取函数源代码source_codeinspect.getsource(globals()[func_name])# 内嵌提示词prompt_template(你是一个非常有经验和天赋的程序员。现在给你如下函数名称你会按照如下格式输出这段代码的名称、源代码和中文解释。\n函数名称: {function_name}\n源代码: {source_code}\n代码解释: )returnprompt_template.format(function_namefunc_name,source_codesource_code)# 使用自定义模板custom_promptCustomCodeExplainerTemplate(input_variables[function_name])final_promptcustom_prompt.format(function_namehello_world)print(final_prompt)输出已包含函数名称和源代码。后续你可以将该提示词直接交给 LLM得到代码解释。这种模式允许你在模板内部封装任何复杂的预处理逻辑从而将提示词构建过程完全自动化。五种模板对比模板类型输入变量占位输出格式适用模型灵活性PromptTemplate字符串花括号纯文本LLM补全低ChatPromptTemplate消息列表变量结构化消息列表Chat Model中MessagesPlaceholder动态消息插槽含占位符的消息列表Chat Model高Message 对象组合无消息列表Chat Model高自定义StringPromptTemplate自定义任意均可极高模板工作流程以下 Mermaid 时序图展示了从定义模板到 LLM 调用的一般流程。大语言模型提示词模板开发者大语言模型提示词模板开发者定义模板及变量传入参数 (format / format_messages / invoke)返回格式化后的提示词或消息列表将格式化结果作为输入发送返回模型响应完整可运行代码以下代码整合了上述五种模板的示例可直接复制执行。执行前请安装依赖pipinstalllangchain langchain-coreimportinspectfromlangchain_core.promptsimport(PromptTemplate,ChatPromptTemplate,MessagesPlaceholder,StringPromptTemplate)fromlangchain_core.messagesimportHumanMessage,SystemMessage,AIMessage# 1. 字符串模板 str_templatePromptTemplate.from_template(你是一个{role}帮我起一个具有{country}特色的{gender}名字。)str_resultstr_template.format(role算命大师,country法国,gender女孩)print(字符串模板结果\n,str_result,\n)# 2. 对话模板 chat_templateChatPromptTemplate.from_messages([(system,你是一个起名大师你的名字叫{name}。),(human,你好感觉如何),(ai,你好我状态非常好。),(human,你叫什么名字),(ai,你好我叫{name}。),(human,{user_input}),])chat_resultchat_template.format_messages(name陈大师,user_input你的爸爸是谁呢)print(对话模板结果\n,chat_result,\n)# 3. 消息占位符 placeholder_templateChatPromptTemplate.from_messages([(system,你是一个厉害的人工智能助手。),MessagesPlaceholder(variable_namehistory),(human,{question})])ph_resultplaceholder_template.invoke({history:[HumanMessage(content你好请多关照)],question:今天天气如何})print(消息占位符结果\n,ph_result.messages,\n)# 4. Message 组合模板 sys_msgSystemMessage(content你是一个起名大师,additional_kwargs{大师名字:陈瞎子})human_msgHumanMessage(content请问大师叫什么)ai_msgAIMessage(content我叫陈瞎子。)composed_list[sys_msg,human_msg,ai_msg]composed_templateChatPromptTemplate.from_messages(composed_list)comp_resultcomposed_template.format_messages()print(Message 组合模板结果\n,comp_result,\n)# 5. 自定义模板 defhello_world(a,b,c):测试函数print(hello world)returna,b,cclassCustomCodeExplainerTemplate(StringPromptTemplate):defformat(self,**kwargs)-str:func_namekwargs[function_name]source_codeinspect.getsource(globals()[func_name])prompt_template(你是一个非常有经验和天赋的程序员。现在给你如下函数名称你会按照如下格式输出这段代码的名称、源代码和中文解释。\n函数名称: {function_name}\n源代码: {source_code}\n代码解释: )returnprompt_template.format(function_namefunc_name,source_codesource_code)custom_promptCustomCodeExplainerTemplate(input_variables[function_name])custom_resultcustom_prompt.format(function_namehello_world)print(自定义模板结果\n,custom_result,\n)总结本文详细介绍了 LangChain 中五种提示词模板的用法及适用场景从最简单的字符串模板到高度灵活的自定义模板覆盖了绝大多数 LLM 应用的提示词构建需求。通过对比和完整代码示例开发者可以快速选择适合自己项目的模板类型并基于此构建稳健、可维护的 AI Agent 系统。

相关新闻

AI4SE:AI赋能软件工程——从自动化到智能化的演进之路

AI4SE:AI赋能软件工程——从自动化到智能化的演进之路

1. 引言:软件工程的智能化浪潮在数字化转型的浪潮中,软件已成为驱动社会进步的核心引擎。然而,随着软件系统日益复杂,传统的软件工程方法在效率、质量和可维护性方面面临严峻挑战。想象一下:开发者深夜还在为复杂的业务…

2026/8/5 2:20:04 阅读更多 →
嵌入式处理器仿真——SystemC原理详解

嵌入式处理器仿真——SystemC原理详解

1. 引言在嵌入式系统开发中,处理器是核心组件。传统的硬件开发流程严重依赖物理原型,不仅成本高昂、周期漫长,更难以应对日益复杂的系统设计挑战。随着芯片集成度与软件复杂度的飙升,在硬件制造前进行精确、高效的SystemC仿真已成…

2026/8/5 2:20:04 阅读更多 →
嵌入式软件测试——测试用例生成方法分析

嵌入式软件测试——测试用例生成方法分析

1. 引言在嵌入式软件开发的生命周期中,测试是确保软件质量、可靠性和安全性的关键环节。与通用软件不同,嵌入式软件运行在特定的硬件环境中,通常对实时性、资源约束和稳定性有严格要求。测试用例作为测试活动的核心输入,其质量直接…

2026/8/5 2:20:04 阅读更多 →

最新新闻

Swagger接口测试实战:从文档生成到动态测试沙箱的深度整合

Swagger接口测试实战:从文档生成到动态测试沙箱的深度整合

1. 项目概述:为什么我们需要整合Swagger进行接口测试?如果你是一名后端开发者,或者正在和API打交道,那么“接口测试”这个词对你来说一定不陌生。从手动在Postman里敲请求,到写一堆自动化脚本,这个过程既繁…

2026/8/5 2:57:20 阅读更多 →
Linux虚拟化性能调优:Hugepage大页内存原理、配置与实战

Linux虚拟化性能调优:Hugepage大页内存原理、配置与实战

1. 从“分页”到“大页”:理解内存管理的效率瓶颈在Linux虚拟化环境里做性能调优,内存管理是绕不开的核心议题。我们平时聊的“调优”,很多时候是在和操作系统底层那些看不见的“摩擦”较劲。今天要聊的Hugepage(大页内存&#xf…

2026/8/5 2:57:20 阅读更多 →
Windows Defender安全中心白屏问题:从服务重置到注册表修复的完整解决方案

Windows Defender安全中心白屏问题:从服务重置到注册表修复的完整解决方案

1. 问题现象与根源剖析如果你在Windows 10或Windows 11上,满怀期待地点击那个盾牌图标,准备查看一下系统的安全状态,或者只是想调整一下实时防护的开关,结果却只等来一个空荡荡的白色窗口,或者一个无限旋转的加载圆圈&…

2026/8/5 2:57:20 阅读更多 →
041、YOLOv11损失函数自适应——自适应损失权重分配机制的即插即用模块设计与收敛加速验证

041、YOLOv11损失函数自适应——自适应损失权重分配机制的即插即用模块设计与收敛加速验证

041、YOLOv11损失函数自适应——自适应损失权重分配机制的即插即用模块设计与收敛加速验证 上个月调一个工业缺陷检测的场景,模型在训练到第80个epoch时,分类分支的loss突然崩了,定位分支却还在正常下降。翻看训练日志,发现分类分支的梯度范数在某个batch后直接跳了两个数…

2026/8/5 2:57:20 阅读更多 →
042、YOLOv11损失函数平衡——Focal Loss在正负样本不平衡场景下的调参指南与涨点效果

042、YOLOv11损失函数平衡——Focal Loss在正负样本不平衡场景下的调参指南与涨点效果

042、YOLOv11损失函数平衡——Focal Loss在正负样本不平衡场景下的调参指南与涨点效果 一、一个让我熬夜三天的调试问题 去年接了个工业质检项目,检测PCB板上的微小焊点缺陷。训练集里正样本(缺陷)只有800多个,负样本(正常焊点)接近12万。YOLOv11默认配置跑下来,mAP@0…

2026/8/5 2:57:20 阅读更多 →
MOXA NPort串口服务器配置实战:实现工业设备网络化与远程监控

MOXA NPort串口服务器配置实战:实现工业设备网络化与远程监控

1. 项目缘起:从一堆旧设备到网络化管理的需求最近在整理一个老旧的工业控制柜,里面塞满了各种PLC、触摸屏和传感器,它们之间大多通过RS-232或RS-485串口进行通信。这些设备本身运行稳定,但最大的问题在于数据孤岛和远程维护困难。…

2026/8/5 2:56:19 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →