Skip to main content

终止代理之间的对话

在 Colab 中打开 在 GitHub 上打开

在本章中,我们将探讨如何终止 AutoGen 代理之间的对话。

为什么这很重要? 这是因为在任何复杂的自主工作流中,知道何时停止工作流是至关重要的。例如,当任务完成时,或者当流程消耗了足够的资源并且需要停止或采用不同的策略(如用户干预)时。因此,AutoGen 本身支持多种机制来终止对话。

如何使用 AutoGen 控制终止?目前有两种广泛的机制来控制代理之间对话的终止:

  1. initiate_chat 中指定参数:在启动对话时,您可以定义确定对话何时结束的参数。

  2. 配置代理以触发终止:在定义各个代理时,您可以指定允许代理根据特定(可配置的)条件终止对话的参数。

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 时,上述终止条件将结束对话。但是当模式为 ALWAYSTERMINATE 时,它不会立即终止。我们将在下一章中描述这种行为并解释其重要性。