AI Agents for Beginners笔记: 2.探索Agent框架
📅 2025-02-17 | 🖱️166
AI Agent 框架是专为简化 AI Agent 的创建、部署和管理而设计的软件平台。这些框架为开发者提供了预构建的组件、抽象和工具,从而简化了复杂 AI 系统的开发流程。
通过为 AI Agent 开发中的常见挑战提供标准化的方法,这些框架帮助开发者专注于应用的独特部分。它们提升了构建 AI 系统的可扩展性、可访问性和效率。
1. 什么是AI Agent框架?它能让开发者做什么? #
传统的AI框架可以帮助将AI集成到应用中,并通过以下方式使这些应用程序变得更好:
- 个性化(Personalization):AI 可以分析用户行为和偏好,提供个性化的推荐、内容和体验。 示例:流媒体服务(如 Netflix)利用AI根据观看历史推荐电影和节目,从而提升用户参与度和满意度。
- 自动化和效率(Automation and Efficiency):AI能够自动化重复性任务、优化工作流程并提高运营效率。 示例:客户服务应用利用AI驱动的聊天机器人处理常见查询,从而减少响应时间,并将人类员工解放出来处理更复杂的问题。
- 增强用户体验(Enhanced User Experience):AI可以通过语音识别、自然语言处理和预测性文本等智能功能提升整体用户体验。 示例:虚拟助手(如Siri 和 Google Assistant)利用AI理解并响应语音命令,使用户更容易与设备互动。
那么为什么还需要AI Agent框架?
AI Agent框架不仅仅是AI框架。它们旨在支持创建能够与用户、其他Agent和环境交互以实现特定目标的智能Agent。这些Agent可以表现出自主行为、做出决策并适应变化的条件。以下是AI Agent框架所支持的一些关键功能:
- Agent协作与协调(Agent Collaboration and Coordination):支持创建多个AI Agent,能够协作、沟通并协调以解决复杂任务。
- 任务自动化与管理(Task Automation and Management):提供自动化多步骤工作流、任务分配和动态任务管理的机制。
- 上下文理解与适应(Contextual Understanding and Adaptation):使Agent具备理解上下文、适应变化的环境并基于实时信息做出决策的能力。
总的来说,Agent框架让开发者可以做得更多,提升自动化水平,创建能够从环境中学习和适应的更智能的系统。
2.如何快速原型设计、迭代并提升 Agent 的能力? #
这是一个快速发展的领域,但大多数 AI Agent框架都具备一些共性,可以帮助快速原型设计和迭代,主要包括模块化组件、协作工具和实时学习。让我们深入探讨这些内容:
- 使用模块化组件(Use Modular Components):AI 框架提供预构建的组件,例如提示(Prompts)、解析器(Parsers)和记忆管理(Memory Management)。
- 利用协作工具(Leverage Collaborative Tools):为Agent设计特定的角色(Roles)和任务(Tasks),测试并优化协作工作流。
- 实时学习(Learn in Real-Time):实现反馈循环(Feedback Loops),使Agent从交互中学习并动态调整行为。
2.1 使用模块化组件(Use Modular Components) #
像LangChain和Microsoft Semantic Kernel这样的框架提供了预构建的组件,例如提示(Prompts)、解析器(Parsers)和记忆管理(Memory Management)。
团队如何使用这些组件:团队可以快速组装这些组件,创建一个功能性原型,而无需从头开始,从而实现快速实验和迭代。
实际工作原理:可以使用预构建的解析器从用户输入中提取信息、使用记忆模块存储和检索数据,并使用提示生成器与用户交互,而无需从头构建这些组件。
示例代码:以下是一个使用预构建解析器从用户输入中提取信息的示例:
1from langchain import Parser
2
3parser = Parser()
4user_input = "Book a flight from New York to London on July 15th"
5
6parsed_data = parser.parse(user_input)
7
8print(parsed_data)
9# Output: {'origin': 'New York', 'destination': 'London', 'date': 'July 15th'}
从这个示例中可以看出,可以利用预构建的解析器从用户输入中提取关键信息,例如航班预订请求的出发地、目的地和日期。这种模块化方法使我们可以专注于高层逻辑。
📝 注意上面的代码不能直接运行
langchain
包中没有一个叫做Parser
的类,这是一个虚构的不完整的示例。
2.2 利用协作工具(Leverage Collaborative Tools) #
像CrewAI和 Microsoft Autogen这样的框架可以帮助创建能够协作的多个 Agent。
团队如何使用这些工具:团队可以为 Agent 设计特定的角色和任务,从而测试和优化协作工作流,提高整体系统效率。
实际工作原理:你可以创建一个 Agent 团队,其中每个 Agent 都有特定的功能,例如数据检索、分析或决策。这些 Agent 可以通过通信和信息共享来实现共同目标,例如回答用户查询或完成任务。
示例代码(Autogen):
1# creating agents, then create a round robin schedule where they can work together, in this case in order
2
3# Data Retrieval Agent
4# Data Analysis Agent
5# Decision Making Agent
6
7agent_retrieve = AssistantAgent(
8 name="dataretrieval",
9 model_client=model_client,
10 tools=[retrieve_tool],
11 system_message="Use tools to solve tasks."
12)
13
14agent_analyze = AssistantAgent(
15 name="dataanalysis",
16 model_client=model_client,
17 tools=[analyze_tool],
18 system_message="Use tools to solve tasks."
19)
20
21# conversation ends when user says "APPROVE"
22termination = TextMentionTermination("APPROVE")
23
24user_proxy = UserProxyAgent("user_proxy", input_func=input)
25
26team = RoundRobinGroupChat([agent_retrieve, agent_analyze, user_proxy], termination_condition=termination)
27
28stream = team.run_stream(task="Analyze data", max_turns=10)
29# Use asyncio.run(...) when running in a script.
30await Console(stream)
上述代码展示了如何创建一个任务,该任务涉及多个 Agent 协作分析数据。每个 Agent 执行特定功能,通过协调这些 Agent 来实现预期结果。通过为每个 Agent 分配专门的角色,可以提升任务效率和性能。
2.3 实时学习(Learn in Real-Time) #
高级框架提供了实时上下文理解和适应的能力。
团队如何使用这些能力:团队可以实现反馈循环,使Agent从交互中学习并动态调整行为,从而不断改进和优化功能。
实际工作原理:Agent可以分析用户反馈、环境数据和任务结果,更新知识库、调整决策算法并随着时间的推移提升性能。这种迭代学习过程使Agent能够适应变化的条件和用户偏好,从而增强整体系统的有效性。
3. Autogen、Semantic Kernel和Azure AI Agent Service框架之间的差异 #
从设计、功能和目标使用场景的角度来分析它们的主要区别:
3.1 Autogen #
由 Microsoft Research 的 AI Frontiers Lab 开发的开源框架,专注于事件驱动的分布式 agentic 应用,支持多个LLM和SLM、工具以及高级多Agent设计模式。
Autogen 的核心理念是基于Agent,这些Agent是可以感知环境、做出决策并采取行动以实现特定目标的自主实体。Agent通过异步消息进行通信,使它们能够独立并行工作,从而增强系统的可扩展性和响应性。
Agent基于Actor模型。根据Wikipedia的定义,Actor是并发计算的基本构建块。Actor在接收到消息时,可以:做出本地决策、创建更多Actor、发送更多消息以及决定如何响应接收到的下一条消息。
使用场景:自动化代码生成、数据分析任务,以及为规划和研究功能构建自定义Agent。
3.1.1 Agent #
Agent:Agent是一个软件实体,能够:
- 通过消息通信,这些消息可以是同步的或异步的。
- 维护自己的状态,状态可以通过接收到的消息进行修改。
- 执行操作,这些操作可能会修改Agent的状态并产生外部效果,例如更新消息日志、发送新消息、执行代码或进行API调用。
以下是一个创建具有聊天功能的 Agent 的简短代码片段:
1!pip install -U "autogen-agentchat" "autogen-ext[openai]"
2!pip install python-dotenv
1import dotenv
2dotenv.load_dotenv()
1from dataclasses import dataclass
2from typing import Optional
3
4
5@dataclass
6class MyMessageType:
7 content: str
8 metadata: Optional[dict] = None
9
10 def __post_init__(self):
11 if self.metadata is None:
12 self.metadata = {}
1from autogen_agentchat.agents import AssistantAgent
2from autogen_agentchat.messages import TextMessage
3from autogen_ext.models.openai import OpenAIChatCompletionClient
4from autogen_core import RoutedAgent, message_handler, MessageContext
5
6
7class MyAssistant(RoutedAgent):
8 def __init__(self, name: str) -> None:
9 super().__init__(name)
10 model_client = OpenAIChatCompletionClient(model="gpt-4o")
11 self._delegate = AssistantAgent(name, model_client=model_client)
12
13 @message_handler
14 async def handle_my_message_type(self, message: MyMessageType, ctx: MessageContext) -> None:
15 print(f"{self.id.type} received message: {message.content}")
16 response = await self._delegate.on_messages(
17 [TextMessage(content=message.content, source="user")], ctx.cancellation_token
18 )
19 print(f"{self.id.type} responded: {response.chat_message.content}")
在上述代码中,已创建了MyAssistant
并继承自RoutedAgent
。它有一个消息处理程序,用于打印消息内容,然后使用AssistantAgent
发送响应。特别注意我们如何将AssistantAgent
的实例分配给self._delegate
,这是一个可以处理chat completions的预构建Agent。
接下来,让我们让AutoGen知道这种Agent类型并启动程序:
1from autogen_core import AgentId, SingleThreadedAgentRuntime
2import asyncio
3
4async def main():
5 runtime = SingleThreadedAgentRuntime()
6 await MyAssistant.register(runtime, "my_assistant", lambda: MyAssistant("my_assistant"))
7 runtime.start() # Start processing messages in the background.
8 await runtime.send_message(
9 MyMessageType("Hello, World!"),
10 AgentId("my_assistant", "default")
11 )
12
13asyncio.run(main())
在上述代码中,Agent被注册到运行时,并向Agent发送了一条消息,产生如下输出:
1my_assistant received message: Hello, World!
2my_assistant responded: Hello! How can I assist you today?
3.1.2 多Agent支持 #
Autogen支持创建多个Agent,它们可以协作以更高效地解决复杂任务。通过定义具有专门功能和角色的不同类型的Agent,例如数据检索、分析、决策和用户交互,可以创建一个多Agent系统。以下是一个这样的例子:
📝 注意原教程中的这个示例代码中使用了GroupChatManager,它被注册到运行时。此管理器负责协调不同类型Agent。这个从autogen v0.4已经没有了。因此这里不再展示这个例子。
关于autogen新版对多Agent的支持,可以参考AutoGen的文档"Teams"
3.1.3 Agent的运行时 #
框架提供了一个运行时环境,用于支持 Agent 之间的通信、管理其身份和生命周期,并执行安全和隐私边界。这意味着可以在一个安全且受控的环境中运行Agent,确保它们能够安全高效地交互。以下是两种运行时的介绍:
- 单机运行时(Standalone runtime): 适用于单进程应用,其中所有 Agent 都用同一种编程语言实现并运行在同一进程中。以下是其工作原理的示意图:
- 分布式Agent运行时(Distributed agent runtime): 用于多进程应用,其中Agent可以用不同的编程语言实现并运行在不同的机器上。以下是其工作原理的示意图:
3.2 Semantic Kernel + Agent Framework #
Semantic Kernel包含两部分:Semantic Kernel Agent Framework和Semantic Kernel本身。
先谈谈Semantic Kernel的核心概念:
- 连接(Connections):与外部AI服务和数据源的接口。
1using Microsoft.SemanticKernel;
2
3// Create kernel
4var builder = Kernel.CreateBuilder();
5
6// Add a chat completion service:
7builder.Services.AddAzureOpenAIChatCompletion(
8 "your-resource-name",
9 "your-endpoint",
10 "your-resource-key",
11 "deployment-model");
12var kernel = builder.Build();
这里是一个简单的示例,展示了如何创建一个 Kernel 并添加一个聊天完成服务。Semantic Kernel 创建了一个与外部 AI 服务(此处为 Azure OpenAI Chat Completion)的连接。
- 插件(Plugins):插件:封装了应用程序可以使用的功能。既有现成的插件,也可以创建自定义插件。这里还有一个“语义函数”的概念。之所以称为语义函数,是因为你提供了语义信息,帮助Semantic Kernel决定需要调用该函数。以下是一个示例:
1var userInput = Console.ReadLine();
2
3// Define semantic function inline.
4string skPrompt = @"Summarize the provided unstructured text in a sentence that is easy to understand.
5 Text to summarize: {{$userInput}}";
6
7// Register the function
8kernel.CreateSemanticFunction(
9 promptTemplate: skPrompt,
10 functionName: "SummarizeText",
11 pluginName: "SemanticFunctions"
12);
在此示例中,首先有一个模板提示词 skPrompt
,其中留有用户输入文本的位置 $userInput
。然后通过 SemanticFunctions
插件注册函数 SummarizeText
。注意函数的名称能帮助Semantic Kernel 理解这个函数的功能以及应该在什么时候调用它。
- 本地函数(Native Function): 框架还可以直接调用本地函数来执行任务。以下是一个检索文件内容的本地函数示例:
1public class NativeFunctions {
2
3 [SKFunction, Description("Retrieve content from local file")]
4 public async Task<string> RetrieveLocalFile(string fileName, int maxSize = 5000)
5 {
6 string content = await File.ReadAllTextAsync(fileName);
7 if (content.Length <= maxSize) return content;
8 return content.Substring(0, maxSize);
9 }
10}
11
12//Import native function
13string plugInName = "NativeFunction";
14string functionName = "RetrieveLocalFile";
15
16var nativeFunctions = new NativeFunctions();
17kernel.ImportFunctions(nativeFunctions, plugInName);
- 规划器(planer):规划器根据用户输入协调执行计划和策略。规划器的作用是表达任务的执行方式,然后作为 Semantic Kernel 的执行指令。它随后调用必要的函数来完成任务。以下是一个计划示例:
1string planDefinition = "Read content from a local file and summarize the content.";
2SequentialPlanner sequentialPlanner = new SequentialPlanner(kernel);
3
4string assetsFolder = @"../../assets";
5string fileName = Path.Combine(assetsFolder,"docs","06_SemanticKernel", "aci_documentation.txt");
6
7ContextVariables contextVariables = new ContextVariables();
8contextVariables.Add("fileName", fileName);
9
10var customPlan = await sequentialPlanner.CreatePlanAsync(planDefinition);
11
12// Execute the plan
13KernelResult kernelResult = await kernel.RunAsync(contextVariables, customPlan);
14Console.WriteLine($"Summarization: {kernelResult.GetValue<string>()}");
特别注意 planDefinition
,这是一个供规划器遵循的简单指令。然后根据这个计划调用相应的函数,在这个例子中是我们的语义函数 SummarizeText
和原生函数 RetrieveLocalFile
。
- 记忆(Memory):抽象并简化AI应用的上下文管理。记忆的概念是LLM应该了解的信息。你可以将这些信息存储在向量存储中,最终可以是内存数据库、向量数据库或其他类似数据库。以下是一个非常简化的场景示例,其中将事实添加到记忆中:
1 var facts = new Dictionary<string,string>();
2 facts.Add(
3 "Azure Machine Learning; https://learn.microsoft.com/azure/machine-learning/",
4 @"Azure Machine Learning is a cloud service for accelerating and
5 managing the machine learning project lifecycle. Machine learning professionals,
6 data scientists, and engineers can use it in their day-to-day workflows"
7 );
8
9 facts.Add(
10 "Azure SQL Service; https://learn.microsoft.com/azure/azure-sql/",
11 @"Azure SQL is a family of managed, secure, and intelligent products
12 that use the SQL Server database engine in the Azure cloud."
13 );
14
15 string memoryCollectionName = "SummarizedAzureDocs";
16
17 foreach (var fact in facts) {
18 await memoryBuilder.SaveReferenceAsync(
19 collection: memoryCollectionName,
20 description: fact.Key.Split(";")[1].Trim(),
21 text: fact.Value,
22 externalId: fact.Key.Split(";")[2].Trim(),
23 externalSourceName: "Azure Documentation"
24 );
25 }
这些事实随后存储在内存集合SummarizedAzureDocs中。这是一个非常简化的示例,但可以看到如何将信息存储到内存中供LLM使用。
这就是Semantic Kernel 框架的基础知识,那么它的Agent Framework是什么?
3.3 Azure AI Agent Service #
Azure AI Agent Service是一个较新的补充,于Microsoft Ignite 2024上推出。它支持开发和部署更灵活的AI Agent,例如直接调用开源LLM(如 Llama 3、Mistral 和 Cohere)。
Azure AI Agent Service提供更强的企业安全机制和数据存储方法,非常适合企业应用。
它可以与Autogen和Semantic Kernel等多Agent协作框架无缝协作。
该服务目前处于公测阶段,支持用Python和C#构建Agent。
3.3.1 核心概念 #
- Agent:Azure AI Agent Service与Azure AI Foundry集成。在AI Foundry 中,AI Agent充当“智能”微服务,可以用于回答问题(RAG)、执行操作或完全自动化工作流。它通过结合生成式AI模型的能力与访问和交互真实数据源的工具实现这些目标。以下是一个 Agent 示例:
1agent = project_client.agents.create_agent(
2 model="gpt-4o-mini",
3 name="my-agent",
4 instructions="You are helpful agent",
5 tools=code_interpreter.definitions,
6 tool_resources=code_interpreter.resources,
7)
在这个例子中,创建了一个agent,使用了 gpt-4o-mini
模型,名称为 my-agent
,并设定了指令 You are helpful agent
。这个agent配备了用于执行代码解释任务的工具和资源。
- Thread和messages: Thread 是另一个重要的概念。它代表Agent与用户之间的对话或交互。Thread 可以用来追踪对话过程、存储上下文信息,以及管理交互状态。以下是一个Thread的示例:
1thread = project_client.agents.create_thread()
2message = project_client.agents.create_message(
3 thread_id=thread.id,
4 role="user",
5 content="Could you please create a bar chart for the operating profit using the following data and provide the file to me? Company A: $1.2 million, Company B: $2.5 million, Company C: $3.0 million, Company D: $1.8 million",
6)
7
8# Ask the agent to perform work on the thread
9run = project_client.agents.create_and_process_run(thread_id=thread.id, agent_id=agent.id)
10
11# Fetch and log all messages to see the agent's response
12messages = project_client.agents.list_messages(thread_id=thread.id)
13print(f"Messages: {messages}")
在前面的代码中,创建了一个Thread。之后,向这个Thread发送了一条 message。通过调用create_and_process_run
,要求Agent对这个Thread 执行工作。最后,获取并记录messages以查看Agent的响应。这些messages表明了用户和Agent之间对话的进展。同时理解这一点也很重要:messages可以是不同类型的,比如文本、图片或文件,也就是说Agent的工作可能会产生图片或文本响应等结果。作为开发者,可以使用这些信息来进一步处理响应或将其呈现给用户。
- 与其他AI框架集成:Azure AI Agent Service可以与其他框架(如 Autogen 和 Semantic Kernel)交互,这意味着可以在这些框架之一中构建应用的一部分,并例如将Agent Service 用作协调器,或者完全使用Agent Service构建应用。
3.4 这些框架之间的区别 #
虽然这些框架之间似乎有很多重叠,但在设计、功能和目标使用场景方面,它们仍然有一些关键区别:
- Autogen: 专注于事件驱动的分布式Agentic应用,支持多个LLM 和SLM、工具以及高级多Agent设计模式。
- Semantic Kernel:专注于通过捕捉更深层的语义含义来理解和生成类人文本内容。它旨在自动化复杂的工作流程,并基于项目目标来启动任务。
- Azure AI Agent Service:提供更灵活的模型,例如直接调用开源LLM,如 Llama 3、Mistral和Cohere。它提供更强大的企业级安全机制和数据存储方法,使其适用于企业应用。
仍然不确定该选择哪个?
3.4.1 使用场景 #
让我们通过一些常见的使用场景来帮助你选择:
问:我的团队正在开发一个项目,涉及自动化代码生成和数据分析任务。我们应该选择哪个框架?
答:Autogen 是一个不错的选择,因为它专注于事件驱动的分布式 Agentic 应用,并支持高级多 Agent 设计模式。
问:在这个使用场景中,Autogen 比 Semantic Kernel 和 Azure AI Agent Service 更好的原因是什么?
答:Autogen 专为事件驱动的分布式 Agentic 应用设计,非常适合自动化代码生成和数据分析任务。它提供了必要的工具和功能,可以高效地构建复杂的多 Agent 系统。
问:听起来 Azure AI Agent Service 也适合这个场景,它也有代码生成工具,对吗?
答:是的,Azure AI Agent Service 也支持代码生成和数据分析任务,但它可能更适合需要安全、可扩展且灵活的 AI Agent 部署的企业应用。Autogen 更专注于事件驱动的分布式 Agentic 应用和高级多 Agent 设计模式。
问:所以你的意思是,如果我想要企业级的解决方案,我应该选择 Azure AI Agent Service?
答:是的,Azure AI Agent Service 专为需要安全、可扩展且灵活的 AI Agent 部署的企业应用设计。它提供更强的企业安全机制和数据存储方法,非常适合企业使用场景。
框架 | 重点 | 核心概念 | 使用场景 |
---|---|---|---|
Autogen | 事件驱动的分布式 Agentic 应用 | Agent、角色、功能、数据 | 代码生成、数据分析任务 |
Semantic Kernel | 理解和生成类人文本内容 | Agent、模块化组件、协作 | 自然语言理解、内容生成 |
Azure AI Agent Service | 灵活的模型、企业安全、工具调用 | 模块化、协作、流程协调 | 安全、可扩展且灵活的AI Agent部署 |
另外Azure AI Agent Service可以直接集成现有的 Azure 生态系统工具,例如Bing、Azure AI Search 和 Azure Functions等。此外,它还与 Azure AI Foundry 有深度集成。
对于Autogen和Semantic Kernel,也可以与Azure服务集成,但可能需要从代码中调用Azure服务。另一种集成方式是使用Azure SDK,通过Agent与Azure 服务交互。此外,如前所述,可以使用Azure AI Agent Service作为在Autogen 或Semantic Kernel中构建的Agent的协调器,这将可以轻松访问Azure生态系统。
📝 LanngGraph对比
Langraph与其他Agent框架的比较
- 设计理念与核心特点:
- Langraph
- 基于有向无环图(DAG)的工作流编排框架
- 专注于可观察性和流程编排
- 将LLM应用视为数据流图
- 强调状态追踪和错误处理
- Autogen
- 基于Actor模型的事件驱动框架
- 专注于Agent间的异步通信和协作
- 将应用视为多个自主Agent的集合
- 强调Agent的自主性和并行处理
- Semantic Kernel
- 基于语义函数和插件的模块化框架
- 专注于语义理解和知识整合
- 将应用视为语义函数的组合
- 强调自然语言理解和内容生成
- Azure AI Agent Service
- 基于云服务的企业级框架
- 专注于安全性和可扩展性
- 将应用视为微服务
- 强调与Azure生态系统的集成
主要差异:
特性/模型 Langraph Autogen Semantic Kernel Azure AI Agent Service 工作流程序模型 DAG 模型 (有向无环图),节点代表处理步骤,边表示数据流向 Actor 模型,每个 Agent 是独立的计算单元 插件模型,通过语义函数组合实现功能 微服务模型,强调服务间的协调 状态管理 显式的状态追踪,每个节点的状态都可观察 基于消息传递的状态管理,状态分布在各个 Agent 中 通过记忆系统管理状态 基于 Thread 和消息的状态管理 可观察性 内置强大的可观察性支持,包括状态追踪、错误处理和调试 通过消息日志实现可观察性 主要依赖系统日志 提供企业级监控和日志功能 适用场景:
工具名称 适用场景 Langraph 需要清晰工作流程的LLM应用;重视可观察性和调试能力的项目;数据处理管道开发 Autogen 需要复杂Agent协作的应用;自动化代码生成和数据分析;并行处理任务 Semantic Kernel 注重自然语言理解的应用;需要强大语义处理能力的项目;内容生成和知识处理 Azure AI Agent Service 企业级应用部署;需要强安全性的项目;与Azure生态系统深度集成的应用