惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Last Week in AI
Last Week in AI
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
The Cloudflare Blog
罗磊的独立博客
月光博客
月光博客
N
Netflix TechBlog - Medium
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
Jina AI
Jina AI
J
Java Code Geeks

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
14. 别再硬写提示词了!LangChain PromptTemplate从入门到实战
老陈说编程 · 2026-05-12 · via 博客园_首页

在 AI 应用开发中,很多开发者都会犯一个共同的错误:把提示词直接写死在代码里。这种做法看似简单快捷,但随着应用功能的扩展,问题会迅速暴露。固定的提示词就像一把只能开一把锁的钥匙,严重限制了大模型的适用范围。

image

 为了解决这个普遍存在的痛点,LangChain框架提供了一个核心基础组件 ——PromptTemplate。它就像一个提示词的 "模具",让你可以定义一次通用模板,然后通过传入不同的参数,动态生成成千上万条针对性的提示词。

为了学习更轻松,我做了动画视频《14.LangChain PromptTemplate从入门到实战》

image

 当你需要创建一个 PromptTemplate 实例时,LangChain 提供了两种方式:直接使用构造方法,或者使用官方更推荐的 from_template 类方法。

直接使用构造方法需要你手动列出所有的输入变量,代码冗长不说,还很容易出错。比如,如果你在模板中添加了一个新变量,但忘记在 input_variables 参数中同步声明,就会导致运行时错误。

而 from_template 方法的最大优势在于它能够自动扫描模板字符串,智能推断出所有的输入变量。这不仅让代码更加简洁易读,还能彻底避免手动维护变量列表带来的不一致问题。

image

 PromptTemplate 内置了对三种主流模板格式的支持,你可以根据自己的实际需求选择最合适的一种:

f-string:这是 Python 的原生语法,也是 LangChain 默认使用的格式。它使用单大括号{variable_name}来标记变量占位符。f-string 格式简单直观,没有额外的学习成本,而且安全性最高,是绝大多数场景下的首选。

jinja2:如果你需要在提示词中实现条件判断、循环等复杂逻辑,jinja2 格式会是更好的选择。它支持{% if %}、{% for %}等控制结构,可以根据不同的输入动态调整提示词的内容。不过需要注意的是,jinja2 模板存在一定的安全风险,在处理不可信的用户输入时需要格外谨慎。

mustache:这是一种跨语言通用的模板格式,使用双大括号{{variable_name}}来标记变量。如果你需要在不同编程语言之间共享提示词模板,mustache 格式可以提供最好的兼容性。

根据大量实际开发经验总结,90% 以上的应用场景使用默认的 f-string 格式就完全能够满足需求。只有当你确实需要复杂的逻辑控制或者跨语言共享时,才需要考虑使用其他两种格式。

image

 从本质上讲,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)