给后端开发者的AI Agent项目:2000行Java从零实现,面试能讲30分钟,一个仿claude code项目
文章目录一、这是什么二、为什么这个项目能帮你找实习面试官想看什么简历上可以怎么写三、面试能聊的技术亮点亮点 1Agent 主循环——while(true) 而不是框架黑盒亮点 2手写 MCP 协议——150 行零 SDK亮点 3三层上下文压缩——比扔给 LLM 摘要高一个维度亮点 4Subagent 隔离——在定义层切断递归亮点 5Prompt Caching——靠架构不靠 API四、学这个项目的路线第一周跑起来看懂主循环第二周改一个工具第三周准备面试话术第四周写进简历开始投五、和其他学习项目比六、项目还有这些细节总结GitHub 仓库https://github.com/cookie250825/mvp-claude-code⭐ 觉得有用就 Star 一下找实习时这就是你的项目经验。今年 Java 后端的实习岗位JD 里开始出现这些词了大模型应用、Agent 开发、MCP 协议、LangChain。你简历上写什么“精通 Spring Boot、熟悉 Redis”——面试官一天看 50 份这样的简历。我写了一个项目专门给后端开发者的纯 Java2000 行代码从零实现一个 AI 编程助手。和 Claude Code 一样的架构但每一行代码都是你自己能看懂、能讲清的。不是套壳不是调 API 玩具。是一个完整的 Agent 引擎——面试能讲 30 分钟的那种。一、这是什么你在终端里敲一行字 帮我在 src 目录下找到所有用到 ThreadPoolExecutor 的地方看看有没有忘记关的它就去读文件、搜索代码、执行命令几轮工具调用之后给你答案。像一个真正的工程师坐在键盘前面。架构图和 Claude Code 完全一致是否纯文本含工具调用批准file/bash/searchtaskMCP用户输入AgentLoop.processBackgroundManager.drain\n后台任务通知注入microCompact\n旧工具输出裁剪token 阈值?LLM 摘要压缩ContextBuilder.build\n可缓存前缀 动态历史AIService.streamingChat\n流式输出 token流式输出 ✅ToolExecutionConfirmation\n用户确认 y/n/aToolDispatcher 路由工具类型内置工具SubagentRunner\n独立上下文 防递归MCPClient\nJSON-RPC over stdioToolResult 写回 history下轮循环关键数字2000 行 Java、7 个 Maven 依赖、零 Spring Boot、零数据库。整个项目就是一个 jar 包跑起来就行。二、为什么这个项目能帮你找实习面试官想看什么后端实习面试面试官心里有三个问题你能不能独立看懂一个系统代码阅读能力你对自己的代码能不能讲清楚为什么这样写工程判断力除了 CRUD你还了解什么技术广度这个项目帮你同时回答这三个问题。简历上可以怎么写MVP Claude Code开源— 核心开发者用 Java 从零实现类 Claude Code 的 AI 编程助手2000 行代码手写 MCP 协议客户端JSON-RPC over stdio零 SDK 依赖支持接入外部工具生态设计三层上下文压缩策略Micro/Auto/Manual解决 LLM 长对话 token 爆炸问题实现 Subagent 子任务隔离机制在工具定义层切断递归技术栈Java 17、LangChain4j、DeepSeek API、Picocli、Jackson五条就够。每一条都是面试官能追问的点——追问了你都能接住这就是好简历。三、面试能聊的技术亮点下面这五个点每个面试都能讲 5-10 分钟。我写项目时专门留了面试话术——docs/HARNESS_DESIGN.md里每个组件都有。亮点 1Agent 主循环——while(true) 而不是框架黑盒大部分 AI 项目靠 LangChain 的AgentExecutor几行配置跑起来但面试一问细节就崩。我是手写的for(intround1;roundMAX_ROUNDS;round){// 1. 排空后台任务通知// 2. microCompact — 零成本裁剪旧工具输出// 3. autoCompact — token 超阈值时 LLM 摘要// 4. 流式调用 LLM// 5. 工具调用→ 确认 → 执行 → 写回结果// 6. 纯文本→ 返回给用户}面试官追问为什么不用 AiServices时你能讲出可控性——框架是黑盒手写循环让你在每一步都能插入自己的逻辑。亮点 2手写 MCP 协议——150 行零 SDKMCPModel Context Protocol是今年最热的 Agent 协议。大部分项目直接用 MCP SDK这没问题但面试没得聊。我自己实现了完整的 JSON-RPC 握手// 标准 MCP 握手流程send(initialize)→ 声明协议版本和客户端能力recv()→ 获取服务端能力send(initialized)→ 握手完成通知send(tools/list)→ 拉取工具列表含JSONSchemasend(tools/call)→ 调用具体工具用的全是 JDK 标准库——ProcessBuilder管理子进程BufferedReader/Writer处理 stdio 通信。面试官问 MCP你能从握手讲到子进程管理10 分钟起步。亮点 3三层上下文压缩——比扔给 LLM 摘要高一个维度LLM 的上下文窗口是有限的对话长了怎么办大部分方案就是调 LLM 做个摘要。我设计了三层递进策略层触发策略API 成本Micro每轮工具输出 2000 字符 → 截到 500零Autotoken 阈值LLM 摘要 保留最近 10 条一次 LLM 调用Manual用户命令全量压缩一次 LLM 调用Micro 层是零成本的——大文件读出来几千字又不是每轮都需要截断保留前 500 字就够了。Auto 层才是 LLM 语义理解真正需要介入的场景。面试话术“多数上下文方案只有一层——要么滑动窗口丢消息要么 LLM 摘要。我设计了三层递进成本递增、按需触发。Micro 层零成本解决 80% 问题。”亮点 4Subagent 隔离——在定义层切断递归Claude Code 有子 Agent我的项目也有。子 Agent 的核心问题是怎么防止无限递归——子 Agent 里不能再创建孙 Agent 去干同一个活。我的做法是在工具定义层切断父 Agent: Tools{file, bash, search, task} ← 有 task 工具 子 Agent: Tools{file, bash, search} ← 没有 task 工具子 Agent 的工具列表里压根没有taskLLM 不知道有这个工具就不可能调用。这不是在执行层拦截是在能力层截断。面试话术“防递归不是加个 if 判断而是在工具定义层切断。子 Agent 的 ToolSpec 列表里没有 taskLLM 的推理链路里永远不可能产生子 Agent 调用。”亮点 5Prompt Caching——靠架构不靠 API每次调用 LLMSystem Prompt 和工具定义占了上下文的前几千 token。对话越长这部分重复发送越多次。我把请求拆成了两层ChatRequest [System Prompt Memory 工具声明] [对话历史] ← 构造时固定跨请求复用 → ← 每次拼接 →前缀在构造时计算一次后续每次build()复用同一个对象引用。LLM API 网关会逐字节比较相邻请求的公共前缀——前缀越稳定缓存命中率越高。不需要一行cache_controlAPI 调用纯粹靠结构设计。四、学这个项目的路线如果你是大三/大四Java 基础还行但没做过 AI 项目建议这么走第一周跑起来看懂主循环gitclone https://github.com/cookie250825/mvp-claude-code.gitcdmvp-claude-codecpconfig.yaml.example config.yaml# 编辑 config.yaml 填上 DeepSeek API Keymvn package-DskipTestsjava-jartarget/mvp-claude-code-1.0-SNAPSHOT.jar-i然后对着AgentLoop.java80 行看用户输入进来后每一步发生了什么。第二周改一个工具给它加一个工具比如TimeTool——问 AI “几点了” 能回答当前时间。走通 “定义工具 → 注册到 Registry → LLM 调用 → 执行 → 写回结果” 的完整链路。第三周准备面试话术docs/HARNESS_DESIGN.md里有 10 个组件的设计思路 面试话术。选 3 个你最熟的能讲 5 分钟以上就行——面试不是背八股是讲你做过的东西。第四周写进简历开始投简历上放 4-5 条项目经验参考上面第二节的模板GitHub 链接放上去。面试官开始问 AI Agent你就从 while(true) 循环开始讲。五、和其他学习项目比Spring Boot 商城调 API 的 ChatBotMVP Claude Code代码量50002002000能讲多久“我写了很多 CRUD”“我调了 OpenAI SDK”30 分钟逐层拆解涉及概念MyBatis、Redis无Agent 循环 / MCP / 压缩 / 子 Agent / 缓存面试区分度低人人都有极低高面试官没见过Spring Boot 商城是好项目但那是我会 Java的证明。MVP Claude Code 是我理解 AI Agent 架构的证明。两个放一起简历就完整了。六、项目还有这些细节聊聊你可能关心的为什么用 DeepSeek 不是 Claude便宜。DeepSeek 的 API 和 OpenAI 完全兼容langchain4j-open-ai 模块直接对接。改两行配置就能换成任何一个 OpenAI 兼容的服务。流式输出怎么做用CompletableFuture桥接异步和同步——流式 API 是异步的onNext 实时打印 token但 while(true) 循环需要等 AI 响应完才能继续。future.get()阻塞等待拿到完整响应后继续。工具执行前怎么确认交互模式下弹 y/n/a 选择——y 执行这次、n 跳过、a 全部批准不再询问。用户拒绝后写入 historyLLM 看到后会自己调整策略不会傻傻重试。CHANGELOG 有完整迭代记录。从 v1.0核心引擎到 v1.3流式 确认 缓存每个版本做了什么、为什么做都在CHANGELOG.md里——这是我有工程迭代能力的证明。总结给后端开发的 AI Agent 项目2000 行 Java7 个依赖不藏复杂度5 个面试能深讲的亮点while(true) 循环、手写 MCP、三层压缩、Subagent 隔离、架构化缓存四周学习路线跑起来 → 改工具 → 准备话术 → 写简历和商城项目互补一个证明广度一个证明深度完整的工程记录设计文档 CHANGELOG 踩坑记录面试官会看GitHubhttps://github.com/cookie250825/mvp-claude-code⭐ 有用就 Star找实习加油。