Notes

LLM 交互基础:透过现象看本质

摘要:在构建 AI Agent 之前,我们需要先理解它的“大脑”——大语言模型 (LLM) 是如何工作的。本文将脱离具体的编程语言,从 HTTP 协议和核心概念的角度,剖析 LLM 的交互原理。

1. 什么是 LLM?

当我们使用 ChatGPT 时,它看起来像是一个无所不知的助手。但从计算机科学的角度来看,LLM 本质上是一个概率预测函数

当你输入 "The sky is" 时,模型并不是在像人类一样“思考”天空的颜色。它是在基于海量的训练数据,计算字典中每一个词(Token)出现在这句话后面的概率

$$ P(w_i | w_1, w_2, ..., w_) $$

它可能会计算出:

  • "blue": 85%
  • "gray": 10%
  • "limit": 1%

然后根据某种策略(如下文提到的 Temperature)选择其中一个词输出。这就是为什么 LLM 有时候会产生“幻觉”——它只是在预测最顺口的下一个词,而不是在陈述事实。

2. 核心概念

在调用 API 之前,必须理解以下几个关键概念,它们直接决定了你的应用成本和效果。

2.1 Token (词元)

Token 是 LLM 处理文本的最小单位,不等同于字符 (Character)。

  • 英文:通常 1 个单词 = 1 个 Token(如 "apple")。复杂单词可能被拆分。
  • 中文:通常 1 个汉字 = 1~2 个 Token(取决于具体模型的分词器)。
  • 代码:代码中的空格、缩进、符号都会消耗 Token。

为什么重要?

  1. 计费:LLM API 通常按 Token 数量收费(Prompt Tokens + Completion Tokens)。
  2. 限制:每个模型都有最大上下文窗口(Context Window),单位也是 Token。

2.2 Context Window (上下文窗口)

这是 LLM 的“短期记忆”容量。

OpenAI 的 API 是 Stateless (无状态) 的。这意味着模型不会记住你上一句话说了什么。如果你想实现多轮对话,你必须每一次都把之前的对话历史打包发给模型。

请求 1:

[
  {"role": "user", "content": "我叫 Alice。"}
]

请求 2 (如果不带历史):

[
  {"role": "user", "content": "我刚才说我叫什么?"}
]
// 模型回答:我不知道。

请求 2 (正确的做法):

[
  {"role": "user", "content": "我叫 Alice。"},
  {"role": "assistant", "content": "你好 Alice!"},
  {"role": "user", "content": "我刚才说我叫什么?"}
]

随着对话变长,Token 消耗会呈线性甚至指数级增长,直到撞墙(Context Window Limit)。这就是为什么记忆管理(Memory)在 Agent 开发中如此重要。

2.3 Temperature (温度)

这个参数控制了模型输出的随机性

  • Temperature = 0.0: 理性模式。模型总是选择概率最高的那个词。适合代码生成、数学解题、数据提取。
  • Temperature > 0.8: 创意模式。模型会尝试选择概率较低的词,带来意想不到的惊喜(或惊吓)。适合写诗、创意写作。

3. OpenAI API 协议标准

目前,OpenAI 的 Chat Completions API 已经成为事实上的行业标准。无论是开源模型(如 Llama 3, Qwen)还是闭源模型(Claude, DeepSeek),通常都提供兼容此格式的接口。

3.1 核心端点

POST /v1/chat/completions
Content-Type: application/json
Authorization: Bearer $OPENAI_API_KEY

3.2 请求结构

最关键的参数是 messages 数组。它模拟了对话的剧本。

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "system", 
      "content": "你是一个精通 Python 的编程助手,回答要简洁。"
    },
    {
      "role": "user", 
      "content": "如何用一行代码反转列表?"
    }
  ],
  "temperature": 0.0
}
  • system: “上帝视角”指令,设定模型的角色、语气和行为规范。
  • user: 用户的输入。
  • assistant: 模型之前的回复(用于构建历史上下文)。

3.3 响应结构

API 会返回一个包含预测结果的 JSON 对象:

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "my_list[::-1]"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 5,
    "total_tokens": 30
  }
}
  • choices0.message.content: 这就是我们需要的回答。
  • usage: 用于统计消耗和计费。
  • finish_reason:
    • stop: 正常结束。
    • length: 达到了 max_tokens 限制,回答被截断。
    • tool_calls: 模型想要调用工具(这是 Agent 的核心,后续会讲)。

4. 总结

掌握了这个 HTTP 协议,你就脱离了对特定 SDK(如 Python openai 库)的依赖。无论是用 Node.js, Go, Rust 还是 curl,你都可以轻松地与世界上最聪明的大脑进行交互。

这也是构建 AI Agent 的第一步:理解如何通过结构化的 JSON 数据与模型沟通。

cd ..