AutoGen框架进行多智能体协作—AI Agentic Design Patterns with AutoGen(一)
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 ConversableAgentagent = 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 pprintpprint.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. 总结
以上只是使用代理构建对话的基本示例。在接下来的课程中,我们将学习其他对话模式和一些代理设计模式,包括工具使用、反思、规划和代码执行等。