258 lines
11 KiB
Python
258 lines
11 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
八仙分层辩论系统:强模型分解 + 小模型辩论
|
||
架构:
|
||
1. 强模型(如GPT-4)进行问题分解和观点提炼
|
||
2. 小模型(如Gemini Flash)基于分解结果进行辩论
|
||
"""
|
||
|
||
import asyncio
|
||
import json
|
||
import time
|
||
from typing import Dict, List, Any
|
||
import aiohttp
|
||
import logging
|
||
|
||
# 配置日志
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
logger = logging.getLogger(__name__)
|
||
|
||
class BreakdownDebateSystem:
|
||
def __init__(self):
|
||
# API配置
|
||
self.api_base = "http://localhost:4000"
|
||
self.api_key = "sk-1234"
|
||
|
||
# 模型配置
|
||
self.strong_model = "fireworks_ai/accounts/fireworks/models/deepseek-v3-0324" # 强模型用于分解
|
||
self.debate_model = "gemini/gemini-2.5-flash" # 小模型用于辩论
|
||
|
||
# 辩论主题
|
||
self.topic = "工作量证明vs无限制爬虫:从李时珍采药到AI数据获取的激励机制变革"
|
||
|
||
# 八仙角色定义
|
||
self.immortals = {
|
||
"吕洞宾": {"性别": "男", "特征": "文雅学者,理性分析", "立场": "支持工作量证明机制"},
|
||
"何仙姑": {"性别": "女", "特征": "温和智慧,注重平衡", "立场": "支持无限制数据获取"},
|
||
"张果老": {"年龄": "老", "特征": "经验丰富,传统智慧", "立场": "支持传统激励机制"},
|
||
"韩湘子": {"年龄": "少", "特征": "创新思维,前瞻视野", "立场": "支持AI时代新机制"},
|
||
"汉钟离": {"地位": "富", "特征": "资源丰富,商业思维", "立场": "支持市场化激励"},
|
||
"蓝采和": {"地位": "贫", "特征": "平民视角,公平关注", "立场": "支持开放共享"},
|
||
"曹国舅": {"出身": "贵", "特征": "权威地位,规则意识", "立场": "支持制度化管理"},
|
||
"铁拐李": {"出身": "贱", "特征": "草根智慧,实用主义", "立场": "支持去中心化"}
|
||
}
|
||
|
||
# 对角线辩论配置
|
||
self.debate_pairs = [
|
||
("吕洞宾", "何仙姑"), # 男女对角线
|
||
("张果老", "韩湘子"), # 老少对角线
|
||
("汉钟离", "蓝采和"), # 富贫对角线
|
||
("曹国舅", "铁拐李") # 贵贱对角线
|
||
]
|
||
|
||
async def call_api(self, model: str, messages: List[Dict], max_tokens: int = 1000) -> str:
|
||
"""调用API"""
|
||
headers = {
|
||
"Authorization": f"Bearer {self.api_key}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
data = {
|
||
"model": model,
|
||
"messages": messages,
|
||
"max_tokens": max_tokens,
|
||
"temperature": 0.7
|
||
}
|
||
|
||
try:
|
||
async with aiohttp.ClientSession() as session:
|
||
async with session.post(f"{self.api_base}/chat/completions",
|
||
headers=headers, json=data) as response:
|
||
if response.status == 200:
|
||
result = await response.json()
|
||
return result['choices'][0]['message']['content']
|
||
else:
|
||
error_text = await response.text()
|
||
logger.error(f"API调用失败: {response.status} - {error_text}")
|
||
return f"API调用失败: {response.status}"
|
||
except Exception as e:
|
||
logger.error(f"API调用异常: {str(e)}")
|
||
return f"API调用异常: {str(e)}"
|
||
|
||
async def breakdown_topic(self) -> Dict[str, Any]:
|
||
"""使用强模型分解辩论主题"""
|
||
logger.info("🧠 开始使用强模型分解辩论主题...")
|
||
|
||
breakdown_prompt = f"""
|
||
你是一个专业的辩论分析师。请对以下主题进行深度分解:
|
||
|
||
主题:{self.topic}
|
||
|
||
请提供:
|
||
1. 核心争议点(3-5个)
|
||
2. 支持工作量证明机制的关键论据(3个)
|
||
3. 支持无限制爬虫/数据获取的关键论据(3个)
|
||
4. 历史对比分析要点
|
||
5. 未来发展趋势预测
|
||
|
||
请以JSON格式返回,结构如下:
|
||
{{
|
||
"core_issues": ["争议点1", "争议点2", ...],
|
||
"pro_pow_arguments": ["论据1", "论据2", "论据3"],
|
||
"pro_unlimited_arguments": ["论据1", "论据2", "论据3"],
|
||
"historical_analysis": ["要点1", "要点2", ...],
|
||
"future_trends": ["趋势1", "趋势2", ...]
|
||
}}
|
||
"""
|
||
|
||
messages = [
|
||
{"role": "system", "content": "你是一个专业的辩论分析师,擅长深度分析复杂议题。"},
|
||
{"role": "user", "content": breakdown_prompt}
|
||
]
|
||
|
||
response = await self.call_api(self.strong_model, messages, max_tokens=2000)
|
||
|
||
try:
|
||
# 尝试解析JSON
|
||
breakdown_data = json.loads(response)
|
||
logger.info("✅ 主题分解完成")
|
||
return breakdown_data
|
||
except json.JSONDecodeError:
|
||
logger.error("❌ 强模型返回的不是有效JSON,使用默认分解")
|
||
return {
|
||
"core_issues": ["激励机制公平性", "创作者权益保护", "技术发展与伦理平衡"],
|
||
"pro_pow_arguments": ["保护创作者权益", "维护内容质量", "建立可持续生态"],
|
||
"pro_unlimited_arguments": ["促进知识传播", "加速技术发展", "降低获取成本"],
|
||
"historical_analysis": ["从手工采药到工业化生产的变迁", "知识产权制度的演进"],
|
||
"future_trends": ["AI与人类协作模式", "新型激励机制探索"]
|
||
}
|
||
|
||
async def conduct_debate(self, breakdown_data: Dict[str, Any]):
|
||
"""基于分解结果进行八仙辩论"""
|
||
logger.info("🎭 开始八仙对角线辩论...")
|
||
|
||
for i, (immortal1, immortal2) in enumerate(self.debate_pairs, 1):
|
||
logger.info(f"\n{'='*60}")
|
||
logger.info(f"第{i}场辩论:{immortal1} vs {immortal2}")
|
||
logger.info(f"{'='*60}")
|
||
|
||
# 为每个仙人准备个性化的论据
|
||
immortal1_info = self.immortals[immortal1]
|
||
immortal2_info = self.immortals[immortal2]
|
||
|
||
# 第一轮:开场陈述
|
||
statement1 = await self.get_opening_statement(immortal1, immortal1_info, breakdown_data)
|
||
logger.info(f"\n🗣️ {immortal1}的开场陈述:")
|
||
logger.info(statement1)
|
||
|
||
statement2 = await self.get_opening_statement(immortal2, immortal2_info, breakdown_data)
|
||
logger.info(f"\n🗣️ {immortal2}的开场陈述:")
|
||
logger.info(statement2)
|
||
|
||
# 第二轮:相互回应
|
||
response1 = await self.get_response(immortal1, immortal1_info, statement2, breakdown_data)
|
||
logger.info(f"\n💬 {immortal1}的回应:")
|
||
logger.info(response1)
|
||
|
||
response2 = await self.get_response(immortal2, immortal2_info, statement1, breakdown_data)
|
||
logger.info(f"\n💬 {immortal2}的回应:")
|
||
logger.info(response2)
|
||
|
||
# 第三轮:总结陈词
|
||
summary1 = await self.get_summary(immortal1, immortal1_info, [statement1, statement2, response1, response2], breakdown_data)
|
||
logger.info(f"\n📝 {immortal1}的总结:")
|
||
logger.info(summary1)
|
||
|
||
await asyncio.sleep(2) # 短暂停顿
|
||
|
||
logger.info(f"\n{'='*60}")
|
||
logger.info("🎉 所有四场对角线辩论已完成!")
|
||
logger.info(f"{'='*60}")
|
||
|
||
async def get_opening_statement(self, immortal: str, immortal_info: Dict, breakdown_data: Dict) -> str:
|
||
"""获取开场陈述"""
|
||
prompt = f"""
|
||
你是{immortal},{immortal_info['特征']}。你的立场是:{immortal_info['立场']}。
|
||
|
||
基于以下分解分析,请发表你的开场陈述:
|
||
|
||
核心争议点:{', '.join(breakdown_data['core_issues'])}
|
||
|
||
支持工作量证明的论据:{', '.join(breakdown_data['pro_pow_arguments'])}
|
||
支持无限制获取的论据:{', '.join(breakdown_data['pro_unlimited_arguments'])}
|
||
|
||
历史分析要点:{', '.join(breakdown_data['historical_analysis'])}
|
||
未来趋势:{', '.join(breakdown_data['future_trends'])}
|
||
|
||
请以{immortal}的身份和特征,结合你的立场,发表一段150字左右的开场陈述。要体现你的个性特征和观点倾向。
|
||
"""
|
||
|
||
messages = [
|
||
{"role": "system", "content": f"你是{immortal},请保持角色一致性。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
return await self.call_api(self.debate_model, messages)
|
||
|
||
async def get_response(self, immortal: str, immortal_info: Dict, opponent_statement: str, breakdown_data: Dict) -> str:
|
||
"""获取回应"""
|
||
prompt = f"""
|
||
你是{immortal},{immortal_info['特征']}。你的立场是:{immortal_info['立场']}。
|
||
|
||
对方刚才说:
|
||
{opponent_statement}
|
||
|
||
基于分解分析的要点:
|
||
{', '.join(breakdown_data['core_issues'])}
|
||
|
||
请以{immortal}的身份回应对方的观点,约100字。要体现你的立场和特征。
|
||
"""
|
||
|
||
messages = [
|
||
{"role": "system", "content": f"你是{immortal},请保持角色一致性。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
return await self.call_api(self.debate_model, messages)
|
||
|
||
async def get_summary(self, immortal: str, immortal_info: Dict, all_statements: List[str], breakdown_data: Dict) -> str:
|
||
"""获取总结陈词"""
|
||
prompt = f"""
|
||
你是{immortal},{immortal_info['特征']}。你的立场是:{immortal_info['立场']}。
|
||
|
||
基于刚才的辩论内容和分解分析,请发表你的总结陈词,约120字。
|
||
要总结你的核心观点,并展望未来。
|
||
|
||
分析要点:{', '.join(breakdown_data['future_trends'])}
|
||
"""
|
||
|
||
messages = [
|
||
{"role": "system", "content": f"你是{immortal},请保持角色一致性。"},
|
||
{"role": "user", "content": prompt}
|
||
]
|
||
|
||
return await self.call_api(self.debate_model, messages)
|
||
|
||
async def run(self):
|
||
"""运行完整的分层辩论系统"""
|
||
logger.info("🚀 启动八仙分层辩论系统")
|
||
logger.info(f"主题:{self.topic}")
|
||
logger.info(f"强模型(分解):{self.strong_model}")
|
||
logger.info(f"辩论模型:{self.debate_model}")
|
||
|
||
# 第一阶段:强模型分解
|
||
breakdown_data = await self.breakdown_topic()
|
||
|
||
logger.info("\n📊 分解结果:")
|
||
for key, value in breakdown_data.items():
|
||
logger.info(f"{key}: {value}")
|
||
|
||
# 第二阶段:小模型辩论
|
||
await self.conduct_debate(breakdown_data)
|
||
|
||
logger.info("\n🎊 分层辩论系统运行完成!")
|
||
|
||
if __name__ == "__main__":
|
||
system = BreakdownDebateSystem()
|
||
asyncio.run(system.run()) |