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 输出与模板引擎结合,实现高质量文档的快速生成。
模板引擎的工作原理:
- 预定义模板:在 Skill 中定义报告模板(Markdown/HTML)
- 变量占位:使用
{variable}标记待填充字段 - 数据填充:将 LLM 生成的结构化数据填入模板
- 格式渲染:生成最终报告
财务报告模板示例:
# {{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 是否足够?