main
HuangHai 5 months ago
parent 3931563bc7
commit 4093ba4ad5

@ -7,8 +7,9 @@ from CommonUtil import *
class MarkdownToJsonConverter:
def __init__(self, client):
def __init__(self, client, language):
self.client = client
self.language = language
def extract_level1_title(self, markdown_content):
"""
@ -110,36 +111,41 @@ class MarkdownToJsonConverter:
return result
def generate_descriptions_for_json_batch(self, json_data):
def generate_descriptions_for_json_batch(self, json_data,language):
"""
批量生成描述语句并替换 JSON 中的 text 属性
"""
for item in json_data:
if "data" in item and "title" in item["data"]:
title = item["data"]["title"]
description = self.generate_description(title) # 同步调用
description = self.generate_description(title,language) # 同步调用
item["data"]["text"] = description
if "data" in item and "items" in item["data"]:
for sub_item in item["data"]["items"]:
if "title" in sub_item:
title = sub_item["title"]
description = self.generate_description(title) # 同步调用
description = self.generate_description(title,language) # 同步调用
sub_item["text"] = description
yield json.dumps(item, ensure_ascii=False)
time.sleep(0.5) # 控制逐行输出的速度
def generate_description(self, title):
def generate_description(self, title,language):
"""
调用 AI 接口生成描述语句限制在 20 个字以内
"""
prompt=''
try:
if language=='cn':
prompt='请使用中文回答。'
elif language=='en':
prompt='Please answer in English.'
response = client.chat.completions.create( # 同步调用
model=MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个专业的助手,能够根据上下文生成简洁的描述信息。"},
{"role": "user",
"content": f"请为以下标题生成一句话的描述信息,描述信息应简洁明了,且与标题内容相关,不要使用与标题内容相同的语句,不要包含任何序号(如 1.、2. 等)或 Markdown 语法(如 #、- 等),且描述长度不超过 20 个字:\n- {title}"}
"content": f"{prompt}请为以下标题生成一句话的描述信息,描述信息应简洁明了,且与标题内容相关,不要使用与标题内容相同的语句,不要包含任何序号(如 1.、2. 等)或 Markdown 语法(如 #、- 等),且描述长度不超过 20 个字:\n- {title}"}
],
max_tokens=20
)
@ -156,7 +162,7 @@ class MarkdownToJsonConverter:
print(f"调用 AI 生成描述信息时出错:{e}")
return title
def convert_markdown_to_json(self, markdown_content):
def convert_markdown_to_json(self, markdown_content,language):
"""
Markdown 内容转换为 JSON 格式
"""
@ -179,5 +185,5 @@ class MarkdownToJsonConverter:
listAll.append(item)
# 生成描述
for item in self.generate_descriptions_for_json_batch(listAll): # 使用普通 for 循环
for item in self.generate_descriptions_for_json_batch(listAll,language): # 使用普通 for 循环
yield item

@ -20,11 +20,11 @@ client = OpenAI(
)
def convertMarkdownToJson(markdown_content):
def convertMarkdownToJson(markdown_content: str, language: str):
# 创建转换器实例
converter = MarkdownToJsonConverter(client)
converter = MarkdownToJsonConverter(client, language)
# 转换 Markdown 为 JSON
for item in converter.convert_markdown_to_json(markdown_content): # 使用普通 for 循环
for item in converter.convert_markdown_to_json(markdown_content,language): # 使用普通 for 循环
yield f"{item}\n" # 每行数据后添加换行符
# 添加结束标记
yield '{"type": "end" }\n' # 结束标记后也添加换行符
@ -47,17 +47,22 @@ def get_local_ips():
# 流式生成数据的函数
async def generate_stream_markdown(course_name: str):
async def generate_stream_markdown(course_name: str, language: str):
"""
流式生成 Markdown 数据并在控制台输出完整的 Markdown 内容
"""
prompt = ''
if language == 'cn':
prompt = '请使用中文回答'
elif language == 'en':
prompt = 'Please answer in English。'
# 调用阿里云 API启用流式响应
stream = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{'role': 'system', 'content': '你是一个教学经验丰富的基础教育教师'},
{'role': 'user',
'content': '帮我设计一下' + course_name + '的课件提纲用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回这个非常重要2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容不能省略。'}
'content': prompt + ',帮我设计一下' + course_name + '的课件提纲用markdown格式返回。强调1、标签只能返回 #,##,###,-,其它标签一率不可以返回这个非常重要2、不要返回 ```markdown 或者 ``` 这样的内容! 3、每部分都有生成完整的一、二、三级内容不能省略。'}
],
stream=True, # 启用流式响应
timeout=6000,
@ -100,11 +105,12 @@ def root():
@app.post("/api/tools/aippt_outline") # 仅支持 POST 方法
async def aippt_outline(
course_name: str = Body(..., embed=True, description="课程名称") # 从请求体中获取 course_name
course_name: str = Body(..., embed=True, description="课程名称"), # 从请求体中获取 course_name
language: str = Body(..., embed=True, description="语言"),
):
# 返回流式响应
return StreamingResponse(
generate_stream_markdown(course_name),
generate_stream_markdown(course_name, language),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
@ -116,9 +122,10 @@ async def aippt_outline(
@app.post("/api/tools/aippt") # 修改为 POST 方法
def aippt(content: str = Body(..., embed=True, description="Markdown 内容")): # 使用 Body 接收请求体参数
def aippt(content: str = Body(..., embed=True, description="Markdown 内容"),
language: str = Body(..., embed=True, description="语言")): # 使用 Body 接收请求体参数
return StreamingResponse(
convertMarkdownToJson(content), # 传入 content
convertMarkdownToJson(content, language), # 传入 content
media_type="text/plain", # 使用 text/plain 格式
headers={
"Cache-Control": "no-cache",
@ -144,4 +151,4 @@ if __name__ == "__main__":
print(f"http://{ip}:5173")
# 启动 FastAPI 应用,绑定到所有 IP 地址
uvicorn.run(app, host="0.0.0.0", port=5173)
uvicorn.run(app, host="0.0.0.0", port=5173)

@ -0,0 +1,65 @@
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import ColorScaleRule
# ================= 创建测试数据 =================
project_data = {
"项目编号": ["P001", "P002"],
"项目名称": ["CRM系统升级", "电商平台开发"],
"项目类型": ["升级", "新开发"],
"起止时间": ["2025-03-01 ~ 2025-06-30", "2025-04-01 ~ 2025-12-31"],
"当前阶段": ["开发中", "需求确认"],
"交付状态": ["未交付", "部分交付"]
}
progress_data = {
"项目编号": ["P001", "P002"],
"整体进度(%)": [45, 20],
"剩余人天": [120, 300],
"当前人数": [8, 5],
"资源缺口": [2, 3]
}
maintenance_data = {
"产品名称": ["CRM系统", "订单管理模块"],
"维护类型": ["付费维护", "质保期维护"],
"工单量": [15, 8],
"平均耗时(h)": [3.5, 2.0]
}
product_data = {
"产品名称": ["CRM标准版", "ERP基础版"],
"定价(万元)": [12.8, 28.5],
"近半年销量": [35, 18]
}
# ================= 生成Excel文件 =================
with pd.ExcelWriter("部门项目总览.xlsx", engine="openpyxl") as writer:
# 生成四个工作表
pd.DataFrame(project_data).to_excel(writer, sheet_name="项目概况", index=False)
pd.DataFrame(progress_data).to_excel(writer, sheet_name="进度管理", index=False)
pd.DataFrame(maintenance_data).to_excel(writer, sheet_name="维护工作", index=False)
pd.DataFrame(product_data).to_excel(writer, sheet_name="产品信息", index=False)
# 获取工作簿对象进行格式设置
workbook = writer.book
# 设置公共格式
for sheetname in writer.sheets:
sheet = writer.sheets[sheetname]
# 冻结首行
sheet.freeze_panes = "A2"
# 设置列宽
sheet.column_dimensions['A'].width = 15
sheet.column_dimensions['B'].width = 25
# 为进度表添加条件格式
progress_sheet = writer.sheets["进度管理"]
progress_rule = ColorScaleRule(start_type='num', start_value=0, start_color='FF0000',
mid_type='num', mid_value=50, mid_color='FFFF00',
end_type='num', end_value=100, end_color='00FF00')
progress_sheet.conditional_formatting.add("B2:B100", progress_rule)
# ================= 最终文件生成 =================
print("文件已生成:部门项目总览.xlsx")

@ -168,4 +168,6 @@ COMMENT ON COLUMN "public"."t_crawler_structure_knowledge"."subject_name" IS '
stage_id使
2
select subject_id from t_crawler_subject where subject_name='语文'
subject_id使
subject_id使
3,gather_regionct_crawler_lesson
lesson_id t_crawler_lesson_schoolt_crawler_lesson_school

@ -0,0 +1,65 @@
from openai import OpenAI
# 阿里云中用来调用 deepseek v3 的密钥
MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc"
#MODEL_NAME = "qwen-plus"
MODEL_NAME="deepseek-v3"
# 初始化 OpenAI 客户端
client = OpenAI(
api_key=MODEL_API_KEY,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
def generate_sql_from_prompt(ddl: str, prompt: str) -> str:
"""
根据 DDL 和自然语言描述生成 SQL 查询
:param ddl: 数据库表结构的 DDL
:param prompt: 自然语言描述
:return: 生成的 SQL 查询
"""
# 构建完整的提示词
full_prompt = (
f"以下是数据库表结构的 DDL\n\n{ddl}\n\n"
f"请根据以下描述生成 SQL 查询:\n\n{prompt}\n\n"
"生成的 SQL 查询:"
)
# 调用大模型
response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个专业的 SQL 生成助手,能够根据数据库表结构和自然语言描述生成正确的 SQL 查询。"},
{"role": "user", "content": full_prompt}
],
max_tokens=500
)
# 提取生成的 SQL
if response.choices and response.choices[0].message.content:
return response.choices[0].message.content.strip()
else:
raise ValueError("未能生成 SQL 查询")
if __name__ == '__main__':
# 读取 Sql/CreateTable.sql 文件
with open("Sql/CreateTable.sql", "r", encoding="utf-8") as file:
ddl = file.read()
# 自然语言描述
prompt = "查询 2024 年每个学段下,上传课程数量排名前 10 的学校,并按行政区名称和上传课程数量排序。"
common_prompt='''
要求
1对于学校名称和行政区划名称为空的不要进行统计
2有行政区划列返回时先按行政区划排序
3有课程数量时再按课程数量由高到低排序
'''
prompt = prompt + common_prompt
# 生成 SQL
try:
sql = generate_sql_from_prompt(ddl, prompt)
print("生成的 SQL 查询:")
print(sql)
except Exception as e:
print(f"生成 SQL 时出错:{e}")

@ -0,0 +1,139 @@
import os
import platform
from Text2Sql.Util.Text2SqlUtil import *
from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil
from Text2Sql.Util.SaveToExcel import save_to_excel
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import pandas as pd
import webbrowser
def process_data(raw_data):
"""
处理原始数据
1. 过滤无效行政区
2. 按上传数量降序排序
3. 取前10名
"""
df = pd.DataFrame(raw_data)
df = df[df['行政区划名称'].notna() & (df['行政区划名称'] != '')]
df = df.sort_values('上传课程数量', ascending=False).head(10)
return df
def create_top10_chart(data):
# 准备数据
schools = data['学校名称'].tolist()
counts = data['上传课程数量'].tolist()
districts = data['行政区划名称'].tolist()
# 生成颜色渐变(从深到浅)
colors = [f"rgb({75 + i * 15}, {115 - i * 10}, {220 - i * 20})" for i in range(10)]
# 创建图表
bar = Bar(init_opts=opts.InitOpts(width='1200px', height='600px'))
bar.add_xaxis(schools)
bar.add_yaxis(
series_name="上传数量",
y_axis=counts,
itemstyle_opts=opts.ItemStyleOpts(color=JsCode(
"function(params){"
f" return {colors}[params.dataIndex];"
"}"
)),
label_opts=opts.LabelOpts(
position="right",
formatter=JsCode(
"function(params){"
" return params.value + ' (' + params.name.split('').join('\\n') + ')';"
"}"
)
)
)
# 全局配置
bar.set_global_opts(
title_opts=opts.TitleOpts(
title="上传资源数量TOP10学校排名",
subtitle="数据来源:课程资源管理系统"
),
tooltip_opts=opts.TooltipOpts(
formatter=JsCode(
"""function(params){
return params.name + '<br/>'
+ '所属行政区:' + %s[params.dataIndex] + '<br/>'
+ '上传数量:<b style="color:#5470C6">' + params.value + '</b>'
}""" % districts
)
),
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(
rotate=30,
formatter=JsCode(
"function(value){"
" return value.length > 6 ? value.substring(0,6)+'...' : value;"
"}"
)
)
),
yaxis_opts=opts.AxisOpts(name="上传数量(件)"),
datazoom_opts=[opts.DataZoomOpts(type_="inside")],
visualmap_opts=opts.VisualMapOpts(
min_=min(counts),
max_=max(counts),
orient="horizontal",
pos_left="center",
range_color=["#91CC75", "#5470C6"]
)
)
# 反转Y轴使降序排列
bar.reversal_axis()
return bar
if __name__ == "__main__":
vn = DeepSeekVanna()
# 开始训练
print("开始训练...")
# 打开CreateTable.sql文件内容
with open("Sql/CreateTable.sql", "r", encoding="utf-8") as file:
ddl = file.read()
# 训练数据
vn.train(
ddl=ddl
)
# 自然语言提问
# '''
question1 = '''
查询发布时间是2024年度每个行政区划每个学校都上传了多少课程数量
返回:行政区名称学校名称上传课程数量等属性.
'''
question = '''
查询发布时间是2024年度按学段分组比如小学初中高中每个学段中上传课程数量前10名的都是些学校,
注意排名是指分组内部排名不是整体排名
返回: 学段排名,行政区名称学校名称上传课程数量等属性.
'''
common_prompt = '''
要求
1行政区划为NULL 或者是空字符的不参加统计工作
2有行政区划列返回时先按行政区划排序
3有课程数量时再按课程数量由高到低排序'''
question = question + common_prompt
# 开始查询
print("开始查询...")
# 获取完整 SQL
sql = vn.generate_sql(question)
print("生成的查询 SQL:\n", sql)
# 执行SQL查询
with PostgreSQLUtil() as db:
sample_data = db.execute_query(sql)
filename = "d:/导出信息.xlsx"
save_to_excel(sample_data, filename)
os.startfile(filename)

@ -482,9 +482,6 @@ public class BookLesson {
for (Record record : lessonList) {
String original_school_name = record.getStr("teacher_school_name");//原始学校名称
if (original_school_name.equals("东北师范大学东安实验学校")) {
System.out.println("Here!");
}
String teacher_name = record.getStr("teacher_name");
String organization_name = "";
String organization_no = "";

Loading…
Cancel
Save