答案一个字一个字蹦出来流式生成的完整链路
开篇引言
上一篇把 Prompt 组装的全过程拆完了——RAGPromptService.buildStructuredMessages() 根据场景(KB_ONLY / MCP_ONLY / MIXED)选模板,把 System Prompt、对话历史、检索证据、用户问题按固定骨架拼成一个 messages 数组,再加上 temperature、topP、是否开启深度思考,封装成一个 ChatRequest。
到这一步,所有调用参数都就位了。但把 ChatRequest 发给大模型,不是一个简单的 HTTP 请求-响应——大模型不会一口气把答案全吐出来,而是一个 token 一个 token 地往外蹦。这些 token 要穿过好几层,才能最终到达用户的浏览器。
打个比方,这有点像快递的中转流程。你在网上下了单(发出请求),商家一件一件地打包(模型逐 token 生成),然后包裹经过分拣中心、中转站、末端网点(各层处理),最后一件一件送到你家门口(浏览器渲染)。每一层只管自己那段路,接力完成整个投递。
Ragent 的流式生成也是这样,从 Controller 到大模型再到浏览器,中间经过五层接力。本篇就把这条链路从头到尾拆开讲。
全景图:五层接力
1. 一张图看全链路
先上一张时序图,把流式生成的完整数据流画出来。从用户发起请求,到 token 一个个蹦到浏览器,中间经过了哪些参与者、发生了哪些关键事件,一目了然:
