代码
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的输入
