Excel转JSON后GPT生成报告无准确数值,求问题原因排查
Excel转JSON后GPT报告数值不准确的问题排查
将Excel统计分析结果通过Python转换为JSON格式后,传入GPT生成的报告未显示Excel源数据中的准确数值,可从以下三个环节逐一排查:
一、原始数据环节
- 核对Excel源数据的数值精度:检查是否存在显示值与实际存储值不符的情况(如Excel单元格显示75.0%,但实际计算值为74.98%),或公式计算导致的浮点精度误差。
- 确认Excel导出范围:检查转JSON时是否完整导出了统计结果的所有行/列,尤其是汇总行、关键指标列是否被正确包含。
- 检查Excel数据格式:确认数值是否被存储为文本类型,这类数据转JSON后会以字符串形式存在,可能导致GPT识别偏差。
二、JSON转换环节
- 直接验证JSON文件内容:打开转换后的JSON文件,逐字段对比与Excel源数据的数值是否一致;也可在Python中添加
print(json_data)输出转换后的JSON对象,进行核对。 - 排查编码检测问题:
chardet.detect可能出现编码误判,可尝试手动指定编码(如utf-8、gbk)读取JSON文件,测试数值是否正确读取。 - 检查JSON序列化精度:
json.dumps默认序列化可能丢失浮点数精度,可添加参数json.dumps(json_data, ensure_ascii=False, float_format="%.2f")强制保留小数位,再检查序列化后的字符串是否与原始数值一致。 - 补全Excel转JSON的代码检查:若使用pandas等工具转换,确认是否设置了
float_format等参数保证数值精度,是否存在数据类型转换错误(如整数被转为浮点数)。
三、GPT处理环节
- 优化prompt指令清晰度:当前instructions中“选取最大值对应的最小值,以及最小值对应的平均值”表述存在歧义,需明确要求GPT严格使用JSON中的原始数值,不得修改、估算或混淆指标逻辑。
- 验证传入GPT的JSON字符串:在
messages.append后添加print(json_string),确认传给GPT的内容与JSON文件中的数值完全一致,避免传递过程中出现截断或编码错误。 - 排查token截断问题:若JSON数据量较大,即使使用gpt-3.5-turbo-16k也可能存在内容截断,导致GPT无法获取完整数值。可尝试传入小范围测试数据,验证是否能输出准确数值。
用户提供的相关代码
# 自动检测JSON文件编码的函数 def detect_encoding(file_path): # 打开文件 with open(file_path, "rb") as file: raw_data = file.read() result = chardet.detect(raw_data) encoding = result["encoding"] return encoding # 将JSON文件转换为字符串的函数 def read_json_file(file_path, encoding): with open(file_path, "r", encoding=encoding) as file: json_data = json.load(file) json_string = json.dumps(json_data, ensure_ascii=False) return json_string # 处理问答的函数 def process_question(json_file_path): instructions = ("请根据给定JSON文件中的数据,按照以下示例格式生成报告。请选取最大值对应的最小值,以及最小值对应的平均值。" "示例1:'在参与调查的318家企业中,75.0%的企业当前相比上一季度处于危机状态,平均得分为2.23分,说明相比上一季度处于轻度危机状态。' " "示例2:'按成立年限划分,当前相比上一季度处于危机状态的企业占比最高的是成立15至20年的企业,达82.4%;平均得分最低的是成立4至7年的企业,为2.49分,说明相比上一季度情况略有恶化。' " "示例3:'按主营产品划分,当前相比上一季度处于危机状态的企业占比最高的是主营知识服务的企业,达84.2%;平均得分最低的也是主营知识服务的企业,为2.59分,说明其相比上一季度处于轻度危机状态。'" "示例4:'按行业划分,当前相比上一季度处于危机状态的企业占比最高的是纺织服装行业,达76.5%;平均得分最低的也是纺织服装行业,为2.11分,说明相比上一季度危机程度略重。' " "示例5:'请按照上述每个示例的相同格式生成报告,并使用JSON文件中的数值。'" ) messages = [ { "role": "assistant", "content" : instructions} ] # 检测JSON文件编码并传递给助手 file_encoding = detect_encoding(json_file_path) json_string = read_json_file(json_file_path, file_encoding) messages.append({"role": "user", "content": json_string}) completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=messages, max_tokens=2000 ) assistant_content = completion.choices[0].message["content"].strip() return assistant_content
内容的提问来源于stack exchange,提问作者민근홍
相关产品推荐
相关产品推荐

