From 7a5498efb78e53aa0a8f2398530b6754eef3020f Mon Sep 17 00:00:00 2001 From: st2411020231 Date: Fri, 9 Jan 2026 01:27:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=A4=9AAgent?= =?UTF-8?q?=E5=86=B3=E7=AD=96=E5=B7=A5=E4=BD=9C=E5=9D=8A=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?\n\n-=20=E5=AE=9E=E7=8E=B0=E5=A4=9A=E8=A7=92=E8=89=B2AI?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=BE=A9=E8=AE=BA=E7=B3=BB=E7=BB=9F\n-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0Streamlit=E4=BA=A4=E4=BA=92=E7=95=8C=E9=9D=A2?= =?UTF-8?q?\n-=20=E5=8C=85=E5=90=AB4=E4=B8=AA=E4=B8=93=E4=B8=9A=E8=A7=92?= =?UTF-8?q?=E8=89=B2=EF=BC=9A=E6=8A=80=E6=9C=AF=E4=B8=93=E5=AE=B6=E3=80=81?= =?UTF-8?q?=E5=95=86=E4=B8=9A=E5=88=86=E6=9E=90=E5=B8=88=E3=80=81=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C=E5=B8=88=E3=80=81=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E9=A1=BE=E9=97=AE\n-=20=E6=94=AF=E6=8C=81=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E8=BE=A9=E8=AE=BA=E8=BF=87=E7=A8=8B=E5=92=8C=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E5=86=B3=E7=AD=96=E8=A6=81=E7=82=B9=E7=94=9F=E6=88=90\n-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=8C=E6=95=B4=E7=9A=84=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=92=8C=E4=BE=9D=E8=B5=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 13 +++ README.md | 143 ++++++++++++++++++++++++++ app.py | 263 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 + 4 files changed, 422 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50d614d --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.env +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +.venv/ +.env.local +.env.development.local +.env.test.local +.env.production.local \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b051212 --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +# 多 Agent 决策工作坊 + +🤖 **决策智囊团** - 基于AI的多角色辩论辅助决策平台 + +## 项目简介 + +这是一个为团队决策者、产品经理和战略规划师设计的AI辅助决策平台。通过4个专业AI代理(技术专家、商业分析师、用户体验师、风险顾问)的多角度辩论,帮助用户全面分析复杂问题并生成结构化决策要点。 + +## 核心功能 + +### 🎯 多角色AI代理辩论 +- **技术专家** - 技术可行性、实现难度分析 +- **商业分析师** - 市场机会、商业模式评估 +- **用户体验师** - 用户需求、易用性分析 +- **风险顾问** - 风险识别、不确定性评估 + +### 🔄 实时辩论过程展示 +- 可视化展示代理间的辩论流程 +- 实时显示论点、论据和推理过程 +- 支持辩论过程的交互控制 + +### 📊 智能决策要点生成 +- 自动总结关键观点和共识 +- 生成结构化决策建议 +- 提供风险评估和行动方案 + +## 快速开始 + +### 环境要求 +- Python 3.8+ +- DeepSeek API密钥 + +### 安装步骤 + +1. 克隆项目 +```bash +git clone +cd multi_agent_decision_workshop +``` + +2. 安装依赖 +```bash +pip install -r requirements.txt +``` + +3. 配置环境变量 +创建 `.env` 文件并添加: +```env +DEEPSEEK_API_KEY=your_deepseek_api_key_here +``` + +4. 运行应用 +```bash +streamlit run app.py +``` + +5. 打开浏览器访问 `http://localhost:8501` + +## 使用指南 + +### 基本流程 +1. **输入决策问题** - 在左侧面板输入需要分析的决策问题 +2. **开始辩论** - 点击"开始辩论"按钮激活AI代理 +3. **观察辩论** - 实时观看4个专业角色的观点碰撞 +4. **生成总结** - 辩论结束后生成结构化决策要点 +5. **制定计划** - 基于共识制定具体行动计划 + +### 决策模板 +系统内置常见决策模板: +- 产品功能优先级排序 +- 技术方案选择评估 +- 市场进入策略分析 +- 团队资源分配决策 + +## 技术架构 + +### 前端 +- **Streamlit** - 快速原型开发框架 +- **实时更新** - 辩论过程的动态展示 +- **响应式设计** - 适配不同屏幕尺寸 + +### 后端 +- **DeepSeek API** - AI对话能力支持 +- **多代理协调** - 角色间的对话管理 +- **内容分析** - 辩论内容的智能处理 + +### 数据流 +1. 用户输入 → 问题解析 +2. 代理激活 → 角色分配 +3. 多轮辩论 → 观点碰撞 +4. 内容分析 → 决策生成 +5. 结果展示 → 用户反馈 + +## 项目结构 + +``` +multi_agent_decision_workshop/ +├── app.py # 主应用文件 +├── requirements.txt # 项目依赖 +├── README.md # 项目说明 +└── .env # 环境变量配置 +``` + +## 开发计划 + +### Phase 1: MVP版本 ✅ +- [x] 基础Streamlit界面 +- [x] 单个AI代理对话功能 +- [x] 简单的辩论流程控制 + +### Phase 2: 功能完善 🔄 +- [ ] 辩论过程可视化优化 +- [ ] 更多专业角色代理 +- [ ] 辩论内容深度分析 + +### Phase 3: 高级功能 📈 +- [ ] 自定义角色配置 +- [ ] 辩论过程导出功能 +- [ ] 决策历史记录 + +## 贡献指南 + +欢迎提交Issue和Pull Request! + +### 开发环境设置 +1. Fork项目仓库 +2. 创建功能分支 +3. 提交代码变更 +4. 创建Pull Request + +## 许可证 + +MIT License + +## 联系方式 + +- 项目主页: [GitHub Repository] +- 问题反馈: [Issues] +- 功能建议: [Discussions] + +--- + +*让AI成为您的决策智囊团,助力更明智的商业决策!* \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..c71197e --- /dev/null +++ b/app.py @@ -0,0 +1,263 @@ +""" +多 Agent 决策工作坊 - 主应用 +基于DeepSeek API的多角色AI代理辩论系统 +""" + +import streamlit as st +import os +from openai import OpenAI +from dotenv import load_dotenv +import asyncio +import json +from typing import List, Dict, Any +from datetime import datetime + +# 加载环境变量 +load_dotenv() + +class MultiAgentDecisionWorkshop: + def __init__(self): + """初始化多代理决策工作坊""" + self.client = OpenAI( + api_key=os.getenv("DEEPSEEK_API_KEY"), + base_url="https://api.deepseek.com" + ) + + # 定义4个专业角色代理 + self.agents = { + "技术专家": { + "role": "system", + "content": "你是一位资深技术专家,擅长从技术可行性、实现难度、技术风险等角度分析问题。你的观点务实、注重细节。" + }, + "商业分析师": { + "role": "system", + "content": "你是一位经验丰富的商业分析师,擅长从市场机会、商业模式、投资回报等商业角度分析问题。你的观点注重商业价值。" + }, + "用户体验师": { + "role": "system", + "content": "你是一位专业的用户体验设计师,擅长从用户需求、易用性、用户体验等角度分析问题。你的观点以用户为中心。" + }, + "风险顾问": { + "role": "system", + "content": "你是一位谨慎的风险顾问,擅长识别潜在风险、评估不确定性、提出风险缓解方案。你的观点保守但务实。" + } + } + + def initialize_debate(self, question: str) -> Dict[str, Any]: + """初始化辩论话题""" + return { + "question": question, + "rounds": 0, + "max_rounds": 3, + "current_speaker": "技术专家", + "debate_history": [], + "start_time": datetime.now() + } + + def get_agent_response(self, agent_name: str, debate_context: str) -> str: + """获取单个代理的回应""" + try: + response = self.client.chat.completions.create( + model="deepseek-chat", + messages=[ + self.agents[agent_name], + { + "role": "user", + "content": f"辩论话题:{debate_context}\n\n请从你的专业角度发表观点,并回应其他代理的论点。" + } + ], + temperature=0.7, + max_tokens=500 + ) + return response.choices[0].message.content + except Exception as e: + return f"{agent_name}暂时无法回应:{str(e)}" + + def conduct_debate_round(self, debate_state: Dict[str, Any]) -> Dict[str, Any]: + """进行一轮辩论""" + current_speaker = debate_state["current_speaker"] + + # 构建辩论上下文 + context = f"问题:{debate_state['question']}\n" + if debate_state["debate_history"]: + context += "之前的讨论:\n" + for entry in debate_state["debate_history"][-3:]: # 只取最近3条 + context += f"{entry['speaker']}:{entry['content']}\n" + + # 获取当前发言者的回应 + response = self.get_agent_response(current_speaker, context) + + # 更新辩论历史 + debate_state["debate_history"].append({ + "speaker": current_speaker, + "content": response, + "timestamp": datetime.now().strftime("%H:%M:%S") + }) + + # 切换到下一个发言者 + agent_names = list(self.agents.keys()) + current_index = agent_names.index(current_speaker) + next_index = (current_index + 1) % len(agent_names) + debate_state["current_speaker"] = agent_names[next_index] + + debate_state["rounds"] += 1 + + return debate_state + + def generate_decision_summary(self, debate_history: List[Dict]) -> str: + """生成决策要点总结""" + try: + # 构建辩论内容摘要 + debate_content = "辩论记录:\n" + for entry in debate_history: + debate_content += f"{entry['speaker']}:{entry['content']}\n" + + response = self.client.chat.completions.create( + model="deepseek-chat", + messages=[ + { + "role": "system", + "content": "你是一位专业的决策顾问,擅长从多角度辩论中提取关键观点、识别共识与分歧,并生成结构化的决策建议。" + }, + { + "role": "user", + "content": f"请基于以下辩论记录,生成决策要点总结:\n\n{debate_content}\n\n请提供:\n1. 关键观点汇总\n2. 主要共识领域\n3. 重要分歧点\n4. 风险评估\n5. 行动建议" + } + ], + temperature=0.5, + max_tokens=800 + ) + return response.choices[0].message.content + except Exception as e: + return f"总结生成失败:{str(e)}" + +def main(): + """主应用函数""" + st.set_page_config( + page_title="多 Agent 决策工作坊", + page_icon="🤖", + layout="wide" + ) + + st.title("🤖 多 Agent 决策工作坊") + st.markdown("### 通过AI代理的多角度辩论,助力智能决策") + + # 初始化工作坊 + if "workshop" not in st.session_state: + st.session_state.workshop = MultiAgentDecisionWorkshop() + if "debate_state" not in st.session_state: + st.session_state.debate_state = None + if "debate_in_progress" not in st.session_state: + st.session_state.debate_in_progress = False + + # 侧边栏 - 控制面板 + with st.sidebar: + st.header("控制面板") + + # 决策问题输入 + question = st.text_area( + "请输入决策问题:", + placeholder="例如:我们应该开发一个新的移动应用吗?", + height=100 + ) + + # 开始辩论按钮 + if st.button("🚀 开始辩论", type="primary", use_container_width=True): + if question.strip(): + st.session_state.debate_state = st.session_state.workshop.initialize_debate(question) + st.session_state.debate_in_progress = True + st.rerun() + else: + st.warning("请输入决策问题") + + # 辩论控制按钮 + if st.session_state.debate_in_progress: + col1, col2 = st.columns(2) + with col1: + if st.button("⏭️ 下一轮", use_container_width=True): + if st.session_state.debate_state["rounds"] < st.session_state.debate_state["max_rounds"]: + st.session_state.debate_state = st.session_state.workshop.conduct_debate_round( + st.session_state.debate_state + ) + st.rerun() + else: + st.session_state.debate_in_progress = False + st.rerun() + + with col2: + if st.button("⏹️ 结束辩论", use_container_width=True): + st.session_state.debate_in_progress = False + st.rerun() + + st.markdown("---") + st.markdown("### 参与代理") + for agent_name in st.session_state.workshop.agents.keys(): + st.markdown(f"- {agent_name}") + + # 主内容区 + col1, col2 = st.columns([2, 1]) + + with col1: + st.header("辩论过程") + + if st.session_state.debate_state: + # 显示辩论进度 + progress = min(st.session_state.debate_state["rounds"] / st.session_state.debate_state["max_rounds"], 1.0) + st.progress(progress, text=f"辩论进度:{st.session_state.debate_state['rounds']}/{st.session_state.debate_state['max_rounds']}轮") + + # 显示辩论历史 + for entry in st.session_state.debate_state["debate_history"]: + with st.chat_message("user", avatar=f"👤"): + st.markdown(f"**{entry['speaker']}** ({entry['timestamp']})") + st.write(entry["content"]) + + # 显示当前状态 + if st.session_state.debate_in_progress: + st.info(f"🔄 等待 {st.session_state.debate_state['current_speaker']} 发言...") + else: + st.success("✅ 辩论已完成!") + + # 生成总结 + if st.button("📊 生成决策总结"): + with st.spinner("正在生成决策要点..."): + summary = st.session_state.workshop.generate_decision_summary( + st.session_state.debate_state["debate_history"] + ) + st.session_state.summary = summary + + if "summary" in st.session_state: + st.markdown("### 决策要点总结") + st.write(st.session_state.summary) + else: + st.info("👆 请在左侧输入决策问题并开始辩论") + + with col2: + st.header("决策助手") + + # 快速决策模板 + st.markdown("### 快速决策模板") + templates = [ + "产品功能优先级排序", + "技术方案选择评估", + "市场进入策略分析", + "团队资源分配决策" + ] + + for template in templates: + if st.button(template, use_container_width=True): + st.session_state.debate_state = st.session_state.workshop.initialize_debate(template) + st.session_state.debate_in_progress = True + st.rerun() + + st.markdown("---") + st.markdown("### 使用说明") + st.markdown(""" + 1. 输入决策问题 + 2. 点击开始辩论 + 3. 观察AI代理的多角度分析 + 4. 生成决策要点总结 + 5. 基于共识制定行动计划 + """) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1e25b23 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +streamlit>=1.28.0 +openai>=1.0.0 +python-dotenv>=1.0.0 \ No newline at end of file