Agent Engineering 课程阅读
首页/课程三 · 框架进阶/Lesson 09 练习 — 毕业项目:LangGraph 研究助手

在 GitHub 查看原文

本页目录

Lesson 09 练习 — 毕业项目:LangGraph 研究助手

这是框架课程的毕业项目。练习重点是"扩展图"和"对比手写版",为简历和面试做准备。


练习 1:把 Mermaid 图可视化(5 分钟)

运行 code.py,复制打印出的 Mermaid 代码,粘贴到 mermaid.live

观察: - 图有几个节点?几条边? - 条件边和回路在哪里? - 对比你 Agent L09 手写时"读代码才能理解流程"——图的视觉化价值有多大?

面试时能画出这张图并解释数据流,是高级候选人的表现。


练习 2:加一个"报告审查"节点(核心扩展练习,20 分钟)

当前图是 research → report → END。加一个 review 节点,审查报告质量:

research → report → review →(条件)→ END(合格)
                              → research(不合格,重新搜索补充)

要求: 1. 定义 review 节点:让 LLM 检查报告是否信息充分、有无明显错误 2. 在 State 里加一个 review_passed: bool 字段 3. 用条件边:合格 → END,不合格 → 回到 research 4. 设置最大重审次数(防止死循环)

思考:这个扩展在手写 Agent L09 的 while 循环里有多难?(对比图的"加节点+连边")

这就是图的杀手锏:扩展只需要加节点和边,不用重构整个循环逻辑。


练习 3:对比手写版和图版本的报告质量(10 分钟)

用同一个研究主题,分别跑: - agent-lessons/09_capstone/code.py(手写 ReAct 循环) - framework-lessons/09_capstone/code.py(LangGraph 图)

对比: 1. 两个版本搜索了几次?报告质量孰优? 2. 哪个版本的搜索过程更清晰?(看打印的轨迹) 3. 如果搜索限流了,两个版本的恢复能力如何?

两者原理相同(都是搜索→收集→报告),差异在工程结构。报告质量主要取决于 LLM 和搜索结果,而非用循环还是图。


练习 4:换一个研究主题测试泛化性(5 分钟)

part_2_research 的 topic 换成你感兴趣的领域,如: - "2025 年大模型发展的关键趋势" - "Python 异步编程的最佳实践" - "向量数据库的选型对比"

观察助手能否自主规划搜索策略、生成合理报告。

注意:DuckDuckGo 偶尔限流,如果连续"无结果",等几分钟或换关键词。


练习 5:给简历写项目描述(求职准备,15 分钟)

基于本课项目,写一段简历项目描述。要求: - 突出技术深度(不要只写"用 LangGraph 做了个 Agent") - 体现你懂原理(手写过 vs 框架版的对比认知) - 量化(节点数、搜索轮数、对比手写省了多少代码)

参考模板:

基于 LangGraph 的智能研究助手
- 用 StateGraph 设计 N 节点 Agent 图(research→tools→report),
  集成 web_search 实现自主多轮联网搜索,输出结构化研究报告
- 用条件边替代手写版的字符串检测,Checkpointer 实现跨会话记忆
- 对比手写 ReAct 循环,流程可视化、代码量从 ~X 行降到 ~Y 行

把它改成你自己的话,确保面试时能解释每个技术选型的理由。


练习 6(进阶):接入 RAG 知识库作为工具(衔接 Agentic RAG)

参考 Agent L07(Agentic RAG),把 RAG 课程建好的知识库(员工手册)包装成一个 search_knowledge_base 工具,接到研究助手图里:

@tool
def search_knowledge_base(query: str) -> str:
    """搜索公司内部知识库(员工手册等)。查内部政策时使用。"""
    # 用 L04 的 retriever 检索
    docs = retriever.invoke(query)
    return "\n".join(d.page_content for d in docs)

这样助手就同时具备"查内部知识 + 联网搜索"两种能力——这就是 Agent L07 的 Agentic RAG 思路在框架里的落地。


思考题(不写代码)

  1. 为什么用自定义 State 而非 MessagesState? 如果只用 MessagesState,topic 和 report 存哪里?(提示:能不能塞进 messages?为什么不优雅)

  2. 条件边 {END: "report"} 这个映射是什么意思? 为什么要把默认的 END 路由到 report 节点?

  3. 这个图相比 Agent L09 手写循环,最大的工程价值是什么? 如果产品要求加"报告审查""多语言""用户审批"三个新功能,哪个版本更容易扩展?


完成标志

  • [ ] 能画出研究助手图的完整结构(节点+边+回路)
  • [ ] 跑通了自主搜索 + 报告生成的完整流程
  • [ ] 理解自定义 State 的价值(携带 topic + report)
  • [ ] 理解条件边如何替代字符串检测
  • [ ] 能向别人解释这个项目的技术选型(简历/面试级)

🎉 框架课程毕业

完成全部 9 课后,你已经拥有: - 📘 RAG 手写课程(9课):从 embedding 到评估的完整原理 - 🤖 Agent 手写课程(9课):从 Function Calling 到多智能体 - 🔧 框架进阶课程(9课):LangChain + LangGraph 工程化

共 27 课,3 个可写进简历的作品。 下一步:跑通所有毕业项目、写简历、准备面试。