Python使用json_repair輕松修復(fù)大模型返回的非法JSON
為什么大模型生成的 JSON 需要修復(fù)
在使用大語言模型(LLM,例如 GPT 系列)時,我們經(jīng)常要求模型返回結(jié)構(gòu)化的 JSON 數(shù)據(jù),以便程序進一步解析和處理。然而,現(xiàn)實中模型輸出的 JSON 往往“不夠干凈”——可能會在前后多出說明文字、注釋、甚至中途缺少引號或逗號,從而導(dǎo)致 json.loads() 報錯。
一個典型的錯誤場景如下。
大語言模型在生成 JSON 數(shù)據(jù)時,可能會出現(xiàn)多種格式問題:
括號不匹配:缺少閉合的括號或方括號
# 模型可能返回
broken_json1 = '{"活動名稱": "旋轉(zhuǎn)木馬", "游玩體驗": "孩子們玩得非常開心!"'
缺失引號:鍵或字符串值缺少引號
broken_json2 = '{活動名稱: "旋轉(zhuǎn)木馬", "游玩體驗": "孩子們玩得非常開心!"}'
缺少逗號:鍵值對之間缺少分隔符
broken_json3 = '{"活動名稱": "旋轉(zhuǎn)木馬" "游玩體驗": "孩子們玩得非常開心!"}'
特殊字符未轉(zhuǎn)義:包含未轉(zhuǎn)義的特殊字符
broken_json4 = '{"描述": "這是一個"包含引號"的字符串"}'
非 JSON 內(nèi)容混雜:輸出中包含解釋性文本或其他非 JSON 內(nèi)容
broken_json5 = """
這里是返回的結(jié)果:
{
"name": "Alice",
"age": 25,
"city": "New York", // 用戶所在城市
}
"""
傳統(tǒng)處理方式的局限性
當面對這些有問題的 JSON 時,開發(fā)者通常會考慮:
- 提示工程:優(yōu)化提示詞,明確要求模型輸出標準 JSON
- 多次調(diào)用:當?shù)谝淮畏祷責o效 JSON 時,再次請求模型修正
- 正則表達式:編寫復(fù)雜的正則表達式來提取 JSON 部分
然而,這些方法都存在明顯缺點:提示工程效果不穩(wěn)定,多次調(diào)用增加時間和 token 消耗,正則表達式編寫維護困難且容易出錯。
有沒有更優(yōu)雅、更自動化的方式?答案就是 —— json_repair。
一、什么是 json_repair
json_repair 是一個 Python 庫,用于自動修復(fù)無效的 JSON 字符串。它會分析字符串中的結(jié)構(gòu)、引號、括號、逗號等錯誤,嘗試將其糾正為可被 json.loads() 正常解析的合法 JSON。
相比于正則修正或多次調(diào)用大模型,json_repair 的優(yōu)勢在于:
無需二次調(diào)用模型,執(zhí)行速度快
可自動修復(fù)常見錯誤,例如:
- 缺少引號
- 結(jié)尾多余逗號
- 單引號替換為雙引號
- 非法字符混入
- JSON 前后附帶額外內(nèi)容
二、安裝方法
使用 pip 安裝:
pip install json-repair
三、基本用法示例
來看一個實際例子。假設(shè)大模型返回了以下內(nèi)容:
from json_repair import repair_json
import json
response = """
模型輸出:
{
name: 'Alice',
"age": 25,
"city": "New York",
}
"""
# 使用 json_repair 修復(fù)
fixed = repair_json(response)
print(fixed)
# 輸出:
# {"name": "Alice", "age": 25, "city": "New York"}
# 現(xiàn)在可以正常解析
data = json.loads(fixed)
print(data["name"]) # Alice
json_repair 自動完成了幾個修復(fù)動作:
- 為
name補上了引號 - 將
'Alice'轉(zhuǎn)換為"Alice" - 去掉了最后一個多余的逗號
- 忽略了前面的“模型輸出:”這段無關(guān)內(nèi)容
四、更復(fù)雜的場景
有時,大模型可能在 JSON 前后附帶了解釋說明,例如:
response = """
以下是結(jié)果:
{
"status": "ok",
"data": {
"id": 123,
"items": ["apple", "banana"]
}
}
謝謝!
"""
這種情況下,json.loads() 同樣無法直接解析。
而使用 json_repair:
fixed = repair_json(response) print(json.loads(fixed))
輸出結(jié)果:
{'status': 'ok', 'data': {'id': 123, 'items': ['apple', 'banana']}}
json_repair 能夠智能識別出中間那段是完整的 JSON 塊,并自動去除多余文字。
五、異常修復(fù)與邊界情況
json_repair 并非萬能。如果輸入的內(nèi)容嚴重破損,例如括號完全不匹配、結(jié)構(gòu)不完整,它可能無法百分百恢復(fù)。
但它會盡力返回“最接近合法 JSON”的結(jié)果,而不會拋出異常。
示例:
bad_json = "{ name: Alice, age: 30"
fixed = repair_json(bad_json)
print(fixed)
# 輸出:{"name": "Alice", "age": 30}
六、實戰(zhàn)建議
優(yōu)先嘗試 json.loads(),若失敗再使用 json_repair。
這樣可以避免對原本就合法的 JSON 進行不必要的處理。
try:
data = json.loads(response)
except json.JSONDecodeError:
data = json.loads(repair_json(response))
結(jié)合日志輸出,記錄修復(fù)前后的差異,方便排查模型輸出問題。
不建議用于安全敏感場景(例如:直接信任外部輸入的 JSON),因為修復(fù)過程中會進行字符串推斷。
七、總結(jié)
當我們依賴大模型生成 JSON 數(shù)據(jù)時,不可避免會遇到各種格式錯誤的問題。json_repair 讓我們不再需要反復(fù)提示模型“請返回合法 JSON”,也不必浪費 token 進行多輪修正。
一句 repair_json(response),即可輕松將混亂的字符串變?yōu)榭捎玫慕Y(jié)構(gòu)化數(shù)據(jù)。
它的出現(xiàn),讓 LLM 與后端程序之間的數(shù)據(jù)對接更穩(wěn)定、更高效。
到此這篇關(guān)于Python使用json_repair輕松修復(fù)大模型返回的非法JSON的文章就介紹到這了,更多相關(guān)Python修復(fù)返回的非法JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Matplotlib創(chuàng)建漂亮的數(shù)據(jù)可視化圖表
在 Python 中,Matplotlib 是一個強大而靈活的工具,可以用來創(chuàng)建各種類型的數(shù)據(jù)可視化圖表,本文給大家介紹了如何使用Matplotlib創(chuàng)建漂亮的數(shù)據(jù)可視化圖表,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-04-04
python?matplotlib畫圖時坐標軸重疊顯示不全和圖片保存時不完整的問題解決
最近工作中遇到了matplotlib保存圖片坐標軸不完整的問題,所以這篇文章主要給大家介紹了關(guān)于python?matplotlib畫圖時坐標軸重疊顯示不全和圖片保存時不完整問題的解決方法,需要的朋友可以參考下2022-07-07
基于tensorflow指定GPU運行及GPU資源分配的幾種方式小結(jié)
今天小編就為大家分享一篇基于tensorflow指定GPU運行及GPU資源分配的幾種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python+Pygame實戰(zhàn)之瘋狂吃水果游戲的實現(xiàn)
吃豆人和切水果這兩個游戲相信大家都不陌生吧,本文將利用Python中的Pygame模塊編寫出一款結(jié)合吃豆人+切水果的新游戲:瘋狂吃水果,感興趣的可以了解一下2022-06-06
Python利用Flask-Mail實現(xiàn)發(fā)送郵件詳解
Flask?的擴展包?Flask?-?Mail?通過包裝了?Python?內(nèi)置的smtplib包,可以用在?Flask?程序中發(fā)送郵件。本文將利用這特性實現(xiàn)郵件發(fā)送功能,感興趣的可以了解一下2022-08-08
Python之lambda匿名函數(shù)及map和filter的用法
今天小編就為大家分享一篇關(guān)于Python之lambda匿名函數(shù)及map和filter的用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Python實現(xiàn)XGBoost算法的應(yīng)用實戰(zhàn)
XGBoost(Extreme Gradient Boosting)是一種高效且廣泛使用的集成學(xué)習(xí)算法,它屬于梯度提升樹(GBDT)模型的一種改進,本文將結(jié)合實際案例,詳細介紹如何在Python中使用XGBoost算法進行模型訓(xùn)練和預(yù)測,需要的朋友可以參考下2024-08-08
關(guān)于django python manage.py startapp 應(yīng)用名出錯異常原因解析
這篇文章主要介紹了關(guān)于django python manage.py startapp 應(yīng)用名出錯異常原因解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

