egisinsight / main.py
wxy01giser's picture
Update main.py
692cb96 verified
# main.py
import gradio as gr
from analyzer import analyze_teacher_dashboard
from cluster_insight import cluster_and_visualize
# ================== LLM 预留接口(未来接入通义千问)==================
# main.py → analyze_report 内
from qwen_api import call_qwen
def generate_teaching_advice(sankey_b64, cluster_stats):
# 1. 构造 Prompt(结构化、专业)
prompt = f"""
你是一名GIS实验教学专家,基于以下分析结果,生成教学优化方案:
【桑基图分析】
- 学生反馈从 s1→s4 的主要流向:核密度 → 参数设置 → 应用场景
- 最粗路径:核密度分析 → 搜索半径选择 → 城市规划应用
【聚类分析】
"""
for s in cluster_stats[:3]: # 取 Top 3 聚类
prompt += f"- 聚类 {s['cluster_id']}{s['keyword']}{s['size']}条,占{s['ratio']:.1%})\n"
prompt += f" 代表句:{s['rep_sentence'][:100]}\n"
prompt += """
【要求】
1. 诊断核心教学痛点(3条)
2. 提出针对性优化措施(微课/演示/作业)
3. 设计 1 个 2 分钟微课脚本(标题+3步演示)
4. 建议 1 个课后作业(验证学生掌握)
【输出格式】
# 教学优化方案
## 1. 核心痛点
## 2. 优化措施
## 3. 微课脚本
## 4. 课后作业
"""
# 2. 调用通义千问
advice = call_qwen(prompt)
return f"<pre style='background:#f8f9fa; padding:15px; border-radius:8px; white-space: pre-wrap;'>{advice}</pre>"
# ================== Gradio 界面 ==================
def analyze_report(file):
if not file:
return "请上传 Excel 文件", None
try:
# 1. 分析 → 桑基图
sankey_b64 = analyze_teacher_dashboard(excel_path = file.name)
# 2. 聚类图
cluster_b64, cluster_stats = cluster_and_visualize( excel_path=file.name )
# print(cluster_b64)
# print(cluster_stats)
# 3. 生成教学建议
advice = generate_teaching_advice(sankey_b64, cluster_stats)
# 4. 聚类统计表格
stats_table = """
<h3>聚类主题统计</h3>
<table border="1" style="width:100%; border-collapse: collapse; text-align:center; font-size:14px;">
<tr style="background:#f0f0f0;">
<th>聚类</th><th>主题关键词</th><th>反馈数</th><th>占比</th><th>代表句</th>
</tr>
"""
for s in cluster_stats:
stats_table += f"""
<tr>
<td>{s['cluster_id']}</td>
<td><strong>{s['keyword']}</strong></td>
<td>{s['size']}</td>
<td>{s['ratio']:.1%}</td>
<td style="text-align:left; max-width:300px;">{s['rep_sentence'][:60]}...</td>
</tr>
"""
stats_table += "</table>"
# 5. 最终 HTML 输出
html = f"""
<div style="font-family: 'Microsoft YaHei', sans-serif; max-width: 1000px; margin: 0 auto; padding: 20px;">
<h1 style="text-align:center; color:#1e88e5;">EGISInsight</h1>
<p style="text-align:center; color:#555; font-size:16px;">
GIS 教学智能体 · 循证教学优化
</p>
<hr style="border: 1px solid #eee; margin: 30px 0;">
<h2 style="color:#1976d2;">1. 实验报告反馈</h2>
<img src="data:image/png;base64,{sankey_b64}"
style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
<h2 style="color:#388e3c; margin-top:40px;">2. 学生反馈聚类</h2>
<img src="data:image/png;base64,{cluster_b64}"
style="width:100%; border-radius:8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
<div style="margin-top:30px;">
{stats_table}
</div>
<div style="margin-top:30px; padding:20px; background:#f8f9fa; border-radius:8px; text-align:left;">
{advice}
</div>
<p style="text-align:center; color:#999; font-size:13px; margin-top:40px;">
EGISInsight © 2025 | 从数据到教学内容改革
</p>
</div>
"""
return html, None
except Exception as e:
return f"分析失败:{str(e)}", None
# ================== Gradio UI ==================
with gr.Blocks(title="教学智能体 · 实验报告分析") as demo:
gr.Markdown("# GIS实验报告智能分析系统")
gr.Markdown("**上传融合后的学生反馈 Excel → 一键生成教学决策图**")
with gr.Row():
file_input = gr.File(
label="上传 ex02.xlsx(含 s1-s4 列)",
file_types=[".xlsx"]
)
with gr.Row():
output = gr.HTML(label="分析结果")
file_input.change(analyze_report, inputs=file_input, outputs=output)
gr.Markdown("---")
gr.Markdown("**后续将接入通义千问大模型,自动生成教案、微课脚本、作业设计**")
# ================== 启动 ==================
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
# server_port=7860,
share=False # 改 True 可生成公网链接
# share=True # 改 True 可生成公网链接
)