You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让Ollama模型正确读取JSON格式的BigQuery查询结果并生成指定分析总结

如何让Ollama模型正确读取JSON格式的BigQuery查询结果并生成指定分析总结

看起来你卡在让Ollama(尤其是llama3.3 70B)正确理解BigQuery返回的数据,输出你想要的字段总结、态势分析和预测上了。我帮你梳理几个核心问题和可落地的调整方案:

一、先解决数据传递的核心问题

你当前的代码里有两个直接导致模型无法读取数据的错误:

  1. JSON转换错误json.dump(DATA_DICT)是把数据写入文件的方法,要转成字符串嵌入prompt,得用json.dumps(DATA_DICT)
  2. 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的额外优化建议

  1. 控制数据量:如果BigQuery返回的结果超过100条,建议先做抽样(比如取前50条)或预计算统计量(比如GoldsteinScale的平均值、事件类型的Top5)再传给模型,避免prompt过长导致模型处理混乱
  2. 指令更具象:可以在prompt里加“如果某个字段无有效数据,请注明‘无有效数据’”,让模型处理空值的逻辑更明确
  3. 启用系统提示词:Ollama的API支持system字段,可以把“你是国际事件数据分析专家,擅长处理结构化事件数据并生成专业分析报告”放在system里,强化模型的角色定位

按这个方案调整后,llama3.3 70B应该能准确读取JSON数据,并输出你想要的总结、分析和预测了。

火山引擎 最新活动