ChatGPT API接口編程基礎與使用技巧

總結/朱季謙
image

趁着這週末空閒時間,在研讀完OpenAi官網文檔的基礎上,及時總結了這篇《ChatGPT API接口編程基礎與使用技巧》

本文大部分內容是圍繞編程方面,包括ChatGPT模型接口、圖像生成接口、敏感數據攔截等,只有一小部分內容圍繞如何通過temperature調參優化使用提示技巧。


一、OpenAi Api調用庫

OpenAi開放了一系列模型接口API,包括ChatGPT、圖像生成、音頻、文件、敏感數據攔截等。

若要集成這些模型接口調用到我們開發的系統裏,可以通過多種編程語言的HTTP請求與openai API交互。目前OpenAi API支持多種編程語言調用,各類編程語言對應的接口調用庫都能在OpenAi官網找到官方推薦的開源庫。

我在本文裏主要介紹Java、Go、Python、Node.js這四種,其餘具體依賴方式和使用,感興趣的童鞋可自行去官網進一步研究。

1.1、Java

官方推薦的是Theo Kanning開源的openai-java 。我用來集成到SpringBoot項目的依賴庫,正好也是用了這款openai-java。

1.1.1、首先,需要在Maven引入以下依賴——

<dependency>
    <groupId>com.theokanning.openai-gpt3-java</groupId>
    <artifactId>service</artifactId>
    <version>0.11.1</version>
</dependency>

1.1.2、安裝完成後,可以參考以下的代碼案例,通過綁定密鑰來調用chatGPT模型——

@GetMapping("/ai")
public void sendMsg() throws InterruptedException {
    System.out.println("開始提問題~");
    //GPT_TOKEN即你的代碼密鑰
    OpenAiService service = new OpenAiService(GPT_TOKEN,Duration.ofSeconds(10000));
    CompletionRequest completionRequest = CompletionRequest.builder()
         //使用的模型
            .model("text-davinci-003")
            //輸入提示語
            .prompt("你是一個工作助手,請幫忙設計一份活動策劃書")
            //該值越大每次返回的結果越隨機,即相似度越小,可選參數,默認值爲 1,取值 0-2
            .temperature(0.5)
            //返回結果最大分詞數
            .maxTokens(2048)
            //與temperature類似
            .topP(1D)
            .build();
    service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
    Thread.sleep(6000);
}

需要注意的是,若是部署在有"魔法代理"的Linux雲服務商,代碼需要相應做一下調整,否則是無法訪問到ChatGPT的,只會出現以下異常提示:

java.net.ConnectException:Failed to connect to api.openai.com/2a03:2880:f10c:283:face:b00c:0:25de:443]

當日我在這個問題上就踩了一個坑。

解決的辦法很簡單,只需要做以下調整——

public void send1Msg() throws InterruptedException {

        System.out.println("開始提問題~");
        //需要額外設置一個能訪問chatGPT的魔法訪問代理
        ObjectMapper mapper = defaultObjectMapper();
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8889));
        OkHttpClient client =  defaultClient(GPT_TOKEN,Duration.ofSeconds(10000))
                .newBuilder()
                .proxy(proxy)
                .build();
        Retrofit retrofit = defaultRetrofit(client, mapper);
        OpenAiApi api = retrofit.create(OpenAiApi.class);

    //將設置的代理傳給OpenAiService即可
        OpenAiService service = new OpenAiService(api);
        CompletionRequest completionRequest = CompletionRequest.builder()
                .model("text-davinci-003")
                .prompt("你是一個工作助手,情幫忙設計一份活動策劃書,設計一份活動策劃書")
                .temperature(0.5)
                .maxTokens(2048)
                .topP(1D)
                .build();
        service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
        Thread.sleep(6000);
}

1.2、Go

官方推薦的是sashabaranov開源的go-gpt3 。

1.2.1、需要先安裝以下依賴包——

go get github.com/sashabaranov/go-openai

1.2.2、該開源項目提供的參考案例如下——

package main
import (
 "context"
 "fmt"
 openai "github.com/sashabaranov/go-openai"
)
func main() {
 client := openai.NewClient("your token")
 resp, err := client.CreateChatCompletion(
  context.Background(),
  openai.ChatCompletionRequest{
   Model: openai.GPT3Dot5Turbo,
   Messages: []openai.ChatCompletionMessage{
    {
     Role:    openai.ChatMessageRoleUser,
     Content: "Hello!",
    },
   },
  },
 )
 if err != nil {
  fmt.Printf("ChatCompletion error: %v\n", err)
  return
 }
 fmt.Println(resp.Choices[0].Message.Content)
}

1.3、Python

先下載Python版本的open庫——

$ pip install openai

安裝完成後,可以參考以下的代碼案例,通過綁定密鑰來調用chatGPT模型——

import os
import openai

# Load your API key from an environment variable or secret management service
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(model="text-davinci-003", prompt="Say this is a test", temperature=0, max_tokens=7)

1.4、Node

先下載Node版本的openai庫——

$ npm install openai

安裝完成後,可以參考以下的代碼案例,通過綁定密鑰來調用chatGPT模型——

const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
  model: "text-davinci-003",
  prompt: "Say this is a test",
  temperature: 0,
  max_tokens: 7,
});

二、密鑰認證

OpenAi API是需要使用API密鑰進行認證訪問。密鑰獲取方式,需要登錄https://platform.openai.com/account/api-keys頁面。

接着點擊【Create new secret key】生成一個新的密鑰,需要注意一點是,該密鑰生成時就得保存下來,否則過後是無法再進行查看的,例如,我的密鑰庫裏先前已有一條密鑰,但現在無法再去確定這條密鑰是什麼了。
image

順便提一點是,chatGPT是有免費額度的,調用API會消耗掉這些額度,我們可以在點擊左邊菜單【Usage】查看——
image

在調用OpenAi的API請求時,需要在HTTP請求報頭中包含該API密鑰,例如——

Authorization: Bearer OPENAI_API_KEY

三、GPT請求設置

官方提供了一個curl通過密鑰調用API的請求案例,需要將案例裏的$OPENAI_API_KEY替換爲自己的API密鑰,在開啓了代理的服務器上運行,可以基於該案例測試服務器是否能正常調用到ChatGPT——

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "這是一個測試請求!"}],
     "temperature": 0.7
   }'

我在自己的服務器上運行了,返回結果如下——

image

這個請求表示,查詢gpt-3.5-turbo模型完成文本處理,提示語爲"這是一個測試請求!",響應結果如下——

{
 "id": "chatcmpl-75U8z1PVwDb0pA0EPhOMZVC1q7q11",
 "object": "chat.completion",
 "created": 1681541869,
 "model": "gpt-3.5-turbo",
 "usage": {
  "prompt_tokens": 14,
  "completion_tokens": 46,
  "total_tokens": 60
 },
 "choices": [{
  "message": {
   "role": "assistant",
   "content": "您好,這是一個回覆測試請求的信息。請問您有什麼需要測試的具體內容或問題嗎?我會盡力幫助您解決問題。"
  },
  "finish_reason": "stop",
  "index": 0
 }]
}

Request body各字段說明——

image


四、開發中添加敏捷信息審覈層

首先得提一下2023年4月11日網信發佈的一份《生成式人工智能服務管理辦法(徵求意見稿)》,裏面第四條明確表示,生成式人工智能算法或服務應當遵守法律法規的要求,尊重社會公德、公序良俗。這就意味着,未來在使用這類Ai接口進行輸入/輸出時,必須針對內容進行違規內容信息的過濾。

其實OpenAi有針對這塊內容審覈提供了開放的API接口,可以免費使用。

若想在聊天API的輸出中添加一個敏捷信息攔截層,就可以在輸入/輸出信息時,調用該接口。例如,存在這樣一份API接口調用案例——

curl https://api.openai.com/v1/moderations \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{"input": "測試一句話"}'

響應返回內容如下——

{
 "id": "modr-75k0nHCOc0SR88t9xCNBHctPDMO8d",
 "model": "text-moderation-004",
 "results": [{
  "flagged": false,
  "categories": {
   "sexual": false,
   "hate": false,
   "violence": false,
   "self-harm": false,
   "sexual/minors": false,
   "hate/threatening": false,
   "violence/graphic": false
  },
  "category_scores": {
   "sexual": 0.00012780998076777905,
   "hate": 0.00013749735080637038,
   "violence": 1.4757171129531343e-07,
   "self-harm": 5.410008441231184e-09,
   "sexual/minors": 1.5541245375061408e-06,
   "hate/threatening": 6.1530336381565576e-09,
   "violence/graphic": 2.9580141003293647e-08
  }
 }]
}
  • flagged:如果模型將內容屬於違反OpenAI的使用策略,則設置爲true,否則爲false。
  • categories:包含每個類別二進制使用策略違反標誌的字典。對於每個字段值,如果模型將相應類別標記爲違規則該值爲true,否則爲false。
  • category_scores:包含模型輸出的每個類別原始分數的字典,表示模型是否相信輸入了違反OpenAI對類別的策略。該值介於0和1之間,其中值越大表示置信度越高。注意一點是,分數不應被解釋爲概率。

categories和category_scores具體字段值對應的說明如下表格所示——

image

官方表示目前該審覈接口仍在不斷努力提高分類器的準確性,特別是仇恨、自殘和暴力等內容的分類。值得注意一點是,對非英語語言的支持目前是有限的,也就是說,中文的審覈支持比較有限。

除了使用OpenAi提供的輸入/輸出信息審覈接口,還可以開發敏感詞過濾系統,將傳給ChatGPT以及響應返回的數據,進行敏感詞過濾。

四、模型調用

4.1、模型列表

OpenAi提供了多種模型,可以通過執行以下查詢指令,查詢出API支持的模型類型——

curl https://api.openai.com/v1/models -H "Authorization: Bearer $OPENAI_API_KEY"

出現出來的結果如下,應該有數十個模型,我用的最多是gpt-3.5-turbo,這是目前比較標準的型號版本——

{
  "data": [
     {
      "id": "text-davinci-003",
      "object": "model",
      "created": 1669599635,
      "owned_by": "openai-internal",
      "permission": [...],
      "root": "text-davinci-003",
      "parent": null
    },

  {
      "id": "gpt-3.5-turbo",
      "object": "model",
      "created": 1677610602,
      "owned_by": "openai",
      "permission": [...],
      "root": "gpt-3.5-turbo",
      "parent": null
    },
    .....
  ],
  "object": "list"
}

4.2、查詢指定 GPT模型詳情

可以基於以上模型類表接口,查詢出具體模型實例的詳情,包括模型的基本信息、所有者及權限等——

curl https://api.openai.com/v1/models/gpt-3.5-turbo \
  -H "Authorization: Bearer $OPENAI_API_KEY"

查詢出gpt-3.5-turbo的模型詳情如下——

{
  "id": "gpt-3.5-turbo",
  "object": "model",
  "created": 1677610602,
  "owned_by": "openai",
  "permission": [
    {
      "id": "modelperm-BmdmcAa1aQwToDxri3DFbZw9",
      "object": "model_permission",
      "created": 1681343255,
      "allow_create_engine": false,
      "allow_sampling": true,
      "allow_logprobs": true,
      "allow_search_indices": false,
      "allow_view": true,
      "allow_fine_tuning": false,
      "organization": "*",
      "group": null,
      "is_blocking": false
    }
  ],
  "root": "gpt-3.5-turbo",
  "parent": null
}

GPT-3.5模型可以理解和生成自然語言或代碼,在GPT-3.5版本當中,最有能力和最具成本收益的模型是GPT-3.5-turbo,它是基於原有的3.5版本模型進行的迭代優化,可以更好地完成傳統任務。目前最新模型是GPT-4,具有更先進的常識和推理能力,但還沒有開放免費API接口。

以下是GPT-3.5模型列表介紹——

image

官方推薦使用GPT-3.5-turbo而不是其他GPT-3.5模型,因爲它的成本更低。gpt-3.5-turbo的性能與text-davinci-003相似,但每個token的價格是它的10%,官方推薦在大多數情況下使用gpt-3.5-turbo。

五、圖像生成調用

給定一個提示和/或一個輸入圖像,模型會生成一個新的圖像,例如,我想讓它畫一隻胖貓——

curl https://api.openai.com/v1/images/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "prompt": "畫一隻可愛的大胖貓",
    "n": 2,
    "size": "1024x1024"
  }'

然後,它確實給我畫了兩張圖——

{
  "created": 1681547551,
  "data": [
    {
      "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-LqdibnOuIlW8xc7Lfh2REsXo/user-6D0yIziBFiX73mCUwNwOwczJ/img-jKdFuRLINlkCeFL1QCWFZtId.png?st=2023-04-15T07%3A32%3A31Z&se=2023-04-15T09%3A32%3A31Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-04-15T08%3A28%3A22Z&ske=2023-04-16T08%3A28%3A22Z&sks=b&skv=2021-08-06&sig=Rbe8x3ZdEcoScQOXrkxGAe1G8rGOrO%2B4wzmzZwotP68%3D"
    },
    {
      "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-LqdibnOuIlW8xc7Lfh2REsXo/user-6D0yIziBFiX73mCUwNwOwczJ/img-00FKmNWnDm5p21CS89UPm56T.png?st=2023-04-15T07%3A32%3A31Z&se=2023-04-15T09%3A32%3A31Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-04-15T08%3A28%3A22Z&ske=2023-04-16T08%3A28%3A22Z&sks=b&skv=2021-08-06&sig=KVsxjwPIsJFC0cFEjRqVPrcckGxipp5BiiUmayPmqMM%3D"
    }
  ]
}

通過圖url鏈接,可以查看圖片,若是在代碼裏,可以直接丟給裏顯示出圖片。不過,我讓openai給我畫的是一隻胖貓,圖一我還能理解,但是,圖二,這個貓屁股着實有些離譜了(自帶🐶)......
image

體驗下來,感覺與midjourney還是有較大區別的,只能說,勉強能用吧。

圖像生成接口參數如下——
image


六、ChatGPT使用技巧和注意事項

6.1、調整temperature參數

我在前文調用API的參數當中,有提及一個temperature參數,翻譯過來叫溫度。該參數用於指定生成文本時的隨機性和多樣性,默認值爲1,介於 0 和 2 之間,較高的溫度值值(如 0.8)會導致GPT輸出內容更隨機,而較低的溫度值(如 0.2)會使其更加可以預測和具備確定性。

打一個比喻,ChatGPT中的溫度值就演員演戲——

較低的溫度值可以看作是“按照劇本表演”,演員是什麼水平,就演出什麼樣子。溫度值低生成的文本比較保守和確定,適合需要準確性和連貫性的任務,比如內容摘要、機器翻譯等。

較高的溫度值可以看成“即興表演”,生成的文本可能更加隨機和多樣性,當然,也可能更加糟糕,這種情況比較適合用來創作和探索性任務,比如生成對話、創意寫作等。

當然,這個temperature參數並非萬能的,在某些文本內容當中,可能幾乎感受不到太多差別。

若溫度值設置爲0,那麼,模型將總會返回相同或非常相似的內容,當溫度高於0時,每次提交相同的提示會導致生成不同內容。官方表示,溫度值在0~1之間,基本上可以控制模型生成比較滿意的答案。

例如,當用戶詢問“如何形容一隻胖貓?”時,聊天機器人可能會生成以下不同的回答:

  • 溫度值爲0.5時:“這是一隻肥嘟嘟的貓。”

  • 溫度值爲1.0時:“這隻貓非常胖,它的身體肥厚且圓潤,看上去就像一個小球一樣。它的肚子很大,當它走路時會晃來晃去,臉上也有一圈又圓又滑的脂肪。總之,這是一隻非常非常胖的貓。”

  • 溫度值爲1.5時:“這隻貓的身材簡直像是一個小沙發,它的腹部肥厚得幾乎擡不起來,四肢也變得特別短。當它走路時,身體會晃動,好像隨時都可能翻倒。它的臉寬大而且圓潤,雙頰上還有一圈厚厚的贅肉,看上去相當可愛。總之,這是一隻極其肥胖的貓。”

在提問當中,使用這個參數的方法很簡單,只需要在提示語後面跟上“Use a temperature of 0.5”即可——

image

6.2、傳遞給API的數據是否會被存儲

用戶比較關心一個問題是,我們傳給ChatGPT的數據是否會被存儲。官方表示,自2023年3月1日起,將保留您的API數據30天,但不再使用通過API發送的數據來改進模型。這就意味着,請勿傳輸涉及個人隱私或者安全相關的信息,避免數據泄漏。

正在建了Ai ChatGPT微信交流羣,目前1羣已超200人無法自動加入,新建了2羣歡迎小夥伴加入,羣成員提供——

1、提供免費 ChatGPT訪問體驗;
2、ChatGPT實際應用案例分享;
3、Ai工具體驗分析分享;
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章