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)。
团队如何使用这些组件:团队可以快速组装这些组件,创建一个功能性原型,而无需从头开始,从而实现快速实验和迭代。
实际工作原理:可以使用预构建的解析器从用户输入中提取信息、使用记忆模块存储和检索数据,并使用提示生成器与用户交互,而无需从头构建这些组件。
示例代码:以下是一个使用预构建解析器从用户输入中提取信息的示例:
from langchain import Parser
parser = Parser()
user_input = "Book a flight from New York to London on July 15th"
parsed_data = parser.parse(user_input)
print(parsed_data)
# 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):
# creating agents, then create a round robin schedule where they can work together, in this case in order
# Data Retrieval Agent
# Data Analysis Agent
# Decision Making Agent
agent_retrieve = AssistantAgent(
name="dataretrieval",
model_client=model_client,
tools=[retrieve_tool],
system_message="Use tools to solve tasks."
)
agent_analyze = AssistantAgent(
name="dataanalysis",
model_client=model_client,
tools=[analyze_tool],
system_message="Use tools to solve tasks."
)
# conversation ends when user says "APPROVE"
termination = TextMentionTermination("APPROVE")
user_proxy = UserProxyAgent("user_proxy", input_func=input)
team = RoundRobinGroupChat([agent_retrieve, agent_analyze, user_proxy], termination_condition=termination)
stream = team.run_stream(task="Analyze data", max_turns=10)
# Use asyncio.run(...) when running in a script.
await 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 的简短代码片段:
!pip install -U "autogen-agentchat" "autogen-ext[openai]"
!pip install python-dotenvimport dotenv
dotenv.load_dotenv()from dataclasses import dataclass
from typing import Optional
@dataclass
class MyMessageType:
content: str
metadata: Optional[dict] = None
def __post_init__(self):
if self.metadata is None:
self.metadata = {}from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_core import RoutedAgent, message_handler, MessageContext
class MyAssistant(RoutedAgent):
def __init__(self, name: str) -> None:
super().__init__(name)
model_client = OpenAIChatCompletionClient(model="gpt-4o")
self._delegate = AssistantAgent(name, model_client=model_client)
@message_handler
async def handle_my_message_type(self, message: MyMessageType, ctx: MessageContext) -> None:
print(f"{self.id.type} received message: {message.content}")
response = await self._delegate.on_messages(
[TextMessage(content=message.content, source="user")], ctx.cancellation_token
)
print(f"{self.id.type} responded: {response.chat_message.content}")在上述代码中,已创建了MyAssistant并继承自RoutedAgent。它有一个消息处理程序,用于打印消息内容,然后使用AssistantAgent发送响应。特别注意我们如何将AssistantAgent的实例分配给self._delegate,这是一个可以处理chat completions的预构建Agent。
接下来,让我们让AutoGen知道这种Agent类型并启动程序:
from autogen_core import AgentId, SingleThreadedAgentRuntime
import asyncio
async def main():
runtime = SingleThreadedAgentRuntime()
await MyAssistant.register(runtime, "my_assistant", lambda: MyAssistant("my_assistant"))
runtime.start() # Start processing messages in the background.
await runtime.send_message(
MyMessageType("Hello, World!"),
AgentId("my_assistant", "default")
)
asyncio.run(main())在上述代码中,Agent被注册到运行时,并向Agent发送了一条消息,产生如下输出:
my_assistant received message: Hello, World!
my_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服务和数据源的接口。
using Microsoft.SemanticKernel;
// Create kernel
var builder = Kernel.CreateBuilder();
// Add a chat completion service:
builder.Services.AddAzureOpenAIChatCompletion(
"your-resource-name",
"your-endpoint",
"your-resource-key",
"deployment-model");
var kernel = builder.Build();这里是一个简单的示例,展示了如何创建一个 Kernel 并添加一个聊天完成服务。Semantic Kernel 创建了一个与外部 AI 服务(此处为 Azure OpenAI Chat Completion)的连接。
- 插件(Plugins):插件:封装了应用程序可以使用的功能。既有现成的插件,也可以创建自定义插件。这里还有一个“语义函数”的概念。之所以称为语义函数,是因为你提供了语义信息,帮助Semantic Kernel决定需要调用该函数。以下是一个示例:
var userInput = Console.ReadLine();
// Define semantic function inline.
string skPrompt = @"Summarize the provided unstructured text in a sentence that is easy to understand.
Text to summarize: {{$userInput}}";
// Register the function
kernel.CreateSemanticFunction(
promptTemplate: skPrompt,
functionName: "SummarizeText",
pluginName: "SemanticFunctions"
);在此示例中,首先有一个模板提示词 skPrompt,其中留有用户输入文本的位置 $userInput。然后通过 SemanticFunctions 插件注册函数 SummarizeText。注意函数的名称能帮助Semantic Kernel 理解这个函数的功能以及应该在什么时候调用它。
- 本地函数(Native Function): 框架还可以直接调用本地函数来执行任务。以下是一个检索文件内容的本地函数示例:
public class NativeFunctions {
[SKFunction, Description("Retrieve content from local file")]
public async Task<string> RetrieveLocalFile(string fileName, int maxSize = 5000)
{
string content = await File.ReadAllTextAsync(fileName);
if (content.Length <= maxSize) return content;
return content.Substring(0, maxSize);
}
}
//Import native function
string plugInName = "NativeFunction";
string functionName = "RetrieveLocalFile";
var nativeFunctions = new NativeFunctions();
kernel.ImportFunctions(nativeFunctions, plugInName);- 规划器(planer):规划器根据用户输入协调执行计划和策略。规划器的作用是表达任务的执行方式,然后作为 Semantic Kernel 的执行指令。它随后调用必要的函数来完成任务。以下是一个计划示例:
string planDefinition = "Read content from a local file and summarize the content.";
SequentialPlanner sequentialPlanner = new SequentialPlanner(kernel);
string assetsFolder = @"../../assets";
string fileName = Path.Combine(assetsFolder,"docs","06_SemanticKernel", "aci_documentation.txt");
ContextVariables contextVariables = new ContextVariables();
contextVariables.Add("fileName", fileName);
var customPlan = await sequentialPlanner.CreatePlanAsync(planDefinition);
// Execute the plan
KernelResult kernelResult = await kernel.RunAsync(contextVariables, customPlan);
Console.WriteLine($"Summarization: {kernelResult.GetValue<string>()}");特别注意 planDefinition,这是一个供规划器遵循的简单指令。然后根据这个计划调用相应的函数,在这个例子中是我们的语义函数 SummarizeText 和原生函数 RetrieveLocalFile。
- 记忆(Memory):抽象并简化AI应用的上下文管理。记忆的概念是LLM应该了解的信息。你可以将这些信息存储在向量存储中,最终可以是内存数据库、向量数据库或其他类似数据库。以下是一个非常简化的场景示例,其中将事实添加到记忆中:
var facts = new Dictionary<string,string>();
facts.Add(
"Azure Machine Learning; https://learn.microsoft.com/azure/machine-learning/",
@"Azure Machine Learning is a cloud service for accelerating and
managing the machine learning project lifecycle. Machine learning professionals,
data scientists, and engineers can use it in their day-to-day workflows"
);
facts.Add(
"Azure SQL Service; https://learn.microsoft.com/azure/azure-sql/",
@"Azure SQL is a family of managed, secure, and intelligent products
that use the SQL Server database engine in the Azure cloud."
);
string memoryCollectionName = "SummarizedAzureDocs";
foreach (var fact in facts) {
await memoryBuilder.SaveReferenceAsync(
collection: memoryCollectionName,
description: fact.Key.Split(";")[1].Trim(),
text: fact.Value,
externalId: fact.Key.Split(";")[2].Trim(),
externalSourceName: "Azure Documentation"
);
}这些事实随后存储在内存集合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 示例:
agent = project_client.agents.create_agent(
model="gpt-4o-mini",
name="my-agent",
instructions="You are helpful agent",
tools=code_interpreter.definitions,
tool_resources=code_interpreter.resources,
)在这个例子中,创建了一个agent,使用了 gpt-4o-mini 模型,名称为 my-agent,并设定了指令 You are helpful agent。这个agent配备了用于执行代码解释任务的工具和资源。
- Thread和messages: Thread 是另一个重要的概念。它代表Agent与用户之间的对话或交互。Thread 可以用来追踪对话过程、存储上下文信息,以及管理交互状态。以下是一个Thread的示例:
thread = project_client.agents.create_thread()
message = project_client.agents.create_message(
thread_id=thread.id,
role="user",
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",
)
# Ask the agent to perform work on the thread
run = project_client.agents.create_and_process_run(thread_id=thread.id, agent_id=agent.id)
# Fetch and log all messages to see the agent's response
messages = project_client.agents.list_messages(thread_id=thread.id)
print(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
主要差异:
| 特性/模型 | Langraph | Autogen | Semantic Kernel | Azure AI Agent Service |
|---|---|---|---|---|
| 工作流程序模型 | DAG 模型 (有向无环图),节点代表处理步骤,边表示数据流向 | Actor 模型,每个 Agent 是独立的计算单元 | 插件模型,通过语义函数组合实现功能 | 微服务模型,强调服务间的协调 |
| 状态管理 | 显式的状态追踪,每个节点的状态都可观察 | 基于消息传递的状态管理,状态分布在各个 Agent 中 | 通过记忆系统管理状态 | 基于 Thread 和消息的状态管理 |
| 可观察性 | 内置强大的可观察性支持,包括状态追踪、错误处理和调试 | 通过消息日志实现可观察性 | 主要依赖系统日志 | 提供企业级监控和日志功能 |
适用场景:
| 工具名称 | 适用场景 |
|---|---|
| Langraph | 需要清晰工作流程的LLM应用;重视可观察性和调试能力的项目;数据处理管道开发 |
| Autogen | 需要复杂Agent协作的应用;自动化代码生成和数据分析;并行处理任务 |
| Semantic Kernel | 注重自然语言理解的应用;需要强大语义处理能力的项目;内容生成和知识处理 |
| Azure AI Agent Service | 企业级应用部署;需要强安全性的项目;与Azure生态系统深度集成的应用 |