feat: 添加多Agent决策工作坊项目\n\n- 实现多角色AI代理辩论系统\n- 添加Streamlit交互界面\n- 包含4个专业角色:技术专家、商业分析师、用户体验师、风险顾问\n- 支持实时辩论过程和智能决策要点生成\n- 添加完整的项目文档和依赖配置
This commit is contained in:
commit
7a5498efb7
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
.env
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
.Python
|
||||
env/
|
||||
venv/
|
||||
.venv/
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
143
README.md
Normal file
143
README.md
Normal file
@ -0,0 +1,143 @@
|
||||
# 多 Agent 决策工作坊
|
||||
|
||||
🤖 **决策智囊团** - 基于AI的多角色辩论辅助决策平台
|
||||
|
||||
## 项目简介
|
||||
|
||||
这是一个为团队决策者、产品经理和战略规划师设计的AI辅助决策平台。通过4个专业AI代理(技术专家、商业分析师、用户体验师、风险顾问)的多角度辩论,帮助用户全面分析复杂问题并生成结构化决策要点。
|
||||
|
||||
## 核心功能
|
||||
|
||||
### 🎯 多角色AI代理辩论
|
||||
- **技术专家** - 技术可行性、实现难度分析
|
||||
- **商业分析师** - 市场机会、商业模式评估
|
||||
- **用户体验师** - 用户需求、易用性分析
|
||||
- **风险顾问** - 风险识别、不确定性评估
|
||||
|
||||
### 🔄 实时辩论过程展示
|
||||
- 可视化展示代理间的辩论流程
|
||||
- 实时显示论点、论据和推理过程
|
||||
- 支持辩论过程的交互控制
|
||||
|
||||
### 📊 智能决策要点生成
|
||||
- 自动总结关键观点和共识
|
||||
- 生成结构化决策建议
|
||||
- 提供风险评估和行动方案
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 环境要求
|
||||
- Python 3.8+
|
||||
- DeepSeek API密钥
|
||||
|
||||
### 安装步骤
|
||||
|
||||
1. 克隆项目
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
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成为您的决策智囊团,助力更明智的商业决策!*
|
||||
263
app.py
Normal file
263
app.py
Normal file
@ -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()
|
||||
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
streamlit>=1.28.0
|
||||
openai>=1.0.0
|
||||
python-dotenv>=1.0.0
|
||||
Loading…
Reference in New Issue
Block a user