
1. 从一张画歪的时序图说起AI 面试平台的调用链到底长什么样如果你正在做 AI 智能面试平台或者接手了一个 SpringCloud 微服务项目大概率会遇到同一个尴尬架构图里服务画了一堆真到面试请求进来的时候谁也说不清它到底先经过谁、在哪一步扣权益、AI 评分又是从哪个服务发出去的。我见过不少团队把「网关 → 业务 → AI」画成一条直线结果联调时发现权益没扣、题目重复生成、评分回调丢失回头再补图已经来不及了。这篇就聚焦一件事用 Mermaid 时序图把 AI 智能面试平台的完整链路还原出来从用户点击「开始模拟面试」到拿到评分点评中间经过 Gateway、Account、AI 面试服务、AIMCP封装大模型调用的服务以及 Product 商品服务。你会拿到可直接运行的 Mermaid 代码、SpringCloud 服务拆分骨架以及本地渲染验证的步骤。适合谁看正在做微服务架构设计、需要给团队讲清调用顺序、或者想用 AI 辅助生成架构图的后端同学。Mermaid 的好处是纯文本、能进 Git、改一行就能重新渲染比拖拽工具更适合放进代码仓库跟版本走。2. 前置准备TaoToken 接入与 AI 面试服务的模型调用位置在画图之前先把「AI 能力从哪来」这件事定下来。AI 面试平台的核心是题目生成和答案评分这两步都要调大模型。我的做法是把模型调用统一收口到 AIMCP 这个服务里业务侧的 AI 面试服务只负责编排流程不直接碰模型 SDK。这样换模型、调参数、加限流都只改一个地方。模型接入我用的是 TaoToken它提供 OpenAI 兼容的接口SpringCloud 里用 WebClient 或 OkHttp 都能直接调。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。你需要先去控制台创建 API Key控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了请求格式和参数说明。为什么要在架构图讲解里先提这个因为时序图里 AIMCP 向大模型发请求那一步如果模型地址和 Key 没配好图画得再漂亮也跑不通。把 Key 配到 AIMCP 的配置文件里后面验证请求时才能看到真实的题目返回。3. SpringCloud 服务拆分骨架与 Mermaid 时序图代码3.1 服务拆分与职责边界先把服务边界定清楚时序图才有意义。我按业务职责拆成五个核心服务加一个网关服务职责关键接口Gateway统一入口、鉴权、路由、限流/api/interview/**Account登录认证、权益校验与扣减/account/deductAI 面试服务面试流程编排、题目下发、评分汇总/ai/interview/startAIMCP封装大模型调用、Prompt 管理/mcp/generate、/mcp/scoreProduct权益套餐、订单、支付回调/product/rights这里有个容易踩的坑权益扣减放在 Gateway 还是 Account我的建议是 Gateway 只做鉴权和路由扣减逻辑放 Account由 Gateway 调用 Account 完成。这样 Account 的扣减接口可以独立做幂等和事务不会把网关拖成业务逻辑堆叠的地方。3.2 可复制的 Mermaid 时序图代码下面这段代码可以直接粘到 Mermaid Live Editor 里渲染。注意箭头规则请求用实线-返回用虚线--这样一眼能看出调用方向。sequenceDiagram participant 用户 participant Gateway participant Account participant AI as AI面试服务 participant AIMCP participant Product 用户-Gateway: 发起模拟面试请求 Gateway-Account: 校验并扣减用户权益 Account--Gateway: 返回权益扣减信息 Gateway-AI: 发起面试请求 AI-AIMCP: 调用AI生成题目 AIMCP--AI: 返回题目内容 AI--Gateway: 返回题目 Gateway--用户: 显示题目 用户-Gateway: 提交答案 Gateway-AI: 发起评分请求 AI-AIMCP: 请求AI评分 AIMCP--AI: 返回评分结果 AI--Gateway: 返回评分 Gateway--用户: 显示评分和点评 Note over 用户,Gateway: 面试结束时渲染出来你会看到六条泳道用户和 Gateway 之间的交互最频繁AIMCP 只跟 AI 面试服务对话不直接暴露给网关。这个结构的好处是模型调用被隔离在 AIMCP 内部AI 面试服务挂了不影响 Account 扣权益AIMCP 挂了也只影响题目和评分不会把整个面试流程拖死。3.3 AIMCP 调用大模型的配置片段时序图里 AIMCP 那一步要真正跑通需要在 application.yml 里配好模型地址和 Key。下面是我用的配置结构Key 从环境变量注入不要硬编码进仓库aimcp: llm: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} model: gpt-4o-mini timeout: 30000 max-retries: 2对应的 Java 调用用 WebClient 发 POST请求体按 OpenAI 兼容格式组装 messages 数组。题目生成和评分用不同的 system prompt评分那步要求模型返回 JSON方便 AI 面试服务解析成分数。4. 本地渲染验证与请求链路核对4.1 Mermaid 渲染验证步骤图写完要验证两件事语法能不能渲染、调用顺序对不对。渲染验证很简单把上面那段代码复制到 Mermaid Live Editor右侧预览区如果出现六条泳道和完整箭头说明语法没问题。如果报错通常是 participant 名称里有空格或特殊字符或者箭头写成了-而不是-。调用顺序核对建议对着代码走一遍。打开 Gateway 的路由配置确认/api/interview/start转发到 AI 面试服务再打开 AI 面试服务的 start 方法看它是不是先远程调用 Account 的扣减接口再调 AIMCP 生成题目。我试过在 Account 扣减接口里加一行日志发起面试请求后看日志顺序能直接验证时序图里的第 2、3 步是否真实发生。4.2 用真实请求验证模型调用AIMCP 配好之后先用 curl 验证模型能不能通再跑整个链路。下面这个请求可以直接在终端执行把 Key 换成你自己的curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [ {role: system, content: 你是一名技术面试官请生成一道Java后端面试题}, {role: user, content: 生成题目} ] }返回里如果能看到 choices 数组和题目内容说明模型调用通了。这时候再发起完整的模拟面试请求观察 Gateway 日志里 Account 扣减成功、AI 面试服务拿到题目、AIMCP 返回评分整条链路就跟时序图对上了。想直接在网页上试模型对话效果可以用模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 不用写代码就能验证 prompt 效果。5. 本篇常见错排查第一个高频错误是 Mermaid 渲染失败提示Parse error。九成情况是 participant 别名写错比如participant AI as AI面试服务里别名带了中文和空格Mermaid 某些版本对别名支持不稳定建议别名用英文显示名放 participant 后面。另一个原因是箭头方向写反返回用了-而不是--图能渲染但语义错了。第二个错误是时序图跟代码对不上。常见表现是图里 Gateway 直接调了 AIMCP但代码里 AIMCP 只被 AI 面试服务调用。这种偏差会让新人照着图去改代码结果把模型调用暴露到网关层。核对方法是以代码里的 FeignClient 或 RestTemplate 调用为准图跟着代码走不要图省事少画一层。第三个错误是权益扣减和面试请求的顺序颠倒。有的实现先调 AI 生成题目再扣权益结果用户权益不足时题目已经生成了白白消耗一次模型调用。正确顺序是 Gateway 先调 Account 扣减扣减成功再发起面试请求这也是时序图里第 2 步在第 4 步之前的原因。第四个错误是 AIMCP 超时没处理。模型调用偶尔会超过 30 秒如果 AIMCP 没配超时和重试AI 面试服务会一直挂着等用户端看到的就是转圈。建议在 AIMCP 的 WebClient 上配 timeout 和 max-retries超时后返回兜底题目或提示重试不要让请求无限等待。6. 把图用起来从架构讲解到长期编码时序图画完不是终点它的价值在于能进 Git、能跟着代码一起改。我习惯把 Mermaid 代码放在docs/architecture/interview-sequence.md里每次改调用链就顺手更新图Code Review 时对着图看代码改动比口头描述清楚得多。如果你要长期维护这类微服务项目或者用 Agent 辅助编码可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 把模型调用和编码流程串起来改完代码让 Agent 帮你核对时序图是否还一致。接入过程中如果遇到 Key 配置或请求格式问题先翻接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 大部分报错在里面都有对应说明。ClaudeCode 相关的接入配置在 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 需要的话可以对照着配。图是给人看的代码是给机器跑的两者对得上架构讲解才算真正落地。