文章目錄
- 一. 多輪對話
- 二. 使用起點: ChatCompletion
- 三. 調用模型:create方法
- 1. 主要的輸入參數:model、message
- 2. 對話長度和token數量管理
- 3. 可選參數
- 四. ChatCompletion端點的輸出格式
本文討論如何使用GPT-4和ChatGPT背后的模型,以及OpenAI Python庫。
目前,GPT-3.5 Turbo是最便宜且功能最多的模型。因此,它也是大多數用例的最佳選擇。
一. 多輪對話
import openai
# 對GPT-3.5 Turbo來說,端點是ChatCompletion
openai.ChatCompletion.create(# 對GPT-3.5 Turbo來說,模型是gpt-3.5-turbomodel="gpt-3.5-turbo",# 消息列表形式的對話messages=[{"role": "system", "content": "You are a helpful teacher."},{"role": "user","content": "Are there other measures than time \complexity for an algorithm?",},{"role": "assistant","content": "Yes, there are other measures besides time \complexity for an algorithm, such as space complexity.",},{"role": "user", "content": "What is it?"},],
)
在hello world的例子中,我們使用了最少數量的參數,來用于預測的LLM和輸入消息。
現在我們關注,輸入消息中的對話格式允許模型進行多輪對話。
請注意,API不會在其上下文中存儲先前的消息。問題“What is it?”問的是先前的回答,這只有在模型知道答案的情況下才有意義。每次模擬聊天會話時,都必須發送整段對話。 ing
?
GPT-3.5 Turbo模型和GPT-4模型針對聊天會話進行了優化,但這并非強制要求。
這兩個模型可用于多輪對話和單輪任務。如果你在提示詞中請求模型補全文本,那么它們也可以很好地完成傳統的文本補全任務。
?
二. 使用起點: ChatCompletion
GPT-4和ChatGPT都使用起點是:openai.ChatCompletion
。
開發人員可以通過更改模型ID來在GPT-3.5Turbo和GPT-4之間切換,而無須修改其他代碼。
?
三. 調用模型:create方法
ChatCompletion的create方法讓用戶能夠調用OpenAI的模型。
當然,還有其他方法可用,但它們對與模型的交互沒有幫助。你可以在OpenAI Python庫的GitHub代碼倉庫中查看代碼。
?
1. 主要的輸入參數:model、message
ChatCompletion端點及其create方法有多個輸入參數,但只有兩個是必需的,如下表
參數名 | 類型 | 描述 |
---|---|---|
model | string | 可以使用openai.Model.list()列出目前可以用模型 |
message | list | 表示對話的消息對象數組。消息對象有兩個屬性:role(user、system、assistant)和content(包含對話消息的字符串) |
- 對話以可選的system content開始,然后是交替出現的user content和assistant content。
- system content幫助設置assistant的行為。(prompt?)
- user content相當于是用戶在ChatGPT網頁界面中鍵入的問題或句子。它既可以由應用程序的用戶生成,也可以作為指令設置。
- assistant content有兩個作用:要么存儲先前的回復以繼續對話,要么設置為指令,以提供所需行為的示例。由于模型沒有任何關于
歷史請求的“記憶”
,因此存儲先前的消息
對于給出對話上下文和提供所有相關信息是必要的。
?
2. 對話長度和token數量管理
如前所述,對話的總長度與token的總數相關。這將影響以下方面。
- 成本定價基于標記計算。
- 時間
- 標記越多,響應所需的時間就越長——最長可能需要幾分鐘。
- 模型是否工作
管理token數量
- 標記總數必須小于模型的上限。
- 所以我們需要控制對話的長度。你可以通過
管理消息的長度
(prompt去引導)來控制輸入標記的數量,并通過max_tokens參數
來控制輸出標記的數量。 - OpenAI提供了一個名為
tiktoken
的庫,讓開發人員能夠計算文本字符串中的標記數。我們強烈建議在調用端點之前使用此庫來估算成本。
?
3. 可選參數
OpenAI提供了其他幾個選項來微調用戶與庫的交互方式。如下幾個常見參數
參數名 | 類型 | 描述 |
---|---|---|
functions | list | 由可用函數組成的數組 |
function_call | string/object | 控制模型的響應方式 - none:模型必須以標準方式響應用戶 - {“name”:“my_function”}表示模型必須給出使用指定函數的回答 - auto:表示模型可以在以標準方式響應用戶和functions數據定義的函數之間進行選擇 |
temperature | 數值(默認為1;可接受介于0和2之間的值) | - 0:表示對于給定的輸入,對模型的調用很可能返回相同的結果,盡管響應結果會高度一致,但OpenAI不做保證。 - 溫度越高,結果的隨機性就越強,LLM通過預測一系列token來生成回答。根據輸入上下文,LLM為每個潛在的標記分配概率。 - 當溫度=0時,LLM將始終選擇概率最高的標記,較高的溫度可以產生更多樣化,更具有創造性的輸出 |
n | int(默認1) | 參數可以為給定消息生成多個回答。不過當溫度=0時,雖然可以得到多個回答,但都相同或非常相似。 |
stream | Boolean(默認false) | 回答以流的形式呈現。當回答內容較長時,可以提供更好的用戶體驗。 |
max_tokens | int | - 參數指定在聊天中生成的最大標記數。雖然為可選值,強烈建議設置為合適的值,以控制成本,但是當設置的過大時,那么可能會被OpenAI忽略。 - 輸入和生成的標記總數不能超過模型的上限。 |
?
四. ChatCompletion端點的輸出格式
你已經知道如何使用基于聊天模式的模型,讓我們看看如何使用模型給出的結果。
以下是Hello World示例程序的完整響應:
{"choices": [{"finish_reason": "stop","index": 0,"message": {"content": "Hello there! How may I assist you today?","role": "assistant",},}],"created": 1681134595,"id": "chatcmpl-73mC3tbOlMNHGci3gyy9nAxIP2vsU","model": "gpt-3.5-turbo","object": "chat.completion","usage": {"completion_tokens": 10, "prompt_tokens": 11,"total_tokens": 21},
}
?
現在說明下各字段的含義
字段名稱 | 類型 | 描述 |
---|---|---|
choices | 對象數組 | 包含模型實際響應的數組,默認情況如下,該數組只有一個元素,可以通過入參n 進行修改。該元素包含以下內容:1. finish_reson:回答結束的原因。在hello world的事例中,finish_reason是stop,也就是我們從模型中得到到完整的響應。如果在輸出過程中出現錯誤,那么將體現在該字段中; 2. index:從choices中選擇對象的索引 3. message:包含role、content或function_call,role的值始終是assistant,content包含模型生成的文本。一般這樣調用:response[ ‘choices’ ][ 0 ][‘message’][‘content’]。 |
created | timestamp | 生成的時間戳 |
id | string | OpenAI內部使用的技術標識符 |
object | string | 對于GPT-4模型和GPT-3.5模型,為chat.completion |
usage | string | 提供有關在此查詢中使用的標記數的信息,從而為你提供費用信息。 - prompt_tokens表示輸入中的標記數 - completion_tokens表示輸出中的標記數 這里有: total_tokens = prompt_tokens + completion_tokens |
?