“本文档按程序员职业阶段分为四个版本:实习生、工作1-3年、工作3-5年、工作5年以上。每个阶段的简历写法、面试题深度、技术关注点均有差异,请根据自身情况选择对应章节。
项目定位:一体化 AI Agent 开发平台。以智能体(Agent)为核心,围绕 Agent 构建了五大能力增强体系:
”
知识库(RAG):给 Agent 提供外部知识,减少幻觉 工作流(Workflow):让 Agent 具备复杂任务编排能力 工具调用(Tool Calling):让 Agent 能操作外部世界(系统内置工具 + MCP 远程工具) 技能(Skill):让 Agent 具备专业领域能力,像专家一样工作 A2A 协议:让 Agent 之间可以跨平台协作
1. 项目架构与演进路线(所有阶段必读)
1.1 当前架构
项目采用 Go Workspace 多模块架构,严格遵循关注点分离原则:
MSZLU-AI/
├── go.work # Go 工作区定义
├── app/ # 主 HTTP 服务(用户 API + 管理后台接口)
│ └── internal/ # 按功能模块划分:agents/knowledges/tools/workflows/skills/...
├── core/ # AI 核心引擎(Eino 封装、Agent 构建器、工作流执行器)
├── model/ # 全局数据模型(GORM 结构体)
├── common/ # 公共工具与业务常量
├── a2a-server/ # A2A 协议独立服务
├── mcp-server/ # MCP 协议独立服务
├── benchmark/ # Agent Chat 接口压测工具
└── k8s/ # Kubernetes 部署清单
app 内部按功能模块划分:agents、knowledges、tools、workflows、skills、settings、subscriptions、templates、nodes、llms 等。每个模块内部遵循 Handler → Service → Repository 经典分层。
演进路线:
当前阶段: app内各模块共享同一个进程和数据库连接,通过内部函数调用或事件总线(event.Trigger)进行模块间通信演进阶段:当业务量增长后,可将 app内的每个功能模块逐步拆分为独立的 gRPC 微服务,model模块作为共享 proto 定义层,各服务独立部署、独立扩缩容最终形态: app退化为 API Gateway,core抽离为独立 AI 引擎服务,a2a-server和mcp-server已在物理上独立,形成完整微服务集群
1.2 技术栈
2. 实习生版本(在校/应届)
2.1 简历写法
项目标题
码神AI — AI Agent 开发平台后端开发
一句话描述
参与基于 Go 的 AI Agent 开发平台后端开发,负责智能体对话、知识库管理、Skill 技能系统、工具系统等模块的接口开发与业务逻辑实现。
详细描述
【项目背景】
码神AI是一款支持"智能体 + 知识库 + 工作流 + Skills + MCP + A2A"的 AI Agent 开发平台,
解决传统 AI 应用能力单一、协议封闭的问题。
【我的职责】
- 负责智能体管理模块(agents)的 CRUD 接口开发,包括智能体创建、配置更新、对话交互
- 参与知识库模块开发,实现文档上传、向量检索、RAG 上下文注入等功能
- 协助实现 Skill 技能系统,支持本地 Skill 注册、SKILL.md 元数据解析、Agent 技能关联
- 协助实现工具系统,支持系统内置工具和 MCP 远程工具的动态加载
- 使用 PostgreSQL + GORM 进行数据持久化,Redis 做缓存
【技术收获】
- 深入理解了 Handler → Service → Repository 分层架构,体会到清晰分层的可维护性
- 学习了 SSE(Server-Sent Events)流式接口的实现,理解了实时推送的原理
- 接触了 AI 工程领域的基础概念:RAG、Agent、Tool Calling、Skill 插件化、Prompt Engineering
技术关键词
GoGinGORMPostgreSQLRedisRESTful APISSEAI AgentRAGSkill
2.2 面试题与参考答案
Q1:请简单介绍一下你参与的码神AI项目
参考答案:
码神AI是一个基于 Go 的 AI Agent 开发平台。我主要参与了后端开发工作,负责智能体管理模块和知识库模块的接口开发,也协助做了 Skill 技能系统的部分功能。
智能体管理模块我实现了智能体的增删改查、对话接口(SSE 流式返回)、以及智能体与工具/知识库/Skill 的关联管理。知识库模块我参与了文档上传、向量检索、RAG 上下文注入的功能开发。Skill 模块我参与了 SKILL.md 文件解析、本地 Skill 注册入库、以及 Agent 与 Skill 关联的功能。
在这个项目中,我第一次接触到了 Handler → Service → Repository 的分层架构,体会到把业务逻辑和 HTTP 细节分开后,代码会清晰很多。也学习了 SSE 流式接口的实现原理,还有 RAG、Agent、Skill 这些 AI 领域的基础概念。
Q2:什么是 Handler → Service → Repository 分层?项目中是怎么体现的?
参考答案:
这是后端开发中很经典的三层架构:
Handler:负责接收 HTTP 请求、解析参数、调用 Service、封装响应。它只关心 HTTP 相关的事情。 Service:负责业务逻辑。比如创建智能体时,Service 层会校验参数、调用 Repository 保存数据、处理事务。 Repository:负责数据库操作。用 GORM 实现增删改查,返回数据给 Service。
在项目中,以 agents 模块为例:
handler.go定义了POST /api/v1/agents/create、POST /api/v1/agents/chat等接口的路由处理函数service.go实现了createAgent、agentMessage等业务方法,处理智能体创建逻辑和对话分发逻辑repository.go和model.go负责 GORM 的数据库操作
Skill 模块也是同样的三层:skills/handler.go 处理 /api/v1/skills 接口,skills/service.go 实现 Skill 的创建、验证、GitHub 安装逻辑,skills/model.go 负责数据库操作。
这样的好处是:如果以后 HTTP 框架从 Gin 换成其他框架,只需要改 Handler 层;如果数据库从 PostgreSQL 换成 MySQL,只需要改 Repository 层。Service 层的业务逻辑基本不用动。
Q3:SSE 是什么?项目中为什么用 SSE 而不是 WebSocket?
参考答案:
SSE(Server-Sent Events)是一种基于 HTTP 的服务器向客户端单向推送的技术。
项目中 Agent 对话接口 /api/v1/agents/chat 使用 SSE,因为:
对话场景只需要服务器向客户端推送AI 的回复内容,客户端不需要主动向服务器发送消息(除了最初的请求) SSE 基于 HTTP,兼容性更好,前端用 EventSource就能接收,不需要额外的库实现更简单,服务端只需要设置 Content-Type: text/event-stream,然后循环写数据即可自动支持断线重连
WebSocket 更适合双向实时通信的场景,比如聊天室、在线游戏。而我们的对话场景是"一问一答"的单向流,SSE 完全够用,且更简单。
Q4:什么是 RAG?你在项目中负责了 RAG 的哪部分?
参考答案:
RAG 是 Retrieval-Augmented Generation(检索增强生成)的缩写。意思是:用户提问时,先从知识库里检索相关内容,把检索结果加到 Prompt 里,再让大模型生成回答。这样模型的回答就有了依据,不容易胡说。
我在项目中参与了 RAG 链路的后半部分:
当用户和智能体对话时,系统会检查该智能体关联了哪些知识库 调用搜索接口,把用户问题和知识库内容做向量相似度匹配 把检索到的 Top-K 结果拼接成上下文字符串 把这个上下文注入到系统提示词里,再发送给大模型 同时把检索到的内容先推送给前端展示,让用户知道"AI 参考了哪些资料"
我理解了 RAG 的核心价值:给大模型提供外部知识,减少幻觉。
Q5:项目中的 Skill 系统是怎么工作的?SKILL.md 是什么?
参考答案:
Skill 系统是码神AI中非常重要的功能,可以理解为Agent 的"专业技能包"。没有 Skill 的 Agent 只能做通用对话,有了 Skill 的 Agent 可以像专家一样处理特定领域的任务。
SKILL.md 是每个 Skill 的核心文件,采用 YAML frontmatter + Markdown body 的格式:
---
name: go-code-review
description: 提供 Go 代码审查服务,识别常见反模式...
---
# Go 代码审查指南
## 审查清单
1. 检查是否正确处理了 error...
frontmatter 里的 name 和 description 是必须的。description 特别重要,它告诉 Agent 什么时候应该使用这个 Skill。
Skill 在系统中的流转:
管理员或用户把 Skill 文件放到指定的目录(如 skills/go-code-review/)通过界面创建 Skill,系统会读取 SKILL.md,解析 name 和 description 存入数据库 用户把 Skill 关联到某个 Agent Agent 对话时,系统把 Skill 的内容作为上下文注入 Prompt 大模型根据 description 判断当前任务是否需要调用这个 Skill
项目中 common/utils/md.go 的 ParseSkillMd 函数负责解析 SKILL.md 的 frontmatter,提取 name、description、version、author、tags 等元数据。
Q6:什么是 Tool Calling?项目中实现了哪两种工具?
参考答案:
Tool Calling(工具调用)是指大模型在生成回答时,判断需要调用外部工具来完成任务,然后由系统执行工具,将结果返回给模型,模型再基于工具结果生成最终回答。
举例:用户问"北京今天天气怎么样?",模型发现自己没有实时天气数据,就会调用天气查询工具,拿到结果后再回复用户。
项目中实现了双轨制工具体系,两种工具形式:
1. 系统内置工具(System Tools):
用 Go 代码直接实现的工具,通过 Eino 的 tool.BaseTool接口暴露给大模型已实现的工具包括: weather_tool:调用高德天气 API 查询天气git_tool:执行 Git 命令(status、add、commit、diff 等)git_commit_workflow:Git 提交流程专用工具,支持状态检查、差异查看、文件添加、提交和提交信息验证file_writer:将内容写入文件,支持覆盖和追加模式html_to_ppt:将 HTML 转换为 PPTX 演示文稿k8s_resource_query:查询 Kubernetes 集群资源(Pod、Deployment、Service 等)k8s_logs:查看 Pod 日志k8s_resource_action:对 K8s 资源执行操作(扩容、重启等)k8s_health_check:检查 K8s 集群和节点健康状态系统工具在 core/ai/tools/目录下实现,通过tools.RegisterSystemTools()统一注册到全局 Registry
2. MCP 远程工具(MCP Tools):
通过 MCP(Model Context Protocol)协议连接外部工具服务器 mcp-server/是独立的 MCP 服务,基于mark3labs/mcp-go实现core/ai/mcps/mcp.go是 MCP 客户端,连接外部 MCP Server 后将远端工具转换为 Eino 的tool.BaseTool用户在界面上配置 MCP 服务地址,系统动态拉取工具列表并绑定到 Agent
工具调用流程:
用户提问 → 模型判断需要调用工具 系统根据工具名称从 Registry 中找到对应工具 执行工具,传入模型生成的参数 将工具执行结果返回给模型 模型基于工具结果生成最终回答
Q7:Go 的 goroutine 和 channel 在项目中是怎么用的?
参考答案:
项目中大量使用 goroutine 和 channel 来处理异步和并发场景:
1. SSE 流式推送:agentMessage 方法里,主 goroutine 创建 dataChan 和 errChan,然后启动一个新的 goroutine 来处理对话逻辑。对话过程中产生的消息通过 dataChan 传回主 goroutine,主 goroutine 再写给 HTTP ResponseWriter。
dataChan := make(chanstring)
errChan := make(chan error)
gofunc() {
// 异步处理对话...
for {
select {
case dataChan <- message:
case <-ctx.Done():
return
}
}
}()
2. 消息持久化: 保存聊天记录时,使用 go s.saveChatMessage(...) 启动后台 goroutine,不阻塞主流程。
3. 并发安全: 面试状态机使用 sync.RWMutex 保护 interviewStates map,防止多个 goroutine 同时读写导致数据竞争。
Q7:你在项目中遇到过什么困难?怎么解决的?
参考答案(示例):
我遇到的一个困难是:SSE 流式接口的异常处理。
一开始实现时,当 AI 模型调用工具出错或网络中断时,前端会卡住收不到消息,用户体验很差。后来我是这样解决的:
在 goroutine 里加了 defer recover(),防止 panic 导致整个服务崩溃区分了不同类型的错误:模型错误、工具调用错误、网络超时,每种错误都封装成统一的 JSON 格式返回给前端 在流结束前一定发送 [DONE]标记,让前端知道流已结束,可以关闭连接加了心跳机制( : keep-alive),防止长时间无数据时连接被中间件断开
这个过程让我学会了:异常处理和正常流程同等重要,特别是流式接口,必须保证任何情况下都有明确的结束信号。
3. 工作1-3年版本
3.1 简历写法
项目标题
码神AI — 一体化 AI Agent 开发平台
一句话描述
基于 Go + Eino 框架构建企业级 AI Agent 平台,负责智能体引擎、RAG 知识库、Skill 技能系统、工作流编排等核心模块的设计与实现,支撑多模型适配与多 Agent 协作。
详细描述
【项目背景】
在企业数字化转型与 AI 技术爆发背景下,构建支持"智能体 + 工作流 + 知识库 + Skills + MCP + A2A"
的 All-in-One AI Agent 开发平台,解决传统 AI 应用能力单一、协议封闭、工程薄弱的问题。
【技术架构】
- 采用 Go Workspace 多模块架构(app/core/model/common/a2a-server/mcp-server)
- app 内部按功能模块划分(agents/knowledges/tools/workflows/skills/...),遵循 Handler→Service→Repository 分层
- 基于自研 Thunder 框架构建 HTTP 接入层,AI 核心引擎基于字节跳动 CloudWeGo Eino 框架
- 当前为单体架构,各模块通过内部调用通信;演进路线为按模块拆分为 gRPC 微服务独立部署
【核心职责】
- 负责智能体对话引擎实现:支持 General/Supervisor/Deep 三种 Agent 模式,SSE 流式返回
- 实现 RAG 完整链路:多格式文档解析 → 语义切分 → Embedding → 向量存储(ES/Milvus)→ 检索注入
- 设计 AgentBuilder 工厂模式,统一封装模型初始化、工具发现、知识库查询、Skill 加载
- 落地 MCP 协议客户端,支持 SSE/Streamable HTTP 两种传输,实现远程工具动态发现
- 负责 Skill 技能系统:SKILL.md 解析与验证、本地 Skill 注册、GitHub Source 远程安装、Agent 技能关联
- 实现可视化工作流编排引擎,基于 Eino compose.Workflow 编译执行 DAG
【技术亮点】
- 单平台同时实现三种 Agent 模式,覆盖从简单对话到自主规划的全场景
- Skill 插件化机制:遵循 Agent Skills 开放规范,支持 Progressive Disclosure 按需加载
- 双轨制工具体系:系统内置工具 + MCP 远程工具,Agent 能力可动态扩展
- 基于标题层级的语义文档切分,按自然语义边界拆分避免切断段落,检索返回完整章节内容
- 多模型厂商动态适配(OpenAI/Ollama/Qwen),通过配置热切换
技术关键词
GoEinoCloudWeGoAI AgentRAGMCPA2ASkillLLMVector DatabaseElasticsearchMilvusPostgreSQLRedisKubernetesDockerGinGORMSSEWorkflowgRPC
3.2 面试题与参考答案
Q1:请介绍一下码神AI的架构设计,app 内的模块是怎么组织的?未来怎么演进?
参考答案:
码神AI采用 Go Workspace 多模块架构。app 是主 HTTP 服务,内部按功能模块划分:agents(智能体)、knowledges(知识库)、tools(工具)、workflows(工作流)、skills(技能)、settings(设置)、subscriptions(订阅支付)等。每个模块内部都是 Handler → Service → Repository 三层。
模块间通信:当前阶段各模块在同一个进程内,通过两种方式通信:
直接函数调用:如 agents 模块的 Service 直接调用其他模块的 Repository 事件总线: event.Trigger("searchKnowledgeBase", ...)解耦跨模块调用
演进路线:app 是按功能模块划分的,这本身就为后续拆分做了准备。当业务量和团队规模增长后,可以按以下路线演进:
将 model模块中的 GORM 结构体转换为 protobuf 定义,作为服务间契约把 agents、knowledges、tools、skills 等模块逐个拆分为独立的 gRPC 微服务 app退化为 API Gateway,负责路由、认证、限流core抽离为独立 AI 引擎服务,通过 gRPC 对外提供 Agent 构建、工作流执行能力a2a-server 和 mcp-server 已经是独立进程,可以直接扩展
这样的好处是:初期开发效率高(单体),后期可按业务域独立部署和扩缩容。
Q2:AgentBuilder 工厂模式是怎么设计的?为什么要这样设计?
参考答案:
AgentBuilder 位于 core/ai/agentbuilder/agentbuilder.go,核心职责是把数据库中的 Agent 配置对象转换为 Eino 运行时可执行的 Agent。
设计流程:
根据 ModelProvider(openai/ollama/qwen)从数据库获取提供商配置调用 BuildToolCallingChatModel创建对应 ChatModel,设置 temperature、maxTokens 等参数调用 BuildTools加载 Agent 关联的工具:system 类型从本地 Registry 获取,mcp 类型通过 MCP 客户端远程获取将 Agent 关联的 Workflows 转换为 WorkflowTool 加入工具列表 调用 BuildSkills按 baseDir 分组加载 Skill Middleware调用 BuildRagContext执行知识库检索,构建上下文字符串最终返回包含 ChatModel、Tools、Skills、RAGContext 的 Context 对象
为什么要用工厂模式:
解耦:app 层(Service)不需要了解 Eino 的 ChatModel、Tool、Middleware 等底层概念,只需要传入 model.Agent 就能拿到可运行的上下文 统一入口:所有 Agent 的构建逻辑收敛到一个地方,方便统一修改和监控 可扩展:新增模型厂商(如 Claude、Gemini)只需在 Builder 中加一个分支,上层无感知 可测试:每个构建步骤可以独立 mock 和单元测试
Q3:RAG 链路中,文档切分策略为什么选择基于标题层级?和普通固定长度切分有什么区别?
参考答案:
项目中 RAG 的文档切分不是简单的固定长度切片(比如每 500 个字符切一块),而是基于标题标记的语义切分。
具体实现(common/utils/md.go 的 SplitByHeading):
用正则表达式匹配标题标记(如 ##),按标题位置将文本切分成若干块每个标题及其下的内容形成一个独立的 chunk 标题出现之前的前置内容也作为一个 chunk
和普通固定长度切分的对比:
举例:一篇技术文档有"第一章 架构设计"→"1.1 模块划分"→"1.2 通信方式"。固定切分可能把"1.1"和"1.2"的内容切到同一块,导致检索时返回的内容缺少上下文。而基于标题切分会分别切出"1.1"和"1.2"两个块,用户查询"通信方式"时返回的就是完整的"1.2"内容。
当前局限与优化方向:
当前 SplitByHeading仅按单一标题层级切分,未实现多层级嵌套切分未实现子块继承父块上下文的 Breadcrumb 机制(可在向量存储前将父标题前置到子块内容中实现) 超长段落仍需配合 SplitByWindow做二次切分,避免单 chunk 超过向量模型长度限制
Q4:项目中 MCP 客户端是怎么实现的?SSE 和 Streamable HTTP 有什么区别?
参考答案:
MCP 客户端在 core/ai/mcps/mcp.go 中实现,核心方法是 GetEinoBaseTools。
实现流程:
解析 MCP Server 的配置(BaseUrl、Token) 根据 URL 后缀判断传输方式: 以 /sse结尾 → 使用client.NewSSEMCPClient创建 SSE 客户端其他 → 使用 client.NewStreamableHttpClient创建 Streamable HTTP 客户端发送 Initialize 请求,协商协议版本 调用 mcpp.GetTools获取工具列表,转换为 Eino 的tool.BaseTool
SSE vs Streamable HTTP 的区别:
项目中同时支持两种方式,是为了兼容不同类型的 MCP Server 实现。
Q5:Skill 系统是怎么设计的?SKILL.md 的格式规范是什么?Agent 如何使用 Skill?
参考答案:
Skill 系统是码神AI围绕 Agent 构建的专业能力增强体系,解决"Agent 能做得多专业"的问题。Tool 解决"能做什么",Skill 解决"做得多专业"。
SKILL.md 格式规范:
必须采用 YAML frontmatter + Markdown body 格式:
---
name: go-code-review
description: 提供 Go 代码审查服务,识别常见反模式、性能陷阱和并发安全问题。当用户上传 Go 代码或请求代码优化时激活。
version: 1.0.0
author: mszlu
tags: go, code-review
---
# Go 代码审查指南
## 审查清单
1. 检查是否正确处理了 error...
必填字段:
name:Skill 唯一标识,1-64 字符,只能包含小写字母、数字和连字符description:1-1024 字符,必须说明 Skill 的功能以及何时应该被激活
Skill 在系统中的流转:
扫描与验证(
skills/service.go):validateSkillName检查 Skill 目录是否存在、SKILL.md 是否存在ParseSkillMd解析 frontmatter,验证 name 与目录名一致注册入库:
本地 Skill: createSkill将公共目录的 Skill 复制到用户私有目录,数据库记录 name、description、statusGitHub Skill: installSkill使用go-git克隆仓库到临时目录,复制到用户目录,解析 SKILL.mdAgent 关联(
agents/service.go):addSkillToAgent在agent_skills关联表中插入记录Agent 详情查询时通过 GORM Preload 加载关联的 Skills 运行时加载(
agentbuilder.go):BuildSkills按baseDir分组,为每组创建skill.BackendFromFilesystem每个 Skill 创建 skill.NewMiddleware,作为 Eino ADK 的 Handler 注入 Agent
Q6:项目中 Tool Calling 的双轨制工具体系是怎么设计的?系统工具和 MCP 工具有什么区别?
参考答案:
项目中设计了双轨制工具体系,让 Agent 既能使用内置的系统工具,也能无缝接入外部的 MCP 工具。
系统工具(System Tools):
实现方式:用 Go 代码直接实现,位于 core/ai/tools/目录下接口规范:实现 Eino 的 tool.BaseTool接口,包含Info()(返回工具元数据)和InvokableRun()(执行具体逻辑)注册机制:通过 tools.RegisterSystemTools()统一注册到全局 Registry,Agent 构建时从 Registry 查找已实现的工具: weather_tool:调用高德天气 APIgit_tool:执行 Git 命令(status、add、commit、diff、log 等)git_commit_workflow:Git 提交流程专用工具,支持状态检查、差异查看、文件添加、提交和提交信息验证file_writer:将内容写入文件,支持覆盖和追加模式,可配置 baseDir 限制写入范围html_to_ppt:将 HTML 转换为 PPTX 演示文稿k8s_resource_query:查询 Kubernetes 集群资源(Pod、Deployment、Service、Node 等)k8s_logs:查看 Pod 日志k8s_resource_action:对 K8s 资源执行操作(扩容、重启等)k8s_health_check:检查 K8s 集群和节点健康状态
MCP 工具(Model Context Protocol Tools):
实现方式:通过 MCP 协议连接外部工具服务器 服务架构: mcp-server/是独立的 MCP 服务,基于mark3labs/mcp-go实现客户端: core/ai/mcps/mcp.go的GetEinoBaseTools方法负责连接 MCP Server动态发现:用户在界面上配置 MCP 服务地址,系统运行时动态拉取工具列表 传输协议:支持 SSE 和 Streamable HTTP 两种方式
两种工具的区别:
core/ai/tools/) | ||
AgentBuilder 中的加载逻辑(agentbuilder.go 的 BuildTools 方法):
for _, v := range agent.Tools {
switch v.ToolType {
case model.SystemToolType:
systemTool := b.loadSystemTool(v.Name) // 从 Registry 获取
agentTools = append(agentTools, systemTool)
case model.McpToolType:
baseTools, err := mcps.GetEinoBaseTools(ctx, &mcpConfig) // 远程获取
agentTools = append(agentTools, baseTools...)
}
}
这种设计的核心价值是:内置工具保证开箱即用,MCP 工具保证无限扩展。
Q7:工作流编排引擎是怎么实现的?DAG 怎么编译执行?
参考答案:
工作流引擎在 core/ai/workflow_execute.go 中实现,基于 Eino 的 compose.Workflow。
核心流程:
节点注册:使用 sync.Once初始化节点工厂映射表,将textDisplay、textCombine、htmlDisplay、qwenVL等类型映射到对应的工厂函数图解析:遍历前端传来的 Graph 数据(Nodes + Edges),识别 start 和 end 节点 节点映射:将每个业务节点通过 wf.AddLambdaNode注册为InvokableLambda,存入nodeRefs边连接: start → 节点:使用 AddInput(compose.START)节点 → end:使用 MapFields(sourceHandle, targetHandle)做字段映射节点 → 节点:使用 AddInputWithOptions支持多字段映射编译执行: wf.Compile(ctx)编译 DAG 为可执行 Runner,runner.Invoke(ctx, params)同步执行
DAG 编译的关键:Eino 的 Workflow 在 Compile 时会检查所有节点的输入依赖是否满足,确保没有循环依赖和数据断链。如果有节点缺少输入或存在环,Compile 会返回错误。
Q7:如果要把面试系统的状态机从内存改为 Redis 持久化,你会怎么设计?
参考答案:
当前面试状态存储在内存 map 中,适合单进程。如果要支持分布式部署,需要改为 Redis 持久化。
设计思路:
数据结构:使用 Redis Hash 存储 interview:{sessionId},字段包括 stage、round、history、scores 等序列化: History和Scores用 JSON 序列化后存储并发控制:使用 Redis 分布式锁( SET interview:{sessionId}:lock NX EX 10)防止多个实例同时修改同一状态过期清理:设置 TTL(如 24 小时),自动清理过期面试状态 代码改造: 抽象 StateStore接口,包含Get、Save、Clear方法实现 MemoryStateStore(当前实现)和RedisStateStore通过配置切换,业务代码无感知
注意事项:
状态更新频繁,要考虑 Redis 写入性能,可以批量更新或用 Pipeline 面试中断恢复时,从 Redis 读取状态要处理序列化失败的情况 如果 Redis 挂了,要有降级方案(如写本地文件缓存)
4. 工作3-5年版本
4.1 简历写法
项目标题
码神AI — 企业级 AI Agent 中台
一句话描述
主导设计与实现企业级 AI Agent 开发平台后端,覆盖智能体引擎、RAG 知识库、Skill 技能生态、工作流编排、MCP/A2A 协议等核心能力,支撑从单体到微服务的架构演进。
详细描述
【项目背景】
面向企业数字化转型的 AI Agent 中台,打造"All-in-One"的智能体开发平台。
向上提供可视化 Agent 配置、知识库管理、工作流编排界面;向下对接多厂商大模型,
支持工具调用、记忆持久化、多 Agent 协作,完整落地 MCP、A2A、Skills 三大开放协议。
【架构设计】
- Go Workspace 多模块架构:app(HTTP 接入层)/ core(AI 引擎)/ model(共享模型)/
common(公共工具)/ a2a-server / mcp-server,严格关注点分离
- app 内部按功能域划分模块,遵循 Handler→Service→Repository 分层,具备演进为 gRPC 微服务的潜力
- 基于自研 Thunder 框架提供配置热加载、JWT 认证、统一响应、链路追踪等基础设施
- AI 核心引擎基于 CloudWeGo Eino,封装 AgentBuilder 工厂、三种 Agent 模式、Workflow 编排器
【核心贡献】
- 设计并实现 AgentBuilder 工厂模式,统一封装模型适配、工具发现、知识库查询、Skill 加载,
使 app 层与 Eino 底层完全解耦
- 主导 RAG 系统设计与实现:多格式文档解析 → 标题层级语义切分 → Embedding 向量化 →
向量存储双方案(ES/Milvus)→ 检索增强生成,按标题边界切分保证检索返回完整语义单元
- 落地 MCP(Model Context Protocol)客户端与 A2A(Agent-to-Agent)协议,实现工具跨平台复用
与 Agent 跨组织协作,将平台从"Agent 工厂"升级为"Agent 互联网"
- 设计并落地 Skill 插件化机制:
· 遵循 Agent Skills 开放规范(与 Claude Code、Roo Code 兼容)
· 实现 SKILL.md YAML frontmatter 解析与验证(name/description/version/author/tags)
· 支持本地 Skill 注册 + GitHub Source 远程安装(go-git 克隆仓库)
· Progressive Disclosure 按需加载:发现阶段 ~100 tokens → 激活阶段完整指令 → 执行阶段按需读取 scripts/references
- 构建可视化工作流编排引擎,基于 Eino compose.Workflow 实现 DAG 编译与执行
- 设计基于内存 CheckPointStore 的状态持久化方案,支持 Deep Agent 和面试系统的断点续跑
【工程化实践】
- Docker 多阶段构建,为 app/a2a-server/mcp-server 分别输出极简镜像
- K8s 完整部署清单:Deployment/Service/Ingress/HPA/ConfigMap/PVC/RBAC,配置三种健康探针
- 自定义 SSE 流式压测工具,支持并发、时长、超时配置,评估模型响应延迟与系统吞吐量
- 设计 AI 面试系统的多阶段状态机,四轮面试 + 评分淘汰机制,基于 SequentialAgent 实现
技术关键词
GoEinoCloudWeGoAI AgentRAGMCPA2ASkillLLMVector DatabaseElasticsearchMilvusPostgreSQLRedisKubernetesDockerGinGORMSSEWorkflow OrchestrationgRPCMicroservicesCheckPointgo-git
4.2 面试题与参考答案
Q1:码神AI的 app 是按功能模块划分的,如果要拆分为 gRPC 微服务,你会怎么设计服务边界和通信协议?
参考答案:
当前 app 内按功能模块划分(agents、knowledges、tools、workflows、skills、subscriptions 等),每个模块已有清晰的职责边界,这是拆分微服务的基础。
服务边界设计:
按**业务域(Domain)**拆分,而非按技术层拆分:
通信协议选择:
服务间同步调用:gRPC(基于 protobuf,性能高,类型安全) 异步事件:消息队列(如 Kafka/RabbitMQ),用于文档解析完成通知、工作流执行事件等 与前端交互:保留 HTTP/REST + SSE(流式对话需要)
数据拆分:
每个服务拥有独立数据库,避免直接访问其他服务的数据库 共享的 model模块需要拆分为:agent-proto:各服务共享的 protobuf 定义common-lib:公共工具库(不依赖具体业务)
演进策略:
第1阶段:先拆分 subscription-service(支付模块,风险隔离需求最强烈)和gateway-service第2阶段:拆分 knowledge-service(数据量增长快,需要独立 ES/Milvus 集群)第3阶段:拆分 workflow-service(长时间运行的任务需要独立资源调度)第4阶段:拆分 agent-service、tool-service、skill-service
Q2:三种 Agent 模式(General/Supervisor/Deep)的底层实现差异是什么?如何根据场景选择?
参考答案:
三种模式基于 Eino ADK 的不同预置实现,核心差异在任务调度策略和自主决策能力。
General 模式:
底层: adk.NewChatModelAgent创建单轮/多轮对话 Agent流程:用户输入 → RAG 检索 → Prompt 组装 → 模型生成 → 如需工具则调用 → 返回结果 特点:单 Agent 执行,没有子 Agent 调度,逻辑最简单 适用:客服问答、内容生成、简单咨询
Supervisor 模式:
底层: supervisor.New创建监督者 Agent流程:用户输入 → Supervisor 理解意图 → 选择最合适的子 Agent → 子 Agent 通过 A2A 协议执行 → 收集结果 → Supervisor 汇总回复 特点:中央调度 + 分布式执行,子 Agent 可以是外部平台的 Agent 适用:企业部门助理(HR/IT/财务 Agent 协作)、多专家会诊
Deep 模式:
底层: deep.New创建 ResumableAgent,配置 MaxIteration 和 TodoList流程:用户输入 → 生成 TodoList → 循环执行(思考 → 规划 → 执行 → 反思)→ 达到 MaxIteration 或任务完成 → 返回结果 特点:Agent 具备自主规划能力,不依赖人工预设流程;支持 CheckPoint 中断恢复 适用:复杂研究报告生成、代码审查、多步骤数据分析
选择策略:
简单任务 → General(成本低、延迟低) 需要多领域专家协作 → Supervisor(明确分工、结果可控) 复杂探索性任务 → Deep(自主规划、适应性强)
Q3:向量存储设计了 ES 和 Milvus 双方案,它们的底层原理差异是什么?项目中如何根据场景选择?
参考答案:
Elasticsearch 向量检索:
基于 **ANN(Approximate Nearest Neighbor)**算法,ES 8 使用 HNSW(Hierarchical Navigable Small World)图索引 向量数据存储在 dense_vector 字段中,通过 knn_searchAPI 查询优势:部署简单(单节点即可)、与全文检索结合方便、已有 Elastic 技术栈的团队接入成本低 劣势:海量向量(千万级以上)时性能下降、内存占用大
Milvus 向量检索:
专为向量设计的数据库,支持多种索引类型(HNSW、IVF_FLAT、IVF_PQ 等) 架构:接入层(Proxy)→ 协调层(Root/Query/Data)→ 存储层(S3/MinIO) 优势:向量检索性能极高、支持分布式扩展、可处理十亿级向量 劣势:部署复杂(需要 etcd + MinIO + 多节点)、运维成本高
项目中的选择策略:
项目中通过 VectorStore 接口抽象,切换只需要改配置,业务代码无感知。
Q4:Skill 的 Progressive Disclosure 机制在 Prompt Engineering 层面有什么价值?如果上下文窗口无限大,还需要这个机制吗?
参考答案:
Progressive Disclosure 的核心价值:
Token 效率:大模型按 Token 计费,减少无效 Token 可以降低调用成本 注意力聚焦:Prompt 中无关信息越多,模型越容易"分心",影响任务执行质量 延迟优化:Prompt 越短,模型生成首个 Token 的时间(TTFB)越短
三阶段加载的具体价值:
发现阶段只加载 name + description(~100 tokens):让模型知道"有哪些能力" 激活阶段加载完整 SKILL.md:让模型知道"如何执行这个能力" 执行阶段按需加载 scripts/references:让模型知道"执行时参考什么"
如果上下文窗口无限大,还需要吗?
仍然需要,原因有三:
注意力机制的限制:Transformer 的注意力是全局的,信息过多会导致"注意力稀释",重要信息被淹没 推理成本:即使上下文无限,模型处理长序列的计算量仍按 O(n²) 或 O(n) 增长,影响响应速度 信息过载:过多的上下文会让模型难以判断哪些信息是当前任务真正需要的,反而降低准确率
Progressive Disclosure 本质上是信息架构设计,和 UI 设计中的"渐进式披露"原理相同:在正确的时间提供正确的信息量。
Q5:项目中 SSE 流式压测工具的设计思路是什么?对于 LLM 应用的压测,和传统 HTTP 接口有什么不同?
参考答案:
压测工具设计(benchmark/agent_chat_benchmark.go):
并发模型: sync.WaitGroup+ goroutine 池,每个 worker 持续发请求直到压测时长结束SSE 流处理:使用 bufio.Reader逐行读取响应,遇到[DONE]标记才算请求成功指标统计:总请求数、成功数、失败数、QPS、吞吐量(KB/s)、平均/最小/最大响应时间 进度报告:每 5 秒打印一次实时统计
LLM 应用压测 vs 传统 HTTP 压测:
LLM 压测的特殊关注点:
模型 Rate Limit:OpenAI/Qwen 等厂商有 TPM(Tokens Per Minute)限制,压测前需要确认配额 流中断处理:网络波动可能导致 SSE 连接中断,需要统计中断率和重连成功率 长尾延迟:LLM 响应时间分布极不均匀,简单问题 2 秒,复杂问题可能 60 秒,需要关注 P95/P99 成本估算:每次压测都要计算 Token 消耗和费用,避免误操作导致高额账单
Q6:AI 面试系统的状态机设计中,如何处理"面试官提问 → 用户回答 → 评分 → 下一题"这个循环的并发安全和一致性?
参考答案:
面试系统是一个典型的长时间运行 + 人机交互的状态机,核心挑战是:用户可能在任意时刻输入回答,而 AI 可能正在生成问题或评分。
并发安全设计:
状态隔离:每个 session 有独立的状态对象 StageState,存储在interviewStatesmap 中,key 为 sessionId锁粒度:使用 sync.RWMutex,读操作(GetState)用 RLock,写操作(SaveState)用 Lock深拷贝:GetState 返回的是状态的深拷贝,防止调用方修改原始状态导致数据竞争
一致性保证:
等待状态(waitingState):AI 提问后设置 waitingState[sessionId] = true,在此期间用户的任何输入都被视为"回答"SequentialAgent:使用 adk.NewSequentialAgent确保四个面试阶段严格按顺序执行,前一阶段不完成不会进入下一阶段。每个阶段由interview.NewInterviewStageAgent创建专门的 StageAgent,负责该轮次的提问、评分和晋级判断分数累计:每轮面试结束后, finalizeInterviewResult计算该阶段得分并存入StageScoresmap,单轮低于阈值(60 分)时触发终止流程
中断恢复(当前限制):
当前面试状态存储在内存 map 中,服务重启后状态丢失 改进方向:引入 Redis 持久化,用 Hash 存储 interview:{sessionId},配合分布式锁保证并发安全
改进方向:
当前是内存存储,分布式部署时需要改为 Redis 或数据库持久化 可以引入 Saga 模式处理跨阶段的补偿逻辑(如某阶段评分异常时回滚) Deep Agent 已使用 Eino 的 CheckPointStore支持断点续跑,面试系统可参考此设计实现持久化
Q7:Skill 系统的 GitHub Source 远程安装是怎么实现的?有什么安全考虑?
参考答案:
Skill 系统支持从 GitHub 仓库远程安装 Skill,这在 app/internal/skills/service.go 的 installSkill 方法中实现。
实现流程:
用户在前端配置 GitHub Source(仓库地址 + 分支) 调用 installSkill时,指定 skillId 和 sourceId使用 go-git库的git.PlainClone克隆仓库到临时目录(baseDir/.temp/{userId}/{skillId})从临时目录的指定路径( req.RepoPath)复制 Skill 文件到用户私有目录清理临时目录 读取用户私有目录中的 SKILL.md,解析元数据 验证 name 和 description 后,存入数据库
安全考虑:
仓库来源白名单:只允许从可信的 GitHub 仓库安装,防止恶意代码注入 SKILL.md 验证: 检查 name 是否与目录名一致 检查 description 是否说明清楚激活条件 限制文件大小,防止超大文件导致内存溢出 沙箱执行:Skill 中的 scripts 应该在沙箱环境中执行,避免直接访问宿主机资源 权限隔离:每个用户的 Skill 放在独立的目录( {baseDir}/{userId}/{skillName}),防止用户 A 访问用户 B 的 Skill临时目录清理:克隆完成后立即删除临时目录,避免磁盘空间泄漏 网络超时:克隆仓库时设置合理的超时时间,防止因网络问题导致 goroutine 泄漏
改进方向:
引入 Skill 签名验证机制,确保 Skill 来自可信发布者 增加 Skill 版本管理,支持回滚到历史版本 建立 Skill Marketplace,由社区审核后上架
5. 工作5年以上版本
5.1 简历写法
项目标题
码神AI — 企业级 AI Agent 中台架构设计与落地
一句话描述
作为技术负责人主导企业级 AI Agent 中台的全栈架构设计,从单体演进到微服务就绪,覆盖 AI 引擎、开放协议、Skill 插件化生态、云原生部署全链路,支撑十万级智能体并发对话。
详细描述
【项目定位】
面向企业数字化转型的"All-in-One" AI Agent 中台,打造智能体"制造工厂"+"互联网络"。
完整落地 MCP(工具协议)、A2A(Agent 协作协议)、Skills(能力插件规范)三大开放标准,
构建从单轮对话 Agent 到多 Agent 深度编排的完整技术栈。
【架构演进】
阶段一(单体):Go Workspace 多模块架构,app 按功能域划分,Handler→Service→Repository 分层,
模块间通过内部调用和事件总线通信,单进程一键启动,支撑快速迭代。
阶段二(微服务就绪):model 模块抽象为 protobuf 契约,各模块具备独立 gRPC 服务能力,
当前通过配置控制是否启用远程调用,实现平滑演进。
阶段三(分布式):app 退化为 API Gateway,core 抽离为 AI 引擎服务,a2a-server/mcp-server
物理独立部署,基于 K8s HPA 弹性伸缩。
【核心技术决策】
- AI 框架选型:评估 LangChain/LangGraph/Eino 后,选择 CloudWeGo Eino(Go 原生、并发友好、
工程化程度高),封装 AgentBuilder 工厂统一构建运行时上下文
- 向量存储双方案:ES(简单部署)+ Milvus(高性能),通过 VectorStore 接口抽象,业务零侵入切换
- 模型适配层:统一 buildToolCallingChatModel 适配 OpenAI/Ollama/Qwen,其他厂商默认走 OpenAI 兼容模式
- 状态持久化:CheckPointStore 接口抽象,内存实现(当前)→ Redis/数据库(演进),支持断点续跑
【Skill 插件化生态】
- 遵循 Agent Skills 开放规范(与 Claude Code、Roo Code 兼容)
- 实现 SKILL.md YAML frontmatter 解析引擎(name/description/version/author/tags)
- 支持本地 Skill 注册 + GitHub Source 远程安装(go-git 克隆仓库、临时目录管理、权限隔离)
- Progressive Disclosure 三阶段按需加载:发现 → 激活 → 执行,实现 Token 效率最大化
- 按 baseDir 分组创建 backend,避免重复构建,提升运行时性能
【开放生态】
- MCP 客户端:支持 SSE 和 Streamable HTTP,将远程工具无缝接入 Agent 工具链
- A2A 协议:实现 AgentCard 市场 + A2A Server 暴露,打破平台壁垒
- Skill 插件化:遵循 Agent Skills 开放规范,支持 GitHub Source 远程安装,Progressive Disclosure
按需加载实现 Token 效率最大化
【工程化与治理】
- Docker 多阶段构建 + K8s 完整部署清单(Deployment/Service/Ingress/HPA/ConfigMap/PVC/RBAC)
- 三种健康探针设计,Pod 反亲和性多节点分布
- 自定义 SSE 流式压测工具,评估模型延迟和系统吞吐量
- 面试状态机:四轮面试 + 评分淘汰 + SequentialAgent,CheckPoint 中断恢复
技术关键词
GoEinoCloudWeGoAI AgentRAGMCPA2ASkillLLMVector DatabaseElasticsearchMilvusPostgreSQLRedisKubernetesDockerGinGORMSSEWorkflow OrchestrationgRPCMicroservicesCheckPointSagaProtobufAPI GatewayDDDgo-git
5.2 面试题与参考答案
Q1:作为技术负责人,你在码神AI项目中做了哪些关键的技术决策?如果有机会重新设计,你会改变什么?
参考答案:
关键决策一:选择 Eino 而非 LangChain/LangGraph
项目整体是 Go 技术栈,引入 Python 运行时会增加运维复杂度 Eino 的 goroutine + channel 设计更适合高并发对话场景 但 Eino 生态成熟度不如 LangChain,部分高级功能需要自研(如某些 Agent 模式)
关键决策二:单体优先,微服务就绪
初期团队规模小,单体架构开发效率高 但通过 Go Workspace 多模块 + 清晰的领域边界,为后续拆分预留了空间 每个模块内部遵循分层,模块间通过事件总线解耦
关键决策三:VectorStore 接口抽象
早期就定义了 VectorStore接口,后期从 ES 扩展到 Milvus 时,业务代码零改动这是"面向接口编程"的典型实践
关键决策四:Skill 采用文件系统 + 数据库混合存储
SKILL.md 内容存在文件系统,元数据存在 PostgreSQL 好处是 Skill 内容可以版本控制(Git),元数据可以快速查询 坏处是数据一致性需要维护(文件删了但数据库记录还在)
如果有机会重新设计,我会改变:
数据库设计:
当前 Agent 和 Tools/KBs/Workflows/Skills 是多对多关系,GORM 的预加载在复杂查询时性能不佳 重新设计会引入CQRS:写模型用关系数据库,读模型用 Elasticsearch 做物化视图 事件总线:
当前用内存事件总线 event.Trigger,无法实现跨进程通信重新设计会在早期引入消息队列(如 NATS 或 Kafka),为微服务拆分做准备 Skill 存储:
当前 Skill 内容存在本地文件系统,分布式部署时需要共享存储(如 NFS/S3) 重新设计会把 Skill 内容存入对象存储(S3/MinIO),元数据保留在数据库,实现真正的无状态服务 缓存策略:
当前知识库检索和模型配置查询没有缓存,每次对话都查数据库 重新设计会引入多级缓存:L1(本地内存缓存热点配置)→ L2(Redis)→ DB 可观测性:
当前日志比较基础,重新设计会引入 OpenTelemetry 做分布式链路追踪,特别是 Agent 执行链路(工具调用 → 子 Agent → 模型生成)需要可视化
Q2:码神AI的 app 是按功能模块划分的,从单体演进为微服务时,最大的技术挑战是什么?你会怎么解决?
参考答案:
挑战一:数据一致性
当前模块间通过数据库事务保证一致性(如删除 Agent 时同时删除关联的 tools、knowledge bases、skills)。拆分为微服务后,每个服务有独立数据库,需要引入分布式事务。
解决方案:
Saga 模式:长事务拆分为本地事务 + 补偿操作。如删除 Agent 时,agent-service 先删除 Agent,然后异步通知 tool-service、skill-service 删除关联。如果某个服务失败,agent-service 执行补偿(恢复 Agent) 最终一致性:非关键操作(如统计计数)允许最终一致,用消息队列异步同步 TCC(Try-Confirm-Cancel):支付等强一致性场景使用
挑战二:服务间通信性能
当前模块间是内存函数调用(纳秒级),拆分为 gRPC 后是网络调用(毫秒级),Agent 对话链路涉及多次跨服务调用,延迟会累积。
解决方案:
聚合查询:gateway-service 提供聚合接口,一次请求查询多个服务的数据 缓存预热:Agent 配置、工具列表、Skill 元数据等不变数据在服务启动时缓存到本地 异步化:非关键路径(如日志、统计)改为异步消息
挑战三:测试复杂度
单体时一个集成测试就能覆盖全流程,微服务后需要管理多个服务的测试环境。
解决方案:
Contract Test:用 Pact 做消费者驱动的契约测试,确保服务间接口兼容性 本地开发:用 Docker Compose 或 Tilt 一键启动所有依赖服务 CI/CD:每个服务独立流水线,但部署时做集成验证
挑战四:运维复杂度
从管理一个进程到管理十几个服务。
解决方案:
K8s + Istio:服务网格统一管理流量、安全、可观测性 GitOps:用 ArgoCD 做声明式部署 统一监控:Prometheus + Grafana + Jaeger
Q3:项目中 MCP 和 A2A 都是开放协议,如果让你设计一个内部的"第四协议"来补充它们,你会设计什么?解决什么问题?
参考答案:
MCP 解决"Agent 能调用什么工具",A2A 解决"Agent 之间怎么协作"。但还有一个关键问题没解决:Agent 的能力如何被安全地授权和审计。
我可能会设计一个 AAP(Agent Authorization Protocol,Agent 授权协议),解决以下问题:
1. 权限粒度控制:
当前系统中,Agent 一旦绑定了某个工具或 Skill,就拥有该工具/Skill 的完全权限 AAP 应该支持最小权限原则:Agent A 只能在工作时间调用天气工具,Agent B 只能使用 go-code-review Skill 审查特定目录的代码
2. 调用审计:
每次工具调用和 Skill 激活需要记录:谁(Agent ID)在什么时候调用了什么工具/Skill,传入什么参数,返回什么结果 支持事后审计和异常检测(如某个 Agent 突然大量调用敏感工具)
3. 动态授权:
用户可以在对话过程中临时授权:"允许本次调用 Git 提交工具" 支持 OAuth2 风格的授权码流程
4. 能力 marketplace:
不仅仅是工具列表,而是能力描述 + 安全等级 + 使用条款 Agent 在调用前需要确认自己满足该能力的安全要求
协议设计草稿:
message Capability {
string id = 1;
string name = 2;
SecurityLevel level = 3; // PUBLIC / INTERNAL / CONFIDENTIAL
repeated Permission permissions = 4;
}
message AuthorizationRequest {
string agent_id = 1;
string capability_id = 2;
string justification = 3; // 为什么需要这个权限
}
message AuthorizationResponse {
bool granted = 1;
string token = 2; // JWT 格式,包含权限范围和过期时间
int64 expires_at = 3;
}
这个协议会让码神AI从一个"功能平台"升级为"可信平台",在企业落地时更有竞争力。
Q4:CheckPoint 机制目前是基于内存的,如果要支持百万级并发对话的断点续跑,你会怎么设计分布式 CheckPoint 系统?
参考答案:
现状问题:
内存 CheckPoint 无法跨实例共享 无过期清理机制,长期运行会内存泄漏 无持久化,服务重启丢失所有状态
分布式 CheckPoint 设计:
架构:
Agent CheckPoint
↓
CheckPoint Gateway(写入聚合 + 异步 flush)
↓
Hot Storage(Redis Cluster,最近 1 小时活跃状态)
↓
Cold Storage(S3/MinIO + 列式数据库,历史归档)
分层存储策略:
写入优化:
批量聚合:CheckPoint 写入先进入本地队列,每 100ms 或满 100 条批量写入 Redis 增量更新:只保存状态 diff,而非全量状态。如面试状态机只保存"当前阶段从 1 变为 2" 异步归档:Redis 中的过期数据由后台 worker 异步写入 S3
读取优化:
本地缓存:每个实例缓存最近访问的 1000 个 CheckPoint(LRU 淘汰) 一致性哈希:按 sessionId 做一致性哈希,同一 session 的请求路由到同一实例,提高本地缓存命中率
一致性保证:
乐观锁:每个 CheckPoint 带版本号,写入时检查版本号是否匹配(CAS 操作) 冲突解决:如果版本冲突(如两个实例同时更新),采用"最后写入者胜"或自定义合并策略 WAL(Write Ahead Log):关键状态变更先写日志,再写存储,支持故障恢复
可靠性:
多副本:Redis Cluster 三副本,S3 多可用区复制 定期快照:每小时对全量 CheckPoint 做快照,支持时间点恢复 监控告警:CheckPoint 丢失率、恢复成功率、延迟 P99
Q5:如果码神AI要支撑十万级智能体并发对话,当前架构的瓶颈会在哪里?你会怎么优化?
参考答案:
瓶颈分析:
优化方案:
1. 模型层优化:
模型路由:根据负载和成本动态选择模型厂商(OpenAI 满了路由到 Qwen) 请求合并:相同 Prompt 的批量请求合并为一次调用(Batch API) 本地缓存:常见问题的回答缓存到 Redis,减少模型调用 模型私有化:高并发场景部署本地模型(Ollama + vLLM),消除外部依赖
2. 连接层优化:
连接池化:SSE 连接复用,一个 HTTP/2 连接承载多个对话流 网关层优化:使用支持百万级连接的网关(如 Cloudflare、Nginx + Stream 模块) 优雅降级:连接数接近上限时,新对话降级为短轮询(polling)
3. 数据层优化:
读写分离:PostgreSQL 主从架构,聊天记录写入主库,查询走从库 分库分表:按 userId 或时间分表,避免单表过大 异步持久化:聊天记录先写本地 WAL,后台批量刷盘,不阻塞主流程
4. 向量层优化:
Milvus 集群:从 standalone 升级为 distributed 模式,多查询节点并行 检索缓存:热点查询结果缓存到 Redis(向量相似度检索结果在短时间内变化很小) 降维索引:对 Embedding 做降维(如 PCA),减少检索计算量
5. AgentBuilder 优化:
对象池:Agent 上下文对象复用,避免每次对话都重新创建 ChatModel 配置缓存:ProviderConfig、Tool 列表、Skill 元数据等不变数据本地缓存,带 TTL 预热机制:服务启动时预加载热门 Agent 的上下文
6. Skill 层优化:
内存缓存:热门 Skill 的 SKILL.md 内容缓存到内存,避免每次从文件系统读取 CDN 分发:Skill 内容通过 CDN 分发到边缘节点,减少中心节点压力 懒加载优化:Progressive Disclosure 的发现阶段只加载 name + description,延迟加载完整内容
7. 架构层优化:
边缘部署:a2a-server 和 mcp-server 部署到边缘节点,减少网络延迟 Serverless:低频 Agent 使用 Serverless 按需启动,高频 Agent 常驻内存 全局限流:基于令牌桶算法,按用户和 Agent 分别限流
Q6:项目中 A2A 协议让不同平台的 Agent 可以协作,但在实际企业落地中,跨平台 Agent 协作最大的障碍是什么?码神AI怎么解决?
参考答案:
跨平台 Agent 协作的现实障碍:
信任问题:
企业 A 的 Agent 调用企业 B 的 Agent 时,如何确保 B 不会泄露敏感数据? 如何验证对方 Agent 的身份和权限? 语义差异:
不同平台的 Agent 对同一任务的理解可能不同 比如"总结报告",有的 Agent 输出 Markdown,有的输出 JSON,格式不兼容 性能差异:
外部 Agent 的响应时间不可控,可能导致整体任务超时 外部 Agent 的可用性无法保证 计费与结算:
跨平台调用涉及 Token 消耗,如何分摊成本? 如何防止恶意调用(如无限循环调用)?
码神AI 的解决方案:
AgentCard 元数据:
每个 A2A Server 提供 AgentCard,包含 Agent 的能力描述、输入输出格式、SLA 承诺调用方在调用前可以评估对方是否满足需求 调用隔离:
外部 Agent 调用在独立的 goroutine 中执行,设置超时(如 30 秒) 使用熔断器模式:外部 Agent 连续失败时暂时停止调用,避免雪崩 结果适配:
Supervisor Agent 负责汇总各子 Agent 的结果,进行格式转换和冲突解决 可以配置"输出模板",强制子 Agent 按指定格式返回 审计与限流:
所有 A2A 调用记录到日志,包括请求内容、响应内容、耗时 配置每个外部 Agent 的调用配额(如每天最多 1000 次)
仍然需要业界解决的问题:
跨平台身份认证标准(如 DID 去中心化身份) Agent 行为审计和合规标准 跨平台计费结算协议
码神AI 通过 A2A 协议打下了互联互通的技术基础,但真正的跨平台协作生态还需要行业标准的成熟。
Q7:Skill 系统是当前 AI 领域非常火热的技术方向,码神AI 的 Skill 机制与市面上其他方案(如 Claude Code 的 Skills、OpenAI 的 GPTs)相比有什么独特之处?未来 Skill 生态会怎么发展?
参考答案:
码神AI Skill 机制的独特之处:
开放规范兼容:
遵循 Agent Skills 开放规范,与 Claude Code、Roo Code 等主流 AI 编辑器兼容 这意味着社区已有的 Skill 可以直接在码神AI中使用,降低了生态建设成本 文件系统 + 数据库混合存储:
Skill 内容(SKILL.md、scripts/、references/)存储在文件系统,便于版本控制(Git)和人工编辑 元数据(name、description、status)存储在 PostgreSQL,便于快速查询和关联管理 这种设计兼顾了"开发者友好"和"系统高效" Progressive Disclosure 三阶段加载:
发现阶段:只加载 name + description(~100 tokens),让 Agent 知道"有哪些能力" 激活阶段:任务匹配时加载完整 SKILL.md 指令体 执行阶段:按需读取 scripts/ 和 references/ 下的文件 这比一次性加载所有 Skill 内容更节省 Token,也减少了对模型注意力的干扰 GitHub Source 远程安装:
支持通过 GitHub 仓库地址直接安装 Skill,使用 go-git 克隆 每个用户的 Skill 放在独立的目录,实现权限隔离 这为构建 Skill Marketplace 奠定了基础 与 Agent 运行时深度集成:
Skill 不是简单的文本注入,而是通过 Eino ADK 的 skill.NewMiddleware作为 Handler 注入 Agent这意味着 Skill 可以参与 Agent 的完整生命周期,包括工具调用、状态管理、错误处理
与市面上方案的对比:
未来 Skill 生态发展方向:
Skill Marketplace:
建立官方 Skill 商店,开发者可以发布、销售、评价 Skill 引入评分机制和社区审核,保证 Skill 质量 Skill 组合:
支持多个 Skill 组合成"Skill 链",如"代码审查 → 性能优化 → 测试生成" 组合 Skill 可以共享上下文,避免重复加载 Skill 版本管理:
支持 Skill 的版本控制和回滚 Agent 可以锁定使用特定版本的 Skill,避免升级导致行为变化 自动 Skill 发现:
Agent 根据用户任务自动从 Marketplace 推荐合适的 Skill 基于用户历史行为的个性化推荐 跨平台 Skill 标准:
推动 Agent Skills 规范成为行业标准 不同平台的 Agent 可以共享同一套 Skill 生态
码神AI 的 Skill 机制已经为这些发展方向打下了坚实的技术基础。
6. 面试通用建议
6.1 自我介绍时的项目描述顺序
一句话定位:码神AI是 Go + Eino 的 AI Agent 开发平台(根据自己参与程度调整) 解决什么问题:AI 应用能力单一、协议封闭、工程薄弱 我的贡献:重点讲自己负责的模块(实习生讲接口开发,资深讲架构设计) 技术亮点:根据阶段选择 2-3 个亮点深入讲(Skill 是当下热门方向,建议重点准备) 成果与收获:数据指标或技术成长
6.2 各阶段面试重点
6.3 加分项
能画出项目的架构图和数据流图 能讲清楚技术选型的 trade-off(为什么选 A 不选 B) 能指出项目的不足并提出改进方案 能结合行业趋势(如 MCP 生态发展、A2A 标准化进程、Skill 插件化趋势)谈项目未来 了解当前 AI 领域的热点:Claude Code Skills、OpenAI GPTs、Cursor Rules 等,能对比分析 有开源贡献或技术博客记录
最后宣传一下我的AI Agent一体化平台项目实战教程,有Go和Java两个版本,长期更新项目,持续添加最新的AI技术,通过这个项目已经有上百位成功转型AI Agent开发领域,薪资翻倍。有意向可以加我mszlu521了解。 如果没有渠道使用国外最好的大模型,可以试试这个mytoken.top
夜雨聆风