共计 1970 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:为什么 Agent 输出格式难以控制?
在开发 LLM Agent 时,大家可能都遇到过这样的场景:明明在 Prompt 里写了 ” 请用 JSON 格式回答 ”,但模型返回的内容却可能是:

- 混合了自然语言解释的伪 JSON(如:
这里是结果:{"name":"Alice"}) - 缺少闭合括号的残缺结构
- 字段名突然变成中文描述
这些问题会导致后续接口解析失败,比如 Python 的 json.loads() 直接抛出异常。更麻烦的是,格式漂移(Format Drifting)可能随机出现,给 debug 带来极大困难。
三大控制方法对比
1. 直接指令约束
最简单的写法如:
请严格按以下 JSON 格式回复:{"field1": "value1", "field2": 123}
优点:零学习成本
缺点:模型可能自行添加解释性文字
2. Schema 描述法
通过结构化描述约束:
输出需满足此 Schema:
{
"type": "object",
"properties": {"city": {"type": "string"},
"temperature": {"type": "number"}
}
}
优点:支持类型校验
缺点:部分模型对 JSON Schema 理解不完整
3. 示例驱动法
给出输入输出对:
输入: 今天北京天气怎么样?输出: {"city":"北京","weather":"晴","temp":25}
请按相同格式回答上海天气
最佳实践:
– 组合使用指令 + 示例 效果最好
– 对 GPT- 4 类模型,Schema+ 示例 准确率可达 95%+
Prompt 模板设计实战
JSON 格式强化模板
def build_json_prompt(query: str, schema: dict):
return f"""
你是一个严格遵循 JSON 格式的 AI 助手,请特别注意:1. 仅输出 JSON,不要有任何额外解释
2. 必须包含所有要求字段
3. 确保数字不加引号
示例输出:{{"name":"产品名称","price":99.9}}
当前请求:{query}
需遵循的 JSON 结构:{schema}
"""
XML 格式控制技巧
对于需要 XML 的场景,建议:
- 明确声明 CDATA 区块
- 指定编码格式
- 添加 XSD 声明示例
<!-- 示例 -->
<response>
<![CDATA[此处是安全的内容区块]]>
</response>
多轮对话一致性保障
关键点在于维护 session 级别的格式记忆:
class DialogManager:
def __init__(self):
self.format_rules = ""
def add_format_rule(self, rule: str):
self.format_rules += f"\n{rule}"
def get_prompt(self, query: str):
return f"""
[系统格式规范]
{self.format_rules}
[当前对话]
用户:{query}
"""
# 使用示例
manager = DialogManager()
manager.add_format_rule("始终使用 YAML 格式,包含 time/status/data 字段")
五大避坑指南
- 处理模型过度解释
- 在 Prompt 开头用⚠️等符号强调
-
示例:
【重要】请直接输出 JSON,不要有任何前言后语 -
嵌套结构 token 超限
- 对深度超过 3 层的结构,改用
...省略中间层级 -
或者拆分多个请求
-
字段值含特殊字符
-
提前做字符转义:
import json safe_str = json.dumps(original_str) -
多语言混合问题
-
明确声明字段语言:
"字段名必须用英文" -
数组长度不一致
- 固定数组长度:
"items 列表必须包含 5 个元素"
自动化验证方案
测试用例设计
import pytest
import json
def test_json_format():
response = agent.query("测试请求")
try:
data = json.loads(response)
assert "required_field" in data
except json.JSONDecodeError:
pytest.fail("Invalid JSON format")
温度参数 (temperature) 测试
通过实验发现:
– temperature= 0 时格式稳定性达 98%
– temperature>0.7 时稳定性骤降至 65%
生产建议:
– 对格式敏感场景建议 temperature≤0.3
– 搭配重试机制(retry 3 次)
延伸思考
- 如何在支持灵活自然语言交互的同时保证关键数据结构化?
- 当模型坚决不遵守格式要求时,有哪些强制矫正方案?
- 对于需要动态调整输出格式的场景(如根据 API 版本自动切换 JSON Schema),如何设计扩展性架构?
通过系统化的 Prompt 设计加上严谨的验证机制,完全可以让 LLM 的输出像传统 API 一样稳定可靠。关键在于:把模型当作需要严格规范的新人程序员来训练。
正文完
