





















第一轮面试官(技术负责人)
第二轮面试官(同事/交叉面)
排查召回效果应建立“检索漏斗 + 人工标注”的闭环:
LangGraph 的 HITL 核心依赖 Checkpoint(检查点)+ Interrupt(中断):
interrupt(),工作流挂起并把当前状态持久化到 checkpoint store(如 Redis/Postgres/SQLite)。graph.invoke(None, config),LangGraph 从 checkpoint 恢复状态继续下游节点。thread_id / checkpoint_id 不变,即使服务重启也能从断点继续。thread_id 作为隔离键;并发请求分别走不同 thread,互不影响。若需多端同步同一会话,后端以 thread_id 为 key 读写 checkpoint,前端轮询或 SSE 拉取最新状态。SSE 本身按建立连接顺序推送,乱序通常出现在“多轮并发请求”或“前端异步处理”场景:
seq 或 message_id,前端用优先队列暂存,按 seq 排序后再渲染。p-queue)保证上一条流式响应结束后再发下一条。created_at,前端做最终排序校准。若有实际项目,可从以下角度描述:
若暂无真实落地,可说明“有一定调研/ demo 经验”,并强调对跨端原理(JS Bridge、Fabric/TurboModules 新架构)的理解。
排查:
解决:
React.memo 包装展示型子组件。useMemo 缓存计算结果,useCallback 缓存事件处理函数并稳定子组件 props。react-window / react-virtualized 只渲染视口内节点。可从以下维度回答:
loading.js、Partial Prerendering(PPR)。见解:Monorepo 适合多应用、多包共享代码的场景,优势是统一依赖、原子提交、共享工具链;劣势是构建体积大、权限管理复杂,需要任务调度与缓存(Turborepo / Nx / Rush)。
目录结构示例:
1 | my-org/ |
apps:面向用户的可运行产物,有独立部署单元。packages:被 apps 依赖的复用模块,通常不直接部署。Harness 思路:把 AI 生成结果纳入 CI/CD 与人工 Review 双重校验:
强制约束:
CLAUDE.md / .cursorrules / copilot-instructions.md,写明:技术栈、目录约定、命名规范、禁用 API、必须使用的工具函数。软约束:
.cursorrules 文件和 Settings 中的 Rules for AI 注入系统/项目级指令。Cursor 的“钩子”更多是隐式的:模型在生成代码前会读取 .cursorrules,生成后可通过 Apply 应用到文件。Cursor 也支持 MCP Servers 扩展工具能力。cline_mcp_settings.json 中配置 MCP,Cline 在规划阶段调用工具,执行阶段写文件/运行命令。packages/ai-rules/ 里。--- description, globs ---)。.cursorrules、Claude 项目根目录、Cline custom instructions)。.mdc / .md 文件,包含 globs 匹配规则(如 src/components/Button/**/*)。两种方式的取舍:
建议混合:静态规范用 Skill 直接注入;动态/海量文档用 MCP + RAG 检索,Agent 根据问题自动选择调用。
mcpServers),包含名称、传输方式(stdio/sse)、命令/URL、环境变量、权限范围。STDIO 模式:Agent 与本地子进程通过标准输入输出通信。
SSE(HTTP)模式:通过 HTTP SSE 流远程连接 MCP Server。
选型建议:本地优先或数据敏感用 STDIO;需要多端共享、远程服务化用 SSE。也可以同时支持,由配置决定。
skill.json 或 MDC 文件头,声明:name、version、description、globs(生效文件范围)、triggers(触发关键词)、priority。.skills/)。SkillLoader 接口,支持 load()、unload()、match(context),方便后续接入不同来源的 Skill。若有,可描述:
若无,可说明当前通过配置文件/代码硬编码,并给出建设方向:先提供 JSON 配置化,再逐步做 UI 封装,降低非技术用户门槛。
可结合项目经验说明:
Copilot Kit 的优势:
useCopilotAction / renderAndWaitForResponse 等 API,可轻松在 AI 工作流中插入人工确认节点。Superpower + OpenSpec 工作流 是一种“规格驱动、AI 辅助实现”的流程:
价值:降低 AI 自由发挥导致的幻觉,让“想清楚”先于“写代码”,便于团队协作与验收。
管理方式:
docs/specs/ 或 specs/ 目录,与代码同仓库,方便 PR 时一起 Review。spec-2026-07-21-user-auth.md 或 features/user-auth/spec.md。不满意时的处理:
spec/draft/ 放初稿,评审通过后移到 spec/final/。spec/archive/,避免干扰主目录,但仍可审计。排查路径(先量化再动手)
调优手段(按性价比排序)
HITL 的本质
LangGraph 的 HITL 建立在 checkpoint(检查点)机制上。图在节点之间可设 interrupt_before / interrupt_after(或 Node.interrupt()),执行到断点时把当前状态写入 checkpointer 并暂停,等待人工输入(approve / edit / 提供字段)后通过 graph.ainvoke(input, config) 带着同一 thread_id 恢复。
重启(resume / replay)
thread_id 唯一定位对话;checkpoint_ns + checkpoint_id 可精确到某次快照,支持从任意历史 checkpoint replay 或 fork(复制状态开新分支)。多端并发
thread_id:每个用户/会话一个 thread_id,checkpointer 后端需支持并发写入(Postgres + 行锁 / 分布式锁),避免两个端同时写同一会话。SSE 底层是单条 TCP 长连接,HTTP/2 下同一流内帧是严格有序的,所以”纯文本 token 流”本身不会乱序。乱序几乎都来自应用层并发写或多路聚合:
write(delta),client 顺序 append,天然有序,无需序号。message_id,并行流各自写入对应 buffer,互不覆盖;index,client 收到先入队,按 seq 重排补齐后再上屏;核心原则:顺序由”消息 id + 序列号”在客户端重组,服务端避免多个生产者直接抢同一连接。
(按真实项目情况填写;以下为落地时涉及的关键点,可据实裁剪)
真实 RN 项目的几个硬骨头我都处理过:
(若实际无 RN 项目,可如实说明并切换到”我对 RN 架构的理解是…”,避免编造。)
排查
why-did-you-render 打印每次重渲染的原因(props 引用变了?context 变了?)。React.memo 包了就安全,结果父组件传了内联函数/新对象导致 memo 失效。解决(按根因)
useCallback 包回调、useMemo 包对象/数组,配合 React.memo 才有意义。useSelector(state => state.x, shallowEqual),只取自己需要的片段,相等则不重渲染。useTransition / useDeferredValue,让输入流畅、列表更新不阻塞交互。react-window / react-virtuoso,只渲染可视区。做过生产级 Next.js 项目,关键实践:
async/await 取数 + <Suspense> 流式渲染,骨架屏优先出水,提升首屏感知。fetch 的 revalidate、Route Segment Config(revalidate/dynamic);用 next/font、图片优化、边缘函数降延迟。generateMetadata 动态 title/OG,sitemap/robots。工具选型:pnpm workspace(快、省磁盘、严格依赖隔离)+ Turborepo / Nx(任务编排 + 远程缓存)。
典型结构
1 | apps/ # 可独立部署的应用 |
收益与坑:依赖提升(hoist)冲突(用 pnpm 的 strict + onlyBuiltDependencies 解决);Turborepo 按 DAG 并行 build、缓存命中跳过重复;CI 按 affected 只测改动包;共享 config 一处改全局生效,但需防止”误伤”其他包。
Harness = 把”让 AI 写出可靠代码”变成可复用的脚手架与门禁,而非靠 prompt 祈祷:
tsc --noEmit、ESLint、Prettier,编译不过不让合并。test + lint + typecheck + build,全绿才提交;失败把报错回喂给 AI 自修(有限次数)。软约束(提示层)
AGENTS.md / CLAUDE.md / .cursorrules / .clinerules,写明命名、目录、import 顺序、禁用写法;AI 启动时注入。.cursor/rules/*.mdc),按需命中注入,避免一次性塞爆上下文。强制(执行层,关键是把”规范”变成”可执行规则”)
any、import 顺序),AI 生成后自动 lint,违反即报错不可合并。tsc 严格模式 + pre-commit hook(Husky + lint-staged)拦在提交前。两类工具都有 hook 机制,在工具调用生命周期的节点插入自定义脚本:
PreToolUse(工具执行前,可拦截/拒绝)、PostToolUse(执行后)、UserPromptSubmit(用户提交前,可改写/附加上下文)、Notification、Stop(一轮结束)、SubagentStop。PreToolUse 拦危险命令(如 rm -rf、推送到主分支)、限制只改白名单目录;PostToolUse 自动 lint / format / 跑单测,把结果回注;UserPromptSubmit 自动附加项目规范、注入相关文件上下文;Stop 自动生成改动摘要 / 写 commit message / 触发审计日志。settings.json 的 hooks 字段按 event + matcher(匹配工具名/命令)注册 shell 命令;Cline 有类似 hooks 配置。核心思想:规范只写一份”真源”(canonical),各工具按需生成自己的消费格式。
AGENTS.md + 一份结构化规范(Markdown / YAML),涵盖命名、目录、lint、禁用项。.cursorrules 或 .cursor/rules/*.mdc.clinerules / .windsurfrules.github/copilot-instructions.mdCLAUDE.md目标:让 AI 自动知道”项目里有哪些组件、怎么用”,而不是靠人写文档。
packages/ui,提取每个组件的导出名、props(含类型与默认值)、文件路径、是否 deprecated。*.stories.tsx / examples/ / 单元测试里提取真实用法片段。SKILL.md(触发条件 + 组件索引 + 用法约束)+ 可选 references/ 放完整 API 表。取决于文档规模与访问模式:
@ 注入或 Skill 内 Read 本地文件,零额外服务、延迟低。缺点是占上下文、不适合频繁变动的大库。search_docs / fetch_doc 工具,AI 按需检索再读片段,避免一次性灌爆上下文,也便于权限控制与服务端更新。mcpServers(STDIO 模式给 command/args/env,SSE 模式给 url/headers)。启动时 Agent 拉起/连接 server,调用 list_tools 发现能力,把工具描述注入系统提示;运行时 planner 决定调用,框架负责参数 schema 校验与结果回传。SKILL.md(指令 + 可选脚本/引用)。命中意图时,框架把 SKILL.md 内容注入上下文,引导 agent 按既定流程做事;重逻辑可配脚本由 agent 调用。把 Skill 当成可插拔扩展点(extension slot),而非写死在代码里:
skill.json(name、description、triggers、permissions、所需 tools、依赖、版本、入口脚本)。Agent 启动时扫描目录 / 远程 registry 自动注册。有。我们提供用户侧 MCP 管理界面,能力包括:
mcp.json),与 agent 共享。核心:不让原始巨量数据直接进 LLM 上下文。
filter / paginate / aggregate / limit 参数,让 server 先算完再返少量结果,而不是 dump 1 万条。get_detail(ids) 拉详情,避免一次性全量。有涉及。典型模式:
CopilotKit 把”人类确认/介入”从后端 chore 变成前端一等公民:
CopilotAction / CopilotTask 可直接在 React 里渲染”确认/编辑表单”,用户在前端点一下就完成 approve,不需自己写 WebSocket + 前端状态同步 + 后端 checkpoint 恢复那一套。init / proposal / apply / archive:openspec/ 目录)版本化,随 PR 评审、可 diff、可 blame,保证”代码与意图”一致、可追溯。archive(标记完成/废弃)而非物理删除,保留决策轨迹——今天觉得烂的 spec,三个月后可能是”当初为什么没这么做”的关键证据。superseded-by: <new>,关系清晰。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。