编者按:以下文章由 Wix 研发主管 Assaf Elovic 撰写。Wix。在这篇博文中,他将带您了解如何使用 LangGraph 和一组专业智能体构建自主研究助理。
自从 GPT Researcher 首次发布以来仅仅一年,但构建、测试和部署 AI 智能体的方法已经发生了显著演变。 这正是当前 AI 进步的本质和速度。 从最初的简单零样本或少样本提示,迅速发展到智能体函数调用、RAG,以及现在的智能体工作流(又名“流程工程”)。
吴恩达 最近表示:“我认为 AI 智能体工作流将推动今年 AI 的巨大进步——甚至可能超过下一代基础模型。这是一个重要的趋势,我敦促所有从事 AI 工作的人都关注它。”
在本文中,您将了解为什么多智能体工作流是当前最佳标准,以及如何使用 LangGraph 构建最佳自主研究多智能体助理。
要跳过本教程,请随时查看 GPT Researcher x LangGraph 的最终代码实现此处。
LangGraph 简介
LangGraph 是 LangChain 的扩展,旨在创建智能体和多智能体流程。 它增加了创建循环流程的能力,并内置了内存——这两者都是创建智能体的重要属性。
LangGraph 为开发者提供了高度的可控性,对于创建定制智能体和流程至关重要。 几乎所有生产环境中的智能体都是针对其试图解决的特定用例进行定制的。 LangGraph 使您可以灵活地创建任意定制的智能体,同时为实现这一目标提供直观的开发者体验。
闲话少说,让我们开始构建吧!
构建终极自主研究智能体
通过利用 LangGraph,研究过程可以通过利用具有专业技能的多个智能体来显著提高深度和质量。 让每个智能体只专注于特定的技能,可以更好地分离关注点、实现定制化,并在项目规模扩大时进一步进行规模化开发。
受最近的 STORM 论文启发,此示例展示了一组 AI 智能体如何协同工作,对给定主题进行从规划到发布的完整研究。 此示例还将利用领先的自主研究智能体 GPT Researcher。
研究智能体团队
研究团队由七个 LLM 智能体组成
- 主编 — 监督研究过程并管理团队。 这是使用 LangGraph 协调其他智能体的“主”智能体。 此智能体充当主要的 LangGraph 接口。
- GPT Researcher — 一种专门的自主智能体,可对给定主题进行深入研究。
- 编辑 — 负责规划研究大纲和结构。
- 审阅者 — 根据一组标准验证研究结果的正确性。
- 修订者 — 根据审阅者的反馈修订研究结果。
- 作者 — 负责汇编和撰写最终报告。
- 发布者 — 负责以各种格式发布最终报告。
架构
如下所示,自动化过程基于以下阶段:研究规划、数据收集和分析、审阅和修订、撰写报告以及最终发布

更具体地说,流程如下
- 浏览器 (gpt-researcher) — 根据给定的研究任务浏览互联网进行初步研究。 此步骤对于 LLM 至关重要,以便基于最新的相关信息规划研究过程,而不是仅仅依赖预训练数据来完成给定的任务或主题。
- 编辑 — 根据初步研究规划报告大纲和结构。 编辑还负责根据计划的大纲触发并行研究任务。
对于每个大纲主题(并行地)
- 研究员 (gpt-researcher) — 对子主题进行深入研究并撰写草稿。 此智能体在底层利用 GPT Researcher Python 包,以获得优化的、深入且基于事实的研究报告。
- 审阅者 — 根据一组指南验证草稿的正确性,并向修订者提供反馈(如有)。
- 修订者 — 根据审阅者的反馈修订草稿,直到满意为止。
- 作者 — 汇编并撰写最终报告,包括引言、结论和参考文献部分,这些内容来自给定的研究结果。
- 发布者 — 将最终报告发布为多种格式,例如 PDF、Docx、Markdown 等。
我们不会深入研究所有代码,因为代码量很大,但我们将重点介绍我发现有价值分享的有趣部分。
定义图状态
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
如上所示,状态分为两个主要区域:研究任务和报告布局内容。 当数据在图智能体中循环时,每个智能体将依次根据现有状态生成新数据,并更新它以供图中更下游的其他智能体进行后续处理。
然后我们可以使用以下内容初始化图
from langgraph.graph import StateGraph
workflow = StateGraph(ResearchState)
使用 LangGraph 初始化图
如上所述,多智能体开发的一大优点是构建每个智能体以使其具有专业化和范围化的技能。 让我们以使用 GPT Researcher python 包的研究员智能体为例
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
如您在上面看到的,我们创建了研究员智能体的实例。 现在让我们假设我们对团队的每个智能体都做了同样的事情。 创建所有智能体后,我们将使用 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
如上所示,创建 LangGraph 图非常简单,由三个主要函数组成:add_node、add_edge 和 set_entry_point。 通过这些主要函数,您可以首先将节点添加到图中,连接边,最后设置起点。
重点检查:如果您正确地遵循了代码和架构,您会注意到上面的初始化中缺少审阅者和修订者智能体。 让我们深入了解一下!
支持有状态并行化的图内图
这是我在使用 LangGraph 时最令人兴奋的部分! 此自主助理的一个令人兴奋的功能是为每个研究任务并行运行,这将根据一组预定义的指南进行审阅和修订。
了解如何在流程中利用并行工作是优化速度的关键。 但是,如果所有智能体都向同一状态报告,您将如何触发并行智能体工作? 这可能会导致最终数据报告中的竞争条件和不一致性。 为了解决这个问题,您可以创建一个子图,该子图将从主 LangGraph 实例触发。 此子图将为每个并行运行保持自己的状态,这将解决提出的问题。
与之前一样,让我们定义 LangGraph 状态及其智能体。 由于此子图基本上审阅和修订研究草稿,我们将使用草稿信息定义状态
class DraftState(TypedDict):
task: dict
topic: str
draft: dict
review: str
revision_notes: str
如 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"})
通过定义条件边,如果审阅者存在审阅注释,则图将定向到修订者,否则循环将以最终草稿结束。 如果您返回到我们构建的主图,您会看到此并行工作位于名为“研究员”的节点下,由主编智能体调用。
运行研究助理
在最终确定智能体、状态和图之后,就该运行我们的 研究助理 了! 为了便于自定义,助理使用给定的 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 等格式的最终研究报告。
要下载并运行示例,请查看 GPT Researcher x LangGraph 开源页面。
下一步是什么?
展望未来,有很多令人兴奋的事情值得思考。 人在环路中是优化 AI 体验的关键。 让人们帮助助理修订并专注于正确的研究计划、主题和大纲,将提高整体质量和体验。 此外,在整个 AI 流程中以人为干预为目标,可以确保正确性、控制感和确定性结果。 很高兴看到 LangGraph 已经开箱即用地支持这一点,如此处所示。
此外,支持对网络和本地数据进行研究对于许多类型的商业和个人用例至关重要。
最后,可以做更多努力来提高检索到的来源的质量,并确保以最佳故事情节构建最终报告。
LangGraph 和多智能体协作作为一个整体向前迈进的一步将是助理可以根据给定的任务动态地规划和生成图。 这种愿景将允许助理为给定的任务仅选择智能体的子集,并根据本文介绍的图基础知识规划其策略,并开启一个全新的可能性世界。 鉴于 AI 领域的创新步伐,新颠覆性版本的 GPT Researcher 的发布指日可待。 期待未来会带来什么!
要跟踪此项目的持续进展和更新,请加入我们的 Discord 社区。