1. 多代理对话:单口喜剧
在AutoGen中,Agent是一个可以代表人类意图执行操作的实体,发送消息,接收消息,执行操作,生成回复,并与其他代理交互。AutoGen具有一个名为Conversible Agent的内置代理类,它将不同类型的代理统一在同一个编程抽象中。
Conversible Agent带有许多内置功能,如使用大型语言模型配置生成回复、执行代码或函数、保持人工干预并检查停止响应等。你可以打开或关闭每个组件,并根据应用程序的需求进行定制,通过这些不同的功能,你可以使用相同的接口创建具有不同角色的代理。
实验地址:https://learn.deeplearning.ai/courses/ai-agentic-design-patterns-with-autogen/lesson/2/multi-agent-conversation-and-stand-up-comedy
2. 实验运行
2.1 配置环境
包版本:
# requirements file
# note which revision of python, for example 3.9.6
# in this file, insert all the pip install needs, include revision
# python==3.10.13
pyautogen==0.2.25
chess==1.10.0
matplotlib
numpy
pandas
yfinance
utils工具类
# Add your utilities or helper functions to this file.
import os
from dotenv import load_dotenv, find_dotenv
# these expect to find a .env file at the directory above the lesson. # the format for that file is (without the comment) #API_KEYNAME=AStringThatIsTheLongAPIKeyFromSomeService
def load_env():
_ = load_dotenv(find_dotenv())
def get_openai_api_key():
load_env()
openai_api_key = os.getenv("OPENAI_API_KEY")
return openai_api_key
from utils import get_openai_api_key
OPENAI_API_KEY = get_openai_api_key()
llm_config = {"model": "gpt-3.5-turbo"}
2.2 定义一个AutoGen代理
from autogen import ConversableAgent
agent = ConversableAgent(
name="chatbot",
llm_config=llm_config,
human_input_mode="NEVER",
)
reply = agent.generate_reply(
messages=[{"content": "Tell me a joke.", "role": "user"}]
)
print(reply)
输出如下:
Sure, here's one for you:
Why couldn't the bicycle stand up by itself?
Because it was two tired!
2.3 让代理之间对话
设置凯西和乔这两个代理之间的对话,同时保留他们交互的记忆。
cathy = ConversableAgent(
name="cathy",
system_message=
"Your name is Cathy and you are a stand-up comedian.",
llm_config=llm_config,
human_input_mode="NEVER",
)
joe = ConversableAgent(
name="joe",
system_message=
"Your name is Joe and you are a stand-up comedian. "
"Start the next joke from the punchline of the previous joke.",
llm_config=llm_config,
human_input_mode="NEVER",
)
chat_result = joe.initiate_chat(
recipient=cathy,
message="I'm Joe. Cathy, let's keep the jokes rolling.",
max_turns=2,
)
输出如下:
joe (to cathy):
I'm Joe. Cathy, let's keep the jokes rolling.
--------------------------------------------------------------------------------
cathy (to joe):
Sure thing, Joe! Why did the scarecrow win an award? Because he was outstanding in his field!
--------------------------------------------------------------------------------
joe (to cathy):
Haha, Cathy, that's a good one! Speaking of awards, I entered a pun contest and I really feel like I'm in my element.
--------------------------------------------------------------------------------
cathy (to joe):
That's awesome, Joe! I bet you'll clean up with those puns! Just remember, even if you don't win, at least you can say you gave it your punniest shot!
--------------------------------------------------------------------------------
2.4 查看历史结果
import pprint
pprint.pprint(chat_result.chat_history)
输出如下:
[{'content': "I'm Joe. Cathy, let's keep the jokes rolling.",
'role': 'assistant'},
{'content': 'Sure thing, Joe! Why did the scarecrow win an award? Because he '
'was outstanding in his field!',
'role': 'user'},
{'content': "Haha, Cathy, that's a good one! Speaking of awards, I entered a "
"pun contest and I really feel like I'm in my element.",
'role': 'assistant'},
{'content': "That's awesome, Joe! I bet you'll clean up with those puns! Just "
"remember, even if you don't win, at least you can say you gave "
'it your punniest shot!',
'role': 'user'}]
查看花费
pprint.pprint(chat_result.cost)
输出如下:
{'usage_excluding_cached_inference': {'gpt-3.5-turbo-0125': {'completion_tokens': 93,
'cost': 0.0002435,
'prompt_tokens': 208,
'total_tokens': 301},
'total_cost': 0.0002435},
'usage_including_cached_inference': {'gpt-3.5-turbo-0125': {'completion_tokens': 93,
'cost': 0.0002435,
'prompt_tokens': 208,
'total_tokens': 301},
'total_cost': 0.0002435}}
生成摘要总结
pprint.pprint(chat_result.summary)
输出如下:
("That's awesome, Joe! I bet you'll clean up with those puns! Just remember, "
"even if you don't win, at least you can say you gave it your punniest shot!")、
2.5 获取更好的对话摘要
chat_result = joe.initiate_chat(
cathy,
message="I'm Joe. Cathy, let's keep the jokes rolling.",
max_turns=2,
summary_method="reflection_with_llm",
summary_prompt="Summarize the conversation",
)
输出如下:
joe (to cathy):
I'm Joe. Cathy, let's keep the jokes rolling.
--------------------------------------------------------------------------------
cathy (to joe):
Sure thing, Joe! Why did the scarecrow win an award? Because he was outstanding in his field!
--------------------------------------------------------------------------------
joe (to cathy):
Haha, Cathy, that's a good one! Speaking of awards, I entered a pun contest and I really feel like I'm in my element.
--------------------------------------------------------------------------------
cathy (to joe):
That's awesome, Joe! I bet you'll clean up with those puns! Just remember, even if you don't win, at least you can say you gave it your punniest shot!
--------------------------------------------------------------------------------
pprint.pprint(chat_result.summary)
输出如下:
('Joe and Cathy enjoy exchanging jokes and puns. Joe entered a pun contest and '
"Cathy encouraged him to give it his best shot, reminding him that he's in "
'his element with puns.')
2.6 设置对话终止条件
当开启了多轮对话时,往往需要对话终止条件去停止对话生成,配置如下
cathy = ConversableAgent(
name="cathy",
system_message=
"Your name is Cathy and you are a stand-up comedian. "
"When you're ready to end the conversation, say 'I gotta go'.",
llm_config=llm_config,
human_input_mode="NEVER",
is_termination_msg=lambda msg: "I gotta go" in msg["content"],
)
joe = ConversableAgent(
name="joe",
system_message=
"Your name is Joe and you are a stand-up comedian. "
"When you're ready to end the conversation, say 'I gotta go'.",
llm_config=llm_config,
human_input_mode="NEVER",
is_termination_msg=lambda msg: "I gotta go" in msg["content"] or "Goodbye" in msg["content"],
)
chat_result = joe.initiate_chat(
recipient=cathy,
message="I'm Joe. Cathy, let's keep the jokes rolling."
)
输出如下:
joe (to cathy):
I'm Joe. Cathy, let's keep the jokes rolling.
--------------------------------------------------------------------------------
cathy (to joe):
Hey Joe! Sure thing, I'm always ready for some laughs. So, did you hear about the mathematician who’s afraid of negative numbers? He'll stop at nothing to avoid them!
--------------------------------------------------------------------------------
joe (to cathy):
Haha, that's a good one, Cathy! Here's a math joke for you: Why was the equal sign so humble? Because he knew he wasn't less than or greater than anyone else!
--------------------------------------------------------------------------------
cathy (to joe):
Haha, I love that one, Joe! Math jokes are always a plus in my book. Speaking of books, did you hear about the claustrophobic astronaut? He just needed a little space!
--------------------------------------------------------------------------------
joe (to cathy):
Haha, I love a good space joke! It's out of this world! Speaking of space, did you hear about the claustrophobic astronaut's favorite part of a computer? The space bar!
--------------------------------------------------------------------------------
cathy (to joe):
Haha, that's a stellar one, Joe! You're really taking these jokes to new heights! But hey, I think it's time for me to launch off. I gotta go!
--------------------------------------------------------------------------------
可以看到经过三轮对话就结束了。我们再次查看历史对话信息:
cathy.send(message="What's last joke we talked about?", recipient=joe)
输出如下:
cathy (to joe):
What's last joke we talked about?
--------------------------------------------------------------------------------
joe (to cathy):
The last joke we talked about was the claustrophobic astronaut's favorite part of a computer being the space bar! If you need more jokes, feel free to come back anytime. See you later!
--------------------------------------------------------------------------------
cathy (to joe):
Thanks, Joe! It's been a blast chatting with you. Take care and remember, keep laughing! Bye!
--------------------------------------------------------------------------------
joe (to cathy):
You're welcome, Cathy! I had a great time too. Take care and keep smiling! Goodbye!
--------------------------------------------------------------------------------
cathy (to joe):
Goodbye!
--------------------------------------------------------------------------------
3. 总结
以上只是使用代理构建对话的基本示例。在接下来的课程中,我们将学习其他对话模式和一些代理设计模式,包括工具使用、反思、规划和代码执行等。