结构化输出实战:JSON Mode、Function Calling与Schema约束

为什么结构化输出如此重要 LLM的默认输出是自由文本,但实际工程中我们几乎总是需要结构化数据——API调用需要JSON参数、数据抽取需要表格、Agent决策需要指令。结构化输出的可靠性直接决定了系统能否自动化运行。 目前主流的三种结构化输出方案各有优劣,选对场景才能发挥最大价值。 方案一:JSON Mode 原理与用法 JSON Mode是OpenAI率先引入的功能,强制模型输出合法JSON。它的原理是在解码阶段约束token采样,确保输出符合JSON语法。 from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": "你是数据抽取助手,输出JSON格式。"}, {"role": "user", "content": "抽取以下文本的人名和职位:张三是CEO,李四是CTO。"} ], response_format={"type": "json_object"} ) import json result = json.loads(response.choices[0].message.content) # {"people": [{"name": "张三", "title": "CEO"}, {"name": "李四", "title": "CTO"}]} 局限性 JSON Mode只保证语法合法,不保证结构符合预期。它无法约束字段名、类型和嵌套层级。你需要额外验证: from pydantic import BaseModel, ValidationError class PersonInfo(BasestModel): name: str title: str class ExtractionResult(BaseModel): people: list[PersonInfo] def safe_parse(raw_json: str) -> dict | None: try: data = json.loads(raw_json) return ExtractionResult(**data).model_dump() except (json.JSONDecodeError, ValidationError) as e: # 记录错误,触发修复流程 logger.warning(f"Schema validation failed: {e}") return None 方案二:Function Calling 设计理念 Function Calling让模型"知道"有哪些可用函数及其参数schema,模型负责生成符合schema的调用参数。这是一种约束生成方式,比JSON Mode更严格。 tools = [ { "type": "function", "function": { "name": "search_database", "description": "在产品数据库中搜索", "parameters": { "type": "object", "properties": { "query": {"type": "string", "description": "搜索关键词"}, "category": { "type": "string", "enum": ["电子产品", "服装", "食品"], "description": "限定品类" }, "limit": {"type": "integer", "minimum": 1, "maximum": 50} }, "required": ["query"] } } } ] response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "帮我找3个电子产品类的手机"}], tools=tools, tool_choice={"type": "function", "function": {"name": "search_database"}} ) # 模型生成结构化参数 tool_call = response.choices[0].message.tool_calls[0] args = json.loads(tool_call.function.arguments) # {"query": "手机", "category": "电子产品", "limit": 3} 多函数编排 Function Calling的真正威力在于多函数编排和模型自主决策调用链: ...

2026-07-29 · 3 min · 432 words · 硅基 AGI 探索者
结构化输出

LLM结构化输出指南

为什么结构化输出如此重要? LLM默认输出自由文本,但实际应用中我们通常需要结构化数据——JSON对象、表格、特定格式。不可靠的结构化输出会导致下游解析失败,是LLM应用从原型到生产的主要障碍之一。 方案一:Prompt工程 基础方案 STRUCTURED_PROMPT = """ 请按以下JSON格式输出,不要包含其他内容: { "intent": "用户意图分类", "confidence": 0.0-1.0之间的数值, "entities": [ {"type": "实体类型", "value": "实体值"} ], "response": "回复内容" } 用户输入:{input} """ Few-shot增强 FEW_SHOT_PROMPT = """ 请按JSON格式输出意图分析结果。 示例1: 输入:我想订一张明天去北京的机票 输出:{"intent": "book_flight", "confidence": 0.95, "entities": [{"type": "destination", "value": "北京"}, {"type": "date", "value": "明天"}], "response": "好的,我来帮您查询明天去北京的航班。"} 示例2: 输入:今天天气怎么样 输出:{"intent": "weather_query", "confidence": 0.9, "entities": [{"type": "date", "value": "今天"}], "response": "让我为您查询今天的天气。"} 现在请分析: 输入:{input} 输出: """ 优缺点 优点:简单通用,任何LLM都支持 缺点:不可靠,模型可能输出多余文本、格式错误、字段缺失 方案二:JSON Mode from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="qwen3-32b", messages=[{"role": "user", "content": "分析以下文本的情感,返回JSON"}], response_format={"type": "json_object"} # 强制JSON输出 ) result = json.loads(response.choices[0].message.content) JSON Mode保证输出是合法的JSON,但不保证包含特定字段。 ...

2026-07-02 · 2 min · 333 words · 硅基 AGI 探索者
structured output prompt design

结构化输出 Prompt 设计:让 LLM 稳定输出 JSON 的方法

为什么结构化输出如此重要 在 2026 年的 AI 应用开发中,LLM 的输出需要被程序消费——传入 API、写入数据库、驱动 Agent 决策。一项 2026 年 Stack Overflow 开发者调查显示,93% 的 LLM 应用需要结构化输出,但其中 41% 的开发者仍在与"输出格式不稳定"作斗争。 一、结构化输出的三层保障 ┌─────────────────────────────┐ │ 第一层:Prompt 设计 │ ← 指令层面的约束 ├─────────────────────────────┤ │ 第二层:Schema 约束 │ ← JSON Schema / 函数调用 ├─────────────────────────────┤ │ 第三层:约束解码 │ ← Token 级别的强制约束 └─────────────────────────────┘ 二、Prompt 层面的结构化设计 2.1 基础模式:明确格式指令 请分析以下产品评论,并以JSON格式输出分析结果。 输出格式要求(严格遵守): { "sentiment": "positive" | "negative" | "neutral", "score": 0.0到1.0之间的浮点数, "aspects": [ { "aspect": "产品维度名称", "opinion": "用户观点", "polarity": "positive" | "negative" } ], "summary": "50字以内的总结" } 注意: 1. 只输出JSON,不要输出任何其他内容 2. 不要用markdown代码块包裹 3. 所有字符串值必须用双引号 4. 确保JSON可以被标准解析器解析 评论内容:{{review}} 2.2 增强模式:Schema 嵌入 + 示例引导 STRUCTURED_OUTPUT_TEMPLATE = """ 你是一个数据提取专家。请从给定文本中提取信息,严格按照以下JSON Schema输出。 ## JSON Schema ```json {schema} 输出规则 输出必须是符合上述Schema的合法JSON 无法从文本中提取的字段,使用null值 日期格式统一为ISO 8601 金额统一为数字,单位为分 不要输出任何解释性文字 示例 输入:{example_input} 输出:{example_output} ...

2026-06-28 · 5 min · 972 words · 硅基 AGI 探索者
鲁ICP备2026018361号