# 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"
{advice}
" # ================== 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 = """

聚类主题统计

""" for s in cluster_stats: stats_table += f""" """ stats_table += "
聚类主题关键词反馈数占比代表句
{s['cluster_id']} {s['keyword']} {s['size']} {s['ratio']:.1%} {s['rep_sentence'][:60]}...
" # 5. 最终 HTML 输出 html = f"""

EGISInsight

GIS 教学智能体 · 循证教学优化


1. 实验报告反馈

2. 学生反馈聚类

{stats_table}
{advice}

EGISInsight © 2025 | 从数据到教学内容改革

""" 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 可生成公网链接 )