构建智能系统:使用autogen在azure Functions上部署多代理ai应用的完整指南
Image Source: unspalsh.com
本教程的配套代码是: 这里
无服务器计算和先进的人工智能应用程序,结合强大的框架与云原生解决方案,是构建可扩展智能系统的关键。在这篇文章中,我们将探讨如何在 Azure Function App 上运行 Autogen 0.4 多代理应用程序。
在这篇文章中,我们将涵盖:
- 对 Autogen 和多代理架构的介绍
- 为什么 Azure Functions 是此类应用程序的优秀平台
- 示例代码的详细讲解
- 各个组件(如 Bing 搜索工具和 Azure OpenAI 客户端)如何协同工作
- 在 Azure Functions 上的部署说明
- 使用案例
1. 理解 Autogen 和多智能体架构
什么是 Autogen?
Autogen 是一个旨在利用 AI 驱动的聊天代理促进多智能体交互的框架。它提供了创建能够执行任务、相互协调和利用外部工具的代理的构建模块。这种模块化的方法意味着您可以开发复杂的工作流程,其中不同的代理贡献专业功能。例如,一个代理可能处理信息检索(例如网页搜索),而另一个则专注于综合结果并生成连贯的答案。
多智能体概念
多智能体系统由多个自主智能体组成,这些智能体相互作用以协作解决问题。在我们的例子中,系统包含两个智能体:
- Bing搜索智能体: 使用工具功能执行网络搜索并检索相关信息。
- 报告智能体: 分析搜索结果,并根据收集的数据生成最终的连贯输出。
智能体通过遵循轮询顺序的群聊系统进行通信。该设计确保每个智能体都有机会为整体任务做出贡献,从而产生平衡且全面的最终输出。
为什么选择多智能体架构?
多智能体架构提供了几个优势:
- 专业化: 每个智能体可以被设计为在特定任务中表现出色。
- 可扩展性: 随着系统复杂性的增加,可以添加新的智能体和工具。
- 弹性: 即使一个组件出现问题,系统仍然可以继续运行。
- 增强的创造力: 协作智能体的互动通常会产生更强大和更细致的输出。
有关多智能体系统的更详细见解,我建议您参考我之前在博客文章中关于Autogen框架的讨论。
2. 为什么使用 Azure Functions 来构建自动生成应用程序?
无服务器的优势
Azure Functions 是一种无服务器计算服务,允许您运行事件驱动的代码而无需管理基础设施。这个模型对于 AI 应用程序特别具有吸引力,因为:
- 可扩展性: Azure Functions 会根据负载自动扩展。这意味着您的多代理系统可以在没有人工干预的情况下处理波动的工作负载。
- 成本效益: 您只需为您使用的计算资源付费。对于间歇性运行或需要处理高峰的应用程序,这可以带来显著的成本节省。
- 易于部署: Azure Functions 与其他 Azure 服务和外部 API 无缝集成,使得部署和监控您的应用程序变得简单。
关注的用例
想象一个场景,在这个场景中,用户通过 HTTP 请求发送查询。系统随后协调多个代理:
- 一个代理向 Bing 查询该主题的最新信息。
- 另一个代理将这些信息综合成最终的、可供人类阅读的报告。
这种由 Azure Functions 驱动的代理之间的实时协作展示了构建响应式、智能助手的潜力。
3. 深入代码分析
本节演示如何在 Azure Functions 上运行 Autogen 0.4 多代理应用。让我们一步一步来分析。
3.1. 设置 Azure Function 应用
在这篇文章中,本文指导您如何使用命令行工具创建一个响应 HTTP 请求的 Python 函数。在本地测试代码后,您将其部署到 Azure Functions 的无服务器环境中。
3.2. 导入 Autogen 模块
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core.tools import FunctionTool
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
在这里,我们从 Autogen 框架中导入关键组件:
- AssistantAgent: 代表一个能够执行任务的 AI 代理。
- RoundRobinGroupChat: 管理多代理通信,确保每个代理按公平的顺序参与。
- FunctionTool: 一个包装器,使我们能够将 Python 函数(例如我们的 Bing 搜索)作为可调用工具在代理生态系统中暴露。
- AzureOpenAIChatCompletionClient: 集成 Azure OpenAI 服务,为我们的代理提供先进的语言能力。
3.3. 实现 Bing 搜索功能
我们多智能体系统的核心组件是从网络中检索信息的能力。以下函数处理此任务:
def bing\_search(query: str, num\_results: int = 1, max\_chars: int = 500) -\> list:
api\_key = "<<your-bing-search-key-here\>\>"
endpoint = "https://api.bing.microsoft.com/v7.0/search"
if not api\_key:
raise ValueError("API key not found in environment variables")
headers = {"Ocp-Apim-Subscription-Key": api\_key}
params = {"q": query, "count": num\_results}
response = requests.get(endpoint, headers=headers, params\=params)
if response.status\_code != 200:
print(response.json())
raise Exception(f"Error in API request: {response.status\_code}")
results = response.json().get("webPages", {}).get("value", \[\])
def get\_page\_content(url: str) -\> str:
try:
response = requests.get(url, timeout=10)
soup = BeautifulSoup(response.content, "html.parser")
text = soup.get\_text(separator=" ", strip=True)
words = text.split()
content = ""
for word in words:
if len(content) + len(word) + 1 \> max\_chars:
break
content +\= " " + word
return content.strip()
except Exception as e:
print(f"Error fetching {url}: {str(e)}")
return ""
enriched\_results = \[\]
for item in results:
body = get\_page\_content(item\["url"\])
enriched\_results.append(
{"title": item\["name"\], "link": item\["url"\], "snippet": item\["snippet"\], "body": body}
)
time.sleep(1) \# Be respectful to the servers
return enriched\_results
该函数封装了将网络搜索集成到我们的多智能体生态系统所需的逻辑,使 Bing 搜索代理能够检索报告代理后续分析的上下文数据。
3.4. 设置 Azure OpenAI 聊天客户端
此实现的亮点之一是使用 Azure OpenAI 进行自然语言处理:
az_model_client = AzureOpenAIChatCompletionClient(
azure_deployment="gpt-4o",
model="gpt-4o",
api_version="2024-08-01-preview",
azure_endpoint="https://<<azure-open-ai-service-name>>.openai.azure.com/",
api_key="<<your-azure-openai-api-key-here>>"
)
此客户端成为我们代理处理自然语言、生成响应和与用户智能互动的基础。
3.5. 创建和配置代理
接下来,我们将我们的 Bing 搜索功能封装成一个代理可以调用的工具。然后,我们实例化两个代理:一个用于网页搜索,另一个用于生成报告。
3.6. 包装 Bing 搜索功能
bing_search_tool = FunctionTool( bing_search, description=“Search bing for information, returns results with a snippet and body content” )
通过使用 FunctionTool
包装 bing_search
函数,我们使 Bing 搜索代理能够在对话中根据需要调用它。描述帮助代理理解该工具的功能以及何时使用它。
3.7. 配置 Bing 搜索代理
bing_search_agent = AssistantAgent( name=“bing_Search_Agent”, model_client=az_model_client, tools=[bing_search_tool], description=“搜索 Bing 获取信息,返回前 1 个结果及其摘要和正文内容”, system_message=“您是一个有帮助的 AI 助手。使用您的工具解决任务。” )
3.8. 配置报告代理
report_agent = AssistantAgent( name=“Report_Agent”, model_client=az_model_client, description=“仅根据搜索结果生成输出”, system_message=“你是一个研究分析师,分析搜索结果并为用户查询提供答案。当你完成生成最终输出时,回复TERMINATE。” )
报告代理的角色是综合信息。它处理来自必应搜索代理的输出。为用户的查询生成一个连贯的答案。使用预定义的命令(“TERMINATE”)来表示报告已完成。
这两个代理一起形成一个团队,处理信息检索和综合的端到端过程。
3.9. 管理代理对话:轮询组聊天
多代理协作由 RoundRobinGroupChat
协调:
team = RoundRobinGroupChat([bing_search_agent, report_agent], max_turns=3)
代理以固定的循环顺序轮流发言。这确保每个代理在对话中都有所贡献,而不会让任何一个代理主导对话。组聊天旨在处理异步操作。对话流以迭代方式处理,收集代理生成的消息。这种方法确保代理之间的协作平衡,使它们能够专注于各自的专业任务,同时朝着共同目标努力。
3.10. 定义 Azure Function 路由
代码的最后一部分是 HTTP 触发的 Azure Function。该函数负责处理传入请求,调用代理团队,并返回最终结果。
@app.route(route=“autogen_func”) async def autogen_func(req: func.HttpRequest) -> func.HttpResponse: logging.info(‘Python HTTP trigger function processed a request.’) name = req.params.get(‘name’) if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get(‘name’) if name: team = RoundRobinGroupChat([bing_search_agent, report_agent], max_turns=3) result = "" async for message in team.run_stream(task=name): if isinstance(message, TextMessage) and message.source == “Report_Agent”: result += str(message.content) return func.HttpResponse(f”Result: {result}”) else: return func.HttpResponse( “此 HTTP 触发函数成功执行。请在查询字符串或请求体中传递名称以获得个性化响应。”, status_code=200 )
4. 在 Azure Functions 上部署
使用 Azure CLI 或直接从 Azure 门户将您的函数部署到 Azure。Azure CLI 命令可能如下所示:
func azure functionapp publish <your-function-app-name>
5. 挑战与考虑因素
虽然将 Autogen 与 Azure Functions 集成是强大的,但仍需考虑一些挑战:
异步操作
- 处理并发: 异步代码,特别是在多代理交互中,可能变得复杂。确保代理之间无死锁或竞争条件地无缝通信需要仔细的设计和测试。
- 流式响应: 使用异步流(如代理对话中所示)需要适当的错误处理和超时管理,以防止进程挂起。
6. 结论
Autogen 0.4 的多智能体框架与 Azure Functions 的灵活性相结合,为构建可扩展的智能应用程序提供了强大的解决方案。通过将复杂任务分解为专门的智能体——例如我们的 Bing 搜索和报告智能体——您可以构建不仅能够实时检索和分析数据,还能以连贯、用户友好的格式呈现数据的系统。
在本指南中,我们涵盖了从基础架构和详细代码演练到部署的所有内容。无论您是在构建智能搜索助手、研究工具,还是动态内容生成器,这种集成都为创新提供了坚实的基础。
通过利用无服务器架构,您可以获得自动扩展、成本效率和与其他 Azure 服务集成的便利等好处。随着人工智能领域的不断发展,这些原则在开发既强大又有弹性的应用程序时将始终至关重要。
我希望这本全面的指南能帮助您理解这一过程,并激励您进一步探索在 Azure Functions 上使用多智能体系统的更多可能性。
祝您编码愉快,期待构建更智能、更可扩展的 AI 解决方案!
感谢您!
感谢您花时间阅读我的故事!如果您喜欢并觉得它有价值,请考虑给我一个掌声(或者50个!)以表示您的支持。您的掌声帮助其他人发现这些内容,并激励我继续创作更多。
此外,请不要忘记关注我,以获取更多关于人工智能的见解和更新。您的支持对我意义重大,帮助我继续与您分享有价值的内容。谢谢您!