如何让Ollama模型正确读取JSON格式的BigQuery查询结果并生成指定分析总结
如何让Ollama模型正确读取JSON格式的BigQuery查询结果并生成指定分析总结
看起来你卡在让Ollama(尤其是llama3.3 70B)正确理解BigQuery返回的数据,输出你想要的字段总结、态势分析和预测上了。我帮你梳理几个核心问题和可落地的调整方案:
一、先解决数据传递的核心问题
你当前的代码里有两个直接导致模型无法读取数据的错误:
- JSON转换错误:
json.dump(DATA_DICT)是把数据写入文件的方法,要转成字符串嵌入prompt,得用json.dumps(DATA_DICT) - Prompt未嵌入实际数据:你的prompt里只写了
Data:---,模型根本没拿到实际的JSON数据,自然会要求更多信息
修改后的数据处理代码:
import json import pandas as pd # 执行BigQuery查询并转换格式 QUERY_RESULT_DATA = client.query(query) DATA_DICT = [dict(row) for row in QUERY_RESULT_DATA] df = pd.DataFrame(DATA_DICT) # 存XLSX用 # 正确转成带缩进的JSON字符串,让模型更容易解析结构 json_data = json.dumps(DATA_DICT, indent=2, ensure_ascii=False)
二、重构Prompt:给模型明确到“不会跑偏”的指令
大模型(尤其是llama3.3 70B)需要非常清晰、结构化的指令,不能用模糊的------占位符。你要明确告诉它:要处理什么数据、做哪些任务、输出什么格式。
针对你的需求,Prompt要包含这几个核心部分:
- 角色定位(比如“事件数据分析专家”)
- 前置上下文(比如之前的handler参数总结)
- 实际的JSON数据
- 分步骤的任务要求(字段总结→态势快照→预测)
- 输出格式要求(避免模型乱输出)
三、修复代码中的语法与逻辑错误
你的代码还有几个语法问题:
- Prompt用了字典
{},但Ollama的API要求prompt是字符串 - 函数参数重复(
askollamaHandler(param2,param2,param3)) - 未处理Ollama请求失败的情况
下面是修改后的完整函数示例:
1. 先处理参数过滤的handler函数
import requests def askollamaHandler(country_code, keyword, event_filter, model="llama3.3:70b"): prompt = f""" 你现在需要基于以下过滤参数,生成后续事件分析的前置总结: - 国家代码过滤:{country_code} - 关键词过滤:{keyword} - 事件类型过滤:{event_filter} 请你用简洁的语言总结这些过滤条件的核心指向,比如“本次分析聚焦[{country_code}]地区,与[{keyword}]相关的[{event_filter}]类型事件”,为后续的数据分析提供上下文。 """ response = requests.post( "http://localhost:11434/api/generate", json={ "model": model, "prompt": prompt, "stream": False } ) # 增加错误处理,避免崩溃 if response.status_code == 200: return response.json()["response"] else: return f"Handler请求失败:{response.status_code} - {response.text}"
2. 处理BigQuery数据的核心分析函数
def askollamaQuery(data_json, handler_summary, model="llama3.3:70b"): # 给llama3.3 70B的指令要更明确,避免大模型“发散” prompt = f""" 你是一位专业的国际事件数据分析专家,现在需要结合前置过滤条件和BigQuery返回的事件数据,完成指定分析任务。 --- ### 前置过滤条件总结 {handler_summary} --- ### 待分析的BigQuery事件数据(JSON格式) {data_json} --- ### 必须完成的3项任务 请严格按照以下顺序输出结果: 1. **字段核心信息总结**:针对以下每个字段,总结本次查询结果的关键内容: - SQLDATE:事件发生日期的时间分布(比如“集中在2024年8月,共XX条数据”) - Actor1Name/Actor2Name:主要参与方及出现频次(比如“Actor1Top3:XX、XX、XX”) - EventCode/EventRootCode:事件类型的Top3分布 - AvgTone:整体语调的正负倾向及平均值 - GoldsteinScale:冲突/合作程度的评分范围与平均值(评分越高越偏向合作) - SOURCEURL:信息来源的主要域名分布 2. **整体态势快照**:基于以上字段,概括本次查询的整体事件态势(比如“以XX类型冲突事件为主,涉及XX与XX双方,整体语调偏消极,冲突程度中等”) 3. **态势预测**:结合前置过滤条件,简要预测该地区/类型事件的短期发展趋势(比如“未来1-2周内,XX与XX的冲突事件可能持续,语调预计维持消极”) --- 请用清晰的小标题区分每个部分,语言简洁专业,不要输出无关内容。 """ response = requests.post( "http://localhost:11434/api/generate", json={ "model": model, "prompt": prompt, "stream": False } ) if response.status_code == 200: return response.json()["response"] else: return f"Query分析请求失败:{response.status_code} - {response.text}"
3. 最终调用逻辑
# 先获取过滤条件的前置总结 llama_handler_summary = askollamaHandler(country_code_filter, keyword_filter, event_filter, model="llama3.3:70b") # 传入JSON数据和前置总结,获取最终分析结果 llama_query_summary = askollamaQuery(json_data, llama_handler_summary, model="llama3.3:70b") # 打印或处理结果 print(llama_query_summary)
四、针对llama3.3 70B的额外优化建议
- 控制数据量:如果BigQuery返回的结果超过100条,建议先做抽样(比如取前50条)或预计算统计量(比如GoldsteinScale的平均值、事件类型的Top5)再传给模型,避免prompt过长导致模型处理混乱
- 指令更具象:可以在prompt里加“如果某个字段无有效数据,请注明‘无有效数据’”,让模型处理空值的逻辑更明确
- 启用系统提示词:Ollama的API支持
system字段,可以把“你是国际事件数据分析专家,擅长处理结构化事件数据并生成专业分析报告”放在system里,强化模型的角色定位
按这个方案调整后,llama3.3 70B应该能准确读取JSON数据,并输出你想要的总结、分析和预测了。




