【LangChain】P12 LangChain 提示词模板深度解析(三):实例化参数
目录
- 核心原理:一切皆消息列表
- 方式一:元组列表 —— 最佳实践
- 关键示例
- 优势分析
- 最佳实践
- 方式二:纯字符串 —— 快速原型
- 关键示例
- 重要特性
- 适用场景
- 局限性
- 方式三:字典类型 —— 结构化配置
- 关键示例
- 核心优势
- 实战应用
- 方式四:消息对象 —— 类型安全的选择
- 关键示例
- 核心价值
- 高级用法
- 方式五:嵌套模板 —— 模块化设计
- 关键优势
- 架构优势
- 企业级应用
- 方式六:消息提示词模板 —— 精细控制
- 关键示例
- 适用场景
- 进阶技巧
- 性能对比与最佳实践
- 选择
在使用 LangChain 构建 AI 应用时,ChatPromptTemplate 是最核心的组件之一。它负责将用户输入和系统指令组织成大语言模型可以理解的格式。本文将深入剖析 ChatPromptTemplate 的所有实例化参数和方法,帮助你掌握这个强大工具的全部能力。
核心原理:一切皆消息列表
无论使用构造方法还是 from_messages()
工厂方法,ChatPromptTemplate 的本质都是将消息列表转换为结构化的提示词。这个设计理念简洁而强大,为多样化的使用场景提供了统一的接口。
从类型系统的角度看,messages
参数始终接受一个列表,但列表元素的类型却极具灵活性。LangChain ChatPromptTemplate 支持六种不同的消息表示方式,每种都有其独特的应用场景和优势。
方式一:元组列表 —— 最佳实践
推荐指数: ⭐⭐⭐⭐⭐
最常用、最直观、也是官方最推荐的方式。元组的第一个元素指定消息角色,第二个元素是消息内容。
关键示例
from langchain_core.prompts import ChatPromptTemplate# 使用构造方法
chat_prompt_template1 = ChatPromptTemplate(messages=[("system", "你是一个AI助手,你的名字叫{name}"),("human", "我的问题是{question}")]
)# 使用工厂方法(推荐)
chat_prompt_template2 = ChatPromptTemplate.from_messages([("system", "你是一个AI助手,你的名字叫{name}"),("human", "我的问题是{question}")
])
优势分析
- 简洁明了: 角色和内容一目了然,代码可读性强
- 类型安全: 元组结构强制要求角色和内容配对
- 支持变量: 使用
{变量名}
语法实现动态内容注入 - 适配性好: 支持 system、human、ai、function 等所有消息类型
最佳实践
from langchain_core.prompts import ChatPromptTemplatechat_prompt_template = ChatPromptTemplate.from_messages([("system", "你是一个AI助手,你的名字叫{name}"),("human", "我的问题是{question}")
])formatted_prompt = chat_prompt_template.invoke(input={"name": "小智","question": "1+2*3=?"
})
print(formatted_prompt)
方式二:纯字符串 —— 快速原型
推荐指数: ⭐⭐⭐
当你需要快速测试或构建简单提示词时,可以直接传入字符串。
关键示例
chat_prompt_template = ChatPromptTemplate.from_messages(["我的问题是{question}"
])
重要特性
- 字符串默认被解析为
HumanMessage
- 适合单轮对话或简单查询场景
- 无法指定系统消息或其他角色
适用场景
# 快速问答
simple_qa = ChatPromptTemplate.from_messages(["请用一句话解释:{concept}"
])# 测试大模型响应
test_prompt = ChatPromptTemplate.from_messages(["测试消息:{test_content}"
])
局限性
缺乏角色控制,难以构建复杂的多角色对话场景。
方式三:字典类型 —— 结构化配置
推荐指数: ⭐⭐⭐⭐
字典方式提供了最大的灵活性,特别适合从配置文件加载或动态生成提示词。
关键示例
chat_prompt_template = ChatPromptTemplate.from_messages([{"role": "system", "content": "我是一个人工智能助手,我的名字叫{name}"},{"role": "human", "content": "我的问题是{question}"},{"role": "ai", "content": "让我思考一下..."},{"role": "human", "content": "{follow_up}"}
])
核心优势
- 可序列化: 易于存储到 JSON/YAML 配置文件
- 动态构建: 可以根据条件动态添加或删除消息
- 扩展性强: 支持添加额外的元数据字段
实战应用
import json# 从配置文件加载
def load_prompt_from_config(config_path):with open(config_path, 'r', encoding='utf-8') as f:config = json.load(f)return ChatPromptTemplate.from_messages(config['messages'])# 动态构建多角色对话
def build_multi_turn_prompt(conversation_history):messages = [{"role": "system", "content": "你是一个有帮助的助手"}]for turn in conversation_history:messages.append({"role": turn['role'], "content": turn['content']})return ChatPromptTemplate.from_messages(messages)
方式四:消息对象 —— 类型安全的选择
推荐指数: ⭐⭐⭐⭐
使用 LangChain 的消息类提供了完整的类型检查和 IDE 支持。
关键示例
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplatechat_prompt = ChatPromptTemplate.from_messages([SystemMessage(content="我是一个人工智能助手,我的名字叫{name}"),HumanMessage(content="我的问题是{question}"),AIMessage(content="让我为你解答...")
])
核心价值
- 类型安全: 明确的类型,可以在编译时捕获错误,减少运行时问题
- IDE 友好: 完整的代码自动补全和类型提示以及自动错误检查
- 功能丰富: 消息对象支持额外的元数据和属性
高级用法
from langchain_core.messages import SystemMessage, HumanMessage# 带元数据的消息
chat_prompt = ChatPromptTemplate.from_messages([SystemMessage(content="你是{role}",additional_kwargs={"temperature": 0.7}),HumanMessage(content="{query}",additional_kwargs={"user_id": "12345"})
])
通过 additional_kwargs
记录更多实用但是不参与运算的内容,提升整体代码价值与效果。
方式五:嵌套模板 —— 模块化设计
推荐指数: ⭐⭐⭐⭐⭐
通过嵌套 ChatPromptTemplate,可以实现提示词的模块化和复用。
关键优势
from langchain_core.prompts import ChatPromptTemplate# 定义可复用的系统提示词模块
system_prompt = ChatPromptTemplate.from_messages([("system", "我是一个人工智能助手,我的名字叫{name}"),("system", "我的专长是{expertise}")
])# 定义用户交互模块
user_prompt = ChatPromptTemplate.from_messages([("human", "我的问题是{question}")
])# 组合模块
final_prompt = ChatPromptTemplate.from_messages([system_prompt,user_prompt
])
架构优势
- 高度复用: 通用模块
ChatPromptTemplate
可在多个场景(System、Human)使用 - 易于维护: 修改模块自动影响所有使用者
- 清晰分层: 系统配置、上下文、用户输入分离,代码非常简洁清晰
企业级应用
# 定义企业标准系统提示词
enterprise_system = ChatPromptTemplate.from_messages([("system", "你是{company}的AI助手"),("system", "请遵守以下原则:{guidelines}"),("system", "当前服务客户:{customer_tier}")
])# 定义业务特定模块
sales_context = ChatPromptTemplate.from_messages([("system", "当前产品线:{product_line}"),("system", "本月促销活动:{promotions}")
])# 组合成完整提示词
sales_assistant_prompt = ChatPromptTemplate.from_messages([enterprise_system,sales_context,("human", "{customer_query}")
])
方式六:消息提示词模板 —— 精细控制
推荐指数: ⭐⭐⭐⭐
使用专门的消息提示词模板类,可以对每个消息进行更精细的配置。
关键示例
from langchain_core.prompts import (ChatPromptTemplate,HumanMessagePromptTemplate,SystemMessagePromptTemplate
)# 创建系统消息模板
system_template = "你是一个专家{role},你的专长是{expertise}"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)# 创建人类消息模板
human_template = "给我解释{concept},用{style}的语言"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)# 组合模板
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt,human_message_prompt
])
适用场景
- 复杂格式化: 需要对单个消息进行特殊处理
- 条件渲染: 根据不同条件选择不同的消息模板
- 模板继承: 构建消息模板的继承体系
进阶技巧
from langchain_core.prompts import (ChatPromptTemplate,HumanMessagePromptTemplate,SystemMessagePromptTemplate,AIMessagePromptTemplate
)# 构建复杂的对话流程
system_prompt = SystemMessagePromptTemplate.from_template("角色:{role}\n背景:{background}\n目标:{objective}"
)context_prompt = AIMessagePromptTemplate.from_template("基于以下上下文:\n{context}\n我的理解是:{understanding}"
)query_prompt = HumanMessagePromptTemplate.from_template("问题:{question}\n期望格式:{format}\n详细程度:{detail_level}"
)complex_prompt = ChatPromptTemplate.from_messages([system_prompt,context_prompt,query_prompt
])# 格式化使用
result = complex_prompt.format_messages(role="数据分析师",background="金融行业10年经验",objective="帮助用户理解财务报表",context="公司Q3财报显示...",understanding="营收增长但利润下降",question="如何优化成本结构?",format="分点说明,每点包含数据支撑",detail_level="详细"
)
性能对比与最佳实践
方式 | 性能 | 可读性 | 可维护性 | 适用规模 |
---|---|---|---|---|
元组列表 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 中小型 |
纯字符串 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | 原型/测试 |
字典类型 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 中大型 |
消息对象 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 所有规模 |
嵌套模板 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 大型/企业 |
消息提示词模板 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 复杂场景 |
选择
ChatPromptTemplate
的六种实例化方式各有千秋:
- 日常开发首选元组列表,简洁高效
- 快速原型使用纯字符串,立即上手
- 配置驱动选择字典类型,灵活可控
- 类型安全依赖消息对象,减少错误
- 模块化设计采用嵌套模板,提升复用
- 精细控制运用消息提示词模板,满足复杂需求
掌握这些方法,在不同场景下游刃有余地构建高质量的 AI 应用提示词系统。选择合适的方法比掌握所有方法更重要。
2025.10.04 吉林·长春