一、什么是openai api
大家對特斯拉的馬斯克應該是不陌生的,openai 就是馬斯克投資的一家研究人工智能的公司,它就致力于推動人工智能技術的發展,目標是確保人工智能對人類有益,并實現安全且通用的人工智能。
此后,OpenAI 在技術研發和應用方面不斷取得進展,逐漸成為全球矚目的人工智能研究機構,OpenAI 在自然語言處理方面取得了眾多突破性成果,最著名的是 GPT(Generative Pretrained Transformer)系列語言模型。例如 GPT-3,它具有強大的語言理解和生成能力,能夠生成連貫、有邏輯的文本,在問答、文本生成、翻譯等多個任務中表現出色。GPT-4 更是在 GPT-3 的基礎上進一步提升了性能和功能,能夠處理更復雜的任務,對語言的理解和生成更加精準和自然。
而chatGpt 就是使用GPT的網頁端應用。
但是為了更好的支持開發者使用,openai 公司提供了標準接口的api 供開發者使用GPT大模型。我們可以通過 api 和大模型進行通訊,從而實現使用大模型實現自己的功能。
目前 openapi api 規范已經是國內所有大模型統一的接口規范,基本上國內各大廠商都參考其規范實現自己的模型 API
二、Api 詳細說明
可以看看下面的例子:
curl --insecure https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $KEY" \
-d '{"model": "gpt-4o","messages": [{"role": "user", "content": "寫一首關于AI的詩"}]}'
這是一個 openai 的聊天補全接口,實際上但Open AI API 提供了許多功能,比如:
Text Generation:生成和處理文本
Embeddings:文本轉向量
Speech to Text:語音轉文本
Image Generation:生成圖像
Vision:處理圖像輸入
這些不同的接口是通過不同的路徑進行區分。這里看到的 /v1/chat/completions 就是我們常用的大模型的編程接口。
接口有兩個特別重要的參數。分別是訪問地址和api key。 通過 api key 可以用來區分不同的用戶,而訪問地址則是一個模型代理地址,不同模型提供的訪問地址一般都是不同的。這個地址不一定是模型本身提供的,也可能是代理地址。
https://api-docs.deepseek.com/zh-cn/guides/multi_round_chat
然后我們來講講接口的請求參數說明:
核心參數:
參數名稱 | 參數說明 |
---|---|
model | 用于指定與哪個模型進行溝通,選擇合適的模型來完成相應任務 |
messages | 是一個消息列表,發送給模型的消息,可理解為歷史消息列表,為模型提供更多上下文信息,幫助其更準確地理解和生成回復 |
temperature | 設定大模型回復的確定性,取值范圍對應不同的隨機性。值越小,生成的回復越具確定性;值越大,回復的隨機性越強 |
max_completion_tokens | 表示生成應答的最大token數。由于大模型生成內容常按token數計費,合理限制此參數大小可有效控制成本 |
stream | 用于決定是否需要流式應答。流式應答能夠提升聊天的響應速度,為用戶帶來更好的交互體驗 |
工程參數
參數名稱 | 參數說明 |
---|---|
終端用戶標識 | 開發者提供給OpenAI,用于監控和檢測API的濫用,監控粒度能到個體 |
n | 為每條輸入消息生成回復的數量,生成更多內容需計費,若無特別需求,不額外設置此參數 |
response_format | 應答格式,默認接口只生成文本內容,開發中常用JSON格式,既可用提示詞要求大模型返回JSON格式,也可通過設置此參數讓API直接返回JSON格式 |
工具參數
參數名稱 | 說明 |
---|---|
tools(模型可以調用的工具列表) | 每個工具包含 type(類型,目前只有 function 類型)和 function 部分。function 用于告知模型函數的調用方式,包括 description(函數描述)、name(函數名)以及 parameters(函數參數) |
tool_choice(選擇怎么調用工具) | 參數值為 none 表示不調用工具;參數值為 auto 表示模型自行選擇生成消息或調用工具;參數值為 required 表示必須調用工具 |
模型參數
參數名稱 | 說明 |
---|---|
seed(種子值) | 用于解決可重復輸出問題,使用相同種子值和相同參數時,生成的結果相同,類似緩存 |
stop | 停止序列,告知大模型在生成文本時遇到該序列就停止生成 |
frequency_penalty(頻率懲罰) | 根據一個 token 在已生成文本中出現的頻率進行計算 |
presence_penalty(存在懲罰) | 根據一個 token 是否已經出現來進行計算 |
logit_bias(logit 偏差) | 在 logit 函數計算中調整計算結果,主要目的是修改某些 token 出現的可能性,如不希望某些詞出現在最終結果里 |
logprobs(是否返回對數概率) | 返回大模型生成每個 token 的概率 |
top_logprobs(返回每個位置最可能返回的 token 數量) | 讓大模型返回排名靠前的 token |
top_p(另一種采樣方式,與 temperature 相對) | 在概率前多少的 token 中進行選擇 |
再看看接口的響應參數:
子項 | 說明 |
---|---|
id | 應答的唯一標識 |
object(對象類型) | 通用字段,在聊天補全接口中,值為 chat.comploetion(應為 chat.completion ) |
created | Unix 時間戳,表明這個應答生成的時間 |
model | 生成應答的模型,一般是請求時所帶的模型,有時會返回具體的版本 |
system_fingerprint(系統指紋) | 代表模型運行時使用的后端配置 |
choices.index(索引) | 順序編號,如果文本被切分了,可通過索引將內容重新排列以生成正確順序 |
choices.finish_reason | 停止生成 token 的原因,到了停止點或遇到停止序列,原因是 stop ;到了一定長度,原因是 length |
message(回復的消息) | 角色和內容 |
tool_calls.id | 函數調用的 ID |
tool_calls.type | 目前只支持 function |
tool_calls.function | 函數調用部分,其中包含了 name 和 arguments |
logprobs.content | token 與其對應的概率(logprob)。bytes 表示這個 token 對應的 UTF-8 的字節表現形式,而 top_logprobs 則包含了每個 token 對應的備選 token 及其概率 |
三、應答模式
流式應答
為了解決大模型生成文本比較慢的問題。如果等大模型把所有內容生成一次性返回,等待的時間會非常長。對于聊天的場景,這會讓本已很長的等待時間會顯得更加漫長。所以推出了流式應答,主要是為了提高聊天的響應速度。
SSE
是指在連接建立之后,一塊一塊地把消息發給用戶。對應到大模型上,就是每生成一部分內容就發送一次。
OpenAI 之所以選擇 SSE,而非 WebSocket,是因為 SSE 的技術特點剛好可以契合流式應答的需求:
客戶端與大模型的交互是一次性的,每產生一個 token,服務端就可以給客戶端推送一次,當生成內容結束時,斷掉連接,無需考慮客戶端的存活情況
如果采用 WebSocket 的話,服務端就需要維護連接,像 OpenAI 這樣的服務體量,維護連接就會造成很大的服務器壓力,而且,在生成內容場景下,也沒有向服務端進一步發送內容,WebSocket 的雙向通信在這里也是多余的
SSE 通常分成純數據消息和事件消息。純數據消息,顧名思義就是只有數據的消息主題,事件消息會先有一個事件(event),后面跟著具體的數據(data)
通過使用大模型的API,我們可以更好了基于大模型實現應用層軟件。這也是開發者低成本使用成熟大模型的途徑。