AgentScope中的多智能体辩论工作流

代码

python 复制代码
import asyncio
import os

from pydantic import (
    BaseModel,
    Field,
)

from agentscope.agent import ReActAgent
from agentscope.formatter import (
    DashScopeChatFormatter,
    DashScopeMultiAgentFormatter,
)
from agentscope.message import Msg
from agentscope.model import DashScopeChatModel
from agentscope.pipeline import MsgHub

from dotenv import load_dotenv
load_dotenv()

import agentscope

agentscope.init(
    # ...
    project="test_examples",           # 项目名称
    name="agent_debate"   ,
    studio_url="http://localhost:3000"
)
  


topic = "两个圆外切且无相对滑动。圆A的半径是圆B半径的1/3。圆A绕圆B滚动一圈回到起点。问圆A总共转了多少圈?"


# 创建两个辩论智能体,Alice和Bob,他们将讨论这个话题。
def create_solver_agent(name: str) -> ReActAgent:
    """获取一个求解智能体。"""
    return ReActAgent(
        name=name,
        sys_prompt=f"你是一个名叫{name}的辩论者。你好,欢迎来到"
        "辩论比赛。不需要完全同意对方的观点,"
        "因为我们的目标是找到正确的答案。辩论主题如下:"
        f"{topic}。请用中文回答问题。",
        model=DashScopeChatModel(
            model_name="qwen-turbo",
            api_key=os.environ["DASHSCOPE_API_KEY"],
            stream=True,
        ),
        formatter=DashScopeChatFormatter(),
    )


alice, bob = [create_solver_agent(name) for name in ["Alice", "Bob"]]

# 创建一个主持人智能体
moderator = ReActAgent(
    name="Aggregator",
    sys_prompt=(
        "你是一个主持人。将有两位辩论者参与辩论比赛。"
        "他们将提出自己的答案并讨论他们对这个话题的观点:\n"
        "```\n"
        "{topic}\n"
        "```\n"
        "在每轮结束时,你将评估双方的答案并决定哪一个是正确的。"
    ),
    model=DashScopeChatModel(
        model_name="qwen-turbo",
        api_key=os.environ["DASHSCOPE_API_KEY"],
        stream=True,
    ),
    formatter=DashScopeMultiAgentFormatter(),
)


# 主持人的结构化输出模型
class JudgeModel(BaseModel):
    """主持人的结构化输出模型。"""

    finished: bool = Field(
        description="辩论是否已经结束。",
    )
    correct_answer: str | None = Field(
        description="辩论主题的正确答案,仅在辩论结束时提供。"
        "否则保持为None。",
        default=None,
    )


async def run_multiagent_debate() -> None:
    """运行多智能体辩论工作流。"""
    while True:
        # 来自参与者的回复消息将在MsgHub中
        # 广播给所有参与者。
        async with MsgHub(participants=[alice, bob, moderator]):
            await alice(
                Msg(
                    "user",
                    "你是正方,请表达你的"
                    "观点。",
                    "user",
                ),
            )
            await bob(
                Msg(
                    "user",
                    "你是反方。你不同意正方的观点。"
                    "请提供你的理由和答案。",
                    "user",
                ),
            )

        # Alice和Bob不需要知道主持人的消息,
        # 所以主持人在MsgHub外部调用。
        msg_judge = await moderator(
            Msg(
                "user",
                "现在你已经听到了其他人的答案,"
                "辩论是否已经结束,你能得出正确答案吗?",
                "user",
            ),
            structured_model=JudgeModel,
        )
        print("【结构化输出】: ", msg_judge.metadata)

        if msg_judge.metadata.get("finished"):
            print(
                "辩论已经结束,正确答案是:",
                msg_judge.metadata.get("correct_answer"),
            )
            break

asyncio.run(run_multiagent_debate())

运行结果

agentscope studio观测结果


各个agent的输入


相关推荐
海兰13 小时前
【文字三国志:第三篇】天命重构,数据模型设计
人工智能·游戏
心疼你的一切14 小时前
高效内容生产:如何实现规模化创作
大数据·人工智能·ai·ai编程·ai写作
QYR-分析14 小时前
智能化重构仓储物流:仓储人形机器人行业全景解析
人工智能·重构·机器人
AI 小老六14 小时前
Claude Code 如何压缩上下文:Microcompact、Prompt Cache 与 cache_edits 工程拆解
数据库·人工智能·ai·语言模型·架构·系统架构
侃谈科技圈15 小时前
多门店数据孤岛破局:零售连锁一体化系统2026选型
人工智能·零售
lqqjuly15 小时前
注意力机制完全详解
人工智能·语言模型
数据科学小丫15 小时前
特征工程处理
人工智能·算法·机器学习
WooaiJava15 小时前
即将到达的AI时代——Claude Code
人工智能
风落无尘15 小时前
第十章《多模态与具身》 完整学习资料
人工智能·语言模型·aigc