我们再以深度调研助手为例,更细致地理解二者之间的区别。
假设这款深度调研助手的业务需求如下:首先浏览网页,查找与指定主题相关的信息,我们以调研特斯拉财报电话会议为例。随后,助手需要阅读并理解来自博客、论坛、研究论文以及社交媒体的各类资讯源。最后,判断这些信息是否可信、是否具备参考价值。 每一条信息源的可信度评分必须高于 75%,才能被认定为可靠来源。助手的最终任务是汇总所有可信信息,生成一份调研报告。
如果采用传统开发方式,你需要编写大量代码: 第一,调用搜索引擎接口获取一批链接; 第二,手动循环遍历所有链接; 第三,抓取网页内容,并交付大模型处理; 第四,为每条信息源生成可信度评分; 第五,校验评分,仅保留分值超过 75% 的来源; 第六,整理分析有效信息,写入报告。 你不仅要独立实现以上每一段代码,还需要手动编排代码执行顺序,整体维护成本很高。
而借助 LangGraph,整套流程会简洁很多。整个业务流程可以抽象为一张状态图:每个节点负责一项明确任务,边用来定义数据流转与执行次序。 对应这个场景,我们需要创建如下节点:
- 搜索并收集信息源节点
- 网页抓取与内容清洗节点
- 调用大模型评估信息可信度节点
- 从信息源提取客观事实节点
- 生成最终报告节点
完成所有节点与流转边的配置并编译之后,LangGraph 会按照预设规则自动调度执行流程。
落实到这个深度调研助手上,整张流程图大致结构如下:存在一个起始节点作为工作流入口,各类节点与流转边分别执行独立任务,最终由终止节点结束整条工作流。
一、先提炼核心对比:传统代码流程 VS LangGraph 实现深度调研助手
传统线性代码模式痛点
整套逻辑是硬编码串行流程: 搜索链接 → 循环爬取网页 → LLM 打分 → 过滤≥75 分来源 → 抽取事实 → 生成报告
- 执行顺序写死在代码里;想要分支、重试、回退、并行、循环必须手写大量控制逻辑;
- 状态需要自己维护:抓取失败、接口超时、LLM 输出格式异常、评分失败,全部手动处理;
- 流程可视化差,新增环节(比如增加 “事实交叉验证” 节点)需要大幅改动原有代码;
- 很难支持动态分支:例如「可信度低于 50 分自动触发二次搜索补充佐证信息」这种分支逻辑实现繁琐。
LangGraph 核心思路
把业务抽象成有状态图(State Graph)
- Node(节点):最小执行单元,对应单一任务(搜索、爬取、可信度评估、事实抽取、报告生成)
- State(状态):全局共享容器,保存链接列表、网页文本、可信度分数、有效事实、报告草稿等全部上下文
- Edge(边):定义流转规则
- 普通边:固定流转
A → B - 条件边:根据状态数据动态选择下一个节点(核心优势)
- 普通边:固定流转
你案例里的 5 个节点映射梳理
- 搜索并收集信息源节点 输入:调研主题(特斯拉财报电话会议) 输出:候选 URL 列表,写入全局 State
- 网页抓取与内容清洗节点 输入:待爬取 URL 输出:清洗后的正文文本
- 大模型评估信息可信度节点 输入:网页正文 + 来源类型(博客 / 论坛 / 研报 / 社交平台) 输出:0~100 可信度评分
- 从信息源提取客观事实节点 前置条件:可信度分数>75 输入:高可信网页内容 输出:结构化事实条目
- 生成最终报告节点 输入:全部可信事实集合 输出:完整调研报告
二、基于场景补充典型流转设计(完善你的流程图逻辑)
基础流转主线
起始节点 → 搜索信息源节点 → 网页抓取清洗节点 → 可信度评估节点条件分支(LangGraph 最强能力)
- 分支 1:可信度评分 >75 → 进入【事实提取节点】
- 分支 2:可信度评分 ≤75 → 直接丢弃本条数据,回到队列处理下一条链接
事实提取完成后,判断:是否还有未处理 URL
- 还有链接:继续循环执行抓取、评估流程
- 全部链接处理完毕:流转至【生成最终报告节点】→ 终止节点
传统代码实现这种「循环 + 条件过滤」需要手写 while 循环、分支判断;LangGraph 仅需要定义条件边,框架自动调度。
三、拓展:这个调研案例可以延伸的进阶优化(LangGraph 天然支持)
- 失败重试节点网页抓取超时、LLM 调用失败,通过状态标记自动重试,无需手动写异常循环;
- 并行执行多个网页同时抓取、并行评估多条资讯可信度,图原生支持并行分支;
- 新增校验节点后续需求增加「事实交叉比对」,只需要新增一个节点,修改边连接,不用重构整条链路;
- 人工介入分支遇到评分在 70~75 分边缘来源,可以分支路由到人工复核节点;
- 持久化状态支持断点续跑,流程中断后可以从当前状态继续执行调研。
四、一段极简伪代码示意,直观感受差异
传统方式伪代码(高度耦合)
# 硬编码串行 urls = search("特斯拉财报电话会议") valid_facts = [] for url in urls: content = crawl(url) score = llm_evaluate_trust(content) if score > 75: fact = extract_fact(content) valid_facts.append(fact) report = generate_report(valid_facts)所有控制逻辑写死,循环、分支、异常处理全部自己维护。
LangGraph 伪代码(解耦、声明式定义流程)
# 1. 定义全局状态 class ResearchState(TypedDict): topic: str urls: list[str] source_contents: list trust_scores: list[int] valid_facts: list report: str # 2. 注册各个独立节点 graph.add_node("search_source", search_source_node) graph.add_node("crawl_clean", crawl_node) graph.add_node("evaluate_trust", evaluate_node) graph.add_node("extract_fact", extract_node) graph.add_node("build_report", report_node) # 3. 定义流转与条件分支 graph.add_edge(START, "search_source") graph.add_edge("search_source", "crawl_clean") graph.add_edge("crawl_clean", "evaluate_trust") # 条件路由:根据可信度分数分流 graph.add_conditional_edges( "evaluate_trust", route_by_score, # 自定义路由函数读取state中的score { "trust_pass": "extract_fact", "trust_fail": "crawl_clean" # 处理下一条链接 } ) graph.add_edge("extract_fact", "crawl_clean") graph.add_edge("build_report", END)五、一句话总结二者本质区别
传统开发:顺序执行的指令清单,开发者手动控制每一步什么时候跑、怎么跳转; LangGraph:声明式定义任务节点与流转规则,框架根据状态自动调度工作流,天然支持分支、循环、动态路由,非常适合调研、智能代理这类存在大量条件判断、多步骤迭代的 Agent 场景。