Skip to content

模型接口、流式输出与生成主线

很多 AI 项目真正落地时,第一步都不是 Agent,也不是知识库,而是把模型接口接明白。

这件事看起来很基础,但它其实决定了后面很多事情的上限:

  1. 前端体验顺不顺
  2. 输出结构稳不稳
  3. 工具调用好不好接
  4. 成本和延迟怎么控

所以这一页不只是讲“请求长什么样”,而是想把一条最小生成链路真正讲清楚。

1. 一次最小调用到底怎么走

一条最简单的链路:

mermaid
sequenceDiagram
    participant U as 用户
    participant A as 应用
    participant M as 模型 API

    U->>A: 提交问题
    A->>M: 组织消息、参数和上下文
    M-->>A: 返回生成结果
    A-->>U: 展示答案

这条线看起来很普通,但里面其实已经有 3 层关键问题:

  1. 应用怎么组织输入
  2. 模型怎么返回输出
  3. 输出是一次性回来,还是边生成边回来

2. 模型接口通常会包含哪些东西

不同厂商的字段命名会有差异,但一条典型模型请求通常都会包含下面几类信息:

  1. 模型名
  2. 输入消息
  3. 采样参数
  4. 是否流式返回
  5. 结构化约束或工具描述

一个最小示意可以看成这样:

json
{
  "model": "gpt-4o-mini",
  "messages": [
    { "role": "system", "content": "你是一名技术助手" },
    { "role": "user", "content": "解释一下 RAG 是什么" }
  ],
  "stream": true
}

2.1 这些字段各自在解决什么问题

可以简单对应一下:

字段主要作用
model指定本次调用用哪个模型
messages / input把任务和上下文喂给模型
采样参数控制输出风格、稳定性和随机性
stream决定结果是整段返回还是增量返回
工具 / 结构化约束让模型能调外部能力或按固定格式返回

所以“模型接口”不是一个单纯发字符串、收字符串的壳,它本质上是在定义:

应用和模型之间到底用什么契约沟通。

3. 为什么流式输出几乎成了默认选项

因为很多大模型输出不是瞬间生成完的,而是一段段往外吐。

只要稍微进入真实交互场景,流式输出几乎都会变得更自然。

3.1 流式输出主要解决什么问题

它至少能解决两件事:

  1. 用户不用一直干等最终整段结果
  2. 前端可以更早开始渲染内容

这对长回答尤其重要。

如果一个回答要生成十几秒,一次性等完整结果再显示,体验通常会很差; 但如果用户从第 1 秒就能看到模型在往下写,主观等待时间会短很多。

3.2 流式输出最常见的场景

流式输出通常会出现在这些场景里:

  1. 聊天问答
  2. 长文生成
  3. 实时助手
  4. 代码补全或解释
  5. 需要边生成边展示中间结果的界面

所以它不只是一个“可选优化”,很多时候它本身就是交互体验的一部分。

3.3 常见流式形态有哪些

应用里最常见的通常是:

  1. SSE
  2. WebSocket
  3. 厂商自己的实时会话协议

大多数文本问答场景里,SSE 往往已经够用了。

如果只是普通文本聊天,直接上复杂双向协议,很多时候反而会把问题做重。

🌟 很多产品说“实时对话”,实际解决的首先是“流式文本展示”,不一定真的是音视频级别的实时会话。

4. 一次模型调用能返回什么

很多人一开始会把模型接口理解成:

  1. 发一个问题
  2. 收一段文本

但真实项目里,返回内容往往不只是一段自然语言。

还可能包括:

  1. 结构化 JSON
  2. 工具调用意图
  3. 中间状态
  4. 多模态内容

这也是为什么后面一定还要继续看:

  1. Function Calling
  2. Structured Output
  3. MCP
  4. A2A

因为模型接口只是起点,业务系统真正关心的通常是:

怎么让模型的输出继续进入后面的执行链路。

5. 模型接口这一层最容易踩的坑

5.1 把模型接口理解成“纯文本问答接口”

这会让后面所有事情都显得像例外。

更准确的理解应该是:

模型接口是应用和生成系统之间的通用契约。

它当然可以返回文本,但也可能返回结构、调用意图和多模态结果。

5.2 把流式输出理解成“只是前端展示优化”

这也不太准。

流式输出一旦引入,后端、前端和中间层的处理方式都会受影响。

例如:

  1. 前端怎么消费增量事件
  2. 后端怎么中断流式返回
  3. 工具调用和流式响应怎么协调

它不只是多一个 stream=true 那么简单。

5.3 把所有交互问题都推给模型

很多“模型返回不自然”“界面卡住”“首字太慢”的问题,最后并不只是模型问题,而是:

  1. 接口层没有流式化
  2. 上下文组织过重
  3. 前端消费方式不合理

6. 真实项目里怎么判断接口层是不是做对了

这层通常至少要满足下面几点:

  1. 输入结构清楚
  2. 输出形态明确
  3. 流式链路稳定
  4. 后面能自然接工具调用和结构化输出

如果这几件事没先做好,后面再往上叠 RAGWorkflowAgent,复杂度只会更高。

7. 一段更稳的总结

如果把这一层压成一句话,可以记成:

模型接口解决的是“应用怎么把任务和上下文发给模型,再把结果按合适形态取回来”。流式输出只是这一层里最常见、也最影响体验的一种返回方式,但它本身并不等于完整的 AI 应用架构。

8. 继续展开看

基于 VitePress 构建的个人技术笔记。