尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于LangGraph与多Agent系统构建AI热点追踪分析平台实战

基于LangGraph与多Agent系统构建AI热点追踪分析平台实战 如果你是一名开发者最近一定被各种AI新闻刷屏OpenAI发布新模型、Google更新Gemini、某大厂开源Agent框架……信息爆炸但真正有价值的热点是什么如何从海量信息中快速识别技术趋势而不是被动接收算法推荐更关键的是如何将这种信息处理能力自动化变成一个能7x24小时工作的智能助手这正是“多Agent 爬虫”技术栈要解决的核心问题。它不是一个简单的信息聚合器而是一个用AI工作流重构信息获取与分析逻辑的工程实践。过去我们写爬虫抓数据用脚本做分析流程僵硬难以应对复杂多变的网络结构和语义理解需求。现在通过LangGraph编排多个具备不同技能的AI Agent如爬虫Agent、分析Agent、总结Agent结合LangChain的工具调用能力我们可以构建一个能自主决策、协同工作的“数字团队”。本文将带你从零搭建一个AI热点追踪分析平台。这个平台能自动爬取指定来源如技术社区、博客、新闻由多个Agent协作完成内容抓取、关键信息提取、趋势分析和报告生成并通过FastAPI提供后端服务用Nuxt构建前端看板。这不是一个玩具项目而是一个融合了多智能体系统MAS、工作流编排、全栈开发的实战案例。读完本文你将掌握LangGraph的核心思想如何用“图”来定义和管理多Agent的协作流程与状态。多Agent系统的设计模式如何为不同任务爬取、解析、分析、存储设计专属Agent。工程化落地的完整路径从环境搭建、核心代码实现、到前后端联调和部署注意事项。避坑指南在多Agent系统中常见的循环依赖、状态管理、错误处理等问题的解决方案。我们开始吧。1. 为什么需要“多Agent爬虫”系统单一工具为什么不够在深入代码之前我们必须先理解问题的复杂性。传统的热点追踪方案通常面临几个瓶颈爬虫的脆弱性网站结构一变XPath或CSS选择器就失效需要人工维护。分析的局限性简单的关键词匹配无法理解上下文、识别新兴概念或判断技术价值。流程的割裂性爬取、清洗、分析、报告是独立的脚本或工具数据流转效率低错误难以追溯。缺乏自主决策系统无法根据内容质量自动调整抓取策略或分析深度。多Agent系统的核心价值在于“分工”与“协作”。我们可以将上述复杂任务分解交给不同的“专家”Agent调度Agent负责接收任务决定工作流走向。爬虫Agent不仅抓取HTML还能利用AI理解页面结构应对轻微变动。解析与过滤Agent提取正文过滤广告、导航等噪音并初步判断内容相关性。分析Agent对高质量内容进行摘要、情感分析、趋势归纳、关联性挖掘。报告生成Agent将分析结果整合成结构化报告如日报、周报。LangGraph在这里扮演“项目经理”的角色。它用“状态图StateGraph”来定义每个Agent的输入输出、执行顺序和条件分支并维护一个共享的“状态State”对象让所有Agent都能读写共同的工作上下文。这解决了传统脚本式流程中状态传递混乱的问题。而LangChain则为每个Agent提供了强大的“工具箱”Tools例如调用大模型API、执行计算、访问数据库等让Agent的能力得以具象化。所以这个平台的技术本质是用LangGraph编排基于LangChain构建的多个智能体形成一个具备感知、决策、执行能力的自动化工作流并以Web应用的形式提供交互界面。2. 核心概念与架构设计2.1 核心组件解析在开始搭建前我们先明确几个关键概念Agent智能体一个具备特定目标、能感知环境输入、使用工具Tools执行动作、并根据结果调整策略的程序实体。在我们的系统中每个Agent都是一个Python类或函数封装了特定的业务逻辑。Tool工具Agent可以调用的函数。例如一个“网络搜索Tool”或“数据库查询Tool”。LangChain内置了大量工具也支持自定义。State状态在工作流执行过程中所有Agent共享的数据容器。通常是一个Pydantic模型包含了输入、中间结果和最终输出。Node节点LangGraph图中的基本单元通常对应一个Agent或一个固定的操作如路由判断。Edge边连接节点的有向边定义了工作流的执行路径。可以是固定的也可以根据条件动态决定conditional_edge。Workflow工作流由Nodes和Edges构成的有向图完整描述了一个业务从开始到结束的自动化过程。2.2 系统架构图逻辑层面用户请求 | v [FastAPI 后端] --- [LangGraph 工作流引擎] | | | v | [共享状态 State] | / | \ | / | \ | v v v | [爬虫Agent] [分析Agent] [报告Agent] | | | | | | | | | v v v | [外部网站] [LLM API] [数据库/文件] | v [Nuxt 前端看板] --- (数据可视化报告展示)工作流程简述用户通过前端或API触发一个热点分析任务如“分析今日CSDN AI板块趋势”。FastAPI接收请求初始化一个LangGraph工作流并传入初始状态如目标URL列表、分析维度。LangGraph引擎根据定义好的图结构依次或并行调用各个Agent。爬虫Agent负责抓取内容并净化。分析Agent调用大模型如OpenAI GPT-4、Ollama本地模型对内容进行深度处理。报告Agent将结果结构化存入数据库如SQLite、PostgreSQL或生成文件。工作流结束最终状态被返回给FastAPI。FastAPI将处理后的数据返回给Nuxt前端前端进行可视化展示。3. 环境准备与项目初始化我们使用Python作为后端和AI工作流的主要语言。3.1 创建项目目录结构mkdir ai-hotspot-platform cd ai-hotspot-platform mkdir -p backend/core backend/api backend/models frontend项目结构规划ai-hotspot-platform/ ├── backend/ # FastAPI后端 │ ├── core/ # 核心工作流、Agent定义 │ │ ├── agents/ # 各个Agent的实现 │ │ ├── graph/ # LangGraph图定义 │ │ ├── state.py # 状态模型定义 │ │ └── tools.py # 自定义工具 │ ├── api/ # FastAPI路由 │ │ └── endpoints.py │ ├── models/ # Pydantic模型用于API请求/响应 │ ├── config.py # 配置文件 │ ├── database.py # 数据库连接 │ └── main.py # FastAPI应用入口 ├── frontend/ # Nuxt3前端后续可独立初始化 └── requirements.txt # Python依赖3.2 安装Python依赖创建backend/requirements.txt文件# 核心框架 fastapi0.104.1 uvicorn[standard]0.24.0 # LangChain LangGraph langchain0.0.340 langchain-community0.0.10 # 社区工具和集成 langgraph0.0.13 # 大模型接口 (以OpenAI为例也可用Ollama) openai1.3.0 langchain-openai0.0.2 # 爬虫与网页解析 httpx0.25.1 beautifulsoup44.12.2 lxml4.9.3 # 数据库 (以SQLite为例轻量) sqlalchemy2.0.23 aiosqlite0.19.0 # 异步SQLite驱动 # 数据处理与工具 pydantic2.5.0 pydantic-settings2.1.0 python-dotenv1.0.0安装依赖cd backend pip install -r requirements.txt重要提示使用大模型API如OpenAI需要配置API Key。请在项目根目录创建.env文件并添加你的密钥# .env OPENAI_API_KEYsk-your-openai-api-key-here # 如果用其他模型如Azure OpenAI或Ollama也在此配置 # AZURE_OPENAI_API_KEY... # OLLAMA_BASE_URLhttp://localhost:114344. 定义核心状态与工具4.1 状态模型State状态是所有Agent沟通的桥梁。在backend/core/state.py中定义from typing import List, Optional, Dict, Any from pydantic import BaseModel, Field from datetime import datetime class AnalysisResult(BaseModel): 单条内容的分析结果 title: str url: str summary: str # AI生成的摘要 keywords: List[str] # 提取的关键词 sentiment: Optional[str] None # 情感倾向如positive, neutral category: Optional[str] None # 分类如“LLM”、“框架”、“行业动态” published_at: Optional[datetime] None raw_content: Optional[str] None # 原始文本可选存储 class HotspotPlatformState(BaseModel): LangGraph工作流的共享状态 # 输入 task_description: str Field(description任务描述如分析今日AI趋势) target_urls: List[str] Field(default_factorylist, description待抓取的URL列表) # 中间结果 raw_htmls: Dict[str, str] Field(default_factorydict, descriptionURL - 原始HTML) cleaned_contents: Dict[str, str] Field(default_factorydict, descriptionURL - 清洗后的正文) analysis_results: List[AnalysisResult] Field(default_factorylist, description所有分析结果) # 输出与元数据 final_report: Optional[str] None # 最终生成的报告文本 error_messages: List[str] Field(default_factorylist, description运行过程中的错误信息) current_step: str Field(defaultinit, description当前执行步骤)4.2 自定义工具Tools在backend/core/tools.py中我们定义一些爬虫和数据处理工具import httpx from bs4 import BeautifulSoup from langchain.tools import tool from typing import Optional import logging logger logging.getLogger(__name__) tool def fetch_webpage(url: str) - str: 抓取给定URL的网页内容。 try: headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } async with httpx.AsyncClient(timeout10.0) as client: resp await client.get(url, headersheaders, follow_redirectsTrue) resp.raise_for_status() return resp.text except Exception as e: logger.error(f抓取 {url} 失败: {e}) return tool def extract_main_content(html: str) - str: 从HTML中提取正文内容移除导航、广告、脚本等噪音。 try: soup BeautifulSoup(html, lxml) # 移除无关标签 for tag in soup([script, style, nav, footer, aside, header]): tag.decompose() # 简单的启发式方法寻找包含最多文本的标签 # 实际项目中可使用更复杂的算法如readability-lxml main_content soup.find(article) or soup.find(main) or soup.body if main_content: text main_content.get_text(separator\n, stripTrue) # 合并多余空行 lines [line.strip() for line in text.splitlines() if line.strip()] return \n.join(lines) return except Exception as e: logger.error(f解析HTML失败: {e}) return 5. 构建多Agent工作流LangGraph核心这是项目的核心。我们在backend/core/graph/workflow.py中构建一个包含多个Agent的图。5.1 定义各个Agent节点首先定义每个Agent对应的函数。它们接收State修改State并返回更新后的State。from typing import Annotated from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.schema import SystemMessage, HumanMessage import json from ..state import HotspotPlatformState from ..tools import fetch_webpage, extract_main_content import logging logger logging.getLogger(__name__) # 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo-1106, temperature0.1) # 使用gpt-3.5-turbo保证速度与成本 def crawler_agent(state: HotspotPlatformState) - HotspotPlatformState: 爬虫Agent并发抓取所有目标URL的页面。 import asyncio logger.info(f爬虫Agent开始工作目标URL数: {len(state.target_urls)}) async def fetch_one(url): html await fetch_webpage.invoke({url: url}) return url, html async def fetch_all(): tasks [fetch_one(url) for url in state.target_urls] results await asyncio.gather(*tasks, return_exceptionsTrue) return results # 注意在同步函数中运行异步代码仅用于演示。生产环境建议全异步。 loop asyncio.new_event_loop() asyncio.set_event_loop(loop) try: fetched_results loop.run_until_complete(fetch_all()) finally: loop.close() new_raw_htmls state.raw_htmls.copy() for result in fetched_results: if isinstance(result, Exception): logger.error(f抓取任务失败: {result}) state.error_messages.append(f抓取失败: {result}) continue url, html result if html: new_raw_htmls[url] html else: state.error_messages.append(fURL返回空内容: {url}) state.raw_htmls new_raw_htmls state.current_step crawled return state def parser_agent(state: HotspotPlatformState) - HotspotPlatformState: 解析Agent清洗抓取到的HTML提取正文。 logger.info(f解析Agent开始工作待解析HTML数: {len(state.raw_htmls)}) new_cleaned_contents state.cleaned_contents.copy() for url, html in state.raw_htmls.items(): if not html: continue # 注意extract_main_content是同步函数这里直接调用 # 如果工具是异步的需要类似crawler_agent中的异步处理 content extract_main_content.invoke({html: html}) if content: new_cleaned_contents[url] content else: logger.warning(f无法从URL提取正文: {url}) state.cleaned_contents new_cleaned_contents state.current_step parsed return state def analysis_agent(state: HotspotPlatformState) - HotspotPlatformState: 分析Agent调用LLM对清洗后的内容进行深度分析。 logger.info(f分析Agent开始工作待分析内容数: {len(state.cleaned_contents)}) analysis_prompt ChatPromptTemplate.from_messages([ SystemMessage(content你是一个资深技术分析师。请对提供的技术文章内容进行深度分析。), HumanMessage(content 请分析以下技术内容 {content} 请以JSON格式返回分析结果包含以下字段 - title: 文章标题或核心主题若原文无标题请总结一个 - summary: 不超过150字的摘要 - keywords: 3-5个关键词 - sentiment: 内容的情感倾向可选值positive积极、neutral中性、negative消极 - category: 内容所属的技术类别如“LLM”、“Python”、“前端框架”、“云计算”等。 只返回JSON不要有其他解释。 ) ]) new_results [] for url, content in state.cleaned_contents.items(): if not content or len(content) 50: # 内容太短则跳过 continue # 截取前3000字符以避免token超限根据模型调整 content_snippet content[:3000] try: # 调用LLM messages analysis_prompt.format_messages(contentcontent_snippet) response llm.invoke(messages) # 解析返回的JSON result_dict json.loads(response.content) # 构建AnalysisResult对象 from ..state import AnalysisResult analysis_result AnalysisResult( titleresult_dict.get(title, Unknown), urlurl, summaryresult_dict.get(summary, ), keywordsresult_dict.get(keywords, []), sentimentresult_dict.get(sentiment), categoryresult_dict.get(category), raw_contentcontent_snippet # 存储片段 ) new_results.append(analysis_result) except json.JSONDecodeError as e: logger.error(f解析LLM返回的JSON失败: {e}, 响应内容: {response.content}) state.error_messages.append(f分析内容失败JSON解析错误: {url}) except Exception as e: logger.error(f分析内容时发生未知错误: {e}) state.error_messages.append(f分析内容失败: {url}) state.analysis_results new_results state.current_step analyzed return state def report_agent(state: HotspotPlatformState) - HotspotPlatformState: 报告生成Agent基于所有分析结果生成一份综合报告。 logger.info(f报告Agent开始工作分析结果数: {len(state.analysis_results)}) if not state.analysis_results: state.final_report 未获取到有效的分析结果无法生成报告。 state.current_step reported return state # 准备报告生成的数据 results_data [] for r in state.analysis_results: results_data.append({ title: r.title, url: r.url, summary: r.summary, keywords: r.keywords, category: r.category }) report_prompt ChatPromptTemplate.from_messages([ SystemMessage(content你是一个技术趋势报告撰写专家。请根据多条技术内容分析结果生成一份简洁明了的每日技术热点报告。), HumanMessage(contentf 以下是今天抓取并分析的{len(results_data)}条技术内容摘要 {json.dumps(results_data, ensure_asciiFalse, indent2)} 请生成一份报告包含以下部分 1. **今日概览**用一两句话总结整体趋势。 2. **热点分类**按技术类别如LLM、前端、后端等归纳内容。 3. **关键发现**列出2-3个最值得关注的趋势或话题。 4. **推荐阅读**给出1-2条最值得深入阅读的文章链接及理由。 报告语言为中文风格专业且清晰。 ) ]) try: messages report_prompt.format_messages() response llm.invoke(messages) state.final_report response.content except Exception as e: logger.error(f生成报告失败: {e}) state.final_report 报告生成失败。 state.error_messages.append(f报告生成失败: {e}) state.current_step reported return state5.2 组装工作流图在同一个文件中继续定义图def create_hotspot_workflow() - StateGraph: 创建并返回热点分析工作流图。 # 1. 初始化图指定状态类型 workflow StateGraph(HotspotPlatformState) # 2. 添加节点每个Agent函数就是一个节点 workflow.add_node(crawler, crawler_agent) workflow.add_node(parser, parser_agent) workflow.add_node(analyzer, analysis_agent) workflow.add_node(reporter, report_agent) # 3. 设置入口点 workflow.set_entry_point(crawler) # 4. 添加边定义执行顺序 workflow.add_edge(crawler, parser) workflow.add_edge(parser, analyzer) workflow.add_edge(analyzer, reporter) workflow.add_edge(reporter, END) # END是LangGraph内置的结束节点 # 5. 编译图 return workflow.compile() # 创建图实例 hotspot_graph create_hotspot_workflow()这个图定义了一个简单的线性流程爬取 - 解析 - 分析 - 生成报告。在实际更复杂的场景中你可以使用add_conditional_edges来创建分支例如当爬取失败时跳转到错误处理节点。6. 集成FastAPI后端现在我们将这个工作流封装成HTTP API。6.1 定义API模型与路由在backend/api/endpoints.py中from fastapi import APIRouter, HTTPException, BackgroundTasks from pydantic import BaseModel from typing import List, Optional from datetime import datetime import uuid from ..core.graph.workflow import hotspot_graph from ..core.state import HotspotPlatformState router APIRouter(prefix/api/v1, tags[hotspot]) # 请求模型 class AnalysisRequest(BaseModel): task_description: str target_urls: List[str] # 响应模型 class AnalysisResponse(BaseModel): task_id: str status: str # “submitted”, “processing”, “completed”, “failed” final_report: Optional[str] None analysis_results: Optional[List[dict]] None error_messages: Optional[List[str]] None created_at: datetime updated_at: datetime # 简单的内存存储用于演示。生产环境请用数据库或消息队列。 tasks_store {} router.post(/analyze, response_modelAnalysisResponse) async def create_analysis_task(request: AnalysisRequest, background_tasks: BackgroundTasks): 提交一个新的热点分析任务。 task_id str(uuid.uuid4()) # 初始化状态 initial_state HotspotPlatformState( task_descriptionrequest.task_description, target_urlsrequest.target_urls, current_stepinit ) # 存储任务初始状态 tasks_store[task_id] { status: submitted, state: initial_state, created_at: datetime.now(), updated_at: datetime.now() } # 将实际执行放入后台任务避免阻塞HTTP响应 background_tasks.add_task(execute_workflow, task_id, initial_state) return AnalysisResponse( task_idtask_id, statussubmitted, created_attasks_store[task_id][created_at], updated_attasks_store[task_id][updated_at] ) async def execute_workflow(task_id: str, state: HotspotPlatformState): 在后台执行LangGraph工作流。 try: tasks_store[task_id][status] processing tasks_store[task_id][updated_at] datetime.now() # 执行图 final_state hotspot_graph.invoke(state) # 更新存储 tasks_store[task_id].update({ status: completed, state: final_state, updated_at: datetime.now(), final_report: final_state.final_report, analysis_results: [r.dict() for r in final_state.analysis_results], error_messages: final_state.error_messages }) except Exception as e: tasks_store[task_id].update({ status: failed, updated_at: datetime.now(), error_messages: [f工作流执行失败: {str(e)}] }) # 这里应该记录更详细的日志 print(fTask {task_id} failed: {e}) router.get(/tasks/{task_id}, response_modelAnalysisResponse) async def get_task_status(task_id: str): 根据任务ID查询分析结果。 if task_id not in tasks_store: raise HTTPException(status_code404, detailTask not found) task_data tasks_store[task_id] state task_data.get(state) return AnalysisResponse( task_idtask_id, statustask_data[status], final_reporttask_data.get(final_report), analysis_resultstask_data.get(analysis_results), error_messagestask_data.get(error_messages), created_attask_data[created_at], updated_attask_data[updated_at] )6.2 创建FastAPI主应用在backend/main.py中from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from .api.endpoints import router as hotspot_router import uvicorn app FastAPI(titleAI热点追踪分析平台 API, version1.0.0) # 配置CORS以便前端访问 app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境应指定具体前端地址 allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 注册路由 app.include_router(hotspot_router) app.get(/) async def root(): return {message: AI热点追踪分析平台后端服务已启动, docs: /docs} if __name__ __main__: uvicorn.run(main:app, host0.0.0.0, port8000, reloadTrue)7. 运行与测试7.1 启动后端服务在backend目录下运行python main.py或使用uvicorn命令uvicorn main:app --reload --host 0.0.0.0 --port 8000服务启动后访问http://localhost:8000/docs即可看到自动生成的Swagger API文档。7.2 测试API我们可以使用curl或 Pythonrequests库进行测试。创建一个简单的测试脚本test_request.pyimport requests import json import time API_BASE http://localhost:8000/api/v1 # 1. 提交任务 task_data { task_description: 分析今日AI与Python相关热点, target_urls: [ https://blog.csdn.net/nav/ai, # CSDN AI社区示例实际需可访问链接 # 此处应替换为真实、可公开访问且允许爬虫的技术文章链接 # 例如https://example.com/tech-article-1 ] } print(提交分析任务...) resp requests.post(f{API_BASE}/analyze, jsontask_data) if resp.status_code ! 200: print(f提交失败: {resp.text}) exit() task_info resp.json() task_id task_info[task_id] print(f任务创建成功ID: {task_id}) # 2. 轮询查询结果 max_attempts 30 # 最大轮询次数 for i in range(max_attempts): print(f查询进度 ({i1}/{max_attempts})...) status_resp requests.get(f{API_BASE}/tasks/{task_id}) status_data status_resp.json() current_status status_data[status] print(f当前状态: {current_status}) if current_status completed: print(\n 任务完成 ) print(f最终报告:\n{status_data.get(final_report)}) print(f\n分析结果数量: {len(status_data.get(analysis_results, []))}) break elif current_status failed: print(f\n任务失败: {status_data.get(error_messages)}) break elif current_status processing: time.sleep(5) # 等待5秒再查询 else: # submitted time.sleep(3) else: print(查询超时任务可能仍在处理中。)重要提示测试前请务必将target_urls替换为真实、可公开访问且你拥有抓取权限的网页链接。直接抓取CSDN首页可能触发反爬机制建议使用其公开的RSS接口或寻找允许爬虫的技术博客。8. 常见问题与排查思路在多Agent系统开发中你会遇到一些典型问题。下表列出了常见问题及其解决方法问题现象可能原因排查方式解决方案LangGraph节点不执行1. 节点函数未正确添加到图。2. 边Edge未正确连接。3. 状态State模型字段类型不匹配。1. 检查workflow.add_node调用。2. 使用workflow.get_graph().draw_mermaid()输出图结构可视化。3. 检查节点函数输入输出是否为State类型。1. 确保所有节点都已添加。2. 检查add_edge或add_conditional_edges逻辑。3. 确保节点函数接收并返回完整的State对象。LLM调用超时或无响应1. API Key错误或额度不足。2. 网络问题。3. 请求Token数超限。1. 检查.env文件配置。2. 尝试简单的llm.invoke(“Hello”)测试。3. 查看LLM提供商的控制台日志。1. 确认API Key有效且有余量。2. 设置合理的超时时间如timeout30。3. 对长文本进行截断或分段处理。爬虫被网站屏蔽1. User-Agent被识别。2. 请求频率过高。3. 网站有JavaScript渲染内容。1. 检查返回状态码如403、429。2. 查看返回内容是否包含验证码或封禁信息。1. 轮换User-Agent添加Referer等请求头。2. 在请求间添加随机延迟如time.sleep(random.uniform(1,3))。3. 考虑使用playwright或selenium处理动态页面。状态State更新未生效1. Pydantic模型字段使用了不可变类型如list,dict且未正确更新。2. 节点函数内修改了局部变量而非state对象。1. 打印节点执行前后的state。2. 检查字段是否为Field(default_factorylist)。1. 在节点函数内对list或dict字段创建副本修改后再赋值给state如state.raw_htmls new_dict。2. 确保直接对state的属性进行赋值。工作流卡在某个节点1. 节点函数内有无限循环或阻塞操作。2. 条件边conditional edge的逻辑永远返回同一个节点形成死循环。1. 在节点函数内添加日志观察执行到哪里。2. 检查条件边函数的返回值确保有结束路径返回END。1. 为可能阻塞的操作设置超时。2. 在条件边逻辑中确保所有可能的分支都有定义并且最终能流向END。内存占用过高1. State中存储了过大的原始数据如图片、完整HTML。2. 并行处理大量任务未做限制。1. 监控Python进程内存。2. 检查State中哪些字段体积最大。1. 在State中只存储必要的元数据和文本摘要原始数据可存入数据库或文件系统只保留引用。2. 使用asyncio.Semaphore限制并发数。9. 最佳实践与进阶优化上面的示例是一个可运行的最小可行产品MVP。要将其用于生产环境或更复杂的场景你需要考虑以下优化9.1 架构优化异步化改造将crawler_agent、parser_agent等全部改为async函数并使用langgraph的异步图执行器以真正实现高并发。引入消息队列对于长时间任务使用Celery Redis/RabbitMQ或Dramatiq将任务提交与执行解耦API快速返回task_id通过WebSocket或轮询通知前端结果。状态持久化不要用内存字典存储任务。将State序列化后存入数据库如PostgreSQL的JSONB字段实现任务状态的持久化和重启恢复。配置中心将模型API地址、超时时间、爬虫间隔等配置外置便于不同环境部署。9.2 Agent能力增强更智能的爬虫集成scrapy或playwright处理JavaScript渲染页面和复杂反爬策略。分析维度扩展让分析Agent不仅能做摘要和分类还能进行实体识别找出提到的人、公司、项目、关联分析发现不同文章间的共同话题、情感演变追踪。引入验证Agent在报告生成前增加一个“验证Agent”检查分析结果的一致性、去重、并过滤低质量内容。长期记忆利用LangGraph的Checkpointer或外接向量数据库如Chroma、Weaviate让系统能记住历史分析结果实现趋势的跨周期对比。9.3 工作流设计进阶条件分支与循环使用add_conditional_edges实现动态流程。例如如果爬虫失败率达到阈值则触发“人工审核”分支如果分析结果太少则让“爬虫Agent”去新的来源抓取形成循环。并行执行某些无依赖的节点可以并行。LangGraph支持通过State中的特定字段来协调并行分支。子图Subgraph将复杂的节点如整个分析流程封装成子图使主图结构更清晰也便于复用。9.4 前端Nuxt3集成建议初始化Nuxt项目在frontend目录下运行npx nuxilatest init .。创建任务提交页面一个表单用于输入任务描述和URL列表每行一个。创建任务状态看板使用WebSocket或定时轮询setInterval从/api/v1/tasks/{task_id}获取任务状态并实时更新进度条。报告可视化任务完成后展示生成的报告。可以使用ECharts或D3.js将分析结果中的关键词、类别分布以图表形式展示。历史任务查询后端需要新增一个列出所有任务的API前端据此实现历史记录查看功能。通过本文你不仅学会了如何用LangGraph和LangChain搭建一个多Agent系统更重要的是掌握了将AI工作流工程化的完整思路。从定义状态、设计Agent、组装工作流到集成Web框架、处理异常、规划优化每一步都是构建复杂AI应用不可或缺的环节。这个平台只是一个起点。你可以在此基础上接入更多数据源GitHub趋势、论文网站、集成更强大的模型本地Ollama、GLM、设计更复杂的决策逻辑让它真正成为你技术视野的延伸。
返回列表