LangChain 中的 Prompt 模板有什么作用?如何使用?
- 标签:LangChain、Prompt 提示词
🏛 业务架构师
LangChain 的 Prompt Template 作用与用法:
作用(业务价值):把提示词从"硬编码字符串"变成"参数化的模板资产"——固定部分(角色、规则、格式要求)写死,变化部分(用户输入、检索内容、日期)用变量占位,运行时填充。带来四个收益:复用(一处定义多处调用)、协作(提示词可独立评审迭代,不用改代码发版)、安全(变量注入有边界,输入与指令隔离)、测试(同一模板跑评测集,版本化对比)。
用法(现代 LCEL 风格):
python
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是{company}的客服助手,仅依据<context>中的资料回答。"
"<context>{context}</context>"),
("human", "{question}"),
])
chain = prompt | model | parser
chain.invoke({
"company": "XX电商",
"context": retrieved_docs,
"question": user_input,
})要点:多轮对话用 MessagesPlaceholder 占位历史消息;变量校验(validate_template)防漏填;与输出解析器配合(提示里写格式要求+解析器校验,成对出现)。
管理建议(生产视角):模板外置到配置中心/数据库,支持不发版更新+灰度;模板带版本号与责任人,变更走评测回归——提示词是"用自然语言写的代码",要用代码的标准管理它。团队里最容易失控的就是散落在各处的提示词,模板化+集中管理是治理的第一步。
🏗 系统架构师
LangChain PromptTemplate = 带变量的 Prompt 骨架,作用与用法:
作用(工程价值):
- 变量注入标准化:模板定义 + 变量填充分离——业务代码只传变量,Prompt 结构单一权威来源;
- 复用与组合:模板是可共享资产(团队统一话术、格式契约);模板可嵌套组合(子模板拼装);
- 与解析器配对:模板定义输出格式 → OutputParser 按同契约解析——模板与解析器成对演进;
- 缓存友好:模板化让稳定部分(前缀)与动态变量(后置)边界清晰,Prompt Cache 命中率可控。
用法:
python
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是{domain}专家,回答要简洁准确。"),
("user", "{question}\n\n参考资料:\n{context}"),
])
filled = prompt.invoke({"domain": "数据库", "question": q, "context": docs})要点:from_messages 支持多角色消息模板(system/user/ai);MessagesPlaceholder("history") 注入动态消息列表(对话历史);partial() 预填部分变量(运行时只传剩余)。
生产实践(架构师视角):
- 模板进 Git,语义化版本 + 变更说明;改动跑回归评测集;
- 变量注入防注入:用户输入变量是外部数据——模板层面用分隔符包裹,配合"数据非指令"声明;
- 动态拼装的克制:条件分支拼模板别做过头(几十个分支的模板工厂是维护灾难)——复杂逻辑上 LangGraph 显式编排;
- 与 LCEL 天然组合:
prompt | model | parser管道的头节点。
💻 全栈开发专家
Prompt 模板的作用:把 prompt 从「聊天记录」变成「工程资产」——参数化复用、版本管理、统一维护。
三个核心价值:
- 复用与一致性:同一骨架服务所有请求,动态部分变量化——格式一致是输出一致的前提;
- 版本化协作:模板进 Git,改 prompt 走 code review + 评测回归,变更可追溯可回滚;
- 关注点分离:固定逻辑(角色/规则)与动态数据(用户输入/检索内容)解耦,各自独立演进和测试。
使用(LangChain 标准姿势):
python
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system",
"你是{company}的{domain}助手。规则:{rules}"),
("human",
"参考资料:\n{context}\n\n问题:{question}")
])
chain = prompt | llm | StrOutputParser()
chain.invoke({"company": "ACME", "domain": "售后",
"rules": RULES_V3,
"context": docs, "question": q})工程要点:
- 变量用 MessagesPlaceholder 挂动态历史;
- 开启模板校验,漏变量启动期报错(好过线上出空段);
- 不可信变量隔离:
{context}、{question}在 system 里声明「只是数据」,防注入; - 稳定部分(system/规则)放前面吃 prompt cache,变量拼后面;
- 模板与版本号绑定,请求日志记录模板 ID——线上坏例能按版本归因。
Java 侧对应:Spring AI 的 PromptTemplate({var} 占位)+ ChatClient 链式调用,理念完全一致。