阶段4(上):LangGraph、Function Calling、MCP(SDK 2.x)、Agent 评测与运维、Agent 设计专题;run_examples 设置 RUN_EXAMPLES=1

This commit is contained in:
Shikui Wang committed 2026-10-23 16:06:54 +08:00
1 parent 6650f7eb6d
commit caaec830b3
38 files changed
+3515 -64

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
---
id: ai.langgraph.interview
title: LangGraph 面试题
type: interview
domain: ai
stack: [langgraph]
tags: [LangGraph, 检查点, 人机协作, 面试]
level: intermediate
related: [ai.langgraph.state-graph, ai.langgraph.persistence-hitl]
week: [11, 12, 16]
---
# LangGraph 面试题
## 基础
### 【基础】LangGraph 解决什么问题?和 LangChain 是什么关系?
**参考答案**:LangGraph 用有状态的图来编排 Agent 和工作流,提供状态管理、条件分支、循环、检查点持久化、人工介入、流式事件。LangChain 提供模型、消息、工具等组件,LangChain 1.x 的 `create_agent` 底层也是基于 LangGraph 构建的。简单的单次调用用 LangChain 即可,复杂流程用 LangGraph。
**追问**:不用框架能做吗?→ 能,手写循环 + 状态表也可以;框架的价值是现成的持久化、恢复和事件流,代价是学习成本和版本变化。
### 【基础】State 和 reducer 是什么?
**参考答案**:State 是所有节点共享的数据结构,节点返回部分更新;reducer 决定某个字段如何合并,默认覆盖,列表可以用 `operator.add` 追加,消息用 `add_messages`(按 id 追加或替换)。
**追问**:两个并行节点同时更新一个没有 reducer 的字段会怎样?→ 会报错(同一步内多个更新冲突),需要给该字段定义 reducer。
### 【基础】`stream_mode` 有哪些?
**参考答案**:`values`(完整状态)、`updates`(节点的增量更新)、`messages`(大模型 token 流)、`custom`(节点主动发出的自定义事件)等,可以同时订阅多种。
**追问**:前端怎么拿到这些事件?→ 后端遍历 `astream` 的结果,转成 SSE 事件发送,前端按事件类型渲染进度和文本。
## 进阶
### 【进阶】checkpointer 保存了什么?有什么用?
**参考答案**:每一步执行后保存的状态快照、下一步要执行的节点、待处理的中断等,按 `thread_id` 组织。用途:多轮对话记忆、人工审批暂停 / 恢复、崩溃后续跑、查看历史和回溯(time travel)。
**追问**:生产环境用什么?→ PostgreSQL 等持久化实现;要考虑检查点表的增长和定期清理。
### 【进阶】interrupt 的工作原理和注意事项?
**参考答案**:节点中调用 `interrupt(value)` 会抛出特殊信号,图暂停并保存状态,`value` 返回给调用方;调用 `Command(resume=x)` 后,该节点从头重新执行,这一次 `interrupt()` 返回 x。注意 interrupt 之前的代码会重复执行,不能有副作用;一个节点里多个 interrupt 按顺序匹配 resume 值。
**追问**:需要用户修改 Agent 生成的参数后再执行,怎么做?→ interrupt 返回用户编辑后的参数,节点用新参数执行工具调用。
### 【进阶】Agent 执行中服务崩溃了,怎么恢复?
**参考答案**:有检查点时,用同一个 `thread_id` 调用 `invoke(None, config)` 从最近的检查点继续;已完成节点不会重新执行,但崩溃时正在执行的节点会重新执行,所以有副作用的节点要幂等。多实例部署时用租约避免重复恢复。
**追问**:怎么发现“卡住”的任务?→ 业务表记录状态和更新时间,定时任务扫描长时间未更新的任务并告警或自动恢复。
## 场景题
### 【场景题】设计一个需要人工审批的退款 Agent。
**参考答案**:分类(结构化输出校验)→ 起草(重试临时错误)→ 金额超过阈值时 interrupt 等待审批 → 执行退款(幂等键)→ 通知。检查点存 PostgreSQL,thread_id 为工单号;状态同步到业务表;审批接口校验当前状态和审批权限;SSE 推送进度。详见[退款工单场景](scenarios/refund-approval.md)。
**追问**:审批超时怎么办?→ 定时任务检查等待时间,提醒或升级给上级;超过期限自动拒绝并通知用户。
### 【场景题】Agent 偶尔陷入循环,反复调用同一个工具,怎么处理?
**参考答案**:设置 `recursion_limit` 和状态里的步数计数器,达到上限后结束并返回已有结果或转人工;检测重复的工具调用(同名同参数)并提示模型换方法;在评测集中加入这类用例,分析是提示词、工具描述还是工具返回信息不足导致的。
**追问**:怎么在线上发现这类问题?→ 记录每次运行的步数和工具调用序列,监控步数分布和超过上限的比例。