4.3 输出格式控制

结构化输出是将 AI 的自由文本响应转化为机器可读格式的技术。在金融应用中,这一点尤为重要——无论是提取财务数据、生成分析报告,还是与下游系统集成,都需要可靠的格式控制。

4.3.1 结构化输出设计

结构化输出的核心价值:

  • 将不可预测的文本转化为确定性数据
  • 简化解析流程,便于与下游系统集成
  • 减少模型幻觉的发生概率
  • 提高输出的可靠性和一致性

格式选择策略

输出格式 适用场景 优势 劣势
JSON API 集成、程序化解析 广泛支持、易于验证 不适合长文本
XML 文档结构、复杂嵌套 自描述性强、Claude 原生支持 冗余度高
Markdown 报告生成、人类阅读 人类可读、格式化渲染 机器解析复杂
表格 数据对比、指标展示 直观清晰 不支持嵌套

4.3.2 JSON 与 XML 格式生成

JSON 格式

JSON 是最常用的结构化输出格式。以下是金融数据提取的示例:

任务:从财务报告中提取关键指标,返回 JSON 格式。

字段说明:
- ticker: 股票代码(如 600519)
- period: 报告期(如 2024Q3)
- revenue: 营业收入(单位:亿元)
- net_profit: 净利润(单位:亿元)
- yoy_growth: 同比增长率

输出格式:
{
    "ticker": "600519",
    "period": "2024Q3",
    "revenue": 398.5,
    "net_profit": 195.3,
    "yoy_growth": "+16.8%"
}

注意:
- 直接输出 JSON,不要使用 Markdown 代码块
- 确保 JSON 格式正确可解析

防御性提示设计

为了避免格式问题,可以在提示中添加明确的约束:

输出要求:
1. 直接输出有效的 JSON,不要使用代码块
2. 不要添加任何解释性文字
3. 响应必须以 "{" 开头,以 "}" 结尾
4. 确保所有字符串使用双引号
5. 数值不带引号

XML 格式

Claude 对 XML 标签有特殊优化,使用 XML 可以清晰分隔提示的不同部分:

<task>金融新闻情感分析</task>

<context>
你是一位专业的金融分析师,需要分析以下新闻的市场情感。
</context>

<news>
某科技公司发布财报,营收超预期 15%,股价盘后上涨 8%。
</news>

<output_format>
请按以下结构输出:
<analysis>
    <sentiment>positive/negative/neutral</sentiment>
    <confidence>0.0-1.0</confidence>
    <reasoning>判断理由</reasoning>
</analysis>
</output_format>

XML vs JSON 选择建议

场景 推荐格式 理由
简单数据结构 JSON 更简洁、广泛支持
复杂嵌套文档 XML 自描述性强、层次清晰
Claude 专用应用 XML Claude 原生优化支持
需要程序处理 JSON 解析库更丰富

4.3.3 模板引擎集成

对于重复性强的报告生成任务,可以将 LLM 输出与模板引擎结合,实现高质量文档的快速生成。

模板引擎的工作原理

  1. 预定义模板:在 Skill 中定义报告模板(Markdown/HTML)
  2. 变量占位:使用 {variable} 标记待填充字段
  3. 数据填充:将 LLM 生成的结构化数据填入模板
  4. 格式渲染:生成最终报告

财务报告模板示例

# {{company_name}} 财务分析报告

**报告期**: {{report_period}}
**生成时间**: {{generated_at}}

## 一、核心指标

| 指标 | 数值 | 同比变化 |
|------|------|----------|
| 营业收入 | {{revenue}} 亿元 | {{revenue_growth}} |
| 净利润 | {{net_profit}} 亿元 | {{profit_growth}} |
| 毛利率 | {{gross_margin}}% | {{margin_change}} |

## 二、财务比率

- **ROE**: {{roe}}%
- **ROA**: {{roa}}%
- **资产负债率**: {{debt_ratio}}%

## 三、分析结论

{{analysis_summary}}

---
*本报告由 AI 自动生成,仅供参考*

在 Opencode 中的应用

Opencode 可通过 Skill 实现模板集成:

---
name: report-generator
description: |
  财务报告生成技能。结合模板生成标准化报告。
---

# 报告生成技能

## 工作流程

1. 从用户输入或数据源获取原始数据
2. 调用 LLM 提取结构化指标(JSON 格式)
3. 将 JSON 数据填充到报告模板
4. 输出格式化的完整报告

## 模板文件

模板存放在 `templates/financial_report.md`

## 输出要求

- 先输出结构化 JSON 数据
- 然后输出填充后的完整报告

模板引擎的优势

优势 说明
格式一致 所有报告遵循统一格式,提升专业性
减少幻觉 数据字段由 LLM 提取,文本框架由模板确定
易于维护 修改模板即可调整所有报告格式
降低成本 模板部分不消耗 token

4.3.4 格式验证与错误处理

即使有明确的格式要求,AI 输出也可能出现问题。常见的格式失败原因及应对策略:

失败类型 检测方法 预防措施
Token 截断 检查响应是否以 } 结尾 max_tokens 设置为预期长度的 1.5 倍
Markdown 包装 检查是否包含 ``` 提示中明确「不要使用代码块」
额外解释 检查首字符是否为 { 提示中强调「直接输出 JSON,不要解释」
字段缺失 使用 JSON Schema 验证 提示中列出所有必填字段

迭代纠错策略

当输出格式不符合预期时,可以要求模型自我纠正:

上一次输出有格式错误,请修正。

错误输出:
{之前的错误输出}

期望格式:
{正确的格式模板}

请只输出修正后的内容,不要任何解释。
注意常见问题

如果 AI 持续输出格式错误,检查以下几点: 1. 格式要求是否足够明确? 2. 是否提供了格式示例? 3. 是否禁止了额外解释文字? 4. max_tokens 是否足够?