Skip to content

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 从「聊天记录」变成「工程资产」——参数化复用、版本管理、统一维护。

三个核心价值:

  1. 复用与一致性:同一骨架服务所有请求,动态部分变量化——格式一致是输出一致的前提;
  2. 版本化协作:模板进 Git,改 prompt 走 code review + 评测回归,变更可追溯可回滚;
  3. 关注点分离:固定逻辑(角色/规则)与动态数据(用户输入/检索内容)解耦,各自独立演进和测试。

使用(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 链式调用,理念完全一致。