Skip to content

GPT models

OpenAI's GPT (generative pre-trained transformer) models have been trained to understand natural language and code. GPTs provide text outputs in response to their inputs. The inputs to GPTs are also referred to as "prompts". Designing a prompt is essentially how you “program” a GPT model, usually by providing instructions or some examples of how to successfully complete a task.

Using GPTs, you can build applications to:

  • Draft documents
  • Write computer code
  • Answer questions about a knowledge base
  • Analyze texts
  • Create conversational agents
  • Give software a natural language interface
  • Tutor in a range of subjects
  • Translate languages
  • Simulate characters for games ...and much more!

To use a GPT model via the OpenAI API, you’ll send a request containing the inputs and your API key, and receive a response containing the model’s output. Our latest models, gpt-4 and gpt-3.5-turbo, are accessed through the chat completions API endpoint. Currently, only the older legacy models are available via the completions API endpoint.

Model FamiliesAPI Endpoint
Newer models (2023–)gpt-4, gpt-3.5-turbohttps://oapi.czl.net/v1/chat/completions
Older models (2020–2022)text-davinci-003, text-davinci-002, davinci, curie, babbage, adahttps://oapi.czl.net/v1/completions

Chat Completions API

聊天模型将消息列表作为输入,并返回模型生成的消息作为输出。尽管聊天格式旨在使多轮对话变得容易,但它对于没有任何对话的单轮任务也同样有用。

API 调用示例如下所示:

python
import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

请参阅此处的完整 API 参考文档。

主要输入是 messages 参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“系统”、“用户”或“助理”)和内容。对话可以短至一条消息,也可以来回多次。

通常,对话首先由系统消息格式化,然后是交替的用户消息和助理消息。

系统消息有助于设置助手的行为。例如,您可以修改助手的个性或提供有关其在整个对话过程中应如何表现的具体说明。但请注意,系统消息是可选的,并且没有系统消息的模型的行为可能类似于使用通用消息,例如“你是一个有用的助手”。

用户消息提供助理响应的请求或评论。助理消息存储以前的助理响应,但也可以由您编写以给出所需行为的示例。

当用户指令引用之前的消息时,包含对话历史记录非常重要。在上面的示例中,用户的最后一个问题是“在哪里播放的?” 仅在有关 2020 年世界职业棒球大赛的先前消息的上下文中才有意义。由于模型没有过去请求的记忆,因此所有相关信息必须作为每个请求中的对话历史记录的一部分提供。如果对话无法满足模型的令牌限制,则需要以某种方式缩短对话

INFO

要模仿 ChatGPT 中迭代返回文本的效果,请将参数设置为 true。

聊天完成响应格式

聊天完成 API 响应示例如下所示:

json
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "The 2020 World Series was played in Texas at Globe Life Field in Arlington.",
        "role": "assistant"
      }
    }
  ],
  "created": 1677664795,
  "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
  "model": "gpt-3.5-turbo-0613",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 17,
    "prompt_tokens": 57,
    "total_tokens": 74
  }
}

在Python中,可以使用 提取助手的回复response['choices'][0]['message']['content']

每个响应都将包含一个finish_reason. 可能的值为finish_reason

  • stop:API 返回完整消息,或由通过stop参数提供的停止序列之一终止的消息
  • length:由于max_tokens参数或令牌限制,模型输出不完整
  • function_call:模型决定调用一个函数
  • content_filter:由于我们的内容过滤器中的标记而省略了内容
  • null:API 响应仍在进行中或不完整 根据输入参数(如提供如下所示的函数),模型响应可能包含不同的信息。

函数调用

在 API 调用中,您可以向gpt-3.5-turbo-0613和描述函数gpt-4-0613,并让模型智能地选择输出包含调用这些函数的参数的 JSON 对象。聊天完成 API 不会调用该函数;相反,模型会生成 JSON,您可以使用它来调用代码中的函数。

最新的模型 (gpt-3.5-turbo-0613和gpt-4-0613) 已经过微调,可以检测何时应该调用函数(取决于输入)并使用遵循函数签名的 JSON 进行响应。这种能力也带来了潜在的风险。我们强烈建议在代表用户采取影响世界的行动(发送电子邮件、在线发布内容、购买等)之前构建用户确认流程。

INFO

在底层,函数按照模型训练过的语法注入到系统消息中。这意味着函数会根据模型的上下文限制进行计数,并作为输入令牌进行计费。如果遇到上下文限制,我们建议限制函数的数量或为函数参数提供的文档的长度。

函数调用使您能够更可靠地从模型中获取结构化数据。例如,您可以:

  • 创建通过调用外部 API(例如 ChatGPT 插件)来回答问题的聊天机器人
    • 例如定义函数,如send_email(to: string, body: string), 或get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
  • 将自然语言转换为 API 调用
    • 例如转换“谁是我的主要客户?” 并get_customers(min_revenue: int, created_before: string, limit: int)调用您的内部 API
  • 从文本中提取结构化数据
    • 例如定义一个名为 的函数extract_data(name: string, birthday: string),或者sql_query(query: string)

...以及更多!

函数调用的基本步骤顺序如下:

  1. 使用用户查询和函数参数中定义的一组函数来调用模型。
  2. 模型可以选择调用函数;如果是这样,内容将是遵循您的自定义架构的字符串化 JSON 对象(注意:模型可能会生成无效的 JSON 或幻觉参数)。
  3. 在代码中将字符串解析为 JSON,并使用提供的参数(如果存在)调用函数。
  4. 通过将函数响应作为新消息附加来再次调用模型,并让模型将结果汇总返回给用户。 您可以通过下面的示例查看这些步骤的实际效果:
python
import openai
import json


# Example dummy function hard coded to return the same weather
# In production, this could be your backend API or an external API
def get_current_weather(location, unit="fahrenheit"):
    """Get the current weather in a given location"""
    weather_info = {
        "location": location,
        "temperature": "72",
        "unit": unit,
        "forecast": ["sunny", "windy"],
    }
    return json.dumps(weather_info)


def run_conversation():
    # Step 1: send the conversation and available functions to GPT
    messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
    functions = [
        {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        }
    ]
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0613",
        messages=messages,
        functions=functions,
        function_call="auto",  # auto is default, but we'll be explicit
    )
    response_message = response["choices"][0]["message"]

    # Step 2: check if GPT wanted to call a function
    if response_message.get("function_call"):
        # Step 3: call the function
        # Note: the JSON response may not always be valid; be sure to handle errors
        available_functions = {
            "get_current_weather": get_current_weather,
        }  # only one function in this example, but you can have multiple
        function_name = response_message["function_call"]["name"]
        fuction_to_call = available_functions[function_name]
        function_args = json.loads(response_message["function_call"]["arguments"])
        function_response = fuction_to_call(
            location=function_args.get("location"),
            unit=function_args.get("unit"),
        )

        # Step 4: send the info on the function call and function response to GPT
        messages.append(response_message)  # extend conversation with assistant's reply
        messages.append(
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            }
        )  # extend conversation with function response
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo-0613",
            messages=messages,
        )  # get a new response from GPT where it can see the function response
        return second_response


print(run_conversation())

INFO

函数调用中的幻觉输出通常可以通过系统消息来缓解。例如,如果您发现模型正在使用未提供给它的函数生成函数调用,请尝试使用系统消息:“仅使用为您提供的函数。”

在上面的示例中,我们将函数响应发送回模型并让它决定下一步。它响应一条面向用户的消息,告诉用户波士顿的温度,但根据查询,它可能会选择再次调用函数。

例如,如果您询问模型"查找本周末波士顿的天气,预订周六两人的晚餐,并更新我的日历"并为这些查询提供相应的函数,它可能会选择连续调用它们,并且仅在最后创建一条面向用户的消息。

如果您想强制模型调用特定函数,您可以通过设置来实现function_call: {"name": "<insert-function-name>"}。您还可以通过设置强制模型生成面向用户的消息function_call: "none"。请注意,默认行为 ( function_call: "auto") 是让模型自行决定是否调用函数以及如果调用哪个函数。

完成 API

完成 API 端点具有与聊天完成端点不同的接口。输入不是消息列表,而是名为 的自由格式文本字符串prompt。

API 调用示例如下所示:

python
import openai

response = openai.Completion.create(
  model="text-davinci-003",
  prompt="Write a tagline for an ice cream shop."
)

令牌对数概率

完成 API 可以提供与每个输出标记的最可能标记相关​​联的有限数量的日志概率。此功能通过使用logprobs字段来控制。在某些情况下,这对于评估模型对其输出的置信度很有用。