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

推荐订阅源

云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
F
Fortinet All Blogs
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
爱范儿
爱范儿
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
有赞技术团队
有赞技术团队
博客园_首页
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
V
Visual Studio Blog
Jina AI
Jina AI
博客园 - Franky
量子位
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
aimingoo的专栏
aimingoo的专栏
M
MIT News - Artificial intelligence

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
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)