当前位置:   article > 正文

LangChain - 使用多代理协作 构建终极AI自动化

LangChain - 使用多代理协作 构建终极AI自动化


本文翻译改编自: How to Build the Ultimate AI Automation with Multi-Agent Collaboration (2024-05-09)
https://blog.langchain.dev/how-to-build-the-ultimate-ai-automation-with-multi-agent-collaboration/



一、概述

编者注:以下文章由 Wix 研发主管 Assaf Elovic 撰写。
在这篇博客中,他介绍了如何使用 LangGraph 和专业代理团队构建自主研究助理。

GPT Researcher 首次发布以来仅一年时间 ,但构建、测试和部署 AI 代理的方法已经发生了显着变化。
这就是当前人工智能进步的本质和速度。
最初是简单的 零次几次提示,已迅速发展为代理 函数调用RAG ,现在终于发展为 agentic workflows (又名“ flow engineering”)。

吴恩达 最近表示:“我认为 AI 代理工作流程将在今年推动大规模的 AI 进步——甚至可能比下一代基础模型的进步还要大。
这是一个重要的趋势,我敦促所有从事 AI 工作的人都关注它。”

在本文中,您将了解为什么多代理工作流程是当前的最佳标准,以及如何使用 LangGraph构建最佳的自主研究多代理助手。

如果跳过本教程,请随意在查看 GPT Researcher x LangGraph 的最终代码实现 : https://github.com/assafelovic/gpt-researcher/tree/master/multi_agents


二、LangGraph 简介

LangGraph 是 LangChain 的扩展,旨在创建代理和多代理流。
它增加了创建循环流的能力,并内置了内存 - 这两个属性对于创建代理都很重要。

LangGraph 为开发人员提供了高度的可控性,对于创建自定义代理和流非常重要。
生产中的几乎所有代理都是针对他们试图解决的特定用例进行定制的。
LangGraph 让您可以灵活地创建任意自定义代理,同时提供直观的开发人员体验。

闲聊够了,让我们开始构建吧!


三、构建终极自主研究代理

通过利用 LangGraph,可以利用具有专业技能的多个代理来显著提高研究过程的深度和质量。
让每个代理只专注于一项特定技能,可以更好地分离关注点、实现可定制性,并随着项目的发展进一步大规模开发。

受最近的 STORM 论文的启发,这个示例展示了人工智能代理团队如何协同工作,对给定主题进行从规划到发布的研究。
此示例还将利用领先的自主研究代理 GPT Researcher


1、研究代理团队

研究团队由七个 LLM agent 组成:

  • 主编 ——监督研究过程并管理团队。
    这是使用 LangGraph 协调其他代理的“主”代理。
    该代理充当主要的 LangGraph 接口。
  • GPT 研究人员 — 一种专门的自主代理,可对给定主题进行深入研究。
  • 编辑 ——负责规划研究大纲和结构。
  • 审稿人 ——根据一组标准验证研究结果的正确性。
  • 修订者 ——根据审稿人的反馈修改研究结果。
  • 作家 ——负责编译和撰写最终报告。
  • 发布者 ——负责以各种格式发布最终报告。

2、结构

如下所示,自动化过程基于以下阶段:规划研究、数据收集和分析、审查和修订、撰写报告和最终发布:

img


更具体的流程如下:

  • 浏览器 (gpt-researcher) — 浏览互联网以根据给定的研究任务进行初步研究。
    此步骤对于 LLM 根据最新的相关信息来规划研究过程至关重要,而不仅仅是依赖于给定任务或主题的预先训练的数据。
  • 编辑 ——根据初步研究规划报告大纲和结构。
    编辑还负责根据规划的大纲触发并行研究任务。

对于每个大纲主题(并行):

  • 研究员 (gpt-researcher) — 对子主题进行深入研究并撰写草稿。
    此代理利用 底层的GPT Researcher Python 包 来生成优化、深入和真实的研究报告。
  • 审阅者 ——根据一组指导原则验证草案的正确性,并向修订者提供反馈(如果有)。
  • 修改者 ——根据审稿人的反馈修改草稿直至满意为止。
  • 作家 — 编译并撰写最终报告,包括给定研究结果的引言、结论和参考文献部分。
  • 发布者 — 将最终报告发布为多种格式,例如 PDF、Docx、Markdown 等。

我们不会深入研究所有代码,因为代码量很大,但我们将重点关注我认为值得分享的有趣部分。


3、定义图形状态

我最喜欢的 LangGraph 功能之一是 状态管理
LangGraph 中的状态是通过结构化方法实现的,开发人员定义封装应用程序整个状态的 GraphState。
图中的每个节点都可以修改此状态,从而允许根据不断变化的交互上下文进行动态响应。

就像每次开始技术设计一样,考虑整个应用程序的数据模式是关键。
在本例中,我们将定义一个 ResearchState,如下所示:

class ResearchState(TypedDict):
    task: dict
    initial_research: str
    sections: List[str]
    research_data: List[dict]
    # Report layout
    title: str
    headers: dict
    date: str
    table_of_contents: str
    introduction: str
    conclusion: str
    sources: List[str]
    report: str
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如上所示,状态主要分为两个区域:研究任务和报告布局内容。
当数据通过图代理循环时,每个代理将依次根据现有状态生成新数据,并更新它以便与其他代理一起在图上进一步进行后续处理。

然后我们可以使用以下命令初始化图表:

from langgraph.graph import StateGraph
workflow = StateGraph(ResearchState)
  • 1
  • 2


4、使用 LangGraph 初始化图

如上所述,多代理开发的一大优点是让每个代理都具有专门的和特定范围的技能。
让我们以使用GPT Researcher python 包的Researcher 代理为例 :

from gpt_researcher import GPTResearcher

class ResearchAgent:
    def __init__(self):
        pass
  
    async def research(self, query: str):
        # Initialize the researcher
        researcher = GPTResearcher(parent_query=parent_query, query=query, report_type=research_report, config_path=None)
        # Conduct research on the given query
        await researcher.conduct_research()
        # Write the report
        report = await researcher.write_report()
  
        return report
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

正如您在上面看到的,我们创建了一个研究代理的实例。
现在假设我们对团队的每个代理都做了同样的事情。
创建所有代理后,我们将使用 LangGraph 初始化图:

def init_research_team(self):
    # Initialize agents
    editor_agent = EditorAgent(self.task)
    research_agent = ResearchAgent()
    writer_agent = WriterAgent()
    publisher_agent = PublisherAgent(self.output_dir)
    
    # Define a Langchain StateGraph with the ResearchState
    workflow = StateGraph(ResearchState)
    
    # Add nodes for each agent
    workflow.add_node("browser", research_agent.run_initial_research)
    workflow.add_node("planner", editor_agent.plan_research)
    workflow.add_node("researcher", editor_agent.run_parallel_research)
    workflow.add_node("writer", writer_agent.run)
    workflow.add_node("publisher", publisher_agent.run)
    
    workflow.add_edge('browser', 'planner')
    workflow.add_edge('planner', 'researcher')
    workflow.add_edge('researcher', 'writer')
    workflow.add_edge('writer', 'publisher')
    
    # set up start and end nodes
    workflow.set_entry_point("browser")
    workflow.add_edge('publisher', END)
    
    return workflow
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

如上所示,创建 LangGraph 图非常简单,由三个主要函数组成: add_nodeadd_edgeset_entry_point
通过这些主要功能,您可以首先将节点添加到图中,连接边,最后设置起点。

重点检查:如果您一直正确遵循代码和架构,您会注意到上面的初始化中缺少 Reviewer 和 Reviser 代理。
让我们深入了解一下吧!


5、图内图支持状态并行

这是我使用 LangGraph 过程中最激动人心的部分!这款自主助手的一项令人兴奋的功能是可以并行运行每项研究任务,并根据一组预定义的指南进行审查和修改。

了解如何在流程中利用并行工作是优化速度的关键。
但是,如果所有代理报告相同的状态,您将如何触发并行代理工作?这可能会导致最终数据报告中的竞争条件和不一致。
为了解决这个问题,您可以创建一个从主 LangGraph 实例触发的子图。
该子图将为每个并行运行保留其自己的状态,这将解决所提出的问题。

正如我们之前所做的那样,让我们定义 LangGraph 状态及其代理。
由于此子图基本上审查和修改研究草稿,我们将使用草稿信息定义状态:

class DraftState(TypedDict):
    task: dict
    topic: str
    draft: dict
    review: str
    revision_notes: str
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从 DraftState 中可以看出,我们最关心的是所讨论的主题,以及审稿人和修订笔记之间的沟通,以最终确定子主题研究报告。
为了创建循环条件,我们将利用 LangGraph 的最后一个重要部分,即 条件边:

async def run_parallel_research(self, research_state: dict):
    workflow = StateGraph(DraftState)
    
    workflow.add_node("researcher", research_agent.run_depth_research)
    workflow.add_node("reviewer", reviewer_agent.run)
    workflow.add_node("reviser", reviser_agent.run)
    
    # set up edges researcher->reviewer->reviser->reviewer...
    workflow.set_entry_point("researcher")
    workflow.add_edge('researcher', 'reviewer')
    workflow.add_edge('reviser', 'reviewer')
    workflow.add_conditional_edges('reviewer',
             (lambda draft: "accept" if draft['review'] is None else "revise"),
             {"accept": END, "revise": "reviser"})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

通过定义条件边,如果审阅者有审阅记录,则图形将指向审阅者,否则循环将以最终稿结束。
如果你回到我们构建的主图,你会看到这个并行工作在 ChiefEditor 代理调用的名为“研究员”的节点下。


6、运行研究助理

在最终确定代理、状态和图表后,是时候运行我们的 研究助手了!为了更容易自定义,助手使用给定的 task.json 文件运行:

{
  "query": "Is AI in a hype cycle?",
  "max_sections": 3,
  "publish_formats": {
    "markdown": true,
    "pdf": true,
    "docx": true
  },
  "follow_guidelines": false,
  "model": "gpt-4-turbo",
  "guidelines": [
    "The report MUST be written in APA format",
    "Each sub section MUST include supporting sources using hyperlinks. If none exist, erase the sub section or rewrite it to be a part of the previous section",
    "The report MUST be written in spanish"
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

任务对象非常不言自明,但是请注意,follow_guidelines 如果为 false 将导致图表忽略修订步骤和定义的指南。
此外, max_sections 字段定义了要研究的子标题数量。
较少会生成较短的报告。

运行助手将生成 Markdown、PDF 和 Docx 等格式的最终研究报告。

要下载并运行该示例,请查看 GPT Researcher x LangGraph 开源页面。


四、下一步是什么?

展望未来,还有一些超级令人兴奋的事情值得思考。
人机交互是优化人工智能体验的关键。
让一个人帮助助理修改并专注于正确的研究计划、主题和大纲,将提高整体质量和体验。
此外,在整个人工智能流程中依靠人工干预来确保正确性、控制感和确定性结果。
很高兴看到 LangGraph 已经开箱即用地支持这一点,如下 所示

此外,支持网络和本地数据的研究对于许多类型的商业和个人用例来说至关重要。

最后,可以做出更多努力来提高检索来源的质量,并确保最终报告以最佳故事情节构建。


LangGraph 和多智能体协作作为一个整体向前迈进了一步,助手可以根据给定的任务动态规划和生成图表。
这一愿景将允许助手为给定任务仅选择一部分代理,并根据本文中介绍的图基础知识规划其策略,并打开一个全新的可能性世界。
鉴于人工智能领域的创新步伐,不久之后就会推出新的颠覆性版本的 GPT Researcher。
期待未来带来什么!

要跟踪该项目的持续进展和更新,请加入我们的 Discord 社区


2024-05-22(三)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/687896
推荐阅读
相关标签
  

闽ICP备14008679号