Files
zhuangang/topics/ai/langgraph/interview.md
T

68 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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` 和状态里的步数计数器,达到上限后结束并返回已有结果或转人工;检测重复的工具调用(同名同参数)并提示模型换方法;在评测集中加入这类用例,分析是提示词、工具描述还是工具返回信息不足导致的。
**追问**:怎么在线上发现这类问题?→ 记录每次运行的步数和工具调用序列,监控步数分布和超过上限的比例。