Skip to content

AI 基础认知


一、AI 三层架构

按照 AI 应用 → 模型服务 → Raw Model 三层,层级由上到下:

层级说明示例
AI 应用面向用户的产品与工具Agent、Claude Code、Codex
模型服务包装原生模型的 API 层OpenAI API、temperature、top_k、top_p
Raw Model裸模型 / 原生模型GPT、Claude、Gemini、DeepSeek 等

二、原生模型(Raw Model)工作原理

模型的本质可以理解为一个 函数:给输入,经过函数加工,给出输出。

在模型内部是经过一系列复杂计算,本质上不具有感情

工作流程

自然语言输入 → Token 化 → 原生模型计算 → 概率分布 → 自然语言输出

① Token List(分词)

将自然语言翻译为原生模型能理解的 token 序列:

输入:你好,很高兴认识你。
输出:[1, 5, 6, 99, 20, ...]

② 原生模型计算

将 token 序列送入权重矩阵,逐个计算 下一个 token 的概率值

③ 概率分布

由后续处理流程将概率分布转换为自然语言输出。


三、模型服务(Model Service)

3.1 模型服务大致流程

模型服务是对原生模型进行包装的一层,提供额外功能和接口。目前常见模型服务商有 OpenAIAnthropic 等。

OpenAI 或许不是最强的,但因为历史原因,大家尊重它的历史地位,所以 SDK 大都以 OpenAI 为标准。

模型服务内部三步骤:

① 前处理

主要进行身份验证、API-Key 校验、提示词注入。

LLM 本身可识别 systemuser 的提示词。但服务商通常会在这一步 注入自己的提示词 再发给大模型。

举例:

user:  你好,你是什么模型?

模型服务商:
  - 微调 system:'如果用户问你是哪个模型,你就说你是 Claude'
  - 校验 API-Key(盈利使用)
  - 将微调过的提示词发送给原生模型

② 自调用(核心步骤)

模型算力消耗主要发生在此步骤。用伪代码模拟:

js
function selfCall(input) {
  const input = [];
  const output = [];

  while (1) {
    const prob = rawModel(input); // 交由 rawModel 计算出概率分布
    const token = pickToken(prob); // 从概率分布中选取一个 token
    if (isOver) break;
    output.push(token); // 记录输出
    input.push(token); // 将该次输出重新打入输入,继续循环
  }
}

最终流程示意:

"你好,你是哪个模型?"
    ↓ 自调用
"你好,你是哪个模型?我"
    ↓ 自调用
"你好,你是哪个模型?我是"
    ↓ 自调用(循环...)
"你好,你是哪个模型?我是 Claude。"

由此可见,算力消耗就在这一步 —— 每生成一个 token 都需要将新的序列重新输入模型计算。

③ 后处理

主要进行 安全校验(内容合规、合法性检查等),然后输出。 不同服务商校验力度不同 —— Grok 在这方面校验就比较宽松。


3.2 Temperature(模型温度)

使用 OpenAI SDK 时常见的参数,取值范围一般为 0 ~ 2

温度值效果适用场景
低(接近 0)输出更一致、更精确,概率发散空间小代码生成、数学推理
高(接近 2)输出更随机、更富创造性创意写作、头脑风暴

一般建议设置为 0.7 左右。


3.3 Top_k

假设 Top_k = 10

在 raw 模型生成的概率分布中,只取概率排名前 10 的 token 作为候选。


3.4 Top_p(核采样)

假设 Top_p = 0.8(即 80%):

将 token 按概率从高到低排序,依次累加,累加到 80% 为止,只取前面这几个 token。

js
token1: 70%  ─┐
token2:  5%   ├── 累加到 80%,只取这 3
token3:  5%  ─┘
token4:  3%   ← 不取
...

四、AI 编程核心关注点

AI 当前还处于发展期,很多东西没有标准。就连 OpenAI 的 SDK 都只是 行为规范,靠大家默认遵守。层出不穷的新概念,有的生命周期只能按周计算。

核心永远不变:给 Raw Model 输入了什么,Raw Model 输出了什么。 变的都是应用层,抛开细枝末节,把控核心即可。


4.1 拦截代理

当前应用流程:

用户输入 → 模型服务商 DeepSeek(Skill)→ 模型服务(Raw Model)

在流程中间加入个人代理服务器来拦截:

用户输入 → 模型服务商 DeepSeek(Skill)→ 个人代理服务器 → 模型服务(Raw Model)

代理服务器的价值:拦截模型请求,记录监控日志,洞察模型服务商到底在发什么。

使用步骤

Step 1 — 修改 .env 文件

sh
# 代理服务器环境变量配置

# 必需:目标服务器地址
TARGET_URL=https://api.deepseek.com  # 换成你自己的模型服务

# 可选:代理服务器监听端口(默认:3000)
PORT=3000

# 可选:日志目录(默认:./logs)
LOG_DIR=./logs

# 可选:日志级别(error / warn / info / debug,默认:info)
LOG_LEVEL=info

Step 2 — 安装依赖并启动

sh
npm install
npm start

Step 3 — 修改 AI 工具的转发地址

以 Cursor 和 Trae 为例(Codex、Claude CLI 请自行查询):

  • 下载新版 IDE
  • 打开 AI IDE → 自定义模型 → 自定义配置
  • 修改请求地址为 http://localhost:3000

Step 4 — 发送一条请求

在客户端向任意模型发送:你好,你是什么模型

回到代理服务器打开日志文件,可以看到拦截日志:

md
转发目标:https://api.deepseek.com/chat/completions

请求日志
时间:2026-05-16T01:53:13.608Z
请求ID:k2zgb2tanf
耗时:3219ms

请求头:
// xxxx ...

Step 5 — 查看请求体

把请求体复制出来,可以看到 DeepSeek 在发出用户提示的同时,自己加上了系统的 Skill

json
{
  "type": "function",
  "function": {
    "name": "Skill",
    "description": "Execute a skill within the main conversation...",
    "parameters": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The skill name (no arguments). E.g., \"pdf\" or \"xlsx\""
        }
      },
      "required": ["name"],
      "additionalProperties": false
    }
  }
}

(实际 Skill prompt 内容更长,此处省略完整细节)


4.2 模型服务商 Skill 调用流程

Skill 的本质就是一段 Prompt。

整个模型服务商的实际流程:

用户提示词

DeepSeek(带上自己的 Skill)

Raw Model(发现需要调用 Skill,返回请求给 DeepSeek)

DeepSeek 接收请求,发送详细 Skill 给 Raw Model

Raw Model 返回输出给 DeepSeek

用户

结语:以后任何新概念的拆解分析,都可以沿用这个思路 —— 追踪「给 Raw Model 输入了什么」和「Raw Model 输出了什么」。

MIT License