[ChatGPT]OpenAI APIでGPT-3.5系のモデル「gpt-3.5-turbo」と「text-davinci-003」をLambdaで試してみた
はじめに
巷で人気のChatGPTのAPI が提供されていますので、Lambdaを使って試してみます。
ChatGPTは、GPT-3.5系のモデルの一つである「gpt-3.5-turbo」が使用されています。
また、GPT-3.5系のモデルの一つである「text-davinci-003」のAPI が提供されていますので、こちらも試してみます。
2つのモデルの違いは、「text-davinci-003」は、高度な自然言語処理タスクに使用される一方、 「gpt-3.5-turbo」は小規模で速度が速く、比較的簡単な自然言語処理タスクに使用されることが多い点があります。
Pythonでは、openaiライブラリが用意されているため、ローカルでライブラリをZIP化し、Lambda Layer経由でライブラリを利用します。
OpenAIアカウントの作成は省略し、APIの発行方法から、Lambdaの作成、テストまでの手順をご説明していきます。
APIキーの発行
OpenAIアカウント作成後、APIキーの発行をします。
APIキーの発行は、アカウントの View API keys をクリックします。
Create new secret key をクリックすると、API keyが発行されます。
openaiライブラリをLambda Layerにアップロード
OpenAIはPythonのライブラリがありますので、これをローカルでインストールし、Lambda Layerにアップロードします。
ローカルのTerminalで下記の3つのコマンドを実行します
// ディレクトリ名は必ずpythonにします。 $ mkdir python // pip install -t ./python openai でも可 $ python3 -m pip install -t ./python openai // zip名は、何でもよいです $ zip -r openai.zip ./python
openai.zip をLambda Layerにアップロードします。
今回は、Pythonを使いますので、最新のPython3.9を指定します。
Lambda作成
Lambdaは、ランタイムをPython3.9に指定し、IAMロールはデフォルトで作成します。
作成したLambdaに、先程追加したLayerを追加します。
追加されたか確認しましょう。
Lambdaの設定値
- タイムアウトは、デフォルトの5秒ですとタイムアウトになりますので、5秒ではなく30秒に変更します。
- OpenAIの API keyは、環境変数にします。
「gpt-3.5-turbo」のLambdaのコード
今回は、「日本の文化について教えて下さい」と聞いてみます。
from decimal import Decimal import json import os import openai openai.api_key = os.environ['API_Key'] API_ENDPOINT = 'https://api.openai.com/v1/engine/davinci-codex/completions' input_text = '日本の文化について教えて下さい' def decimal_to_int(obj): if isinstance(obj, Decimal): return int(obj) def lambda_handler(event, context): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": input_text}, ] ) print("Received response:" + json.dumps(response,default=decimal_to_int, ensure_ascii=False)) return response["choices"][0]["message"]["content"]
「text-davinci-003」のLambdaのコード
from decimal import Decimal import json import os import openai openai.api_key = os.environ['API_Key'] API_ENDPOINT = 'https://api.openai.com/v1/engine/davinci-codex/completions' input_text = '日本の文化について教えて下さい' def decimal_to_int(obj): if isinstance(obj, Decimal): return int(obj) def lambda_handler(event, context): response = openai.Completion.create( engine="text-davinci-003", prompt=input_text, max_tokens=200 ) print("Received response:" + json.dumps(response,default=decimal_to_int, ensure_ascii=False)) return response.choices[0].text.replace('\n', '')
- promptは、聞く文章内容です。
- max_tokens は、応答を生成するトークンの最大数です。
- 今回は、200にします
他にも様々なパラメータがありますので、ドキュメントを一読することをおすすめします。
「gpt-3.5-turbo」でLambdaを実行
Lambdaをテスト実行します。eventは、空でよいです。
実行すると、Returnで以下の文章が返ってきました。
日本には、伝統的な文化や芸術、音楽、建築、食文化などがあります。 以下にいくつかの代表的な文化について紹介します。 1. お茶の文化日本のお茶の文化は、茶道と呼ばれる芸術的な行為として、茶室でのお茶会などに見られます。茶道では、茶器や茶の湯、庭園や建物などが重要な役割を担います。 2. 武道の文化日本の武道の文化には、剣道や柔道、合気道、弓道などがあります。これらは、昔から伝わる日本の武士や武士道の一部として発展したもので、身体を鍛えることや、精神的な成長を促すことが重視されます。 3. 芸術の文化日本には、浮世絵、書道、陶芸、漆器、絵画などの芸術作品が多くあります。これらの芸術は、長い歴史を持ち、日本の美意識や文化を伝える役割を果たしています。 4. 伝統的な祭りやお祭り日本には多くの祭りやお祭りがあります。代表的なものに、お正月の訪問神、祇園祭、お盆、七夕などがあります。これらの祭りは、古代より伝えられており、日本の風習や信仰を象徴するものです。 5. 和食の文化和食は、日本の伝統的な食文化であり、地産地消、旬の食材を使うことが基本的な考え方です。また、器や盛りつけ方にもこだわりがあり、季節感や美しさを表現します。 以上が、日本の文化の一部です。しかし、これらは多岐にわたり、それぞれ深い歴史や背景を持っています。"
また、レスポンス内容は、以下の通りでした。
Received response: { "id": "chatcmpl-6rhW9xQSjNNGn7HFVaZUkTGRe3YCd", "object": "chat.completion", "created": 1678256685, "model": "gpt-3.5-turbo-0301", "usage": { "prompt_tokens": 22, "completion_tokens": 628, "total_tokens": 650 }, "choices": [ { "message": { "role": "assistant", "content": "\n\n日本には、伝統的な文化や芸術、音楽、建築、食文化などがあります。以下にいくつかの代表的な文化について紹介します。\n\n1. お茶の文化\n日本のお茶の文化は、茶道と呼ばれる芸術的な行為として、茶室でのお茶会などに見られます。茶道では、茶器や茶の湯、庭園や建物などが重要な役割を担います。\n\n2. 武道の文化\n日本の武道の文化には、剣道や柔道、合気道、弓道などがあります。これらは、昔から伝わる日本の武士や武士道の一部として発展したもので、身体を鍛えることや、精神的な成長を促すことが重視されます。\n\n3. 芸術の文化\n日本には、浮世絵、書道、陶芸、漆器、絵画などの芸術作品が多くあります。これらの芸術は、長い歴史を持ち、日本の美意識や文化を伝える役割を果たしています。\n\n4. 伝統的な祭りやお祭り\n日本には多くの祭りやお祭りがあります。代表的なものに、お正月の訪問神、祇園祭、お盆、七夕などがあります。これらの祭りは、古代より伝えられており、日本の風習や信仰を象徴するものです。\n\n5. 和食の文化\n和食は、日本の伝統的な食文化であり、地産地消、旬の食材を使うことが基本的な考え方です。また、器や盛りつけ方にもこだわりがあり、季節感や美しさを表現します。\n\n以上が、日本の文化の一部です。しかし、これらは多岐にわたり、それぞれ深い歴史や背景を持っています。" }, "finish_reason": "stop", "index": 0 } ] }
「text-davinci-003」のLambdaを実行
"日本の文化は古くから深い歴史があります。 日本は芸術、音楽、演劇、詩、ゲームなど、多くの手法で文化を表現してきています。 日本伝統文化でも有名なのが「茶道」です。 茶道では、茶などの紅茶を煎じて淹れた抹茶を楽しむ儀式を意識しながら行います。また、夏に"
また、レスポンス内容は、以下の通りでした。
{ "id": "cmpl-6rSIkufYLaudZZY4BqHbYmUFaKeZK", "object": "text_completion", "created": 1678198194, "model": "text-davinci-003", "choices": [ { "text": "\n\n日本の文化は古くから深い歴史があります。日本は芸術、音楽、演劇、詩、ゲームなど、多くの手法で文化を表現してきています。日本伝統文化でも有名なのが「茶道」です。茶道では、茶などの紅茶を煎じて淹れた抹茶を楽しむ儀式を意識しながら行います。\n\nまた、夏に", "index": 0, "logprobs": null, "finish_reason": "length" } ], "usage": { "prompt_tokens": 23, "completion_tokens": 200, "total_tokens": 223 } }
文章が途中で途切れてしまっていますが、原因は、json内でtotal_tokensが223とありますが、コード内で設定したmax_tokensは、200しているためです。
途切れないようにするには、max_tokensを増やすとよいです。
簡単なコードでしたが、参考になればと思います