liurenchaxin/experiments/baxian_breakdown_debate.py

258 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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())