基于LangGraph多智能體技術,搭建AI寫作自動化系統(tǒng)
1 LangGraph概述
LangGraph是LangChain的增強版,專注于構建智能體及多智能體流程。其核心優(yōu)勢在于新增的循環(huán)流程構建功能以及內嵌的記憶機制,這些特性對于智能體的構建極為重要。
LangGraph為開發(fā)者提供了高度的控制能力,這在自定義智能體和流程的開發(fā)中極為關鍵。市面上絕大多數(shù)的智能體都是針對特定應用場景進行了定制。
LangGraph不僅賦予了開發(fā)者靈活定制智能體的能力,還提供了直觀且易于操作的開發(fā)體驗。
2 構建終極自主研究智能體
借助LangGraph的強大功能,我們能夠通過集結具備專業(yè)技能的多個智能體,顯著提高研究工作的深度與品質。每個智能體專注于其獨特技能,這不僅能夠優(yōu)化任務分工,增強定制性,還為項目的擴展與規(guī)?;l(fā)展奠定了基礎。
本示例展示了一個AI智能體團隊如何通力合作,對特定主題進行全面研究,涵蓋從策劃到發(fā)布的全過程。在此過程中,會特別應用前沿的自主研究智能體——GPT Researcher。
2.1 研究智能體團隊
研究團隊由七個大型語言模型智能體組成:
- 主編智能體 —— 負責監(jiān)督研究過程并管理整個團隊。這是使用LangGraph協(xié)調其他智能體的“主”智能體,充當LangGraph的主要接口。
- GPT研究智能體 —— 一個專門進行特定主題深入研究的自主智能體。
- 編輯智能體 —— 負責規(guī)劃研究大綱和結構。
- 審稿智能體 —— 根據(jù)一套標準驗證研究結果的正確性。
- 修訂智能體 —— 根據(jù)審稿智能體的反饋修訂研究結果。
- 寫作智能體 —— 負責匯編并撰寫最終報告。
- 出版智能體 —— 負責將最終報告以多種格式發(fā)布。
2.2 架構
如下圖,自動化過程基于以下階段:規(guī)劃研究、數(shù)據(jù)收集與分析、審查與修訂、編寫報告,最后是出版:
更具體的流程如下:
- 瀏覽器(gpt-researcher)——基于給定的研究任務,瀏覽互聯(lián)網進行初步研究。這一步對于LLMs來說非常重要,以便根據(jù)最新和相關信息規(guī)劃研究過程,而不是僅依賴于針對給定任務或主題的預訓練數(shù)據(jù)。
- 編輯——根據(jù)初步研究規(guī)劃報告大綱和結構。編輯還負責觸發(fā)基于計劃大綱的并行研究任務。
- 對于每個大綱主題(并行):
- 研究員(gpt-researcher)——對子主題進行深入研究并撰寫草稿。這個智能體利用GPT Researcher Python包,以優(yōu)化、深入且符合事實的研究報告。
- 審稿人——根據(jù)一套指導方針驗證草稿的正確性,并向修訂者提供反饋(如果有的話)。
- 修訂者——根據(jù)審稿人的反饋修訂草稿,直到滿意為止。
- 作者——匯編并撰寫最終報告,包括引言、結論和參考文獻部分。
- 出版商——將最終報告以多種格式(如PDF、Docx、Markdown等)發(fā)布。
我們不會深入所有代碼,因為代碼量很大,但會重點關注所發(fā)現(xiàn)的有價值或有趣部分進行分享。
2.3 定義圖狀態(tài)
在LangGraph中,狀態(tài)管理采用一種結構化的方式,允許開發(fā)者定義一個GraphState對象,它能夠包含整個應用程序的狀態(tài)信息。這樣,圖中的每個節(jié)點都具備了修改狀態(tài)的能力,可以根據(jù)交互過程中的上下文變化,實現(xiàn)動態(tài)的響應機制。
在每項技術設計的初期,需要確立整個應用程序的數(shù)據(jù)結構。針對本例,創(chuàng)建一個名為ResearchState的數(shù)據(jù)模型,將作為我們研究應用程序的核心數(shù)據(jù)架構。如下所示:
class ResearchState(TypedDict):
task: dict
initial_research: str
sections: List[str]
research_data: List[dict]
# 報告布局
title: str
headers: dict
date: str
table_of_contents: str
introduction: str
conclusion: str
sources: List[str]
report: str
如上所見,狀態(tài)被分為兩個主要區(qū)域:研究任務和報告布局內容。當數(shù)據(jù)通過圖中的智能體流通時,每個智能體將根據(jù)現(xiàn)有狀態(tài)生成新數(shù)據(jù),并更新它以便在圖中的其他智能體進一步處理。
然后,使用以下方式初始化圖:
from langgraph.graph import StateGraph
workflow = StateGraph(ResearchState)
2.4 使用LangGraph初始化圖
如上所述,多智能體開發(fā)的一個偉大之處在于構建每個智能體具有專門化和限定范圍的技能。以使用GPT Researcher Python包的Researcher智能體為例:
from gpt_researcher import GPTResearcher
class ResearchAgent:
def __init__(self):
pass
async def research(self, query: str):
# 初始化研究員
researcher = GPTResearcher(parent_query=parent_query, query=query, report_type=research_report, config_path=None)
# 對給定查詢進行研究
await researcher.conduct_research()
# 編寫報告
report = await researcher.write_report()
return report
如上所見,已經創(chuàng)建了Research智能體的一個實例?,F(xiàn)在假設我們已經為團隊中的每個智能體都做了同樣的事情。在創(chuàng)建了所有智能體之后,將使用LangGraph初始化圖:
def init_research_team(self):
# 初始化智能體
editor_agent = EditorAgent(self.task)
research_agent = ResearchAgent()
writer_agent = WriterAgent()
publisher_agent = PublisherAgent(self.output_dir)
# 定義一個Langchain StateGraph與ResearchState
workflow = StateGraph(ResearchState)
# 為每個智能體添加節(jié)點
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')
# 設置起始和結束節(jié)點
workflow.set_entry_point("browser")
workflow.add_edge('publisher', END)
return workflow
如上所見,創(chuàng)建LangGraph圖非常簡單,主要由三個主要功能組成:add_node、add_edge和set_entry_point。通過這些主要功能,你可以首先向圖中添加節(jié)點,連接邊,并最終設置起始點。
重點檢查:如果你一直按照代碼和架構進行,會注意到在上面的初始化中缺少了Reviewer和Reviser智能體。讓我們深入探討!
2.5 圖內嵌套圖以實現(xiàn)狀態(tài)化的并行處理
這個智能助手的一個亮點是其支持對每個研究任務進行并行處理,且每項任務都遵循一套預設的規(guī)范進行審查與修訂。
在流程設計中,有效利用并行工作是提升效率的秘訣。然而,若所有智能體都向同一狀態(tài)報告,如何協(xié)調它們的并行工作以避免競爭條件和數(shù)據(jù)不一致的問題呢?解決方案是構建一個子圖,由主LangGraph實例觸發(fā),并為每次并行運行維護獨立的狀態(tài),從而巧妙地解決了這一難題。
正如之前所做的,讓我們定義LangGraph狀態(tài)及其智能體。由于這個子圖基本上是審查和修訂研究草稿,我們將用草稿信息定義狀態(tài):
class DraftState(TypedDict):
task: dict
topic: str
draft: dict
review: str
revision_notes: str
如DraftState中所見,我們主要關心討論的主題,以及審稿人和修訂筆記,因為它們相互溝通以完成子主題研究報告。為了創(chuàng)建循環(huán)條件,我們將利用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)
# 設置邊 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"})
通過定義條件邊,如果審稿人有審稿筆記,圖將指向修訂者,或者循環(huán)將以最終草稿結束。如果你回到已經構建的主圖,會看到這個并行工作是在由ChiefEditor智能體調用的名為“researcher”的節(jié)點下進行的。
2.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"
]
}
任務對象相當直觀,但請注意,如果follow_guidelines為false,則會導致圖忽略修訂步驟和定義的準則。此外,max_sections字段定義了要研究的子標題數(shù)量。數(shù)量較少將生成較短的報告。
運行助手會生成最終研究報告,格式包括Markdown、PDF和Docx等。
本文轉載自 ??AI科技論談??,作者: AI科技論談
