在 AI 应用开发中,很多开发者都会犯一个共同的错误:把提示词直接写死在代码里。这种做法看似简单快捷,但随着应用功能的扩展,问题会迅速暴露。固定的提示词就像一把只能开一把锁的钥匙,严重限制了大模型的适用范围。
为了解决这个普遍存在的痛点,LangChain框架提供了一个核心基础组件 ------PromptTemplate。它就像一个提示词的 "模具",让你可以定义一次通用模板,然后通过传入不同的参数,动态生成成千上万条针对性的提示词。
为了学习更轻松,我做了动画视频《14.LangChain PromptTemplate从入门到实战》。
当你需要创建一个 PromptTemplate 实例时,LangChain 提供了两种方式:直接使用构造方法,或者使用官方更推荐的 from_template 类方法。
直接使用构造方法需要你手动列出所有的输入变量,代码冗长不说,还很容易出错。比如,如果你在模板中添加了一个新变量,但忘记在 input_variables 参数中同步声明,就会导致运行时错误。
而 from_template 方法的最大优势在于它能够自动扫描模板字符串,智能推断出所有的输入变量。这不仅让代码更加简洁易读,还能彻底避免手动维护变量列表带来的不一致问题。
PromptTemplate 内置了对三种主流模板格式的支持,你可以根据自己的实际需求选择最合适的一种:
f-string:这是 Python 的原生语法,也是 LangChain 默认使用的格式。它使用单大括号{variable_name}来标记变量占位符。f-string 格式简单直观,没有额外的学习成本,而且安全性最高,是绝大多数场景下的首选。
jinja2:如果你需要在提示词中实现条件判断、循环等复杂逻辑,jinja2 格式会是更好的选择。它支持{% if %}、{% for %}等控制结构,可以根据不同的输入动态调整提示词的内容。不过需要注意的是,jinja2 模板存在一定的安全风险,在处理不可信的用户输入时需要格外谨慎。
mustache:这是一种跨语言通用的模板格式,使用双大括号{{variable_name}}来标记变量。如果你需要在不同编程语言之间共享提示词模板,mustache 格式可以提供最好的兼容性。
根据大量实际开发经验总结,90% 以上的应用场景使用默认的 f-string 格式就完全能够满足需求。只有当你确实需要复杂的逻辑控制或者跨语言共享时,才需要考虑使用其他两种格式。
从本质上讲,PromptTemplate 就是一个可复用的模板字符串。它的工作流程非常清晰:
(1) 定义一个包含变量占位符的模板字符串
(2) 以字典的形式传入具体的变量值
(3) PromptTemplate 会将这些值精确地填充到对应的占位符中
(4) 最终输出一个统一格式的PromptValue对象
这个 PromptValue 对象是 LangChain 中的一个通用数据类型,它可以直接传入任何大语言模型的 invoke 方法。同时,它也提供了便捷的转换方法,可以轻松地转换为普通字符串或者消息列表,满足不同模型的输入要求。
prompt = PromptTemplate.from_template(
"将{word}翻译成{lang}"
)
下面我们通过一个完整的示例来演示如何在实际代码中使用 PromptTemplate。
首先从langchain_core.prompts模块导入PromptTemplate类。
接着使用from_template方法创建PromptTemplate实例,该方法接收一个字符串模板作为参数,模板中用大括号包裹的部分即为变量占位符。
然后调用 prompt 的invoke方法,传入包含具体填充值的字典,该方法会将这些值替换到模板中,生成完整的提示词对象PromptValue。
最后将PromptValue传入之前已初始化好的大语言模型实例的invoke方法,并传入配置信息,大模型会根据该提示词生成对应的回答。
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate.from_template(
"将{word}翻译成{lang}"
)
prompt_value = prompt.invoke({"word": "good", "lang": "中文"})
res = llm.invoke(prompt_value, config=config)
print(res.content)
在某些情况下,你的模板中可能有一些变量的值在大部分时候都是固定的,只有少数几个变量需要每次调用时动态传入。这时,你可以使用partial_variables参数来预先定义这些固定变量,从而简化后续的调用过程。
from langchain_core.prompts import PromptTemplate
prompt = PromptTemplate.from_template(
"将{word}翻译成{lang}",
partial_variables={"lang": "中文"}
)
prompt_value = prompt.invoke({"word": "good"})
res = llm.invoke(prompt_value, config=config)
print(res.content)