终止代理之间的对话
在本章中,我们将探讨如何终止 AutoGen 代理之间的对话。
为什么这很重要? 这是因为在任何复杂的自主工作流中,知道何时停止工作流是至关重要的。例如,当 任务完成时,或者当流程消耗了足够的资源并且需要停止或采用不同的策略(如用户干预)时。因此,AutoGen 本身支持多种机制来终止对话。
如何使用 AutoGen 控制终止?目前有两种广泛的机制来控制代理之间对话的终止:
-
在
initiate_chat
中指定参数:在启动对话时,您可以定义确定对话何时结束的参数。 -
配置代理以触发终止:在定义各个代理时,您可以指定允许代理根据特定(可配置的)条件终止对话的参数。
在 initiate_chat
中的参数
在上一章中,当我们使用 max_turns
参数限制回合数时,实际上就演示了这一点。如果我们将 max_turns
增加到 3
,可以注意到对话需要更多的回合才能终止:
import os
from autogen import ConversableAgent
cathy = ConversableAgent(
"cathy",
system_message="你的名字是 Cathy,你是一对喜剧演员中的一员。",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.9, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # 从不要求人类输入。
)
joe = ConversableAgent(
"joe",
system_message="你的名字是 Joe,你是一对喜剧演员中的一员。",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.7, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # 从不要求人类输入。
)
result = joe.initiate_chat(cathy, message="Cathy,给我讲个笑话。", max_turns=2)
joe(对cathy):
Cathy,给我讲个笑话吧。
cathy(对joe):
好的,给你讲一个:
为什么科学家不相信原子?
因为它们组成了一切!
joe(对cathy):
哈哈,这个真好笑,Cathy!轮到我了。
为什么我们从不在农场里说秘密?
因为土豆有眼睛,玉米有耳朵,豆子有茎 。
cathy(对joe):
哈哈,太棒了!农场绝对不是保守秘密的地方。好了,轮到我了。
为什么自行车不能自己站起来?
因为它太累了!
result = joe.initiate_chat(
cathy, message="Cathy, tell me a joke.", max_turns=3, max_consecutive_auto_reply=1
)
joe = ConversableAgent(
"joe",
system_message="你叫Joe,是一对喜剧演员中的一员。",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.7, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # 不会要求人类输入。
max_consecutive_auto_reply=1, # 限制连续自动回复的次数。
)
result = joe.initiate_chat(cathy, message="Cathy,给我讲个笑话。")
joe (对 cathy):
Cathy,给我讲个笑话吧。
cathy (对 joe):
好的,给你讲一个:
为什么科学家不相信原子?
因为它们构成了一切!
joe (对 cathy):
哈哈,这个很好笑,Cathy!轮到我了。
为什么我们从不在农场里说秘密?
因为土豆有眼睛,玉米有耳朵,豆子有茎。
cathy (对 joe):
哈哈,太棒了!农场绝对不是保守秘密的地方。轮到我了。
为什么自行车不能自己站起来?
因为它太累了!
使用 is_termination_msg
让我们将终止消息设置为“再见”,看看对话如何终止。
joe = ConversableAgent(
"joe",
system_message="你叫 Joe,是一对喜剧演员中的一员。",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.7, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # 不会要求人类输入。
is_termination_msg=lambda msg: "再见" in msg["content"],
)
result = joe.initiate_chat(cathy, message="Cathy,给我讲个笑话,然后说“再见”。")
joe (对 cathy):
Cathy,给我讲个笑话,然后说“再见”。
--------------------------------------------------------------------------------
cathy (对 joe):
为 什么科学家不相信原子?
因为它们构成了一切!
再见!
--------------------------------------------------------------------------------
注意对话是如何根据 cathy 的消息内容结束的!
总结
在本章中,我们介绍了终止对话的机制。您可以在 initiate_chat
中配置这两个参数,也可以配置代理的参数。
值得注意的是,当触发终止条件时,对话可能并不总是立即终止。实际的终止取决于 ConversableAgent
类的 human_input_mode
参数。例如,当模式为 NEVER
时,上述终止条件将结束对话。但是当模式为 ALWAYS
或 TERMINATE
时,它不会立即终止。我们将在下一章中描述这种行为并解释其重要性。