1

导语

本文介绍如何使用 LangGraph 与一组专业的 Agent 构建一个自主的研究助手。在本文中,您将了解为什么 multi agent 工作流是当前最好的标准,以及如何使用 LangGraph 构建最佳的自主研究 multi-agent 助手。

文章由 Wix 研发主管 Assaf Elovic 撰写。在这篇博客中,他介绍了如何使用 LangGraph 和一组专业的 agent 构建一个自主的研究助手。

GPT Researcher 发布至今只有一年的时间,但构建、测试和部署 AI Agent 的方法已经有了显著的发展。这就是当前人工智能发展的本质和速度。从简单的 zero-shot 或者 few-shot prompting 开始,已经迅速发展到 Agent function calling,RAG,以及现在的 agentic workflows(又名“flow engineering”)。

吴恩达(Andrew Ng)最近表示:“我认为 AI agent workflows 将在今年推动大规模的人工智能进步,甚至可能超过下一代基础模型。这是一个重要的趋势,我敦促每个从事 AI 工作的人都要关注它。“

LangGraph 简介

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

LangGraph 为开发人员提供了高可控性,对于创建自定义 agent 和 flows 非常重要。几乎所有生产环境中的 agent 都是针对特定用途场景进行自定义的。LangGraph 为您提供了创建任意自定义 Agent 的灵活性,同时提供做这些工作所需的、使用简单的开发者经验。

开搞吧!

构建 Ultimate Autonomous Research Agent

通过使用 LangGraph,利用具备专业技能的多个 agents 可以让研究过程在深度和质量上得到显著改善。

下面的这个例子展示了一个人工智能 agent team 内部如何合作,从规划到出版,对给定的主题进行研究。这个例子还将利用先进的 autonomous research agent:GPT Researcher

The Research Agent Team

该 Research Team 由七名 LLM Agents 组成:

  • Chief Editor:主编,监督研究过程并管理团队。这是使用 LangGraph 协调其他 agents 的 master agent。该 agent 充当主 LangGraph 接口。
  • GPT Researcher:GPT 研究员,一个专门的自主 agent,对给定的主题进行深入研究。
  • Editor:编辑,负责规划研究大纲和结构。
  • Reviewer:审阅者,根据一系列标准验证研究结果的正确性。
  • Reviser:修订者,根据 Reviewer 的反馈意见修订研究结果。
  • Writer:撰写人,负责编写最终报告。
  • Publisher:发布者,负责以各种格式发布最终报告。

架构

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

具体的过程如下:

  • Browser (gpt-researcher):根据给定的研究任务浏览互联网进行初步研究。这一步对于 LLMs 基于最新的相关信息规划研究过程至关重要,而不仅仅依赖于给定任务或主题的预先训练数据。
  • Editor:在初步研究的基础上规划报告大纲和结构。Editor 还负责根据计划大纲触发并行研究任务。

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

  • Researcher (gpt-researcher):对子主题进行深入研究并撰写草稿。该 agent 利用 GPT Researcher Python 软件包进行研究报告的优化,增加真实性和深入程度。
  • Reviewer:根据一系列指导原则验证草稿的正确性,并向 Reviser 提供反馈(如果有)。
  • Reviser:根据 Reviewer 的反馈修订草稿,直到满意为止。
  • Writer:根据给定的研究结果编写最终报告,包括引言、结论和参考文献部分。
  • Publisher:将最终报告发布为多种格式,如 PDF,Docx,Markdown 等。

这里不会深入到所有的代码,因为太多,这里只会集中在有价值、有趣的那部分。

定义图形状态

LangGraph 中的状态是通过结构化的方法实现的,开发人员定义了一个 GraphState,用于封装应用程序的整个状态。graph 中的每个节点都可以修改此状态,从而允许基于不断发展的交互上下文进行动态响应。

就像每次代码设计开始时一样,考虑整个应用程序的 data schema 是关键。在这种情况下,我们将定义一个 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

如上所述,状态主要分为两个方面:

  • 研究任务
  • 报告排版内容

随着数据在图agent中循环,每个agent将依次根据现有状态生成新数据并对其进行更新,以便与其他agent在图中进一步向下处理。

然后可以用下面的代码初始化图:

from langgraph.graph import StateGraph
workflow = StateGraph(ResearchState)

使用 LangGraph 初始化 graph

如上所述,multi agent 开发的一个伟大之处是构建每一个 agent,并使其具有专业化和领域化的技能。以使用 GPT Researcher python 包的 Researcher agent为例:

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

正如在上面看到的,我们已经创建了 Research Agent 的一个实例。现在假设我们已经为 team 中的每个 agent 做了同样的事情。在创建所有 agent 之后,使用 LangGraph 初始化 graph:

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

如上,创建 LangGraph 的图(graph)非常简单,由三个主要函数组成:add_node,add_edge 和 set_entry_point。使用这些主要功能,可以首先将节点 nodes 添加到图中,然后连接边 edges,最后设置起点 starting point。

你可能已经注意到上面的流程缺少 Reviewer agent 和 Reviser agent,接下来我们就来处理他们。

支持有状态并行化

这个自主助手的一个令人兴奋的功能是它可以对每个研究任务并行运行,并根据一组预定义的指导方案进行审查和修订。

知晓如何在流程中利用并行来处理工作是优化速度的关键。但是,如果所有 agent 都向同一个状态点报告,又将如何触发并行 agent 进行工作呢?这可能会导致条件竞争和不一致的最终数据报告。要解决这个问题,您可以创建一个子图,它将从主 LangGraph 实例触发。这个子图将为每个并行执行任务保存自己的状态,来解决上述问题。

让我们定义 LangGraph 状态及其 agent。由于这个子图基本上是审查和修改研究草稿,这里将使用草稿信息定义状态:

class DraftState(TypedDict):
    task: dict
    topic: str
    draft: dict
    review: str
    revision_notes: str

如上面定义的 DraftState 中所示,我们主要关心讨论的主题,以及 reviewer 和修订说明,因为他们相互沟通以最终确定子主题研究报告的内容。为了创建循环条件,这里将利用 LangGraph 的最后一个重要部分,即条件边(conditional edges):

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"})

通过定义条件边,如果存在 reviewer 的审阅注释,则该图将指向 reviser,或者该循环将以最终草案结束。如果返回到构建的主图,将看到此并行工作位于 ChiefEditor Agent 调用的名为“researcher”的节点下。

运行 research assistant!

要下载和运行该实例请查看 github:https://github.com/assafelovic/gpt-researcher/tree/master/multi_agents?ref=blog.langchain.dev

在完成 agents、states 和 graphs 之后,是时候运行 research assistant 了。为了更容易自定义,这里使用给定的 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"
  ]
}

请注意,如果 follow_guidelines 为 false,则会导致图形忽略修订步骤和定义的规划。此外,max_sections 字段定义了要搜索多少个子标题,少一点会产生更短的报告。

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

总结

人在整个链路中是优化 AI 体验的关键。有一个人帮助这个助理修改和专注于正确的研究计划、主题和大纲,将提高整体质量。此外,在整个人工智能流程中依靠人工干预的目标确保了正确性、控制感和确定性结果。

LangGraph 已经支持这一点:https://blog.langchain.dev/human-in-the-loop-with-opengpts-an...

LangGraph 和 multi-agent 协作,作为一个整体向前迈进了一步,助手可以根据给定的任务动态地规划和生成图。这个愿景将允许助手为给定的任务选择一个代理子集,并根据本文中介绍的图基础来规划他们的策略,并打开一个全新的充满各种可能性的世界。

考虑到人工智能领域的创新步伐,用不了多久就会推出一个新的破坏性版本的 GPT Researcher。期待未来带来的一切!

快乐学习,简单学习!
关注了解更多 AI 编程、Java 编程知识!

本文由mdnice多平台发布


我在公司做牛码
1 声望3 粉丝

快乐学习,简单学习!