219 lines
6.6 KiB
Python
219 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
辩论主持人智能体
|
|
Debate Master Agent
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
from typing import List, Dict, Any, Optional
|
|
from datetime import datetime
|
|
|
|
from jixia_academy.core.memory_bank.interface import MemoryBankInterface
|
|
|
|
|
|
class DebateMaster:
|
|
"""辩论主持人"""
|
|
|
|
def __init__(self, memory_bank: MemoryBankInterface):
|
|
self.memory_bank = memory_bank
|
|
self.initialized = False
|
|
|
|
async def initialize(self):
|
|
"""初始化主持人"""
|
|
if self.initialized:
|
|
return
|
|
|
|
print("🎭 初始化辩论主持人...")
|
|
self.initialized = True
|
|
|
|
async def close(self):
|
|
"""关闭资源"""
|
|
self.initialized = False
|
|
|
|
async def open_debate(
|
|
self,
|
|
topic: str,
|
|
participants: List[str]
|
|
) -> str:
|
|
"""开场白"""
|
|
|
|
# 根据话题和参与者生成开场白
|
|
opening_templates = [
|
|
f"各位仙友,今日我们齐聚稷下学宫,共商"{topic}"这一重要议题。",
|
|
f"让我们以{', '.join(participants)}的智慧,共同探讨"{topic}"的深层含义。",
|
|
f"今日辩论的主题是"{topic}",请各位仙人畅所欲言,各抒己见。"
|
|
]
|
|
|
|
# 根据参与者数量选择不同的开场白
|
|
if len(participants) <= 3:
|
|
opening = opening_templates[1]
|
|
else:
|
|
opening = opening_templates[2]
|
|
|
|
return opening
|
|
|
|
async def close_debate(
|
|
self,
|
|
topic: str,
|
|
participants: List[str],
|
|
summary: Dict[str, Any]
|
|
) -> str:
|
|
"""结束语"""
|
|
|
|
# 生成总结性结束语
|
|
closing_parts = []
|
|
|
|
# 开场
|
|
closing_parts.append(f"今日关于"{topic}"的辩论到此结束。")
|
|
|
|
# 参与者总结
|
|
if len(participants) > 1:
|
|
closing_parts.append(f"感谢{', '.join(participants)}的精彩发言。")
|
|
|
|
# 观点总结
|
|
consensus = summary.get("consensus", [])
|
|
if consensus:
|
|
closing_parts.append(f"我们达成了以下共识:{'; '.join(consensus)}")
|
|
|
|
# 分歧总结
|
|
disagreements = summary.get("disagreements", [])
|
|
if disagreements:
|
|
closing_parts.append(f"存在的分歧包括:{'; '.join(disagreements)}")
|
|
|
|
# 结束语
|
|
closing_parts.append("让我们带着今天的智慧,继续前行。")
|
|
|
|
return " ".join(closing_parts)
|
|
|
|
async def summarize_debate(self, debate_id: str) -> Dict[str, Any]:
|
|
"""总结辩论"""
|
|
|
|
# 获取辩论历史
|
|
history = await self.memory_bank.get_debate_history(debate_id)
|
|
|
|
# 分析辩论内容
|
|
analysis = await self._analyze_debate_content(history)
|
|
|
|
# 生成总结
|
|
summary = {
|
|
"total_messages": len(history),
|
|
"participants": list(set([h.get("speaker", "") for h in history])),
|
|
"consensus": analysis.get("consensus", []),
|
|
"disagreements": analysis.get("disagreements", []),
|
|
"key_points": analysis.get("key_points", []),
|
|
"timestamp": datetime.now().isoformat()
|
|
}
|
|
|
|
return summary
|
|
|
|
async def _analyze_debate_content(
|
|
self,
|
|
history: List[Dict[str, Any]]
|
|
) -> Dict[str, Any]:
|
|
"""分析辩论内容"""
|
|
|
|
if not history:
|
|
return {
|
|
"consensus": [],
|
|
"disagreements": [],
|
|
"key_points": []
|
|
}
|
|
|
|
# 提取所有消息内容
|
|
all_messages = [h.get("message", "") for h in history]
|
|
content = " ".join(all_messages)
|
|
|
|
# 简化版分析
|
|
key_words = ["风险", "机会", "收益", "损失", "策略", "建议"]
|
|
key_points = [kw for kw in key_words if kw in content]
|
|
|
|
# 基于内容长度和参与者数量估算共识
|
|
participants = list(set([h.get("speaker", "") for h in history]))
|
|
|
|
consensus = []
|
|
disagreements = []
|
|
|
|
# 简化版共识识别
|
|
if "风险" in content and "机会" in content:
|
|
consensus.append("同时关注风险和机会")
|
|
|
|
if len(participants) > 2:
|
|
consensus.append("多方参与讨论")
|
|
|
|
# 简化版分歧识别
|
|
if "但是" in content or "然而" in content:
|
|
disagreements.append("存在不同观点")
|
|
|
|
return {
|
|
"consensus": consensus,
|
|
"disagreements": disagreements,
|
|
"key_points": key_points
|
|
}
|
|
|
|
async def moderate_dispute(
|
|
self,
|
|
dispute: str,
|
|
participants: List[str]
|
|
) -> str:
|
|
"""调解争议"""
|
|
|
|
# 生成调解建议
|
|
moderation_templates = [
|
|
f"各位仙友,关于"{dispute}",让我们回归理性讨论。",
|
|
f"我理解{', '.join(participants)}的不同观点,让我们寻找共同点。",
|
|
f"争议"{dispute}"体现了问题的复杂性,我们需要更深入的分析。"
|
|
]
|
|
|
|
# 根据争议类型选择调解方式
|
|
return moderation_templates[0]
|
|
|
|
def get_info(self) -> Dict[str, Any]:
|
|
"""获取主持人信息"""
|
|
return {
|
|
"role": "辩论主持人",
|
|
"responsibilities": [
|
|
"开场和结束辩论",
|
|
"总结辩论观点",
|
|
"调解争议",
|
|
"维持辩论秩序"
|
|
],
|
|
"initialized": self.initialized
|
|
}
|
|
|
|
|
|
async def test_debate_master():
|
|
"""测试辩论主持人"""
|
|
from jixia_academy.core.memory_bank.factory import get_memory_backend
|
|
|
|
memory_bank = get_memory_backend()
|
|
await memory_bank.initialize()
|
|
|
|
master = DebateMaster(memory_bank=memory_bank)
|
|
await master.initialize()
|
|
|
|
# 测试开场白
|
|
opening = await master.open_debate(
|
|
topic="人工智能对投资的影响",
|
|
participants=["铁拐李", "吕洞宾", "何仙姑"]
|
|
)
|
|
print(f"\n🎯 开场白: {opening}")
|
|
|
|
# 测试结束语
|
|
closing = await master.close_debate(
|
|
topic="人工智能对投资的影响",
|
|
participants=["铁拐李", "吕洞宾", "何仙姑"],
|
|
summary={
|
|
"consensus": ["关注技术风险", "寻找投资机会"],
|
|
"disagreements": ["对发展速度的看法不同"]
|
|
}
|
|
)
|
|
print(f"\n🎯 结束语: {closing}")
|
|
|
|
await master.close()
|
|
await memory_bank.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(test_debate_master()) |