共计 1862 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要约束 Agent 输出格式?
在开发基于 LLM 的 Agent 时,输出格式的不确定性会导致许多实际问题。最常见的是 API 响应解析错误,比如下游系统期望一个严格的 JSON 结构,但 Agent 返回的却是自由文本或格式不完整的 JSON。另一个典型问题是多轮对话中的格式漂移,随着对话轮数的增加,输出格式逐渐偏离初始设定的结构。

技术方案对比
直接字符串模板 vs 结构化 Prompt
- 字符串模板 :简单直接,但在复杂场景下维护困难
- 优点:实现简单,适合固定格式输出
-
缺点:灵活性差,难以处理动态内容
-
结构化 Prompt:更强大但需要精心设计
- 优点:可以定义严格的输出规范
- 缺点:需要更多前期设计工作
OpenAI Function Calling 和 Grammars
- Function Calling:适合 API 调用场景
- 可以定义严格的参数结构
-
但仅限于特定类型的交互
-
Grammars:提供更细粒度的控制
- 可以定义输出的语法结构
- 但目前支持有限
实战:使用 Python 实现格式约束
下面是一个使用 LangChain 的 OutputParser 实现 JSON 格式强约束的示例:
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
# 1. 定义输出格式规范
response_schemas = [ResponseSchema(name="answer", description="回答内容"),
ResponseSchema(name="source", description="数据来源")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 2. 创建包含格式指令的 Prompt
template = """
请根据以下问题提供回答,并严格遵循指定的输出格式。问题: {question}
{format_instructions}
"""
prompt = PromptTemplate(
template=template,
input_variables=["question"],
partial_variables={"format_instructions": output_parser.get_format_instructions()}
)
# 3. 调用 LLM 并解析结果
llm = OpenAI()
query = "什么是 Prompt 工程?"
_input = prompt.format_prompt(question=query)
output = llm(_input.to_string())
# 4. 解析并验证输出
try:
parsed = output_parser.parse(output)
print(parsed)
except Exception as e:
print(f"格式错误: {e}")
# 实现回退逻辑
fallback_output = {"answer": output, "source": "unstructured"}
print(fallback_output)
生产环境考量
Token 开销与格式复杂度
- 格式约束越严格,Prompt 的 token 开销越大
- 需要在约束力度和效率之间找到平衡点
轻量级验证方案
- 使用 JSON Schema 进行快速验证
- 实现示例:
import jsonschema
schema = {
"type": "object",
"properties": {"answer": {"type": "string"},
"source": {"type": "string"}
},
"required": ["answer"]
}
try:
jsonschema.validate(parsed, schema)
except jsonschema.ValidationError as e:
print(f"验证失败: {e}")
避坑指南
常见误区
- 过度约束 :可能导致创造力下降
- 静态格式 :无法适应动态需求
最佳实践
- 为复杂场景实现动态格式切换
- 保留一定的自由文本输出能力
格式约束挑战题
尝试修改上面的示例,实现以下功能:
1. 支持嵌套的 JSON 结构
2. 添加自动格式修复机制
3. 实现基于对话历史的动态格式调整
通过这篇指南,你应该已经掌握了约束 Agent 输出格式的关键技术。记住,好的格式约束应该在保证结构化的同时,不牺牲 Agent 的灵活性和创造力。
正文完
