AI Agents for Beginners笔记: 2.探索Agent框架

AI Agents for Beginners笔记: 2.探索Agent框架

📅 2025-02-17 | 🖱️166
🔖 agent, 🔖 aigc

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生态系统的集成

主要差异:

特性/模型LangraphAutogenSemantic KernelAzure AI Agent Service
工作流程序模型DAG 模型 (有向无环图),节点代表处理步骤,边表示数据流向Actor 模型,每个 Agent 是独立的计算单元插件模型,通过语义函数组合实现功能微服务模型,强调服务间的协调
状态管理显式的状态追踪,每个节点的状态都可观察基于消息传递的状态管理,状态分布在各个 Agent 中通过记忆系统管理状态基于 Thread 和消息的状态管理
可观察性内置强大的可观察性支持,包括状态追踪、错误处理和调试通过消息日志实现可观察性主要依赖系统日志提供企业级监控和日志功能

适用场景:

工具名称适用场景
Langraph需要清晰工作流程的LLM应用;重视可观察性和调试能力的项目;数据处理管道开发
Autogen需要复杂Agent协作的应用;自动化代码生成和数据分析;并行处理任务
Semantic Kernel注重自然语言理解的应用;需要强大语义处理能力的项目;内容生成和知识处理
Azure AI Agent Service企业级应用部署;需要强安全性的项目;与Azure生态系统深度集成的应用

参考 #

© 2025 青蛙小白 | 总访问量 1,278,502 | 总访客数 601,630