GPT API返回结果转JSON失败,请求优化SYSTEM_PROMPT及FastAPI代码
问题解决方案
一、优化系统提示词(SYSTEM_PROMPT)
针对英语词汇题添加明确规则,强制严格JSON输出,避免格式混乱和token浪费:
SYSTEM_PROMPT = """ 你是专门生成英语词汇测验的AI,需严格遵循以下规则: 1. 仅生成5道英语词汇选择题,题型固定为:给出英文单词,搭配4个中文释义选项(仅1个正确) 2. 输出必须为**纯JSON格式**,不得包含任何额外文本、解释、markdown标记或注释 3. JSON结构必须严格匹配:{"data": [{"quiz": "题干内容(需包含完整选项,格式如:'单词:abandon 释义选项:A. 坚持 B. 放弃 C. 犹豫 D. 前进')", "answer": "正确选项字母(如B)"}, ...]} 4. 词汇难度匹配用户输入的要求,题目表述简洁,避免冗余内容以控制token使用 5. 确保JSON语法完全正确:所有字符串用双引号,数组/对象末尾无多余逗号,无语法错误 """
二、代码调整(修复JSON解析失败问题)
添加返回内容清理、错误捕获和token控制逻辑:
from fastapi import FastAPI, HTTPException import openai import json app = FastAPI() openai.api_key = "key" SYSTEM_PROMPT = """ 你是专门生成英语词汇测验的AI,需严格遵循以下规则: 1. 仅生成5道英语词汇选择题,题型固定为:给出英文单词,搭配4个中文释义选项(仅1个正确) 2. 输出必须为**纯JSON格式**,不得包含任何额外文本、解释、markdown标记或注释 3. JSON结构必须严格匹配:{"data": [{"quiz": "题干内容(需包含完整选项,格式如:'单词:abandon 释义选项:A. 坚持 B. 放弃 C. 犹豫 D. 前进')", "answer": "正确选项字母(如B)"}, ...]} 4. 词汇难度匹配用户输入的要求,题目表述简洁,避免冗余内容以控制token使用 5. 确保JSON语法完全正确:所有字符串用双引号,数组/对象末尾无多余逗号,无语法错误 """ @app.get("/{request}") def generate_quiz(request: str): message = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": request} ] try: completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=message, temperature=0.1, max_tokens=500, # 限制返回token数,避免溢出和冗余内容 response_format={"type": "json_object"} # 强制GPT返回JSON对象(需OpenAI API版本支持) ) # 清理返回内容:移除可能的markdown代码块标记 raw_content = completion.choices[0].message.content.strip() if raw_content.startswith("```json") and raw_content.endswith("```"): raw_content = raw_content[7:-3].strip() quizzes = json.loads(raw_content) return quizzes # 直接返回解析后的JSON,避免重复嵌套data字段 except json.JSONDecodeError: raise HTTPException(status_code=500, detail="生成的测验格式不符合要求,无法解析为JSON") except Exception as e: raise HTTPException(status_code=500, detail=f"生成测验失败:{str(e)}") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8080)
三、关键改进说明
- 强制JSON输出:API调用中添加
response_format={"type": "json_object"}(需OpenAI API版本支持),结合提示词双重约束,确保GPT返回纯JSON - 内容清理:处理GPT可能返回的markdown代码块标记,避免解析失败
- token控制:设置
max_tokens限制返回长度,减少无效token消耗,同时避免因内容过长导致的解析问题 - 错误处理:捕获JSON解析错误和其他异常,返回明确的HTTP错误信息,便于调试
- 题型标准化:明确词汇题的题型和格式,减少GPT输出的不确定性,同时控制内容长度节省token
内容的提问来源于stack exchange,提问作者nuguryy
相关产品推荐
相关产品推荐

