Golang/PythonによるopenAI API呼び出しの詳細説明

学習目標:

  • OpenAI API の概要

  • Golang で OpenAI の API を使用する方法を学ぶ

  • OpenAI の共通パラメータとその説明

  • OpenAI API のトークンを理解する

  • OpenAI API は、いくつかの異なるエンドポイントとモードを提供します

  • 複雑で実用的なアプリケーションの例


学習内容:

  「OpenAI API の紹介:

OpenAI API は、OpenAI が提供するサービスで、開発者が OpenAI の強力な自然言語処理モデルとプログラムで対話できるようにします。これらのモデルは深層学習技術に基づいており、テキスト生成、自動要約、翻訳、ダイアログ生成などのさまざまなタスクに使用できます。

OpenAI API に関する重要な注意事項をいくつか示します。

  1. モデル: OpenAI API は GPT (Generative Pre-Training) アーキテクチャに基づいており、GPT-3、GPT-2 などの複数の事前トレーニング済み言語モデルを提供します。これらのモデルは大規模なデータセットでトレーニングされ、強力なテキスト生成および理解機能を提供します。

  2. アクセス方法: OpenAI API に HTTP リクエストを送信することで、モデルと対話できます。API は複数のプログラミング言語と開発環境をサポートしており、HTTP クライアント ライブラリを使用してリクエストを送信し、API が提供するエンドポイントを通じてテキスト生成やその他のタスクを実行できます。

  3. 認可と認証: OpenAI API を使用する前に、API キーを取得し、それを認証の資格情報として使用する必要があります。リクエスト ヘッダーに Authentication ヘッダーを追加することで、認証のために API キーを OpenAI API に渡すことができます。

  4. リクエストとパラメータ: リクエスト本文に適切なパラメータを指定することで、目的のタスクとモデルの動作を指定できます。たとえば、テキスト生成を開始するためのプロンプト (プロンプト) を提供したり、生成の最大長、温度、その他のパラメーターを指定したりできます。

  5. 有料: OpenAI API は有料サービスです。テキスト生成やその他の操作に API を使用するとリソースが消費され、OpenAI の価格モデルに従って課金されます。API を使用する前に、関連する価格と手数料の情報を必ず理解してください。

OpenAI は、その API の機能、価格、可用性を更新する可能性があり、特定の使用ルールと制限がある場合があることに注意してください。最新の API の説明と関連詳細については、OpenAI の公式ドキュメントを参照することをお勧めします。

「Golang を介して OpenAI の API を使用する方法を学びます:

Golang で OpenAI の API を呼び出すには、次の手順に従います。

1. 必要なライブラリをインストールします

まず、「net/http」や「github.com/go-resty/resty」などの「go」HTTP リクエスト ライブラリをインストールする必要があります。次のコマンドのいずれかを使用して、必要なライブラリをインストールします。

   
   go get -u net/http
   go get -u github.com/go-resty/resty
   

2. OpenAI API キーを取得します。

OpenAI API キーを取得するには、OpenAI の公式 Web サイトにアクセスし、アカウントを登録する必要があります。登録したら、次の手順に従って API キーを取得できます。

  1. OpenAI 公式 Web サイトにログインする: OpenAI 公式 Web サイトを開き、登録したアカウントでログインします。

  2. API セクションに移動する: ログイン後、OpenAI Web サイトの API セクションに移動します。API に関する関連ドキュメントや情報を検索してアクセスできます。

  3. API キーの作成: 指示に従って新しい API キーを作成します。これには通常、本人確認情報と関連する開発プロジェクト情報の提供が含まれます。

  4. API キーを取得する: API キーを作成すると、OpenAI によって一意の API キーが提供されます。このキーは通常、OpenAI API を呼び出すときに認証に使用する必要がある文字列です。

上記の手順は一般的なガイドラインであり、OpenAI 公式 Web サイトの更新や変更により実際のプロセスが異なる場合があることに注意してください。CRRC またはその他の特定の組織の場合、OpenAI API キーを取得するには、その特定のプロセスに従うか、関連チームに連絡する必要がある場合があります。

3. HTTP リクエストを作成します。

Golang では、上記のライブラリのいずれかを使用して HTTP リクエストを作成できます。以下は「net/http」ライブラリを使用したサンプルコードです。

 package main
   
   import (
       "fmt"
       "io/ioutil"
       "net/http"
   )
   
   func main() {
       apiKey := "YOUR_OPENAI_API_KEY"
       url := "https://api.openai.com/v1/engines/davinci-codex/completions"
   
       reqBody := `{
           "prompt": "Hello, world!",
           "max_tokens": 10
       }`
   
       req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(reqBody)))
       if err != nil {
           fmt.Println("Error creating request:", err)
           return
       }
   
       req.Header.Set("Authorization", "Bearer "+apiKey)
       req.Header.Set("Content-Type", "application/json")
   
       client := &http.Client{}
       resp, err := client.Do(req)
       if err != nil {
           fmt.Println("Error sending request:", err)
           return
       }
   
       defer resp.Body.Close()
       respBody, err := ioutil.ReadAll(resp.Body)
       if err != nil {
           fmt.Println("Error reading response:", err)
           return
       }
   
       fmt.Println("Response:", string(respBody))
   }

   上記のコードで、「YOUR_OPENAI_API_KEY」を独自の OpenAI API キーに置き換えます。「reqBody」はリクエストの JSON データを定義します。これにはヒントと生成するトークンの最大数が含まれます。ニーズに応じて適切な変更を加えてください。

4. リクエストを送信し、レスポンスを処理します。

`client.Do(req)`を呼び出してリクエストを送信し、`ioutil.ReadAll`でレスポンスの内容を読み取ります。必要に応じて、さらに処理や解析を行うことができます。

これは、Golang で OpenAI の API を呼び出す方法を理解するための単なる基本的なサンプル コードであることに注意してください。OpenAI API の特定の要件と機能によっては、さらに多くの構成とパラメーター設定を実行する必要がある場合があります。詳細については OpenAI API のドキュメントを必ず参照し、必要に応じて適切な調整を行ってください。

》OpenAIの共通パラメータと説明

1. OpenAI API のいくつかの共通パラメータとその説明:

1. `engine` (文字列): 「davinci」、「curie」、「gpt-3.5-turbo」など、使用するモデル エンジンを指定します。エンジンのモデルが異なれば、性能や機能も異なります。

2. `prompt` (文字列): モデルにテキストの開始コンテンツを生成するよう促すために使用されます。1 つ以上の文をプロンプトとして提供できます。

3. `max_tokens` (int): テキストを生成するトークンの最大数を制限します。トークンは、モデルが処理するテキストの基本単位です。トークンの数を制御することで、生成されるテキストの長さを制御できます。

4. 「温度」 (float): 生成されるテキストの多様性を制御します。温度値が高い (1.0 より大きい) と出力はよりランダムで多様になりますが、温度値が低い (1.0 未満) と出力はより決定的で一貫性のあるものになります。

5. `max_response_length` (int): 生成される応答の最大長 (文字数) を制限します。生成されたテキストは、長すぎる応答が返されるのを避けるために、このパラメーターを使用して切り詰めることができます。

6. `stop` (文字列または配列): 1 つ以上の文字列を停止タグとして指定します。モデルが停止タグを含むテキストを生成すると、生成を停止し、結果を返します。

7. `n` (int): 生成する応答候補の数を指定します。モデルは、確率に従ってランク付けされたいくつかの可能な応答を生成します。デフォルトでは、「n」の値は 1 で、最も高い確率で応答を返します。

これらは、モデルの動作と結果のテキスト出力を制御するために OpenAI API で一般的に使用されるパラメーターの一部です。特定のニーズやタスクに応じて、適切なパラメータ設定を行うことができます。モデルによってサポートされるパラメータが異なる場合があり、特定のパラメータ設定とデフォルト値が異なる場合があることに注意してください。最新のパラメータの説明と関連詳細については、OpenAI の公式ドキュメントを参照することをお勧めします。

2. Golang は OpenAI API を呼び出し、すべてのパラメータを設定します。

サンプルコードでそれを行う方法:

package main

import (
    "fmt"
    "log"
    "os"

    openai "github.com/openai/openai-go/v2"
)

func main() {
    apiKey := "YOUR_API_KEY"
    openai.SetAPIKey(apiKey)

    engine := "davinci"
    prompt := "Once upon a time"
    maxTokens := 50
    temperature := 0.8
    maxResponseLength := 200
    stop := []string{"\n", "The end"}
    n := 5

    // 创建 OpenAI 请求
    req := &openai.CompletionRequest{
        Model:           engine,
        Prompt:          &prompt,
        MaxTokens:       &maxTokens,
        Temperature:     &temperature,
        MaxResponseSize: &maxResponseLength,
        Stop:            stop,
        N:               &n,
    }

    // 发送请求并获取响应
    client := openai.NewCompletionClient()
    response, err := client.CreateCompletion(req)
    if err != nil {
        log.Fatal(err)
    }

    // 解析响应并获取生成的文本
    generatedTexts := make([]string, len(response.Choices))
    for i, choice := range response.Choices {
        generatedTexts[i] = choice.Text
    }

    // 输出生成的文本
    fmt.Println(generatedTexts)
}

上記のサンプル コードの「YOUR_API_KEY」を独自の OpenAI API キーに置き換えます。次に、必要に応じて、「engine」、「prompt」、「maxTokens」、「temperature」、「maxResponseLength」、「stop」、「n」パラメータの値を設定できます。

OpenAI の Go SDK (`openai-go`) を使用すると、`CompletionRequest` オブジェクトを作成し、そのオブジェクトのフィールドとしてパラメーターを設定できます。次に、リクエストを送信し、「CreateCompletion()」メソッドを呼び出してレスポンスを取得します。

最後に、応答を解析して生成されたテキストを抽出し、それを `generatedTexts` スライスに保存して、結果を出力します。

サンプルコードを実行する前に、「go get」コマンドを使用して「openai-go」パッケージがインストールされていることを確認してください。

「OpenAI API のトークンを理解する:

OpenAI API では、「トークン」はテキストの最小処理単位を指します。言語モデルでは、テキストは一連のトークンに分割され、各トークンは単語、句読点、スペース、またはその他の文字になります。モデルはテキストを生成するときに、実際にトークンごとに処理して予測します。

一部の API パラメーター (「max_tokens」など) はトークンに関して計算されるため、OpenAI API を使用するにはトークンを理解することが重要です。トークンの数を制御することで、生成されるテキストの長さを制御できます。

OpenAI の `tiktoken` Python パッケージを使用して、テキスト内のトークンの数をカウントできます。簡単なサンプルコードを次に示します。

import openai
from openai import tiktoken

openai.api_key = 'YOUR_API_KEY'

text = "Hello, how are you?"

token_count = tiktoken.count(text)
print("Token count:", token_count)

「YOUR_API_KEY」を OpenAI API キーに置き換えます。上の例では、`tiktoken.count()` 関数を使用して、指定されたテキスト内のトークンの数をカウントし、出力を出力します。

さらに、OpenAI は、「tiktoken」と呼ばれるトークンの数を表示するオンライン ツールも提供します。OpenAI ドキュメントに「tiktoken」へのリンクがあり、それを使用して任意のテキストのトークン数をカウントできます。このツールは、デバッグやトークン数の確認に非常に役立ちます。

1. OpenAI API では、通常、トークン (トークン) の数は API のコストに関係します。

API を呼び出すたびに、請求されるトークンの数は、リクエストしたテキスト入力とモデルによって生成されたテキスト出力によって異なります。

API リクエストのコストは、次の 2 つの要素に基づいて決まります。

1. 入力トークン: API に送信するテキスト入力のトークン量です。一般に、入力テキストが長いほど多くのトークンを消費するため、料金が高くなります。

2. 出力トークン: これは、モデルによって生成された応答テキストのトークンの数を指します。生成されるテキストが長ければ長いほど、取得されるトークンの数が増えるため、料金も高くなります。

OpenAI の `tiktoken` Python パッケージを使用してテキスト内のトークンをカウントし、入力と出力に使用されているトークンの数を把握できます。API リクエストで使用されるトークンの数に応じて、対応する料金の詳細は OpenAI の価格ページで確認できます。

料金はモデルやエンドポイントによって異なる場合があることに注意してください。さらに、OpenAI は需要と市場の状況に基づいて価格と請求を調整する場合があります。したがって、最も正確で最新の請求詳細については、OpenAI の公式ドキュメントと価格情報を参照することをお勧めします。

》OpenAI API は、いくつかの異なるエンドポイントとモードを提供します。

OpenAI API は、さまざまな自然言語処理タスクとニーズを満たすために、いくつかの異なるエンドポイントとモードを提供します。一般的なエンドポイントとパターンをいくつか示します。

1. 完了エンドポイント:

「davinci」、「curie」、「babbage」は OpenAI API の 3 つの主要なモデルであり、それぞれテキスト補完の生成に使用できます。プロンプトとしてテキスト スニペットを指定してリクエストを Completions エンドポイントに送信すると、モデルによって継続または完了テキストが生成されます。

2. チャットエンドポイント:

チャット モードは、ダイアログ生成タスクに適しています。チャット エンドポイントを使用して、モデルと対話し、継続的な対話応答を生成するマルチターン対話システムを構築できます。モデルがコンテキストを理解して適切な応答を生成できるように、以前の会話の内容とモデルの応答を含む履歴メッセージのリストを提供できます。

OpenAI API の Chat エンドポイントは現在、次の 3 つの異なるモデルを提供しています。

1). `gpt-3.5-turbo`: これは、OpenAI API によって提供される最新かつ最も強力なチャット モデルです。GPT-3.5 アーキテクチャに基づいており、優れたダイアログ生成機能を備えています。このモデルは複数のタスクやアプリケーションにわたって適切に動作し、一貫性のある正確な応答を生成します。

2). `davinci`: これは、GPT-3 アーキテクチャに基づく以前のチャット モデルです。すでにより高度なモデル (gpt-3.5-turbo など) がありますが、「davinci」は対話生成に引き続き使用でき、高品質な応答を提供します。

3). `curie`: これは、GPT-3.5 アーキテクチャに基づいた、GPT-3.5-turbo より前のチャット モデルです。gpt-3.5-turbo ほど強力ではありませんが、「curie」は依然として効果的な対話生成モデルであり、いくつかのアプリケーションで役割を果たしています。

これらのチャット モデルは、さまざまなダイアログ生成タスクに幅広い用途があり、特定のニーズに応じて適切なモデルを選択できます。OpenAI が改良を続け、新しいモデルをリリースし続けると、新しいモデルが利用可能になる可能性があることに注意してください。モデルの最新リストと関連詳細については、OpenAI の公式ドキュメントを参照することをお勧めします。

3. 翻訳エンドポイント:

OpenAI API は、機械翻訳用のエンドポイントも提供します。ソース言語とターゲット言語を指定して、翻訳するテキストを含むリクエストを送信すると、モデルは翻訳されたテキストを返します。

これらのエンドポイントとモードは、さまざまな自然言語処理タスク用に OpenAI API によって提供されるいくつかの共通オプションです。ニーズに応じて適切なエンドポイントとモードを選択し、API ドキュメントで提供されるガイドラインに従ってリクエストを作成し、レスポンスを解析できます。

OpenAI は、より多くの機能と柔軟性を提供するために、将来的により多くのエンドポイントとモードを更新および追加する可能性があることに注意してください。エンドポイントとモードに関する最新情報、およびそれらの適切な使用方法については、OpenAI の公式ドキュメントを必ずご確認ください。

 4. Golang は、OpenAI API のさまざまなエンドポイントとモードを呼び出します。

適切な HTTP リクエストを作成し、適切なエンドポイントに送信する必要があります。以下は、Golang で OpenAI API の Completions エンドポイントと Chat エンドポイントを呼び出す方法を示すサンプル コードです。

まず、「net/http」などの Golang の HTTP リクエスト ライブラリがインストールされていることを確認してください。

1. 完了エンドポイントのサンプル コード:
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    apiKey := "YOUR_OPENAI_API_KEY"
    url := "https://api.openai.com/v1/engines/davinci-codex/completions"

    reqBody := map[string]interface{}{
        "prompt":     "Once upon a time",
        "max_tokens": 50,
    }

    reqJSON, err := json.Marshal(reqBody)
    if err != nil {
        fmt.Println("Error marshaling request:", err)
        return
    }

    req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqJSON))
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }

    defer resp.Body.Close()
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println("Response:", string(respBody))
}

上記のコードで、「YOUR_OPENAI_API_KEY」を独自の OpenAI API キーに置き換えます。「reqBody」は、プロンプト (prompt) と生成されるトークンの最大数 (max_tokens) を含む、要求された JSON データを定義します。ニーズに応じて適切な変更を加えてください。

2. チャット エンドポイントのサンプル コード:
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    apiKey := "YOUR_OPENAI_API_KEY"
    url := "https://api.openai.com/v1/chat/completions"

    reqBody := map[string]interface{}{
        "messages": []map[string]string{
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "Who won the world series in 2020?"},
        },
    }

    reqJSON, err := json.Marshal(reqBody)
    if err != nil {
        fmt.Println("Error marshaling request:", err)
        return
    }

    req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqJSON))
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }

    req.Header.Set("Authorization", "Bearer "+apiKey)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error sending request:", err)
        return
    }

    defer resp.Body.Close()
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println("Response:", string(respBody))
}

上記の中で

コードでは、「YOUR_OPENAI_API_KEY」を独自の OpenAI API キーに置き換える必要もあります。`reqBody` はリクエストの JSON データを定義し、`messages` リストには会話の履歴メッセージが含まれます。必要に応じてさらにメッセージを追加できます。

これらのサンプル コードは、Golang を使用して OpenAI API のさまざまなエンドポイントとモードを呼び出す方法を示しています。特定のニーズに応じてこれらのコードを変更し、適切なエラー処理やその他のロジックを追加できます。リクエストとレスポンスの詳細については、OpenAI API の公式ドキュメントを必ず参照してください。

》 複雑かつ実用的なアプリケーションの例:

例 1:

指定したコメントの感情を分析し、コメントの内容と感情分析結果を出力するようにコードを変更する場合は、次のようにコードを変更できます。

import openai

def analyze_sentiment(comment):
    # 设置OpenAI API密钥
    openai.api_key = 'YOUR_API_KEY'

    # 调用OpenAI GPT-3.5模型进行情感分析
    response = openai.Completion.create(
        engine='text-davinci-003',
        prompt=f"分析以下评论的情感:{comment}\n情感分析结果",
        max_tokens=1,
        temperature=0,
        n=1,
        stop=None,
        logprobs=None
    )

    # 解析API响应,获取情感分析结果
    sentiment = response.choices[0].text.strip()

    return sentiment

# 要分析的评论
comment = "这部电影太精彩了!"

# 进行情感分析
result = analyze_sentiment(comment)
print(f"评论: {comment}")
print(f"情感分析结果: {result}")

この変更後、コードは指定されたコメントをセンチメント分析に使用し、コメントの内容とセンチメント分析結果を出力します。必ず「YOUR_API_KEY」を OpenAI API キーに置き換えてください。

例 2:

複数の「#」記号を使用すると、入力テキストをさまざまな部分に分割するために使用され、モデルの生成動作に影響を与える可能性があります。以下に例を示します。

import openai

def generate_text(prompt):
    openai.api_key = 'YOUR_API_KEY'

    response = openai.Completion.create(
        engine='text-davinci-003',
        prompt=prompt,
        max_tokens=50,
        temperature=0.8,
        n=1,
        stop=None,
        logprobs=None
    )

    generated_text = response.choices[0].text.strip()

    return generated_text

prompt = """
输入一句话,让模型继续生成下一句:
#在一个遥远的星系中,
#在宇宙的尽头,
#人类探险家发现了一颗神秘的行星。
"""

output = generate_text(prompt)
print(output)

上の例では、3 つの「#」記号を使用して入力テキストを 3 つの部分に分割しました。その部分は次のとおりです。 はるか遠く、宇宙の果てにある銀河系で、人類の探検家たちは謎の惑星を発見しました。モデルは、最後の「#」記号の後に始まるテキストを生成します。たとえば、生成されるテキストは次のようになります。


人間の探検家たちは謎の惑星を発見しました。地球上には奇妙な生き物がいて、並外れた知性と力を持っています。人類は、その秘密を明らかにすることを期待して、この神秘的な惑星の探索を始めました。
 

複数の「#」記号を使用すると、モデルの生成動作をある程度制御およびガイドして、期待に応えるテキストを生成できます。例で生成された結果はモデルの動作に基づいて推定されており、実際の結果はモデルのトレーニングやデータなどの要因によって異なる場合があることに注意してください。

例 3:

提供した例では、3 つの「#」記号を使用して入力テキストを 3 つの部分に分割しています。最初のセクションは「次のレビューの感情を分析します:」、2 番目のセクションは「この映画は素晴らしいです!」というレビューの内容、3 番目のセクションは「感情分析の結果:」です。

このセグメント化された構造は、モデルがユーザーの意図と入力がどのように構成されているかを理解するのに役立ちます。センチメント分析を実行すると、モデルは指定されたレビュー コンテンツに基づいてセンチメント関連のテキスト結果を生成します。

これは、指定した「プロンプト」を使用してセンチメント分析を行うサンプルコードです。

import openai

def analyze_sentiment(comment):
    openai.api_key = 'YOUR_API_KEY'

    response = openai.Completion.create(
        engine='text-davinci-003',
        prompt=comment,
        max_tokens=1,
        temperature=0,
        n=1,
        stop=None,
        logprobs=None
    )

    sentiment = response.choices[0].text.strip()

    return sentiment

prompt = """
分析以下评论的情感:
###
这部电影太精彩了!
###
情感分析结果:
"""

result = analyze_sentiment(prompt)
print(result)

上記のコードでは、センチメント分析の入力として提供された「プロンプト」を使用し、結果を出力します。必ず「YOUR_API_KEY」を有効な OpenAI API キーに置き換えてください。

注: この例では、モデルは「プロンプト」全体に対して感情分析を直接実行し、感情関連のテキスト結果を生成します。具体的なセンチメント分析の結果は、モデルのトレーニングとデータ、および考えられる後処理ステップによって異なります。


オリジナリティを発揮するのは簡単なことではありませんが、皆さんに気に入っていただき、サポートしていただければ幸いです。あなたのサポートが私のモチベーションです。

無断転載を禁止します

おすすめ

転載: blog.csdn.net/canduecho/article/details/131382102