llm的实际输出是什么样子的,api产商如何知道这个文本流是tool call的结果

最后发布时间 : 2026-02-06 10:23:59 浏览量 :

这个问题我换一种更“底层、去玄学”的方式再讲一遍,直接回答你这两点,不绕 SDK、不绕 JSON。

一、LLM 的「实际输出」到底是什么样?

核心结论先给

LLM 的实际输出永远只是 token 序列

不存在“JSON / tool_calls / role / finish_reason”这些东西

👉 这些都是 API 在解码阶段附加的结构化视图

1️⃣ 没有 tool 时,LLM 在输出什么?

在模型内部,大致是这样(概念级):

你 | 好 | ! | 我 | 是 | …
  • 每一步只生成 下一个 token
  • 没有“这是 assistant 说的话”这种概念
  • 也没有“content 字段”

2️⃣ 有 tool 时,LLM 实际输出的是什么?

关键点:不是“文本”,而是“受约束 token”

当模型决定调用工具,它生成的 token 语义上更像:

CALL get_current_weather
ARG { "location": "杭州市" }
END_CALL

但注意 👇
不是字符串,而是:

  • 一组 被模型和解码器共同理解的语义 token
  • 有点像“结构化 AST 的线性展开”

在 tokenizer 级别可能是:

▁get_current_weather
▁{
▁"location"
▁:
▁"杭州
市"
▁}

模型只是:

“我现在在输出一个 tool call 的 name 和 arguments”

二、那 API 厂商是怎么「知道这是 tool call」的?

关键结论一句话

API 不是“识别”出来的

而是模型在解码阶段“明确告诉 API:我现在在 tool-call 模式”

不是靠猜、不是靠正则、不是靠 JSON。

三、真正发生的事情(重点)

① 你请求时,把 tools 传给了 API

tools: [
{
name: "get_current_weather",
parameters: { ... }
}
]

这一步非常关键。

② API 把 tools 变成「解码约束」

在模型内部,变成类似这样的规则:

  • 输出可以是 TEXT

  • 或者是 TOOL_CALL

  • 如果进入 TOOL_CALL:

  • 只能输出合法的 tool name

  • arguments 必须符合 schema

  • 不能再输出普通文本 token

👉 这一步发生在 decoder / sampler 层

③ 解码时存在一个「模式位(mode bit)」

可以把它想成:

mode ∈ { TEXT, TOOL }

当模型在某一步选择了 TOOL:

  • 解码器立刻切换模式
  • API 立刻知道:
    👉 接下来这不是普通文本

所以 API 并不是事后分析文本,而是同步知道状态变化

四、为什么 streaming 里能立刻知道是 tool call?

因为流程是这样的:

模型 step 1:
emit token
signal: TOOL_CALL_START

API:
好,我走 tool_calls 通道,不走 content

这就是你看到的:

delta.tool_calls = [...]
delta.content = null

👉 不是解析出来的,是实时状态

五、arguments 为什么会被拆得这么碎?

因为:

  • 模型是 token-by-token 生成
  • API 又要 实时 streaming
  • JSON 在 tokenizer 里天然会被拆

所以 API 只能:

arguments += new_token

而不是等一个完整对象。

六、finish_reason = tool_calls 是谁决定的?

不是模型输出的文本。

流程是:

  1. 模型完成了一个合法 tool call
  2. 解码器检测到「结构闭合」
  3. API 标记:
finish_reason: "tool_calls"

👉 这是 API 的控制信号

七、用一句最底层的话总结

🧠 LLM 实际在做的事

我在一步一步生成 token

在某一步,我选择了「工具调用语义」

后续 token 只用于补全这个调用

⚙️ API 实际在做的事

我在解码阶段:

  • 约束 token 空间
  • 监听模型当前模式
  • 把 token 分流成 content 或 tool_calls
  • 在结构完成时发结束信号

八、为什么你“自己无法复刻”这个能力?

如果你没有:

  • 模型 decoder 的 mode signal
  • 或 structured decoding 支持

那你只能:

❌ 猜 JSON
❌ 靠 prompt 约定
❌ 靠正则

API 厂商是在“解码器这一层”做的

如果你愿意,下一步我可以:

  • 状态机图 画清楚 TEXT / TOOL / DONE
  • 解释 JSON mode 和 tool call 的本质区别
  • 从「如果你自己训练模型」的角度讲:tool call 是怎么学会的

你已经问到 模型接口设计的最底层 了,这个问题非常专业。