用 response_format 让 deepseek-flash 输出稳定 JSON
场景与坑
把大模型输出喂给下游程序,格式稳定性比文笔重要。想让 deepseek-flash 直接吐出可解析的 JSON,靠提示词硬约束并不保险,成功率时高时低。官方其实为这个场景准备了 response_format 参数。这篇就把完整用法过一遍,顺带聊几个容易踩的坑。
基础用法
在请求体里加上 response_format,类型填 json_object。提示词也别闲着,要明确要求 JSON 并给出字段示例。官方文档特别提醒了两点,若提示词里不含 json 字样,接口会直接报错,并提示可能输出无限空格——两个条件缺一不可。示例代码如下。
from openai import OpenAI
client = OpenAI(
api_key="YOUR_KEY",
base_url="https://api.deepseek.com")
resp = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": (
"从下面这段文本抽取公司名与融资金额,"
"以 JSON 输出,字段用 company 与 amount:"
"智谱完成新一轮融资")}],
response_format={"type": "json_object"})
解析与容错
拿到返回先别急着信。json.loads 之前要做一层防御,截掉可能混入的代码围栏与前后缀文本。解析一旦失败,把原始输出和报错一起记进日志,再带着错误信息让模型重出一次。实践中两轮重试内基本都能拿到合法 JSON。
温度也值得调低。做结构化抽取时,temperature 放在 0.1 到 0.3 之间,字段乱填的概率会明显下降。字段约束一复杂,光写一段说明不够稳,把字段定义配上一个正例、一个反例都塞进提示词,效果更好。
和 function calling 的分工
两者的边界其实很清楚。需要模型执行动作,用 function calling;只需要数据,用 JSON 输出。它们还能组合起来,把工具返回的结果再整理成结构化数据。本站的 Function Calling 实战与API Python 快速入门适合作为前置阅读。模型名与定价速查见接入速查。
收尾提醒
一是 json_object 模式下输出可能被截断,超长结构建议拆成多次调用,每轮只出一部分。二是该模式不校验 schema,字段类型与枚举值得靠提示词约束,再加程序侧校验兜底。本文内容选自网上公开资料。
大模型网摘