如何调用 LLM 接口

了解了 LLM 和 Agent 的核心术语和原理,我们接下来就要结合 LLM,实际做一些有趣的小应用了。

首先需要能够调用 LLM,但这些模型动辄几百亿甚至几千亿参数,对算力要求极高,就算是 DeepSeek、Llama 这类开源模型,普通电脑也很难跑得动。

所以我们开发者一般使用 LLM 方式是:由模型服务商把模型部署在他们的服务器上,我们通过网络请求调用它,按用量付费。这个请求接口就是 LLM 的 API(Application Programming Interface),而调用时用来证明「我是谁」的身份凭证就是 API Key

每次请求带上你的 API Key,服务商就知道是谁在调用、该扣谁的钱。后续文章的很多地方都会用到 API Key,这篇先给你介绍 API 和 API Key 的基本概念,准备好一个 API Key 后续使用。

主流大模型服务商

目前提供大模型 API 的服务商很多,这里列几个主流的,以及它们各自创建 API Key 的控制台地址:

服务商代表模型API 平台
DeepSeekdeepseek-v4-flash、deepseek-v4-proplatform.deepseek.com
OpenAIGPT-5.4platform.openai.com
AnthropicClaude Sonnet 4.6、Opus 4.6console.anthropic.com
GoogleGemini 3.1 Pro、Flashaistudio.google.com
阿里云Qwen3.5bailian.console.aliyun.com
字节跳动豆包 2.0console.volcengine.com/ark
智谱 AIGLM-5open.bigmodel.cn

各家的使用流程大同小异:注册账号 → 创建 API Key → 充值 → 调用。区别主要在模型能力、价格和控制台的易用程度上。

创建 DeepSeek API Key

本教程的代码示例统一用 DeepSeek 的模型,原因有三个。

首先是模型能力够用,DeepSeek V4 提供 deepseek-v4-flash 是性价比最高的模型,本站教程完全够用。

其次是创建 API Key 简单,DeepSeek 的开发者平台设计得很干净,注册后几步就能拿到 Key。不像阿里云、GCP 这类云平台,控制台功能太多太杂,光找到创建 Key 的入口就得绕半天。

最后是价格便宜,DeepSeek 的定价在主流服务商里属于最低一档,跑完整套教程的所有示例花不了几块钱。

不用担心被锁定在 DeepSeek 上。各家服务商基本都兼容同一套 API 接口规范(OpenAI 最早定义的),后面文章的代码只要换一个 API 地址和 Key 就能切换到别家模型,业务代码一行不用改。这个我们在后面的文章里会详细说。

学习本章节,我们需要创建一个 API key,首先打开 platform.deepseek.com,注册一个账号。

登录后在左侧菜单找到「API keys」,点击「创建 API key」,随便起个名字,确认后会显示一串 sk- 开头的字符串,这就是你的 API Key。

然后在左侧「充值」页面充几块钱(学习本套教程几块钱够用了),准备工作就完成了。

有一点要注意:API Key 相当于你的账号密码,别人拿到就能花你的钱,所以要妥善保存。

教程里为了演示方便会直接把 Key 写在代码中,你跟着练没问题,但正式项目里应该用环境变量存储,千万不要把 API Key 提交到 GitHub 等公开代码仓库

API 接口格式

上面表格里列了这么多大模型服务商,是不是每家的接口格式都不一样,调用他们的服务都得单独写代码适配?

其实不用。目前主流就两种格式:OpenAI 的 Chat Completions 接口格式Anthropic 的 Messages 接口格式

OpenAI 是最早做出大语言模型 API 的厂商,它定义的接口规范成了事实标准。后来的国产模型(DeepSeek、Qwen 等)都兼容这套格式,你只需要换个 base_urlapi_key,OpenAI 的 SDK 就能调用其他厂商的模型,业务代码一行不用改。

Anthropic 的 Claude 模型能力也很强,而且他们做的 Claude Code 工具已经被很多程序员使用,所以他们那套 Messages 接口格式也越来越流行。

其他的模型厂商为了方便用户在 Claude Code 中使用自家的模型,也会兼容 Anthropic 的 Messages 接口格式。

DeepSeek 就是这样,官方文档里同时给出了两个 base_url

PARAMVALUE
base_url (OpenAI)https://api.deepseek.com
base_url (Anthropic)https://api.deepseek.com/anthropic

下面我们直接拿 DeepSeek 的 API 跑两个 curl 命令,你就能直观看到两种格式的差异。

OpenAI 格式

curl 是一个发 HTTP 请求命令行工具,请把下面的 YOUR_API_KEY 换成你刚拿到的 Key,复制到终端运行:

curl https://api.deepseek.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "model": "deepseek-v4-flash",
    "messages": [
      {"role": "system", "content": "你是一个友好的助手。"},
      {"role": "user", "content": "你好。"}
    ],
    "thinking": {"type": "disabled"}
  }'

返回的 JSON 是这样:

{
  "id": "ed2e5069-2991-4835-8914-e2b80f21d1d9",
  "object": "chat.completion",
  "model": "deepseek-v4-flash",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "你好!很高兴见到你。有什么我可以帮你的吗?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 11,
    "completion_tokens": 12,
    "total_tokens": 23
  }
}

模型的回答在 choices[0].message.content 里,就是那句「你好!很高兴见到你。有什么我可以帮你的吗?」。

其他字段我们在后面的章节详细介绍,这里我们只关注返回的 json 格式。

Anthropic 格式

同样问一句话,换成 Anthropic 格式:

curl https://api.deepseek.com/anthropic/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "deepseek-v4-flash",
    "max_tokens": 256,
    "system": "你是一个友好的助手。",
    "messages": [
      {"role": "user", "content": "你好。"}
    ],
    "thinking": {"type": "disabled"}
  }'

首先注意到请求的 JSON body 格式和 OpenAI 的格式不一样了,然后看返回的 JSON:

{
  "id": "da5a342e-80da-4df2-bd57-e1eede417ebf",
  "type": "message",
  "role": "assistant",
  "model": "deepseek-v4-flash",
  "content": [
    {"type": "text", "text": "你好!很高兴见到你,有什么可以帮你的吗?"}
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 11,
    "output_tokens": 12
  }
}

response 格式也和 OpenAI 格式不一样:

模型的回答在 content[0].text 里,而不是 choices[0].message.content,同时 stop_reasonusage 等字段名也不太一样。

虽然格式不太一样,但本质都是一样的事情:你发一段消息,模型给你一段回复,附带 token 用量和结束原因。

所以总结一下:接口格式其实只是一种约定,最大程度方便你切换模型的提供商。

现在的模型提供商一般都会同时提供 OpenAI 和 Anthropic 两种格式的接口,你只需要修改 base_urlapi_key 就能使用不同提供商的模型。