forked from Ikalus1988/MisakaNet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlesson-model-output-fix.json
More file actions
12 lines (12 loc) · 1.82 KB
/
Copy pathlesson-model-output-fix.json
File metadata and controls
12 lines (12 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
{
"task_id": "lesson-model-output-fix",
"title": "Model Output Fix",
"domain": "general",
"tags": [
"contrib"
],
"problem": "模型返回的内容不完整(truncated),或者 JSON 解析失败(`json.decoder.JSONDecodeError`),导致后续处理流程中断。",
"solution": "**JSON 截断修复:**\n```python\nimport json, re\n\ndef safe_parse_json(raw: str) -> dict | None:\n \"\"\"尝试修复截断的 JSON\"\"\"\n # 1. 去除控制字符\n raw = re.sub(r'[\\x00-\\x1f]', '', raw)\n # 2. 尝试直接解析\n try:\n return json.loads(raw)\n except json.JSONDecodeError:\n pass\n # 3. 尝试补全缺失的闭合括号\n for bracket in [('\"', '\"'), (\"'\", \"'\"), (\"[\", \"]\"), (\"{\", \"}\")]:\n open_count = raw.count(bracket[0]) - raw.count(bracket[1])\n if open_count > 0:\n raw += bracket[1] * open_count\n try:\n return json.loads(raw)\n except json.JSONDecodeError:\n return None\n```\n\n**模型侧预防:**\n```python\n# 增加 max_tokens 或改用更强的模型\nresponse = client.messages.create(\n model=\"claude-sonnet-4-6\",\n max_tokens=4096, # 加大\n # 或者在 prompt 里要求:\"输出完整的 JSON,不要省略任何字段\"\n)\n```\n\n**检测截断:**\n```python\ndef is_truncated(response_text: str) -> bool:\n \"\"\"检查是否被截断\"\"\"\n # 常见截断标记\n truncated_markers = [\n '...', # 省略号结尾\n '...\"', # 字符串未闭合\n '{...}', # 对象被省略\n '\"', # 字符串未闭合\n ]\n for marker in truncated_markers:\n if response_text.rstrip().endswith(marker):\n return True\n return False\n```",
"source": "lessons/contrib/model-output-fix.md",
"test_cmd": ""
}