以OpenAI为例,手把手教你调用大模型接口

跟传统应用服务一样,大模型服务也提供 HTTP API 接口,供客户端调用。本文便以 OpenAI 为例,介绍如何调用大模型接口。

对话补全

OpenAI 协议提供了多种 API 接口,其中最常用的是对话补全接口。对话补全,顾名思义就是根据用户输入的上下文,补全后续内容,可用来实现智能聊天机器人。

对话补全请求

OpenAI 对话补全接口如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
POST /v1/chat/completions HTTP/1.1
Host: api.deepseek.com
Authorization: Bearer <your-api-key>
Content-Type: application/json

{
  "model": "deepseek-v3",
  "messages": [
    {"role": "system", "content": "你是一个智能聊天机器人,名字叫小菜。"},
    {"role": "user", "content": "你好,小菜。"}
  ]
}

这是一个典型的 POST 请求,请求体是一个 JSON 对象,包含以下字段:

  • model:模型名称,这里使用的是 DeepSeek 的 v3 版本。
  • messages:对话历史,包含系统提示和用户消息。
block-beta
  columns 2
    S(["🖥 system"]) SM("你是一个智能聊天机器人,名字叫小菜。")
    U(["👤 user"]) UM("你好,小菜!")

注意到,请求通过 Authorization 头传递 API Key,这是接口的认证机制,防止 API 被滥用。

对话补全响应

大模型根据对话历史,生成补全内容,并返回给客户端:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
HTTP/1.1 200 OK
Content-Type: application/json

{
  "choices": [
    {
      "message": {
        "content": "你好!很高兴见到你,有什么我可以帮你的吗?",
        "role": "assistant"
      },
    }
  ]
}

结果包含 choices 数组,数组中包含一个元素,表示大模型生成的消息内容。注意到,消息内容包含 role 字段,assistant 表示智能助手,即大模型生成的内容。

block-beta
  columns 2
    S(["🖥 system"]) SM("你是一个智能聊天机器人,名字叫小菜。")
    U(["👤 user"]) UM("你好,小菜!")
    space Arrow<["LLM"]>(down)
    A(["🤖 assistant"]) AM("你好!很高兴见到你,有什么我可以帮你的吗?")

看到这里,你可能会拍案而起,这不就是智能聊天机器人吗?没错,对话补全接口可以用来实现智能聊天机器人,这是一个等价的聊天时序图:

sequenceDiagram
    participant U as 👤 user
    participant S as 🖥 system
    participant A as 🤖 assistant

    S->>A: 你是一个智能聊天机器人,名字叫小菜。
    U->>A: 你好,小菜!
    A->>U: 你好!很高兴见到你,有什么我可以帮你的吗?
  • system 先给大模型设定角色,即系统提示。
  • user 输入消息,大模型根据系统提示和用户消息,生成补全内容。
  • 大模型将补全内容返回给 user。

如需多轮对话,只需将对话历史作为 messages 参数传递给大模型,大模型就会根据对话历史生成补全内容。

block-beta
  columns 2
    S(["🖥 system"]) SM("你是一个智能聊天机器人,名字叫小菜。")
    U1(["👤 user"]) UM1("你好,小菜!")
    A1(["🤖 assistant"]) AM1("你好!很高兴见到你,有什么我可以帮你的吗?")
    U2(["👤 user"]) UM2("你还不知道我的名字吧,我叫小明。")
    A2(["🤖 assistant"]) AM2("很高兴认识你,小明!今天有什么特别的事情或者问题需要我帮忙的吗?")
    U3(["👤 user"]) UM3("你觉得我的名字怎么样?")
    space Arrow<["LLM"]>(down)
    A3(["🤖 assistant"]) AM3("小明这个名字简单又好记,给人一种亲切和阳光的感觉。你觉得这个名字怎么样呢?")

注意,由于大模型上下文窗口限制,历史对话轮数不宜过多,通常只保留最近若干轮对话。

curl 示例

使用 curl 调用对话补全接口的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 设置接口地址环境变量,这里使用的是阿里云的接口地址
export OPENAI_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"

# 设置 API Key 环境变量(注意保密)
export OPENAI_API_KEY="sk-..."

curl -X POST \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "deepseek-v3", "messages": [{"role": "system", "content": "你是一个智能聊天机器人,名字叫小菜。"}, {"role": "user", "content": "你好,小菜。"}]}' \
  $OPENAI_BASE_URL/chat/completions

接口返回数据如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "choices": [
    {
      "message": {
        "content": "你好!很高兴见到你,有什么我可以帮你的吗?",
        "role": "assistant"
      },
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null
    }
  ],
  "object": "chat.completion",
  "usage": {
    "prompt_tokens": 19,
    "completion_tokens": 12,
    "total_tokens": 31
  },
  "created": 1743220835,
  "system_fingerprint": null,
  "model": "deepseek-v3", 
  "id": "chatcmpl-23ea89b3-4ac6-93e4-8b06-3f5722579662"
}

其中,choices 数组包含一个元素,表示大模型生成的消息内容。注意到,消息内容包含 role 字段,assistant 表示智能助手,即大模型生成的内容。

python 示例(多轮对话)

使用 python 调用对话补全接口的示例(多轮对话):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import requests

# 设置接口地址常量,这里使用的是阿里云的接口地址
OPENAI_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"

# 设置 API Key 常量(注意保密)
OPENAI_API_KEY = "sk-..."

response = requests.post(
    f"{OPENAI_BASE_URL}/chat/completions",
    headers={
        "Authorization": f"Bearer {OPENAI_API_KEY}",
    },
    json={
        "model": "deepseek-v3", 
        "messages": [
            {"role": "system", "content": "你是一个智能聊天机器人,名字叫小菜。"},
            {"role": "user", "content": "你好,小菜。"},
            {"role": "assistant", "content": "你好!很高兴见到你,有什么我可以帮你的吗?"},
            {"role": "user", "content": "你还不知道我的名字吧,我叫小明。"},
            {"role": "assistant", "content": "很高兴认识你,小明!今天有什么特别的事情或者问题需要我帮忙的吗?"},
            {"role": "user", "content": "你觉得我的名字怎么样?"},
        ]
    },
)

print(response.json())

大模型将根据对话历史,生成补全内容,并以 JSON 格式返回给客户端:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "choices": [
        {
            "message": {
                "content": "小明这个名字简单又好记,给人一种亲切和阳光的感觉。你觉得这个名字怎么样呢?",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": None,
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 68,
        "completion_tokens": 17,
        "total_tokens": 85
    },
    "created": 1743236996,
    "system_fingerprint": None,
    "model": "deepseek-v3",
    "id": "chatcmpl-3b14f36e-184d-94f8-8aa0-1c22202d477b"
}

【小菜学AI】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学AI】系列文章首发于公众号【小菜学编程】,敬请关注: