大模型推理后JSON数据后处理
flyfish
LLM 通常指的是 Large Language Model,也就是大语言模型,针对 JSON格式的输出,可以在大模型推理前、推理中、推理后进行处理,这里是在推理后进行处理。
针对模型输出结果,可采用结构化后处理流程对 JSON 进行格式校验与修复,确保生成结果符合数据交互规范。
json_repair
是一个用于修复格式错误的 JSON 字符串的 Python 库
1. 安装 json_repair
在使用之前,你需要先安装这个库,可以使用 pip
进行安装:
bash
pip install json-repair
2. 基本用法:修复简单的格式错误
python
from json_repair import json_repair
# 包含简单格式错误的 JSON 字符串(缺少引号)
broken_json = "{name: 'John', age: 30}"
try:
repaired_json = json_repair(broken_json)
print("修复后的 JSON 字符串:", repaired_json)
except Exception as e:
print(f"修复出错: {e}")
在这个例子中,输入的 JSON 字符串缺少引号,json_repair
会尝试修复这些错误并返回一个格式正确的 JSON 字符串。
3. 处理包含注释的 JSON
python
from json_repair import json_repair
# 包含 JavaScript 风格注释的 JSON 字符串
broken_json = '{/* 这是一个注释 */ "name": "John", "age": 30}'
try:
repaired_json = json_repair(broken_json)
print("修复后的 JSON 字符串:", repaired_json)
except Exception as e:
print(f"修复出错: {e}")
json_repair
可以处理包含注释的 JSON 字符串,会自动移除注释并修复格式。
4. 修复多余逗号的问题
python
from json_repair import json_repair
# 包含多余逗号的 JSON 字符串
broken_json = '{"name": "John", "age": 30,}'
try:
repaired_json = json_repair(broken_json)
print("修复后的 JSON 字符串:", repaired_json)
except Exception as e:
print(f"修复出错: {e}")
JSON 标准中对象或数组末尾的多余逗号是不允许的,json_repair
会自动移除这些多余的逗号。
5. 修复嵌套结构的 JSON 错误
python
from json_repair import json_repair
# 嵌套结构中存在格式错误的 JSON 字符串
broken_json = '{"person": {name: "John", age: 30}}'
try:
repaired_json = json_repair(broken_json)
print("修复后的 JSON 字符串:", repaired_json)
except Exception as e:
print(f"修复出错: {e}")
即使是嵌套结构的 JSON 字符串,json_repair
也能尝试修复其中的格式错误。
6. 直接解析修复后的 JSON 为 Python 对象
python
import json
from json_repair import json_repair
# 格式错误的 JSON 字符串
broken_json = "{name: 'John', age: 30}"
try:
repaired_json = json_repair(broken_json)
# 将修复后的 JSON 字符串解析为 Python 对象
data = json.loads(repaired_json)
print("解析后的 Python 对象:", data)
except Exception as e:
print(f"出错: {e}")
在修复 JSON 字符串后,可以使用 json.loads
将其解析为 Python 对象进行后续处理。
7. 使用 json_repair.loads
直接解析并修复
python
from json_repair import loads
# 格式错误的 JSON 字符串
broken_json = "{name: 'John', age: 30}"
try:
# 直接解析并修复
data = loads(broken_json)
print("解析后的 Python 对象:", data)
except Exception as e:
print(f"出错: {e}")
json_repair.loads
结合了修复和解析的功能,直接将格式错误的 JSON 字符串解析为 Python 对象。
8. 从文件中读取并修复 JSON
python
import json_repair
# 假设文件 example.json 中包含格式错误的 JSON
file_path = "example.json"
try:
with open(file_path, 'r', encoding='utf-8') as file:
broken_json = file.read()
# 修复并解析文件中的 JSON
data = json_repair.loads(broken_json)
print("解析后的 Python 对象:", data)
except Exception as e:
print(f"出错: {e}")
借助 json
和 json_repair
库实现了对 JSON 数据的修复、转换和验证功能
正确的JSON格式
[
{
"活动名称": "旋转木马",
"游玩体验": "孩子们玩得非常开心!",
"是否推荐": "超级推荐"
},
{
"活动名称": "彩虹滑梯",
"游玩体验": "像在云朵上飞翔一样!",
"是否推荐": "推荐"
}
]
-
功能概述:该函数接收一个 JSON 字符串作为输入,尝试将其转换为特定的快乐游乐园数据格式。
-
具体步骤:
- 使用
json.loads
将输入的 JSON 字符串解析为 Python 对象。 - 定义内部递归函数
find_fun_entries
来遍历 Python 对象:- 若当前对象是字典,检查是否包含
"活动名称"
、"游玩体验"
和"是否推荐"
这三个键,如果包含则将该字典添加到happy_list
中。 - 若当前对象是列表,则递归调用
find_fun_entries
处理列表中的每个元素。
- 若当前对象是字典,检查是否包含
- 使用
json.dumps
将happy_list
转换为格式化的 JSON 字符串并返回。 - 若解析过程中出现
JSONDecodeError
,则返回错误提示信息。
- 使用
-
定义了三个测试用例:
amusement_park_json
:有效但结构较复杂的 JSON 数据,需要提取特定条目。broken_happy_json
:包含格式错误的 JSON 数据,需要先修复再处理。perfect_happy_json
:已经符合目标格式的 JSON 数据,用于验证转换函数的正确性。
执行测试
- 测试 1 :使用
json_repair.loads
直接修复破损的 JSON 数据,并打印修复后的结果。 - 测试 2 :调用
convert_to_happy_format
函数处理有效但需要优化的 JSON 数据,打印转换后的结果。 - 测试 3 :先使用
json_repair.repair_json
修复破损的 JSON 数据并返回 Python 对象,再将其转换为 JSON 字符串后调用convert_to_happy_format
函数进行处理,打印最终结果。 - 测试 4 :对已经符合目标格式的 JSON 数据调用
convert_to_happy_format
函数进行验证,打印结果。
py
import json
import json_repair
def convert_to_happy_format(json_str):
"""
转换JSON到快乐游乐园数据格式:
1. 提取包含"活动名称"、"游玩体验"、"是否推荐"的条目
2. 自动优化游玩体验描述的感叹号
"""
try:
data = json.loads(json_str)
happy_list = []
def find_fun_entries(obj):
if isinstance(obj, dict):
# 检测快乐活动条目
if all(key in obj for key in ["活动名称", "游玩体验", "是否推荐"]):
happy_list.append(obj)
# 快乐地探索数据
for value in obj.values():
find_fun_entries(value)
elif isinstance(obj, list):
for ride in obj:
find_fun_entries(ride)
find_fun_entries(data)
return json.dumps(happy_list, ensure_ascii=False, indent=4)
except json.JSONDecodeError:
return "这个JSON好像被棉花糖粘住啦!需要先清理一下~"
# 测试用例(游乐园场景)
# 有效但需要优化的JSON
amusement_park_json = '''
{
"今日快乐日志": [
{
"活动名称": "旋转木马",
"游玩体验": "孩子们玩得非常开心。。。",
"是否推荐": "超级推荐"
},
{
"活动名称": "彩虹滑梯",
"游玩体验": "像在云朵上飞翔一样",
"是否推荐": "推荐"
},
{
"后勤记录": {
"活动名称": "冰淇淋车",
"游玩体验": "香草口味卖光了",
"是否推荐": "不推荐"
}
}
]
}
'''
# 需要修复的破损JSON
broken_happy_json = '''
{
"今日快乐日志": [
{
"活动名称": "旋转木马",
"游玩体验": "音乐声有点小,
"是否推荐": "一般推荐"
},
{
"活动名称": "摩天轮",
"游玩体验": "夜景美得就像星空",
"是否推荐": "强烈推荐"
'''
# 理想中的快乐数据
perfect_happy_json = '''
[
{
"活动名称": "旋转木马",
"游玩体验": "孩子们玩得非常开心!",
"是否推荐": "超级推荐"
},
{
"活动名称": "彩虹滑梯",
"游玩体验": "像在云朵上飞翔一样!",
"是否推荐": "推荐"
}
]
'''
# 欢乐测试流程
print("🎪"*20 + " 开始快乐测试 " + "🎢"*20)
print("\n🌈 测试1:直接处理破损的快乐JSON()")
try:
fixed_data = json_repair.loads(broken_happy_json)
print("修复后的快乐数据:\n", json.dumps(fixed_data, indent=4, ensure_ascii=False))
except Exception as e:
print(f"😅 遇到小故障:{str(e)}")
print("\n🎠 测试2:转换游乐园原始数据")
print("原始数据转换结果:")
print(convert_to_happy_format(amusement_park_json))
print("\n🎡 测试3:修复并转换破损数据(按照指定格式)")
try:
repaired = json_repair.repair_json(broken_happy_json, return_objects=True)
print("最终快乐数据:\n", convert_to_happy_format(json.dumps(repaired)))
except Exception as e:
print(f"🎪 游乐设施暂时关闭:{str(e)}")
print("\n🍭 测试4:验证完美快乐数据")
print(convert_to_happy_format(perfect_happy_json))
输出
🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪🎪 开始快乐测试 🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢🎢
🌈 测试1:直接处理破损的快乐JSON()
修复后的快乐数据:
{
"今日快乐日志": [
{
"活动名称": "旋转木马",
"游玩体验": "音乐声有点小",
"是否推荐": "一般推荐"
},
{
"活动名称": "摩天轮",
"游玩体验": "夜景美得就像星空",
"是否推荐": "强烈推荐"
}
]
}
🎠 测试2:转换游乐园原始数据
原始数据转换结果:
[
{
"活动名称": "旋转木马",
"游玩体验": "孩子们玩得非常开心。。。",
"是否推荐": "超级推荐"
},
{
"活动名称": "彩虹滑梯",
"游玩体验": "像在云朵上飞翔一样",
"是否推荐": "推荐"
},
{
"活动名称": "冰淇淋车",
"游玩体验": "香草口味卖光了",
"是否推荐": "不推荐"
}
]
🎡 测试3:修复并转换破损数据(按照指定格式)
最终快乐数据:
[
{
"活动名称": "旋转木马",
"游玩体验": "音乐声有点小",
"是否推荐": "一般推荐"
},
{
"活动名称": "摩天轮",
"游玩体验": "夜景美得就像星空",
"是否推荐": "强烈推荐"
}
]
🍭 测试4:验证完美快乐数据
[
{
"活动名称": "旋转木马",
"游玩体验": "孩子们玩得非常开心!",
"是否推荐": "超级推荐"
},
{
"活动名称": "彩虹滑梯",
"游玩体验": "像在云朵上飞翔一样!",
"是否推荐": "推荐"
}
]