You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import json
from openai import OpenAI
from Text2Sql.Util.MarkdownToDocxUtil import markdown_to_docx
from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil
from Text2Sql.Util.SaveToExcel import save_to_excel
from Text2Sql.Util.VannaUtil import *
from Util.EchartsUtil import *
'''
经验:
1、尽量使用宽表少用关联越少越好
2、应该有一些固定的组合用法预置出来给出范例让用户可以简单修改后就能使用
3、应该有类似于 保存为用例,查询历史等功能,让用户方便利旧。
'''
if __name__ == "__main__":
vn = VannaUtil()
# 开始训练
print("开始训练...")
# 打开AreaSchoolLesson.sql文件内容
with open("Sql/AreaSchoolLesson.sql", "r", encoding="utf-8") as file:
ddl = file.read()
# 训练数据
vn.train(
ddl=ddl
)
# 自然语言提问
# 整体情况
# question = '''
# 查询:
# 1、发布时间是2024年度
# 2、每个行政区每个学校都上传了多少课程数量
# 3、格式: 行政区划名,学段,排名,学校名称,课程数量
# '''
# 指定行政区域
# question = '''
# 查询:
# 1、发布时间是2024年度
# 2、二道区每个学校都上传了多少课程数量
# 3、格式: 行政区划名,学段,排名,学校名称,发布年份,课程数量
# '''
# 指定学段
question = '''
查询:
1、发布时间是2024年度
2、每个学段每个科目上传课程数量按由多到少排序
3、字段名: 学段,科目,排名,课程数量
'''
common_prompt = '''
返回的信息要求:
1、行政区划为NULL 或者是空字符的不参加统计
2、目标数据库是Postgresql 16
'''
question = question + common_prompt
# 开始查询
print("开始查询...")
# 获取完整 SQL
sql = vn.generate_sql(question)
print("生成的查询 SQL:\n", sql)
# 执行SQL查询
with PostgreSQLUtil() as db:
_data = db.execute_query(sql)
# 1、生成柱状图
generate_bar_chart(
_data=_data,
title="学段+科目课程数量柱状图",
x_columns=["学段", "科目"], # 动态指定 X 轴列
y_columns=["课程数量"], # 动态指定 Y 轴列
output_file="d:/lesson_bar_chart.html"
)
# 2、生成饼状图
generate_pie_chart(
_data=_data,
title="学段+科目分布",
category_columns=["学段", "科目"], # 多列组合参数
value_column="课程数量",
output_file="d:/lesson_pie_chart.html"
)
# 3、生成excel
filename = "d:/导出信息.xlsx"
save_to_excel(_data, filename)
# 4、生成word报告
prompt = '''
请根据以下 JSON 数据整理出2000字左右的话描述当前数据情况。要求
1、以Markdown格式返回我将直接通过markdown格式生成Word。
2、标题统一为长春云校数据分析报告
3、内容中不要提到JSON数据统一称数据
4、尽量以条目列出这样更清晰
5、数据
'''
prompt = prompt + json.dumps(_data, ensure_ascii=False)
# 初始化 OpenAI 客户端
client = OpenAI(
api_key=MODEL_API_KEY,
base_url=MODEL_API_URL,
)
# 调用 OpenAI API 生成总结(流式输出)
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个数据分析助手,擅长从 JSON 数据中提取关键信息并生成详细的总结。"},
{"role": "user", "content": prompt}
],
max_tokens=3000, # 控制生成内容的长度
temperature=0.7, # 控制生成内容的创造性
stream=True # 启用流式输出
)
# 初始化变量用于存储流式输出的内容
summary = ""
# 处理流式输出
for chunk in response:
if chunk.choices[0].delta.content: # 检查是否有内容
chunk_content = chunk.choices[0].delta.content
print(chunk_content, end="", flush=True) # 实时打印到控制台
summary += chunk_content # 将内容拼接到 summary 中
# 保存markdown
with open("d:/report.md", "w", encoding="utf-8") as file:
file.write(summary)
# 最终 summary 为完整的 Markdown 内容
print("\n\n流式输出完成summary 已拼接为完整字符串。")
# 生成 Word 文档
markdown_to_docx(summary, output_file="d:/report.docx")