离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争

🏭导航收藏不迷路--->制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)

文章摘要

在LangChain的PromptTemplate中嵌入JSON示例时,{"line_name": "交互屏组装A线"}中的花括号被误解析为模板变量,触发INVALID_PROMPT_INPUT错误。本文深入剖析PromptTemplate的变量解析机制,揭示{}语法与JSON格式的冲突本质,并提供"双花括号转义"与"变量占位符隔离"的解决方案。适用于所有使用LangChain PromptTemplate进行提示词工程的Python项目。

问题现象

兄弟们,前面几篇排坑笔记你们也看了,我们搞定了导入链污染、搞定了版本碎片化、搞定了中文括号、搞定了Agent的嵌套JSON。我本以为可以消停一会儿了。

然后我继续跑Agent测试,输入:

bash 复制代码
计算交互屏组装A线在2026-07-12的OEE

结果Agent还没开始思考,直接给我弹了个大红叉:

bash 复制代码
❌ 错误: 'Input to PromptTemplate is missing variables {\'"line_name"\'}. 
Expected: [\'"line_name"\', \'agent_scratchpad\', \'input\'] 
Received: [\'input\', \'intermediate_steps\', \'agent_scratchpad\']

Note: if you intended {"line_name"} to be part of the string and not a variable, 
please escape it with double curly braces like: \'{{"line_name"}}\'.

我当时的第一反应还是:这不科学啊......😀

我只是在Prompt里写了一个JSON示例,想告诉Agent应该怎么传参数。LangChain凭什么把我的示例JSON里的花括号当成变量名?而且报错信息里那个Note------它明明知道问题在哪,为什么不自己处理,非要让我手动去改?

根因分析

说实话,这个问题的报错信息其实已经把答案写在脸上了------就是那一行Note。但我当时没仔细看,还以为是Prompt写错了,改了半天格式,绕了一大圈才回到这个提示上。

第一层:PromptTemplate的"占位符"机制

LangChain的PromptTemplate有一个核心设计:{变量名}来表示需要动态填充的位置

比如你写:

python 复制代码
template = "你好,{name},今天是{date}"
prompt = PromptTemplate.from_template(template)
prompt.format(name="老蒋", date="2026-07-20")
# 输出:你好,老蒋,今天是2026-07-20

这是它的正常工作方式------{name}{date}变量占位符,运行时会被替换成实际值。

第二层:JSON的花括号撞上了占位符语法

问题出在,当我在Prompt里写了一个JSON示例,告诉Agent应该怎么调用工具时:

python 复制代码
template = """
...
Action Input: {"line_name": "交互屏组装A线", "date": "2026-07-12"}
...
"""

PromptTemplate在解析这个模板时,看到{"line_name",心里想的是:

"哦,这里有一个{开始的花括号,后面跟着"line_name",这是一个变量名。我要找它的右括号}来闭合。但是等一下,怎么一直匹配到JSON结束都没有找到?不管了,先记下来:需要用户提供"line_name"这个变量。"

于是它就认为"line_name"是一个需要用户输入的变量名,要求你提供它------但你根本没想用它当变量,它只是JSON示例里的一段文本啊!

说白了就是:PromptTemplate只认识{}是占位符,它不管你的{}里面写的是什么。只要是{},它就当变量处理。

第三层:为什么报错信息明明提示了,却不自动处理?

这个是最气人的。报错信息里那句Note写得清清楚楚:

bash 复制代码
Note: if you intended {"line_name"} to be part of the string and not a variable, 
please escape it with double curly braces like: '{{"line_name"}}'.

它知道问题在哪,也知道怎么解决,但它就是不做。 非要你手动去把花括号改成双层的。

这就像你去餐馆点菜,服务员跟你说:"先生,您的菜里有辣椒,如果您不能吃辣,可以自己把辣椒挑出来。"------你心里想的是:你不应该帮我提醒厨房别放辣椒吗?

解决方案

别慌,三步搞定它。

第一步:找到你的Prompt模板

打开common/base_agent_builder.py,找到_get_prompt_template方法。在方法的字符串里,你一定写了类似这样的JSON示例:

python 复制代码
def _get_prompt_template(self) -> str:
    return """
    调用工具时,Action Input必须是一个JSON对象。
    例如:{"line_name": "交互屏组装A线", "date": "2026-07-12"}
    """

第二步:把单花括号改成双花括号

核心规则:JSON示例中的花括号用双层的{``{}},变量占位符保持单层的{}

python 复制代码
def _get_prompt_template(self) -> str:
    return """
    调用工具时,Action Input必须是一个JSON对象。
    例如:{{"line_name": "交互屏组装A线", "date": "2026-07-12"}}
    """

同时确保真正的变量占位符 (比如{input}{agent_scratchpad}保持单花括号

python 复制代码
def _get_prompt_template(self) -> str:
    return """
    ...
    Question: {input}
    Thought: {agent_scratchpad}
    """

第三步:理解这张"对照表",以后就不会再搞混了

你的意图 写法 PromptTemplate的行为
显示一个JSON示例 {``{"key": "value"}} 当作文本,原样输出{"key": "value"}
定义一个变量占位符 {variable} 运行时替换为实际值
显示文本中的普通花括号 {``{}} 每个双花括号转义成一个单花括号

记住这个表,以后就不会再被这个坑绊倒了。

经验总结

怕你忘了,我再啰嗦一遍😀😀😀:PromptTemplate里,JSON的花括号不是拿来给你当示例用的,它是用来定义变量的。你想显示JSON,就得用双花括号把它"藏"起来。

落到具体操作上就是四条:

  1. JSON示例全部用双花括号{"key": "value"}{``{"key": "value"}}。只要你的Prompt里包含JSON示例,就得这么写,没有例外。

  2. 变量占位符保持单花括号{input}{agent_scratchpad}{tools}{tool_names}这些是真正的变量,必须保持单花括号,不能乱改。

  3. 区分规则很简单 :想显示给用户看的JSON → 双花括号;想让LangChain替换内容的变量 → 单花括号。一句话:显示的用双层,替换的用单层。

  4. 调试技巧 :如果遇到missing variables报错,先把Prompt里的所有花括号过一遍。看到{就去确认:这到底是JSON示例还是变量?如果是JSON示例,立刻改成{``{90%的情况,改完就好了。

说白了就是一句话:花括号是LangChain的"魔法符号",你想让它显示出来,就得用双层的。 这就像Markdown里你想显示#号,得用转义一样。

系列导航


本文问题源自智联工坊实战:制造知识库工具调用Agent从零搭建(OEE+手册+排班)-CSDN博客 完整源码及深度教程见该文详细内容。

💡 建议关注收藏 :下次遇到INVALID_PROMPT_INPUT报错,可以快速对照本文排查。

互动与交流

你在使用LangChain或其他模板引擎时,有没有被花括号坑过?欢迎在评论区吐槽,咱们互相安慰一下------也让我知道多少人被标点符号折磨过的人😀

关于作者

制造业数据与AI践行者老蒋,23年IT老兵。聚焦制造业数据架构与AI融合落地。全流程实战,全源码开源。

标签:#排坑笔记 #LangChain #Prompt #踩坑实录

相关推荐
m0_4626052218 小时前
大模型week02
数据库
DBA_G18 小时前
GBase 8a数据库集群多维度资源管控策略矩阵解析
数据库·oracle
逐米时代19 小时前
智能招聘与人岗匹配:可解释匹配让录用依据有迹可循
大数据·数据库·人工智能
承渊政道19 小时前
KES专业技能包发布:覆盖数据库开发、迁移与运维全流程
运维·数据库·gitee·数据库开发·金仓数据库
IvorySQL20 小时前
PostgreSQL 日报| RI 快速路径并发读取缺陷(8 月 13 日)
数据库·postgresql
highreport20 小时前
HighReport报表工具定时调度和邮件定时发送
运维·服务器·数据库
01_ice21 小时前
数据库基础
数据库
deepdata_cn21 小时前
向量数据库是非结构化数据的AI检索底座
数据库·人工智能
梁辰兴21 小时前
软件工程:数据库设计
数据库·软件工程·数据库设计·逻辑设计·概念设计·梁辰兴·物理设计
10mAh21 小时前
【Git】误删分支、reset --hard 后提交丢了怎么办?——reflog、fsck 与安全恢复实战
数据库·git·安全·回归