wxy01giser commited on
Commit
852403f
·
verified ·
1 Parent(s): 166bbfc

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +142 -142
main.py CHANGED
@@ -1,143 +1,143 @@
1
- # main.py
2
- import gradio as gr
3
- from analyzer import analyze_teacher_dashboard
4
- from cluster_insight import cluster_and_visualize
5
-
6
-
7
- # ================== LLM 预留接口(未来接入通义千问)==================
8
- # main.py → analyze_report 内
9
- from qwen_api import call_qwen
10
-
11
- def generate_teaching_advice(sankey_b64, cluster_stats):
12
- # 1. 构造 Prompt(结构化、专业)
13
- prompt = f"""
14
- 你是一名GIS实验教学专家,基于以下分析结果,生成教学优化方案:
15
-
16
- 【桑基图分析】
17
- - 学生反馈从 s1→s4 的主要流向:核密度 → 参数设置 → 应用场景
18
- - 最粗路径:核密度分析 → 搜索半径选择 → 城市规划应用
19
-
20
- 【聚类分析】
21
- """
22
- for s in cluster_stats[:3]: # 取 Top 3 聚类
23
- prompt += f"- 聚类 {s['cluster_id']}:{s['keyword']}({s['size']}条,占{s['ratio']:.1%})\n"
24
- prompt += f" 代表句:{s['rep_sentence'][:100]}\n"
25
-
26
- prompt += """
27
- 【要求】
28
- 1. 诊断核心教学痛点(3条)
29
- 2. 提出针对性优化措施(微课/演示/作业)
30
- 3. 设计 1 个 2 分钟微课脚本(标题+3步演示)
31
- 4. 建议 1 个课后作业(验证学生掌握)
32
-
33
- 【输出格式】
34
- # 教学优化方案
35
- ## 1. 核心痛点
36
- ## 2. 优化措施
37
- ## 3. 微课脚本
38
- ## 4. 课后作业
39
- """
40
-
41
- # 2. 调用通义千问
42
- advice = call_qwen(prompt)
43
- return f"<pre style='background:#f8f9fa; padding:15px; border-radius:8px; white-space: pre-wrap;'>{advice}</pre>"
44
-
45
-
46
- # ================== Gradio 界面 ==================
47
- def analyze_report(file):
48
- if not file:
49
- return "请上传 Excel 文件", None
50
-
51
- try:
52
- # 1. 分析 → 桑基图
53
- sankey_b64 = analyze_teacher_dashboard(excel_path = file.name)
54
- # 2. 聚类图
55
- cluster_b64, cluster_stats = cluster_and_visualize( excel_path=file.name )
56
- # print(cluster_b64)
57
- # print(cluster_stats)
58
- # 3. 生成教学建议
59
- advice = generate_teaching_advice(sankey_b64, cluster_stats)
60
-
61
- # 4. 聚类统计表格
62
- stats_table = """
63
- <h3>聚类主题统计</h3>
64
- <table border="1" style="width:100%; border-collapse: collapse; text-align:center; font-size:14px;">
65
- <tr style="background:#f0f0f0;">
66
- <th>聚类</th><th>主题关键词</th><th>反馈数</th><th>占比</th><th>代表句</th>
67
- </tr>
68
- """
69
- for s in cluster_stats:
70
- stats_table += f"""
71
- <tr>
72
- <td>{s['cluster_id']}</td>
73
- <td><strong>{s['keyword']}</strong></td>
74
- <td>{s['size']}</td>
75
- <td>{s['ratio']:.1%}</td>
76
- <td style="text-align:left; max-width:300px;">{s['rep_sentence'][:60]}...</td>
77
- </tr>
78
- """
79
- stats_table += "</table>"
80
-
81
- # 5. 最终 HTML 输出
82
- html = f"""
83
- <div style="font-family: 'Microsoft YaHei', sans-serif; max-width: 1000px; margin: 0 auto; padding: 20px;">
84
- <h1 style="text-align:center; color:#1e88e5;">EGISInsight</h1>
85
- <p style="text-align:center; color:#555; font-size:16px;">
86
- GIS 教学智能体 · 循证教学优化
87
- </p>
88
- <hr style="border: 1px solid #eee; margin: 30px 0;">
89
-
90
- <h2 style="color:#1976d2;">1. 实验报告反馈</h2>
91
- <img src="data:image/png;base64,{sankey_b64}"
92
- style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
93
-
94
- <h2 style="color:#388e3c; margin-top:40px;">2. 学生反馈聚类</h2>
95
- <img src="data:image/png;base64,{cluster_b64}"
96
- style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
97
-
98
- <div style="margin-top:30px;">
99
- {stats_table}
100
- </div>
101
-
102
- <div style="margin-top:30px; padding:20px; background:#f8f9fa; border-radius:8px; text-align:left;">
103
- {advice}
104
- </div>
105
-
106
- <p style="text-align:center; color:#999; font-size:13px; margin-top:40px;">
107
- EGISInsight © 2025 | 从数据到教学内容改革
108
- </p>
109
- </div>
110
- """
111
- return html, None
112
-
113
- except Exception as e:
114
- return f"分析失败:{str(e)}", None
115
-
116
-
117
- # ================== Gradio UI ==================
118
- with gr.Blocks(title="教学智能体 · 实验报告分析") as demo:
119
- gr.Markdown("# GIS实验报告智能分析系统")
120
- gr.Markdown("**上传融合后的学生反馈 Excel → 一键生成教学决策图**")
121
-
122
- with gr.Row():
123
- file_input = gr.File(
124
- label="上传 ex02.xlsx(含 s1-s4 列)",
125
- file_types=[".xlsx"]
126
- )
127
-
128
- with gr.Row():
129
- output = gr.HTML(label="分析结果")
130
-
131
- file_input.change(analyze_report, inputs=file_input, outputs=output)
132
-
133
- gr.Markdown("---")
134
- gr.Markdown("**后续将接入通义千问大模型,自动生成教案、微课脚本、作业设计**")
135
-
136
- # ================== 启动 ==================
137
- if __name__ == "__main__":
138
- demo.launch(
139
- server_name="0.0.0.0",
140
- server_port=7860,
141
- # share=False # 改 True 可生成公网链接
142
- share=True # 改 True 可生成公网链接
143
  )
 
1
+ # main.py
2
+ import gradio as gr
3
+ from analyzer import analyze_teacher_dashboard
4
+ from cluster_insight import cluster_and_visualize
5
+
6
+
7
+ # ================== LLM 预留接口(未来接入通义千问)==================
8
+ # main.py → analyze_report 内
9
+ from qwen_api import call_qwen
10
+
11
+ def generate_teaching_advice(sankey_b64, cluster_stats):
12
+ # 1. 构造 Prompt(结构化、专业)
13
+ prompt = f"""
14
+ 你是一名GIS实验教学专家,基于以下分析结果,生成教学优化方案:
15
+
16
+ 【桑基图分析】
17
+ - 学生反馈从 s1→s4 的主要流向:核密度 → 参数设置 → 应用场景
18
+ - 最粗路径:核密度分析 → 搜索半径选择 → 城市规划应用
19
+
20
+ 【聚类分析】
21
+ """
22
+ for s in cluster_stats[:3]: # 取 Top 3 聚类
23
+ prompt += f"- 聚类 {s['cluster_id']}:{s['keyword']}({s['size']}条,占{s['ratio']:.1%})\n"
24
+ prompt += f" 代表句:{s['rep_sentence'][:100]}\n"
25
+
26
+ prompt += """
27
+ 【要求】
28
+ 1. 诊断核心教学痛点(3条)
29
+ 2. 提出针对性优化措施(微课/演示/作业)
30
+ 3. 设计 1 个 2 分钟微课脚本(标题+3步演示)
31
+ 4. 建议 1 个课后作业(验证学生掌握)
32
+
33
+ 【输出格式】
34
+ # 教学优化方案
35
+ ## 1. 核心痛点
36
+ ## 2. 优化措施
37
+ ## 3. 微课脚本
38
+ ## 4. 课后作业
39
+ """
40
+
41
+ # 2. 调用通义千问
42
+ advice = call_qwen(prompt)
43
+ return f"<pre style='background:#f8f9fa; padding:15px; border-radius:8px; white-space: pre-wrap;'>{advice}</pre>"
44
+
45
+
46
+ # ================== Gradio 界面 ==================
47
+ def analyze_report(file):
48
+ if not file:
49
+ return "请上传 Excel 文件", None
50
+
51
+ try:
52
+ # 1. 分析 → 桑基图
53
+ sankey_b64 = analyze_teacher_dashboard(excel_path = file.name)
54
+ # 2. 聚类图
55
+ cluster_b64, cluster_stats = cluster_and_visualize( excel_path=file.name )
56
+ # print(cluster_b64)
57
+ # print(cluster_stats)
58
+ # 3. 生成教学建议
59
+ advice = generate_teaching_advice(sankey_b64, cluster_stats)
60
+
61
+ # 4. 聚类统计表格
62
+ stats_table = """
63
+ <h3>聚类主题统计</h3>
64
+ <table border="1" style="width:100%; border-collapse: collapse; text-align:center; font-size:14px;">
65
+ <tr style="background:#f0f0f0;">
66
+ <th>聚类</th><th>主题关键词</th><th>反馈数</th><th>占比</th><th>代表句</th>
67
+ </tr>
68
+ """
69
+ for s in cluster_stats:
70
+ stats_table += f"""
71
+ <tr>
72
+ <td>{s['cluster_id']}</td>
73
+ <td><strong>{s['keyword']}</strong></td>
74
+ <td>{s['size']}</td>
75
+ <td>{s['ratio']:.1%}</td>
76
+ <td style="text-align:left; max-width:300px;">{s['rep_sentence'][:60]}...</td>
77
+ </tr>
78
+ """
79
+ stats_table += "</table>"
80
+
81
+ # 5. 最终 HTML 输出
82
+ html = f"""
83
+ <div style="font-family: 'Microsoft YaHei', sans-serif; max-width: 1000px; margin: 0 auto; padding: 20px;">
84
+ <h1 style="text-align:center; color:#1e88e5;">EGISInsight</h1>
85
+ <p style="text-align:center; color:#555; font-size:16px;">
86
+ GIS 教学智能体 · 循证教学优化
87
+ </p>
88
+ <hr style="border: 1px solid #eee; margin: 30px 0;">
89
+
90
+ <h2 style="color:#1976d2;">1. 实验报告反馈</h2>
91
+ <img src="data:image/png;base64,{sankey_b64}"
92
+ style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
93
+
94
+ <h2 style="color:#388e3c; margin-top:40px;">2. 学生反馈聚类</h2>
95
+ <img src="data:image/png;base64,{cluster_b64}"
96
+ style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
97
+
98
+ <div style="margin-top:30px;">
99
+ {stats_table}
100
+ </div>
101
+
102
+ <div style="margin-top:30px; padding:20px; background:#f8f9fa; border-radius:8px; text-align:left;">
103
+ {advice}
104
+ </div>
105
+
106
+ <p style="text-align:center; color:#999; font-size:13px; margin-top:40px;">
107
+ EGISInsight © 2025 | 从数据到教学内容改革
108
+ </p>
109
+ </div>
110
+ """
111
+ return html, None
112
+
113
+ except Exception as e:
114
+ return f"分析失败:{str(e)}", None
115
+
116
+
117
+ # ================== Gradio UI ==================
118
+ with gr.Blocks(title="教学智能体 · 实验报告分析") as demo:
119
+ gr.Markdown("# GIS实验报告智能分析系统")
120
+ gr.Markdown("**上传融合后的学生反馈 Excel → 一键生成教学决策图**")
121
+
122
+ with gr.Row():
123
+ file_input = gr.File(
124
+ label="上传 ex02.xlsx(含 s1-s4 列)",
125
+ file_types=[".xlsx"]
126
+ )
127
+
128
+ with gr.Row():
129
+ output = gr.HTML(label="分析结果")
130
+
131
+ file_input.change(analyze_report, inputs=file_input, outputs=output)
132
+
133
+ gr.Markdown("---")
134
+ gr.Markdown("**后续将接入通义千问大模型,自动生成教案、微课脚本、作业设计**")
135
+
136
+ # ================== 启动 ==================
137
+ if __name__ == "__main__":
138
+ demo.launch(
139
+ server_name="0.0.0.0",
140
+ server_port=7860,
141
+ share=False # 改 True 可生成公网链接
142
+ # share=True # 改 True 可生成公网链接
143
  )