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()) |