import streamlit as st import streamlit_antd_components as sac from streamlit_ace import st_ace from utils.sanitize_code import sanitize_code from workflow.modeling.model_training import train_execution, modeling_code_gen, train_download_model from workflow.modeling.model_inference import infer_load_data, infer_execution from workflow.preprocessing.preprocessing_core import prep_meta_execution def modeling_quick_actions(agent): st.write("选择一个或多个model:") selected_models = sac.chip( items=[ sac.ChipItem(label='线性回归'), sac.ChipItem(label='XGBoost'), sac.ChipItem(label='随机森林'), sac.ChipItem(label='神经网络'), ], index=[0, 2], align='center', radius='md', color='#44658C', multiple=True ) df = agent.load_df() if st.button("🖋️ 快速建模"): if not selected_models: st.error("请先选择训练model。") else: with st.spinner("建模 Agent 正在生成训练脚本..."): raw = agent.code_generation(df.head().to_string(), selected_models) code = sanitize_code(raw) agent.save_code(code) agent.save_suggestion(selected_models) agent.save_user_selection(selected_models) st.success("训练脚本已生成并保存。") st.rerun() return selected_models def modeling_execution(agent, auto = False) -> None: code = agent.load_code() edited = st_ace( value=code, height=450, theme="tomorrow_night", language="python", auto_update=True ) not_executed = agent.load_modeling_result() == None if edited is not None: if st.button("▶️ 执行建模", key="modeling_run_code") or (auto and not_executed): code = sanitize_code(edited) agent.save_code(code) train_execution(agent) agent.finish_auto() st.rerun() modeling_result = agent.load_modeling_result() if modeling_result is None: result_expand = False else: result_expand = True train_download_model(agent) with st.expander("训练结果", result_expand): if modeling_result: st.subheader("训练结果") try: st.markdown(modeling_result) except Exception: st.write(modeling_result) def modeling_inference(agent, preproc_agent): infer_load_data(agent) inference_processed_data = agent.load_inference_processed_df() inference_data = agent.load_inference_data() code = agent.load_inference_code() if st.button("▶️ 执行推断"): with st.spinner("正在对推理数据进行预处理..."): inference_data = agent.load_inference_data() if preproc_agent.code is not None: inference_processed_df = prep_meta_execution(preproc_agent, preproc_agent.code, inference_data) inference_data = inference_processed_df agent.save_inference_processed_df(inference_data) st.write("推断数据预览:") st.dataframe(inference_data.head()) with st.spinner("建模 Agent 正在生成推理脚本..."): raw = agent.code_generation_for_inference(agent.load_code(), inference_data.head()) code = sanitize_code(raw) agent.save_inference_code(code) if code is not None: edited_code = st_ace( value=code, height=450, theme="tomorrow_night", language="python", auto_update=True ) agent.save_inference_code(code) if st.button("▶️ 执行建模"): infer_execution(agent) def modeling_chat(agent, auto) -> None: user_input = st.text_input("建模目标", "默认") agent.save_target(user_input) with st.chat_message("assistant"): st.write( "我是 Autostat 数据分析助手,很高兴为您服务!\n\n" "您可以在下方输入建模相关问题,或直接点击按钮获取建模建议。" ) c = st.columns(2) with c[0]: analyze_btn = st.button("🔍 建模推荐", key='modeling_suggest', use_container_width=True) with c[1]: clear_modeling_suggest = st.button("♻️ 清除建模分析", key='clear_modeling_suggest', use_container_width=True) if clear_modeling_suggest: agent.clear_memory() agent.suggestion = None chat_history = agent.load_memory() for idx, entry in enumerate(chat_history): bubble = st.chat_message(entry["role"]) content = entry["content"] if isinstance(content, str): bubble.write(content) already_generated = any( entry["role"] == "assistant" and "模" in str(entry["content"]) for entry in chat_history ) if analyze_btn or (auto and not already_generated): st.chat_message("user").write("请帮我获取建模建议") agent.add_memory({"role": "user", "content": "请帮我获取建模建议"}) with st.spinner("分析中..."): suggestion = agent.get_model_suggestion() agent.save_suggestion(suggestion) agent.refine_suggestions() st.chat_message("assistant").write(suggestion) agent.add_memory({"role": "assistant", "content": suggestion}) st.chat_message("assistant").write("需要进一步优化?再次点击按钮获取下一条建议") agent.add_memory({"role": "assistant", "content": "需要进一步优化?再次点击按钮获取下一条建议"}) user_input = st.chat_input("请输入您的问题,例如“如何优化这个模型”") if user_input: st.chat_message("user").write(user_input) agent.add_memory({"role": "user", "content": user_input}) with st.spinner("处理中…"): reply = agent.get_model_suggestion(user_input) agent.save_suggestion(reply) agent.refine_suggestions() st.chat_message("assistant").write(reply) agent.add_memory({"role": "assistant", "content": reply}) st.chat_message("assistant").write("需要进一步优化?再次点击按钮获取下一条建议") agent.add_memory({"role": "assistant", "content": "需要进一步优化?再次点击按钮获取下一条建议"}) if __name__ == "__main__": st.title("数据建模") st.markdown("---") preproc_agent = st.session_state.data_preprocess_agent load_agent = st.session_state.data_loading_agent processed_df = preproc_agent.load_processed_df() if processed_df is None: df = load_agent.load_df() else: df = processed_df if df is None: st.warning("⚠️ 请先在数据导入页面加载数据") st.stop() agent = st.session_state.modeling_coding_agent agent.add_df(df) planner = st.session_state.planner_agent auto = planner.modeling_auto if st.session_state.auto_mode == True: if (agent.finish_auto_task == True and planner.switched_modeling == False) or planner.modeling_auto == False: planner.finish_modeling_auto() st.switch_page("workflow/report/report_render.py") code = agent.load_code() if code is None: expand = False else: expand = True inference_model = agent.load_best_model() if inference_model is None: inference_expand = False else: inference_expand = True c = st.columns(2) with c[0].expander('快速建模', True): modeling_quick_actions(agent) with c[1].expander('建模建议', True): modeling_chat(agent, auto) modeling_code_gen(agent, auto=auto) with c[0].expander('建模执行', expand): modeling_execution(agent, auto) # with c[0].expander('推断分析', inference_expand): # modeling_inference(agent, preproc_agent)