乐于分享
好东西不私藏

码神AI(MSZLU-AI)项目面试文档

码神AI(MSZLU-AI)项目面试文档

本文档按程序员职业阶段分为四个版本:实习生、工作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 内部按功能模块划分agentsknowledgestoolsworkflowsskillssettingssubscriptionstemplatesnodesllms 等。每个模块内部遵循 Handler → Service → Repository 经典分层。

演进路线

  • 当前阶段app 内各模块共享同一个进程和数据库连接,通过内部函数调用或事件总线(event.Trigger)进行模块间通信
  • 演进阶段:当业务量增长后,可将 app 内的每个功能模块逐步拆分为独立的 gRPC 微服务model 模块作为共享 proto 定义层,各服务独立部署、独立扩缩容
  • 最终形态app 退化为 API Gateway,core 抽离为独立 AI 引擎服务,a2a-server 和 mcp-server 已在物理上独立,形成完整微服务集群

1.2 技术栈

类别
技术
编程语言
Go
Web 框架
Thunder(自研)、Gin
AI 框架
Eino(CloudWeGo)、Eino-Ext
数据库
PostgreSQL、Redis
向量数据库
Elasticsearch 8、Milvus
模型支持
OpenAI、Ollama、Qwen(通义千问)
开放协议
MCP(Model Context Protocol)、A2A(Agent-to-Agent)
Skill 规范
Agent Skills 开放规范(与 Claude Code、Roo Code 兼容)
容器化
Docker、Docker Compose
云原生
Kubernetes、HPA、ConfigMap、Ingress
工具库
GORM、Viper、JWT、UUID、go-git
支付
微信支付(V3)
压测
自定义 Go 压测工具

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/createPOST /api/v1/agents/chat 等接口的路由处理函数
  • service.go 实现了 createAgentagentMessage 等业务方法,处理智能体创建逻辑和对话分发逻辑
  • 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,因为:

  1. 对话场景只需要服务器向客户端推送AI 的回复内容,客户端不需要主动向服务器发送消息(除了最初的请求)
  2. SSE 基于 HTTP,兼容性更好,前端用 EventSource 就能接收,不需要额外的库
  3. 实现更简单,服务端只需要设置 Content-Type: text/event-stream,然后循环写数据即可
  4. 自动支持断线重连

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 在系统中的流转

  1. 管理员或用户把 Skill 文件放到指定的目录(如 skills/go-code-review/
  2. 通过界面创建 Skill,系统会读取 SKILL.md,解析 name 和 description 存入数据库
  3. 用户把 Skill 关联到某个 Agent
  4. Agent 对话时,系统把 Skill 的内容作为上下文注入 Prompt
  5. 大模型根据 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

工具调用流程

  1. 用户提问 → 模型判断需要调用工具
  2. 系统根据工具名称从 Registry 中找到对应工具
  3. 执行工具,传入模型生成的参数
  4. 将工具执行结果返回给模型
  5. 模型基于工具结果生成最终回答

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 模型调用工具出错或网络中断时,前端会卡住收不到消息,用户体验很差。后来我是这样解决的:

  1. 在 goroutine 里加了 defer recover(),防止 panic 导致整个服务崩溃
  2. 区分了不同类型的错误:模型错误、工具调用错误、网络超时,每种错误都封装成统一的 JSON 格式返回给前端
  3. 在流结束前一定发送 [DONE] 标记,让前端知道流已结束,可以关闭连接
  4. 加了心跳机制(: 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 三层。

模块间通信:当前阶段各模块在同一个进程内,通过两种方式通信:

  1. 直接函数调用:如 agents 模块的 Service 直接调用其他模块的 Repository
  2. 事件总线:event.Trigger("searchKnowledgeBase", ...) 解耦跨模块调用

演进路线:app 是按功能模块划分的,这本身就为后续拆分做了准备。当业务量和团队规模增长后,可以按以下路线演进:

  1. 将 model 模块中的 GORM 结构体转换为 protobuf 定义,作为服务间契约
  2. 把 agents、knowledges、tools、skills 等模块逐个拆分为独立的 gRPC 微服务
  3. app 退化为 API Gateway,负责路由、认证、限流
  4. core 抽离为独立 AI 引擎服务,通过 gRPC 对外提供 Agent 构建、工作流执行能力
  5. a2a-server 和 mcp-server 已经是独立进程,可以直接扩展

这样的好处是:初期开发效率高(单体),后期可按业务域独立部署和扩缩容。


Q2:AgentBuilder 工厂模式是怎么设计的?为什么要这样设计?

参考答案

AgentBuilder 位于 core/ai/agentbuilder/agentbuilder.go,核心职责是把数据库中的 Agent 配置对象转换为 Eino 运行时可执行的 Agent。

设计流程

  1. 根据 ModelProvider(openai/ollama/qwen)从数据库获取提供商配置
  2. 调用 BuildToolCallingChatModel 创建对应 ChatModel,设置 temperature、maxTokens 等参数
  3. 调用 BuildTools 加载 Agent 关联的工具:system 类型从本地 Registry 获取,mcp 类型通过 MCP 客户端远程获取
  4. 将 Agent 关联的 Workflows 转换为 WorkflowTool 加入工具列表
  5. 调用 BuildSkills 按 baseDir 分组加载 Skill Middleware
  6. 调用 BuildRagContext 执行知识库检索,构建上下文字符串
  7. 最终返回包含 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

实现流程

  1. 解析 MCP Server 的配置(BaseUrl、Token)
  2. 根据 URL 后缀判断传输方式:
    • 以 /sse 结尾 → 使用 client.NewSSEMCPClient 创建 SSE 客户端
    • 其他 → 使用 client.NewStreamableHttpClient 创建 Streamable HTTP 客户端
  3. 发送 Initialize 请求,协商协议版本
  4. 调用 mcpp.GetTools 获取工具列表,转换为 Eino 的 tool.BaseTool

SSE vs Streamable HTTP 的区别

维度
SSE
Streamable HTTP
连接方式
长连接,单向推送
短连接,请求-响应
适用场景
实时通知、流式数据
传统 API 调用
兼容性
基于 HTTP,兼容性好
标准 HTTP,兼容性最好
复杂度
需要维护长连接
和普通 HTTP 调用一样
项目中用途
MCP Server 推送工具列表变更
普通工具调用

项目中同时支持两种方式,是为了兼容不同类型的 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 在系统中的流转

  1. 扫描与验证skills/service.go):

    • validateSkillName 检查 Skill 目录是否存在、SKILL.md 是否存在
    • ParseSkillMd 解析 frontmatter,验证 name 与目录名一致
  2. 注册入库

    • 本地 Skill:createSkill 将公共目录的 Skill 复制到用户私有目录,数据库记录 name、description、status
    • GitHub Skill:installSkill 使用 go-git 克隆仓库到临时目录,复制到用户目录,解析 SKILL.md
  3. Agent 关联agents/service.go):

    • addSkillToAgent 在 agent_skills 关联表中插入记录
    • Agent 详情查询时通过 GORM Preload 加载关联的 Skills
  4. 运行时加载agentbuilder.go):

    • BuildSkills 按 baseDir 分组,为每组创建 skill.BackendFromFilesystem
    • 每个 Skill 创建 skill.NewMiddleware,作为 Eino ADK 的 Handler 注入 Agent

Q6:项目中 Tool Calling 的双轨制工具体系是怎么设计的?系统工具和 MCP 工具有什么区别?

参考答案

项目中设计了双轨制工具体系,让 Agent 既能使用内置的系统工具,也能无缝接入外部的 MCP 工具。

系统工具(System Tools)

  1. 实现方式:用 Go 代码直接实现,位于 core/ai/tools/ 目录下
  2. 接口规范:实现 Eino 的 tool.BaseTool 接口,包含 Info()(返回工具元数据)和 InvokableRun()(执行具体逻辑)
  3. 注册机制:通过 tools.RegisterSystemTools() 统一注册到全局 Registry,Agent 构建时从 Registry 查找
  4. 已实现的工具
    • weather_tool:调用高德天气 API
    • git_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)

  1. 实现方式:通过 MCP 协议连接外部工具服务器
  2. 服务架构mcp-server/ 是独立的 MCP 服务,基于 mark3labs/mcp-go 实现
  3. 客户端core/ai/mcps/mcp.go 的 GetEinoBaseTools 方法负责连接 MCP Server
  4. 动态发现:用户在界面上配置 MCP 服务地址,系统运行时动态拉取工具列表
  5. 传输协议:支持 SSE 和 Streamable HTTP 两种方式

两种工具的区别

维度
系统工具
MCP 工具
实现位置
项目代码内(core/ai/tools/
外部 MCP Server
部署方式
随主服务一起部署
独立部署,可分布式
发现方式
启动时注册到 Registry
运行时动态拉取
适用场景
通用能力(天气、Git、文件操作)
第三方服务(数据库、邮件、CRM)
扩展成本
需要改代码、重新编译
配置地址即可,零代码

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

核心流程

  1. 节点注册:使用 sync.Once 初始化节点工厂映射表,将 textDisplaytextCombinehtmlDisplayqwenVL 等类型映射到对应的工厂函数
  2. 图解析:遍历前端传来的 Graph 数据(Nodes + Edges),识别 start 和 end 节点
  3. 节点映射:将每个业务节点通过 wf.AddLambdaNode 注册为 InvokableLambda,存入 nodeRefs
  4. 边连接
    • start → 节点:使用 AddInput(compose.START)
    • 节点 → end:使用 MapFields(sourceHandle, targetHandle) 做字段映射
    • 节点 → 节点:使用 AddInputWithOptions 支持多字段映射
  5. 编译执行wf.Compile(ctx) 编译 DAG 为可执行 Runner,runner.Invoke(ctx, params) 同步执行

DAG 编译的关键:Eino 的 Workflow 在 Compile 时会检查所有节点的输入依赖是否满足,确保没有循环依赖和数据断链。如果有节点缺少输入或存在环,Compile 会返回错误。


Q7:如果要把面试系统的状态机从内存改为 Redis 持久化,你会怎么设计?

参考答案

当前面试状态存储在内存 map 中,适合单进程。如果要支持分布式部署,需要改为 Redis 持久化。

设计思路

  1. 数据结构:使用 Redis Hash 存储 interview:{sessionId},字段包括 stage、round、history、scores 等
  2. 序列化History 和 Scores 用 JSON 序列化后存储
  3. 并发控制:使用 Redis 分布式锁(SET interview:{sessionId}:lock NX EX 10)防止多个实例同时修改同一状态
  4. 过期清理:设置 TTL(如 24 小时),自动清理过期面试状态
  5. 代码改造
    • 抽象 StateStore 接口,包含 GetSaveClear 方法
    • 实现 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)**拆分,而非按技术层拆分:

微服务
职责
拆分依据
agent-service
智能体 CRUD、对话编排、三种模式分发
核心业务能力,调用频率高
knowledge-service
知识库管理、文档解析、向量索引、检索
数据密集型,可独立扩缩容
tool-service
系统工具注册、MCP 客户端管理
工具调用需要独立超时和重试策略
skill-service
Skill 扫描、验证、加载、GitHub 安装
文件 IO 密集型,与 AI 引擎耦合低
workflow-service
工作流定义、DAG 编译执行
计算密集型,可能长时间运行
subscription-service
订阅计划、订单、微信支付
支付敏感,需要独立安全策略
gateway-service
路由、认证、限流、日志
API 网关,聚合各服务接口

通信协议选择

  • 服务间同步调用:gRPC(基于 protobuf,性能高,类型安全)
  • 异步事件:消息队列(如 Kafka/RabbitMQ),用于文档解析完成通知、工作流执行事件等
  • 与前端交互:保留 HTTP/REST + SSE(流式对话需要)

数据拆分

  • 每个服务拥有独立数据库,避免直接访问其他服务的数据库
  • 共享的 model 模块需要拆分为:
    • agent-proto:各服务共享的 protobuf 定义
    • common-lib:公共工具库(不依赖具体业务)

演进策略

  1. 第1阶段:先拆分 subscription-service(支付模块,风险隔离需求最强烈)和 gateway-service
  2. 第2阶段:拆分 knowledge-service(数据量增长快,需要独立 ES/Milvus 集群)
  3. 第3阶段:拆分 workflow-service(长时间运行的任务需要独立资源调度)
  4. 第4阶段:拆分 agent-servicetool-serviceskill-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_search API 查询
  • 优势:部署简单(单节点即可)、与全文检索结合方便、已有 Elastic 技术栈的团队接入成本低
  • 劣势:海量向量(千万级以上)时性能下降、内存占用大

Milvus 向量检索

  • 专为向量设计的数据库,支持多种索引类型(HNSW、IVF_FLAT、IVF_PQ 等)
  • 架构:接入层(Proxy)→ 协调层(Root/Query/Data)→ 存储层(S3/MinIO)
  • 优势:向量检索性能极高、支持分布式扩展、可处理十亿级向量
  • 劣势:部署复杂(需要 etcd + MinIO + 多节点)、运维成本高

项目中的选择策略

场景
推荐方案
理由
文档 < 10万,已有 ES 集群
ES
部署简单,无需引入新组件
文档 > 100万,高并发检索
Milvus
性能更强,支持水平扩展
需要混合检索(向量 + 全文)
ES
原生支持 text + dense_vector 混合查询
多租户隔离需求强
Milvus
Collection 级别的资源隔离

项目中通过 VectorStore 接口抽象,切换只需要改配置,业务代码无感知。


Q4:Skill 的 Progressive Disclosure 机制在 Prompt Engineering 层面有什么价值?如果上下文窗口无限大,还需要这个机制吗?

参考答案

Progressive Disclosure 的核心价值

  1. Token 效率:大模型按 Token 计费,减少无效 Token 可以降低调用成本
  2. 注意力聚焦:Prompt 中无关信息越多,模型越容易"分心",影响任务执行质量
  3. 延迟优化:Prompt 越短,模型生成首个 Token 的时间(TTFB)越短

三阶段加载的具体价值

  • 发现阶段只加载 name + description(~100 tokens):让模型知道"有哪些能力"
  • 激活阶段加载完整 SKILL.md:让模型知道"如何执行这个能力"
  • 执行阶段按需加载 scripts/references:让模型知道"执行时参考什么"

如果上下文窗口无限大,还需要吗?

仍然需要,原因有三:

  1. 注意力机制的限制:Transformer 的注意力是全局的,信息过多会导致"注意力稀释",重要信息被淹没
  2. 推理成本:即使上下文无限,模型处理长序列的计算量仍按 O(n²) 或 O(n) 增长,影响响应速度
  3. 信息过载:过多的上下文会让模型难以判断哪些信息是当前任务真正需要的,反而降低准确率

Progressive Disclosure 本质上是信息架构设计,和 UI 设计中的"渐进式披露"原理相同:在正确的时间提供正确的信息量。


Q5:项目中 SSE 流式压测工具的设计思路是什么?对于 LLM 应用的压测,和传统 HTTP 接口有什么不同?

参考答案

压测工具设计benchmark/agent_chat_benchmark.go):

  1. 并发模型sync.WaitGroup + goroutine 池,每个 worker 持续发请求直到压测时长结束
  2. SSE 流处理:使用 bufio.Reader 逐行读取响应,遇到 [DONE] 标记才算请求成功
  3. 指标统计:总请求数、成功数、失败数、QPS、吞吐量(KB/s)、平均/最小/最大响应时间
  4. 进度报告:每 5 秒打印一次实时统计

LLM 应用压测 vs 传统 HTTP 压测

维度
传统 HTTP 接口
LLM SSE 流式接口
响应时间
一次性返回,TTFB ≈ 总耗时
TTFB 很快,但总耗时长(流式输出)
成功定义
Status 200 即成功
必须读到 [DONE] 才算成功
并发瓶颈
服务端处理能力
模型 API 的 Rate Limit + 服务端处理能力
资源消耗
主要消耗 CPU/内存
主要消耗模型调用额度 + 网络带宽
压测重点
QPS、延迟 P99
吞吐量、流稳定性、模型超时率

LLM 压测的特殊关注点

  1. 模型 Rate Limit:OpenAI/Qwen 等厂商有 TPM(Tokens Per Minute)限制,压测前需要确认配额
  2. 流中断处理:网络波动可能导致 SSE 连接中断,需要统计中断率和重连成功率
  3. 长尾延迟:LLM 响应时间分布极不均匀,简单问题 2 秒,复杂问题可能 60 秒,需要关注 P95/P99
  4. 成本估算:每次压测都要计算 Token 消耗和费用,避免误操作导致高额账单

Q6:AI 面试系统的状态机设计中,如何处理"面试官提问 → 用户回答 → 评分 → 下一题"这个循环的并发安全和一致性?

参考答案

面试系统是一个典型的长时间运行 + 人机交互的状态机,核心挑战是:用户可能在任意时刻输入回答,而 AI 可能正在生成问题或评分。

并发安全设计

  1. 状态隔离:每个 session 有独立的状态对象 StageState,存储在 interviewStates map 中,key 为 sessionId
  2. 锁粒度:使用 sync.RWMutex,读操作(GetState)用 RLock,写操作(SaveState)用 Lock
  3. 深拷贝:GetState 返回的是状态的深拷贝,防止调用方修改原始状态导致数据竞争

一致性保证

  1. 等待状态(waitingState):AI 提问后设置 waitingState[sessionId] = true,在此期间用户的任何输入都被视为"回答"
  2. SequentialAgent:使用 adk.NewSequentialAgent 确保四个面试阶段严格按顺序执行,前一阶段不完成不会进入下一阶段。每个阶段由 interview.NewInterviewStageAgent 创建专门的 StageAgent,负责该轮次的提问、评分和晋级判断
  3. 分数累计:每轮面试结束后,finalizeInterviewResult 计算该阶段得分并存入 StageScores map,单轮低于阈值(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 方法中实现。

实现流程

  1. 用户在前端配置 GitHub Source(仓库地址 + 分支)
  2. 调用 installSkill 时,指定 skillId 和 sourceId
  3. 使用 go-git 库的 git.PlainClone 克隆仓库到临时目录(baseDir/.temp/{userId}/{skillId}
  4. 从临时目录的指定路径(req.RepoPath)复制 Skill 文件到用户私有目录
  5. 清理临时目录
  6. 读取用户私有目录中的 SKILL.md,解析元数据
  7. 验证 name 和 description 后,存入数据库

安全考虑

  1. 仓库来源白名单:只允许从可信的 GitHub 仓库安装,防止恶意代码注入
  2. SKILL.md 验证
    • 检查 name 是否与目录名一致
    • 检查 description 是否说明清楚激活条件
    • 限制文件大小,防止超大文件导致内存溢出
  3. 沙箱执行:Skill 中的 scripts 应该在沙箱环境中执行,避免直接访问宿主机资源
  4. 权限隔离:每个用户的 Skill 放在独立的目录({baseDir}/{userId}/{skillName}),防止用户 A 访问用户 B 的 Skill
  5. 临时目录清理:克隆完成后立即删除临时目录,避免磁盘空间泄漏
  6. 网络超时:克隆仓库时设置合理的超时时间,防止因网络问题导致 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),元数据可以快速查询
  • 坏处是数据一致性需要维护(文件删了但数据库记录还在)

如果有机会重新设计,我会改变

  1. 数据库设计

    • 当前 Agent 和 Tools/KBs/Workflows/Skills 是多对多关系,GORM 的预加载在复杂查询时性能不佳
    • 重新设计会引入CQRS:写模型用关系数据库,读模型用 Elasticsearch 做物化视图
  2. 事件总线

    • 当前用内存事件总线 event.Trigger,无法实现跨进程通信
    • 重新设计会在早期引入消息队列(如 NATS 或 Kafka),为微服务拆分做准备
  3. Skill 存储

    • 当前 Skill 内容存在本地文件系统,分布式部署时需要共享存储(如 NFS/S3)
    • 重新设计会把 Skill 内容存入对象存储(S3/MinIO),元数据保留在数据库,实现真正的无状态服务
  4. 缓存策略

    • 当前知识库检索和模型配置查询没有缓存,每次对话都查数据库
    • 重新设计会引入多级缓存:L1(本地内存缓存热点配置)→ L2(Redis)→ DB
  5. 可观测性

    • 当前日志比较基础,重新设计会引入 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 + 列式数据库,历史归档)

分层存储策略

层级
存储介质
数据特点
TTL
L1 Hot
Redis Cluster + 本地内存缓存
最近 1 小时活跃的对话
1 小时
L2 Warm
Redis Cluster(持久化版)
最近 24 小时活跃的对话
24 小时
L3 Cold
S3 + ClickHouse/Doris
历史归档,用于审计和分析
永久

写入优化

  1. 批量聚合:CheckPoint 写入先进入本地队列,每 100ms 或满 100 条批量写入 Redis
  2. 增量更新:只保存状态 diff,而非全量状态。如面试状态机只保存"当前阶段从 1 变为 2"
  3. 异步归档:Redis 中的过期数据由后台 worker 异步写入 S3

读取优化

  1. 本地缓存:每个实例缓存最近访问的 1000 个 CheckPoint(LRU 淘汰)
  2. 一致性哈希:按 sessionId 做一致性哈希,同一 session 的请求路由到同一实例,提高本地缓存命中率

一致性保证

  1. 乐观锁:每个 CheckPoint 带版本号,写入时检查版本号是否匹配(CAS 操作)
  2. 冲突解决:如果版本冲突(如两个实例同时更新),采用"最后写入者胜"或自定义合并策略
  3. WAL(Write Ahead Log):关键状态变更先写日志,再写存储,支持故障恢复

可靠性

  1. 多副本:Redis Cluster 三副本,S3 多可用区复制
  2. 定期快照:每小时对全量 CheckPoint 做快照,支持时间点恢复
  3. 监控告警:CheckPoint 丢失率、恢复成功率、延迟 P99

Q5:如果码神AI要支撑十万级智能体并发对话,当前架构的瓶颈会在哪里?你会怎么优化?

参考答案

瓶颈分析

组件
当前瓶颈
十万级并发时的表现
模型 API
外部模型有 Rate Limit
大量请求排队,延迟飙升
SSE 连接
每个对话一个长连接
文件描述符耗尽,内存 OOM
PostgreSQL
单实例写入瓶颈
聊天记录写入成为瓶颈
向量检索
ES/Milvus 单实例
检索延迟增加,超时率上升
AgentBuilder
每次对话都重新构建
CPU 占用高,响应慢
Skill 加载
每次对话都从文件系统读取
IO 瓶颈,延迟增加

优化方案

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 协作的现实障碍

  1. 信任问题

    • 企业 A 的 Agent 调用企业 B 的 Agent 时,如何确保 B 不会泄露敏感数据?
    • 如何验证对方 Agent 的身份和权限?
  2. 语义差异

    • 不同平台的 Agent 对同一任务的理解可能不同
    • 比如"总结报告",有的 Agent 输出 Markdown,有的输出 JSON,格式不兼容
  3. 性能差异

    • 外部 Agent 的响应时间不可控,可能导致整体任务超时
    • 外部 Agent 的可用性无法保证
  4. 计费与结算

    • 跨平台调用涉及 Token 消耗,如何分摊成本?
    • 如何防止恶意调用(如无限循环调用)?

码神AI 的解决方案

  1. AgentCard 元数据

    • 每个 A2A Server 提供 AgentCard,包含 Agent 的能力描述、输入输出格式、SLA 承诺
    • 调用方在调用前可以评估对方是否满足需求
  2. 调用隔离

    • 外部 Agent 调用在独立的 goroutine 中执行,设置超时(如 30 秒)
    • 使用熔断器模式:外部 Agent 连续失败时暂时停止调用,避免雪崩
  3. 结果适配

    • Supervisor Agent 负责汇总各子 Agent 的结果,进行格式转换和冲突解决
    • 可以配置"输出模板",强制子 Agent 按指定格式返回
  4. 审计与限流

    • 所有 A2A 调用记录到日志,包括请求内容、响应内容、耗时
    • 配置每个外部 Agent 的调用配额(如每天最多 1000 次)

仍然需要业界解决的问题

  • 跨平台身份认证标准(如 DID 去中心化身份)
  • Agent 行为审计和合规标准
  • 跨平台计费结算协议

码神AI 通过 A2A 协议打下了互联互通的技术基础,但真正的跨平台协作生态还需要行业标准的成熟。


Q7:Skill 系统是当前 AI 领域非常火热的技术方向,码神AI 的 Skill 机制与市面上其他方案(如 Claude Code 的 Skills、OpenAI 的 GPTs)相比有什么独特之处?未来 Skill 生态会怎么发展?

参考答案

码神AI Skill 机制的独特之处

  1. 开放规范兼容

    • 遵循 Agent Skills 开放规范,与 Claude Code、Roo Code 等主流 AI 编辑器兼容
    • 这意味着社区已有的 Skill 可以直接在码神AI中使用,降低了生态建设成本
  2. 文件系统 + 数据库混合存储

    • Skill 内容(SKILL.md、scripts/、references/)存储在文件系统,便于版本控制(Git)和人工编辑
    • 元数据(name、description、status)存储在 PostgreSQL,便于快速查询和关联管理
    • 这种设计兼顾了"开发者友好"和"系统高效"
  3. Progressive Disclosure 三阶段加载

    • 发现阶段:只加载 name + description(~100 tokens),让 Agent 知道"有哪些能力"
    • 激活阶段:任务匹配时加载完整 SKILL.md 指令体
    • 执行阶段:按需读取 scripts/ 和 references/ 下的文件
    • 这比一次性加载所有 Skill 内容更节省 Token,也减少了对模型注意力的干扰
  4. GitHub Source 远程安装

    • 支持通过 GitHub 仓库地址直接安装 Skill,使用 go-git 克隆
    • 每个用户的 Skill 放在独立的目录,实现权限隔离
    • 这为构建 Skill Marketplace 奠定了基础
  5. 与 Agent 运行时深度集成

    • Skill 不是简单的文本注入,而是通过 Eino ADK 的 skill.NewMiddleware 作为 Handler 注入 Agent
    • 这意味着 Skill 可以参与 Agent 的完整生命周期,包括工具调用、状态管理、错误处理

与市面上方案的对比

维度
码神AI Skill
Claude Code Skills
OpenAI GPTs
规范
Agent Skills 开放规范
自有规范
自有规范
格式
YAML frontmatter + Markdown
YAML + Markdown
配置文件 + 提示词
安装方式
本地 + GitHub 克隆
内置 + 手动复制
商店下载
加载策略
Progressive Disclosure
全量加载
全量加载
运行时集成
Eino Middleware
内置执行器
内置执行器
权限隔离
用户级目录隔离

未来 Skill 生态发展方向

  1. Skill Marketplace

    • 建立官方 Skill 商店,开发者可以发布、销售、评价 Skill
    • 引入评分机制和社区审核,保证 Skill 质量
  2. Skill 组合

    • 支持多个 Skill 组合成"Skill 链",如"代码审查 → 性能优化 → 测试生成"
    • 组合 Skill 可以共享上下文,避免重复加载
  3. Skill 版本管理

    • 支持 Skill 的版本控制和回滚
    • Agent 可以锁定使用特定版本的 Skill,避免升级导致行为变化
  4. 自动 Skill 发现

    • Agent 根据用户任务自动从 Marketplace 推荐合适的 Skill
    • 基于用户历史行为的个性化推荐
  5. 跨平台 Skill 标准

    • 推动 Agent Skills 规范成为行业标准
    • 不同平台的 Agent 可以共享同一套 Skill 生态

码神AI 的 Skill 机制已经为这些发展方向打下了坚实的技术基础。


6. 面试通用建议

6.1 自我介绍时的项目描述顺序

  1. 一句话定位:码神AI是 Go + Eino 的 AI Agent 开发平台(根据自己参与程度调整)
  2. 解决什么问题:AI 应用能力单一、协议封闭、工程薄弱
  3. 我的贡献:重点讲自己负责的模块(实习生讲接口开发,资深讲架构设计)
  4. 技术亮点:根据阶段选择 2-3 个亮点深入讲(Skill 是当下热门方向,建议重点准备)
  5. 成果与收获:数据指标或技术成长

6.2 各阶段面试重点

阶段
面试官关注点
准备重点
实习生
学习能力、基础扎实程度、对技术的热情
Go 基础、HTTP 协议、数据库操作、Skill 概念理解、项目中做了什么
1-3年
独立完成能力、代码质量、对业务理解
分层架构、接口设计、RAG 原理、MCP/A2A 概念、Skill 系统实现
3-5年
系统设计能力、技术选型能力、问题解决
微服务拆分、性能优化、分布式一致性、协议细节、Skill 插件化设计
5年以上
架构视野、技术决策、团队影响力、行业洞察
架构演进、高并发设计、开放生态、Skill 生态趋势、技术趋势判断

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

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-12 07:05:45 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/587468.html
  2. 运行时间 : 0.217430s [ 吞吐率:4.60req/s ] 内存消耗:4,955.42kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=19341dfeaa5461685986e75e48590d84
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001105s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001420s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000783s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000638s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001306s ]
  6. SELECT * FROM `set` [ RunTime:0.000496s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001428s ]
  8. SELECT * FROM `article` WHERE `id` = 587468 LIMIT 1 [ RunTime:0.001658s ]
  9. UPDATE `article` SET `lasttime` = 1781219145 WHERE `id` = 587468 [ RunTime:0.001427s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000629s ]
  11. SELECT * FROM `article` WHERE `id` < 587468 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001428s ]
  12. SELECT * FROM `article` WHERE `id` > 587468 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001172s ]
  13. SELECT * FROM `article` WHERE `id` < 587468 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.005077s ]
  14. SELECT * FROM `article` WHERE `id` < 587468 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006112s ]
  15. SELECT * FROM `article` WHERE `id` < 587468 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005713s ]
0.221697s