category
随着生成性人工智能能力的发展,成功的商业应用取决于强大的问题解决能力的发展。这一转型的最前沿是代理系统,它利用基础模型(FM)的力量来应对复杂的现实挑战。通过无缝集成多个代理,这些创新的解决方案实现了在不同环境中的自主协作、决策和高效解决问题。亚马逊网络服务(AWS)科学家与学术研究人员共同进行的实证研究表明,通过在竞争任务上的代理协作,在增强推理能力方面取得了重大进展。
本文提供了创建具有推理能力的协作多代理框架的分步说明,以将业务应用程序与FM解耦。它演示了如何将Amazon Bedrock代理与开源多代理框架相结合,使代理之间的协作和推理能够动态执行各种任务。本练习将指导您使用亚马逊基岩、亚马逊基岩知识库、亚马逊基岩代理和FM构建推理编排系统的过程。我们还探索了Amazon Bedrock Agents与开源编排框架LangGraph和CrewAI的集成,用于调度和推理。
AWS为Amazon Bedrock引入了多代理协作功能,使开发人员能够构建、部署和管理多个在复杂任务中协同工作的AI代理。此功能允许创建处理流程不同方面的专用代理,由主管代理协调,主管代理分解请求、委派任务并整合输出。这种方法提高了任务成功率、准确性和生产率,特别是对于复杂的多步骤任务。
有关本文中讨论的示例代码和演示,请参阅代理编排GitHub存储库和本AWS研讨会。您还可以参考GitHub仓库获取Amazon Bedrock多代理协作代码示例。
代理服务的关键特征
在生成式人工智能的背景下,“代理”是指一种自主功能,可以与环境交互,收集数据,并做出执行复杂任务的决策,以实现预定义的目标。生成型人工智能代理是自主的、面向目标的系统,使用大型语言模型(LLM)等功能模块与环境进行交互并适应环境。这些代理擅长计划、解决问题和决策,使用思维链提示等技术来分解复杂的任务。他们可以自我反思,改进流程,并通过使用工具和与其他人工智能模型的协作来扩展自己的能力。这些代理可以独立或协同操作,在不同领域执行任务,同时不断适应新信息和不断变化的环境。代理可以提高创造力,大规模生产内容,自动化重复性任务,使人类能够专注于战略工作,从而减少重复性行为并节省成本。下图显示了解决方案的高级架构。
要在AWS上实现代理,您可以使用Amazon Bedrock Agents Boto3客户端,如以下代码示例所示。为代理创建所需的AWS和身份和访问管理(IAM)角色后,请使用create_agent API。此API需要代理名称、FM标识符和指令字符串。您也可以选择提供代理描述。创建的代理尚未准备好使用。我们专注于准备代理,然后使用它来调用操作并与其他API交互。使用以下代码示例获取您的代理ID;这对于与代理一起执行操作至关重要。
# Use the Python boto3 SDK to interact with Amazon Bedrock Agent service
bedrock_agent_client = boto3.client('bedrock-agent')
# Create a new Bedrock Agent
response = bedrock_agent_client.create_agent(
agentName=<agent_name>, #customized text string
agentResourceRoleArn=<agent_role['Role']['Arn']>, #IAM role assigned to the agent
description=<agent_description>, #customized text string
idleSessionTTLInSeconds=1800,
foundationModel=<agent_foundation_model>, #e.g. "anthropic.claude-3-sonnet-20240229-v1:0"
instruction=<agent_instruction>, #agent instruction text string
)
agent_id = response['agent']['agentId']
用于代理内部协作的多代理管道
多代理管道是人工智能系统中精心编排的流程,涉及多个专门的代理协同工作以完成复杂的任务。在管道中,代理以顺序结构组织,不同的代理处理整个工作流中的特定子任务或角色。代理之间通常通过共享的“草稿栏”或消息系统进行交互,使它们能够交换信息并在彼此的工作基础上进行构建。每个代理都保持自己的状态,随着流程的进展,可以用新的信息进行更新。复杂的项目被分解为可管理的子任务,然后分布在专门的代理之间。工作流程包括明确规定的任务编排流程,有助于高效分配任务并与目标保持一致。这些过程可以控制代理间的交互和代理内的操作(例如代理如何与工具或流程输出交互)。可以为代理分配特定的角色(例如,检索器或注射器)来解决问题的不同方面。
作为一个实际例子,考虑一个用于博客写作的多代理管道,用多代理框架CrewAI实现。要使用CrewAI创建多代理管道,首先定义将参与管道的各个代理。以下示例中的代理是Planner代理、Writer代理和Editor代理。接下来,将这些代理安排到一个管道中,指定任务执行的顺序以及数据在它们之间的流动方式。CrewAI为代理提供了相互传递信息和协调行动的机制。CrewAI的模块化和可扩展设计使其非常适合开发简单和复杂的多智能体AI应用程序。下图显示了此多代理管道。
from crewai import Agent, Task, Crew, Process
# Create a blog writing multi-agent pipeline, which is comprised of a planner, a writer, and an editor agent
# This code snippet shows only the planner agent, which calls web search tools
# and Amazon Bedrock for the LLM
class blogAgents():
def __init__(self, topic, model_id):
self.topic = topic
self.model_id = model_id
def planner(self, topic, model_id):
return Agent(
role="Content Planner",
goal=f"""Plan engaging and factually accurate content on {topic}.""",
backstory=f"""You're working on planning a blog article about the topic: {topic}. \n
You collect information by searching the web for the latest developments that directly relate to the {topic}. \n
You help the audience learn something to make informed decisions regarding {topic}. \n
Your work is the basis for the Content Writer to write an article on this {topic}.""",
allow_delegation=False,
tools=<tools_to_use>,
llm=<Bedrock_foundation_model>,
verbose=True
)
......
# Create the associated blog agent tasks which are comprised of a planner, writer, and editor tasks.
# This code snippet shows only the planner task.
class blogTasks():
def __init__(self, topic, model_id):
self.topic = topic
self.model_id = model_id
def plan(self, planner, topic, model_id):
return Task(
description=(
f"""1. Prioritize the latest trends, key players, and noteworthy news on {topic}.\n
2. Identify the target audience, considering their interests and pain points.\n
3. Develop a detailed content outline including an introduction, key points, and a call to action.\n
4. Include SEO keywords and relevant data or sources."""
),
expected_output=f"""Convey the latest developments on the {topic} with sufficient depth as a domain expert.\n
Create a comprehensive content plan document with an outline, audience analysis,
SEO keywords, and resources.""",
agent=planner
)
......
# Define planner agent and planning tasks
planner_agent = agents.planner(self.topic, self.model_id)
plan_task = tasks.plan(planner_agent, self.topic, self.model_id)
......
# Define an agentic pipeline to chain the agent and associated tasks
# with service components, embedding engine, and execution process
crew = Crew(
agents=[planner_agent, writer_agent, editor_agent],
tasks=[plan_task, write_task, edit_task],
verbose=True,
memory=True,
embedder={
"provider": "huggingface",
"config": {"model": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"},
},
cache=True,
process=Process.sequential # Sequential process will have tasks executed one after the other
)
result = crew.kickoff()
如本代码示例所示,多代理管道通常是简单的线性结构,可能易于设置和理解。它们具有从一个代理到下一个代理的清晰顺序任务流,并且可以很好地用于具有定义操作顺序的简单工作流。同时,管道结构对于复杂的非线性代理交互可能不太灵活,这使得它处理分支逻辑或循环的能力较差。对于需要代理之间来回切换的问题,这可能效率较低。下一节将介绍多智能体系统的图框架,它更适合更复杂的场景。
用于异步编排和推理的多代理图框架
多代理框架为智能、动态的问题解决提供了巨大的潜力,使协作、专门的任务执行成为可能。虽然这些系统可以通过动态激活和协调代理来提高推理准确性和响应效率,但它们也带来了关键的挑战,包括潜在的偏见、有限的推理能力和对强有力监督的需求。有效的多智能体框架需要仔细的设计考虑,如明确的领导、动态的团队建设、有效的信息共享、思维链提示等规划机制、上下文学习的记忆系统以及专业语言模型的战略编排。随着技术的发展,在智能体自主性与人类监督和道德保障之间取得平衡,对于释放这些智能系统的全部潜力,同时降低潜在风险至关重要。
多代理图框架是一个使用基于图的表示对多个自治代理之间的交互和关系进行建模的系统。在这种类型的框架中,代理在图中表示为节点,每个代理都有自己的一组能力、目标和决策过程。图中的边表示代理之间的交互、通信或依赖关系。这些可以包括信息共享、任务委托、谈判或协调等。图结构允许对代理之间复杂的动态关系进行建模,包括循环、反馈循环和层次结构。下图显示了这种架构。
基于图的方法提供了一种灵活且可扩展的方式来表示多智能体系统的结构,使分析、模拟和推理由智能体交互引起的紧急行为变得更加容易。以下代码片段说明了使用LangGraph构建为多代理编排设计的图形框架的过程。该框架对于管理和协调系统内多个代理之间的交互,促进高效和有效的沟通与协作至关重要。值得注意的是,它强调了即插即用功能,允许动态更改和适应第三方代理的灵活性。具有此功能的框架可以无缝地适应新的要求并与外部系统集成,从而增强其整体通用性和可用性。
from langgraph.graph import StateGraph, END
......
# Create a graph to orchestrate multiple agents (i.e. nodes)
orch = StateGraph(MultiAgentState)
orch.add_node("rewrite_agent", rewrite_node)
orch.add_node('booking_assistant', bedrock_agent_node)
orch.add_node('blog_writer', blog_writer_node)
orch.add_node("router_agent", router_node)
orch.add_node('search_expert', search_expert_node)
....
# Create edges to connect agents to form a graph
orch.set_entry_point("rewrite_agent")
orch.add_edge('rewrite_agent', 'router_agent')
orch.add_conditional_edges(
"RAG_agent",
decide_to_search,
{
"to_human": "human",
"do_search": "search_expert",
},
)
orch.add_edge('blog_writer', 'text2image_generation')
......
# Compile the graph for agentic orchestration
graph = orch.compile(checkpointer=memory, interrupt_before = ['human'])
多代理图方法对于需要建模和分析自治实体之间复杂动态交互的领域特别有用,例如机器人、物流、社交网络等。与线性多智能体管道方法相比,基于多智能体图的方法有多个优点和缺点,如下所述。
优点和局限性
代理服务的出现代表了一种变革性的系统设计方法。与遵循固定、预定工作流程的传统人工智能模型不同,代理系统的特点是它们能够实时协作、适应和做出决策。从被动人工智能到主动人工智能的转变为开发人员和架构师带来了令人兴奋的机会,并带来了独特的设计挑战。代理服务的核心是代理推理的概念,它体现了一种灵活的、迭代的解决问题的方法,反映了人类的认知过程。通过整合反射、自我改进和工具利用等设计模式,我们可以开发出能够在各个领域进行持续增强和更广泛功能的AI代理。
代理服务虽然很有前景,但面临着几个必须解决的局限性,才能成功实现生产。管理多个自主代理的复杂性,特别是随着其数量和范围的增加,对保持系统的一致性和稳定性构成了重大挑战。此外,这些系统的紧急行为可能难以预测和理解,阻碍了透明度和可解释性,而这对于建立信任和问责制至关重要。安全性和稳健性是最重要的问题,因为意外的行为或故障可能会产生深远的后果,需要强有力的保障措施和错误处理机制。随着代理服务的扩展,保持高效性能变得越来越具有挑战性,需要优化资源利用率和负载平衡。最后,基于代理的系统缺乏广泛采用的标准和协议,这造成了互操作性问题,使得这些服务难以与现有基础设施集成。解决这些限制对于代理服务在各个领域的广泛采用和成功至关重要。
优势:
使用图结构更灵活地表示代理交互
更适合具有非线性代理通信的复杂工作流
可以更容易地表示代理之间的循环和分支逻辑
对于大型多智能体系统来说,可能更具可扩展性
更清晰地显示整个代理系统结构
缺点:
与线性管道相比,初始设置更复杂
可能需要更多的前期规划来设计图形结构
可能需要额外的资源使用和更长的响应时间
下一步行动
在多代理编排的下一阶段,我们的重点将是增强代理的推理、反射和自我纠正能力。这涉及开发高级算法(如思想树(ToT)提示、蒙特卡洛树搜索(MCTS)等),使代理能够从其对等交互中学习,适应新情况,并根据反馈纠正其行为。此外,我们正在努力创建一个生产就绪的框架,可以容纳各种代理服务。该框架将被设计为灵活和可扩展的,能够无缝集成不同类型的代理和服务。这些工作目前正在进行中,我们将在下一篇博客文章中提供有关我们进展的详细更新。请继续关注我们对多代理编排的创新方法的更多见解。
结论
多代理编排和推理代表了生成式人工智能生产采用的重大飞跃,为复杂的问题解决和决策提供了前所未有的潜力,将您的应用程序与单个功能模块解耦。承认并解决这些局限性也很重要,包括可扩展性挑战、长延迟以及不同代理之间可能存在的不兼容性。展望未来,增强我们的智能体的自我和内部推理、反思和自我纠正能力将是至关重要的。这将涉及开发更复杂的元认知算法,改进代理间通信协议,并实施强大的错误检测和纠正机制。
有关本文中讨论的示例代码和演示,请参阅代理编排GitHub存储库和本AWS研讨会。您还可以参考GitHub仓库获取Amazon Bedrock多代理协作代码示例。
- 登录 发表评论
- 4 次浏览
最新内容
- 34 minutes 15 seconds ago
- 57 minutes 39 seconds ago
- 2 hours ago
- 2 hours ago
- 2 hours ago
- 20 hours 57 minutes ago
- 1 day 2 hours ago
- 1 day 3 hours ago
- 2 days 21 hours ago
- 2 days 21 hours ago