备注
Go to the end to download the full example code.
Multi-Agent Debate¶
Multi-Agent debate 模拟不同智能体之间的多轮讨论场景,通常包括几个 solver 和一个 aggregator。 典型情况下,solver 生成并交换他们的答案,而 aggregator 收集并总结答案。
我们实现了 EMNLP 2024 中的示例,其中两个 solver 智能体将按固定顺序讨论一个话题,根据先前的辩论历史表达他们的论点。 在每一轮中,主持人智能体将决定是否可以在当前轮获得最终的正确答案。
import asyncio
import os
from pydantic import Field, BaseModel
from agentscope.agent import ReActAgent
from agentscope.formatter import (
DashScopeMultiAgentFormatter,
)
from agentscope.message import Msg
from agentscope.model import DashScopeChatModel
from agentscope.pipeline import MsgHub
# 准备一个话题
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-max",
api_key=os.environ["DASHSCOPE_API_KEY"],
stream=False,
),
formatter=DashScopeMultiAgentFormatter(),
)
alice, bob = [create_solver_agent(name) for name in ["Alice", "Bob"]]
# 创建主持人智能体
moderator = ReActAgent(
name="Aggregator",
sys_prompt=f"""你是一个主持人。将有两个辩论者参与辩论比赛。他们将就以下话题提出观点并进行讨论:
``````
{topic}
``````
在每轮讨论结束时,你将评估辩论是否结束,以及话题正确的答案。""",
model=DashScopeChatModel(
model_name="qwen-max",
api_key=os.environ["DASHSCOPE_API_KEY"],
stream=False,
),
# 使用多智能体格式化器,因为主持人将接收来自多于用户和助手的消息
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,
)
if msg_judge.metadata.get("finished"):
print(
"\n辩论结束,正确答案是:",
msg_judge.metadata.get("correct_answer"),
)
break
asyncio.run(run_multiagent_debate())
Alice: 正方观点是:当圆A绕着圆B滚动一圈回到起点时,圆A总共会旋转4次。
理由如下:
1. 圆A的半径是圆B的1/3,因此圆A的周长也是圆B周长的1/3。
2. 当圆A围绕圆B外侧完整地滚动一圈(即沿着圆B的周长移动了圆B的一个周长距离),圆A实际上走过了一个等于圆B周长的距离。
3. 由于圆A的周长只有圆B周长的1/3,所以为了覆盖这个距离,理论上它需要转过相当于自己周长3倍的距离,也就是要自转3圈才能走过圆B的整个周长。
4. 然而,这里有一个关键点需要注意——除了上述的3圈自转之外,还需要考虑圆A相对于地面的旋转。因为圆A在绕着圆B运动的同时也在绕着自己的中心轴旋转,这导致了一个额外的一圈旋转。
5. 因此,将这两个因素加起来,圆A总共完成了4圈旋转。
综上所述,我的立场是圆A绕圆B滚动一圈回到起点的过程中,总共会发生4次完整的旋转。
Bob: 谢谢Alice的阐述。我理解了你的观点,但我持有不同的看法。我认为当圆A绕着圆B滚动一圈回到起点时,圆A总共会旋转3次,而不是4次。
理由如下:
1. 圆A的半径确实是圆B的1/3,因此圆A的周长也是圆B周长的1/3。
2. 当圆A围绕圆B外侧完整地滚动一圈(即沿着圆B的周长移动了圆B的一个周长距离),圆A实际上走过了一个等于圆B周长的距离。
3. 由于圆A的周长只有圆B周长的1/3,所以为了覆盖这个距离,理论上它需要转过相当于自己周长3倍的距离,也就是要自转3圈才能走过圆B的整个周长。
4. 关键点在于如何理解“额外的一圈旋转”。在本题中,圆A和圆B之间没有相对滑动,这意味着圆A与圆B接触点的速度是相同的。因此,当圆A完成绕圆B一周的动作时,它的旋转次数只取决于它所走过的路径长度与其自身周长的比例关系,而不需要再额外加上一圈旋转。
5. 因此,将上述因素考虑进去后,圆A总共完成了3圈旋转。
综上所述,我的立场是圆A绕圆B滚动一圈回到起点的过程中,总共会发生3次完整的旋转。
/home/runner/work/agentscope/agentscope/src/agentscope/model/_dashscope_model.py:232: DeprecationWarning: 'required' is not supported by DashScope API. It will be converted to 'auto'.
warnings.warn(
Aggregator: {
"type": "tool_use",
"name": "generate_response",
"input": {
"finished": true,
"correct_answer": "3次"
},
"id": "call_0517f94e0646426bb1d6e2"
}
system: {
"type": "tool_result",
"id": "call_0517f94e0646426bb1d6e2",
"name": "generate_response",
"output": [
{
"type": "text",
"text": "Successfully generated response."
}
]
}
Aggregator: 感谢两位辩论者的精彩讨论。根据你们的论述,现在我来宣布一下最终结果。
首先,Alice提出圆A绕着圆B滚动一圈回到起点时,会经历4次旋转。她认为除了圆A需要自转3圈以覆盖圆B周长的距离外,还需要加上由于圆A绕着圆B运动而产生的额外一圈旋转。
然而,Bob对此持有不同的看法,他认为圆A绕着圆B滚动一圈回到起点时,总共只会发生3次旋转。他指出,在没有相对滑动的情况下,圆A与圆B接触点的速度相同,因此圆A的旋转次数只取决于它所走过的路径长度与其自身周长的比例关系,并不需要再加上一圈旋转。
经过仔细分析,我认为Bob的观点更为准确。当圆A绕着圆B滚动一圈回到起点时,圆A确实总共会发生3次完整的旋转。这是因为圆A为了走过等于圆B周长的距离(即圆A需转过自己周长3倍的距离),确实只需自转3圈即可完成整个过程,而无需考虑额外的一圈旋转。
所以,正确答案是:当圆A绕着圆B滚动一圈回到起点时,圆A总共会旋转3次。再次感谢双方带来的精彩辩论!
辩论结束,正确答案是: 3次
进一步阅读¶
Encouraging Divergent Thinking in Large Language Models through Multi-Agent Debate. EMNLP 2024.
Total running time of the script: (1 minutes 7.539 seconds)