臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

一、💡 一句话理解

核心结论

API 是调用入口,请求参数是你告诉模型“使用什么模型、处理什么内容、遵循什么规则”,响应结构则是模型返回的回答、状态、请求编号和 Token 用量。

可以把一次大模型调用记成:

准备 HTTP 请求
  → 携带身份认证和请求参数
  → 发送给模型服务
  → 接收 JSON 或流式响应
  → 提取回答并返回给业务系统

本文以通用 HTTP/JSON 方式讲解,并用 DeepSeek 兼容 OpenAI 格式的 Chat Completions API 作示例。不同厂商的接口名称和字段可能不同,实际开发时应以对应厂商的官方文档为准。

二、🧭 理论:它是什么

2.1 大模型 API 是什么

API 是 Application Programming Interface 的缩写,中文通常叫“应用程序编程接口”。

它可以理解为模型服务提供的一扇标准窗口:应用程序按照约定的地址、请求格式和认证方式发送请求,模型服务再按照约定返回结果。

大模型 API 通常建立在 HTTP 和 JSON 之上,因此 Java、Python、JavaScript 等语言都可以调用。

2.2 一次请求由什么组成

请求部分示例作用
请求方法POST表示提交一次生成请求
URL/chat/completions指定调用哪个接口
请求头Authorization进行身份认证
请求头Content-Type: application/json说明请求体格式
请求体model、messages提供模型、问题和其他配置

在大模型调用中,最重要的通常是请求头和 JSON 请求体。

2.3 请求参数和模型参数不是一回事

“请求参数”是本次调用时传入的配置,例如 model、messages 和输出长度限制。

“模型参数”则是模型训练后形成的内部数值,属于模型本身的能力结构。

概念发生时间示例
模型参数训练模型时形成模型内部的大量权重数值
请求参数每次调用时传入model、messages、stream

三、⚙️ 理论:它是怎么工作的

3.1 请求参数的主要类别

参数类别常见字段作用
模型选择model指定使用哪个模型
输入内容messages提供问题、上下文和角色信息
生成控制温度、最大输出长度等控制回答的随机性和长度
输出格式JSON Schema、结构化输出约束模型返回的数据格式
工具调用tools允许模型调用外部函数或系统能力
流式控制stream决定一次性返回还是边生成边返回

不同厂商的字段名称不完全相同。例如,OpenAI Responses API 使用 input,而 DeepSeek 的 Chat Completions API 使用 messages。因此不能只背参数名,要结合实际接口文档理解参数含义。

3.2 响应结构的主要组成

一个完整响应通常包含四类信息:

响应
├── 身份信息:id、model
├── 状态信息:status、finish_reason
├── 内容信息:回答文本、结构化对象或工具调用
└── 用量信息:输入 Token、输出 Token、总 Token
  • id:本次请求的唯一标识,排查问题时很有用。
  • status:本次生成是否完成。
  • output 或 choices:模型真正生成的内容,字段名取决于 API 类型;DeepSeek Chat Completions 使用 choices。
  • usage:本次请求消耗的 Token 数量,可用于成本统计和限流分析。

3.3 普通响应和流式响应

普通响应是等待模型生成完成后,一次性返回完整 JSON。

流式响应则是边生成边返回文本片段,最后再返回结束事件。它适合聊天页面,但后端解析方式不同:普通响应通常解析一个 JSON,流式响应通常解析多个 SSE 事件。

四、🚀 实践:可以拿来干什么

理解 API、请求参数和响应结构后,可以完成:

  • 在 Java 后端中调用大模型完成问答。
  • 根据业务场景控制输出长度、格式和风格。
  • 实现普通聊天接口和 SSE 流式聊天接口。
  • 统计 Token 用量、调用次数和成本。
  • 处理超时、重试、限流、降级和错误响应。
  • 为 Tool Calling、RAG 和 Agent 工作流提供模型调用基础。

推荐由后端屏蔽第三方模型的原始响应,返回自己的业务响应结构。这样将来更换模型供应商时,前端接口不需要跟着大幅修改。

五、🔍 最小例子

5.1 用 HTTP 调用模型

下面的示例解决“向 DeepSeek 发送一句话并获得回答”这个最小问题:

export DEEPSEEK_API_KEY="你的 DeepSeek API Key"
 
curl https://api.deepseek.com/chat/completions \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-flash",
    "messages": [
      {
        "role": "user",
        "content": "用一句话解释什么是 API"
      }
    ],
    "thinking": {
      "type": "disabled"
    },
    "stream": false
  }'

这个请求中,Authorization 用于身份认证,model 指定模型,messages 指定对话内容,stream: false 表示一次性返回完整结果。DeepSeek 官方当前提供 deepseek-v4-flash 和 deepseek-v4-pro,并使用 https://api.deepseek.com/chat/completions 调用 Chat API。DeepSeek 官方快速开始

5.2 读取简化后的响应

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "model": "deepseek-v4-flash",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "API 是应用程序之间进行通信的接口。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 20,
    "completion_tokens": 12,
    "total_tokens": 32
  }
}

DeepSeek Chat Completions 的回答通常从 choices[0].message.content 读取,Token 用量从 usage 读取。这是帮助理解的简化示意,不代表所有字段都会在每次响应中出现。业务代码需要根据实际 API 文档定义 DTO,并处理可选字段、错误状态和空内容。

5.3 Java 后端中的调用链

Controller 接收用户问题
  → Service 组装请求参数
  → HTTP Client 调用模型 API
  → 解析响应结构
  → 提取模型文本
  → 转换成业务响应
  → 返回给前端

后端可以对外统一返回:

{
  "conversationId": "conversation-001",
  "answer": "API 是应用程序之间的通信接口。",
  "usage": {
    "inputTokens": 20,
    "outputTokens": 12
  }
}

这样前端只依赖自己的接口,不需要知道第三方模型响应中 output、content 等内部嵌套结构。

六、⚠️ 边界与常见误区

  • 请求头不是请求体参数,Authorization 通常放在 Header 中。
  • model 写错会导致请求失败,模型名称必须以供应商实际提供的名称为准。
  • 不同厂商的 input、messages、content 结构可能不同;DeepSeek 使用 messages。
  • DeepSeek 的回答通常位于 choices[0].message.content,不能假设所有接口都使用 response.content。
  • 流式响应和普通响应不能使用同一种解析方式。
  • 即使要求模型返回 JSON,后端仍然需要进行 JSON 解析、字段校验和异常处理。
  • 模型生成的是概率性结果,不代表事实一定正确。
  • API Key 不能写死在 Java 源码、前端代码或 Git 仓库中。
  • 重试请求可能重复扣费;如果后续接入工具调用或写操作,还可能造成重复业务执行。
  • 生产环境应记录请求 ID、响应状态、耗时和用量,但不要记录 API Key 或不必要的敏感内容。

七、📌 总结

  • 快速回顾:API 是应用程序调用大模型的标准入口。
  • 快速回顾:请求通常由 URL、请求方法、请求头和 JSON 请求体组成。
  • 快速回顾:请求参数负责描述模型、输入内容和生成规则。
  • 快速回顾:响应结构通常包含回答内容、状态、请求 ID 和 Token 用量。
  • 快速回顾:普通响应一次返回完整结果,流式响应分片返回结果。
  • 快速回顾:Java 后端应封装第三方 API,向前端返回稳定的业务结构。

记忆句:请求把问题和规则交给模型,响应把回答和调用结果交还给业务系统。

相关笔记:1.LLM、Token、上下文窗口与模型参数、0-学习路线