11月6日の OpenAI Dev Day の時期に openai のライブラリ は v.0.x 系 (最終的には v0.28.1) から v1系にアップデートされました。
Azure OpenAI へのアクセス方法も breaking changes が発生しています。過渡期になり、openai のライブラリはバージョン指定をしておかないと突然動かなくなる可能性あるので要注意です。
ということでこの辺りの変更について先週やってたことを個人的にメモしておきます。
準備
今回私は VS Code 上で jupyter notebook を動かしながらやってます。もしさっと試したい方向けに、ざっくりですが私の準備作業からメモしておきます。
とりあえず .env ファイル作って Azure OpenAI の endpoint と api が定義しておきます。
AZURE_OPENAI_ENDPOINT=https://xxxxxxx.openai.azure.com/ AZURE_OPENAI_API_KEY=xxxxxqaaaaaabbbb
まずは requirements.txt にはこれだけ入れておく。
python-dotenv
あとは pip install -r requirements.txt をしてからだけ実行した状態にしておきます。
from dotenv import load_dotenv load_dotenv()
notebook はこんな感じ。
Chat completions
Chat completions: v0.28.1 までの実装方法
requirements.txt で openai の version を 0.28.1
に固定して pip install しておきます。
python-dotenv openai==0.28.1
今まではこんな感じでしたね。
import openai import os openai.api_type = "azure" openai.api_key = os.getenv("AZURE_OPENAI_API_KEY") openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT") openai.api_version = "2023-05-15" GPT_DEPLOYMENT_NAME = "gpt-4" completion = openai.ChatCompletion.create( engine=GPT_DEPLOYMENT_NAME, messages=[ {"role": "system", "content": "あなたは関西弁のチャットボットです"}, {"role": "user", "content": "こんにちは"} ] ) answer = completion['choices'][0]['message']['content'] print(answer)
Chat completions: v1系での実装方法
requirements.txt で openai の version を 11/13時点で最新の 1.2.3
に固定して pip install しておきます。1.*
とか 1.2.*
でもいいかなぁと思いつつ、1.1.2
リリースの同日に 1.2.0
が出たりとバタバタしており、いきなり動かくなるリスクは最小限にしたいのでこのブログでは固定にしておきます (でも bug fix での update が多いので常に最新にしておきたいところ)。
python-dotenv openai==1.2.3
で、v1 系からは client をインスタンス化して API にアクセスする感じに変わりました。私は古いやつよりこちらの方が好みです。
import os from openai import AzureOpenAI GPT_DEPLOYMENT_NAME = "gpt-4" client = AzureOpenAI( azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), api_key=os.getenv("AZURE_OPENAI_KEY"), api_version="2023-12-01-preview" ) completion = client.chat.completions.create( model=GPT_DEPLOYMENT_NAME, messages=[ {"role": "system", "content": "あなたは博多弁のチャットボットです"}, {"role": "user", "content": "こんにちは"} ] ) print(completion.choices[0].message.content)
余談その1ですが、内部の実装をみると client をインスタンス化するときに deployment name を指定する方法もあったけど、先週はそこのコメントで書かれてる通りには動作しなかったので今回はふれないでおきます。
ちなみに Chat Completions の API で利用できる api_version は こちら に記載がありますが、2023年12月に 2023-12-01-preview
が出ており、これを使うと json mode や seed の指定も可能となっています。
余談その2ですが API のレスポンスには model_dump_json()
ってメソッドがついてるのでレスポンスの確認はしやすくなりました。
Embeddings
Embeddings: v0.28.1 までの実装方法
v0.28.1 では numpy が必要でしたので requirements.txt はこうしておく必要がありました。
python-dotenv openai==0.28.1 numpy
で、実装方法はこんな感じ。
import openai import os openai.api_type = "azure" openai.api_key = os.getenv("AZURE_OPENAI_API_KEY") openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT") openai.api_version = "2023-05-15" ADA_DEPLOYMENT_NAME = "text-embedding-ada-002" text="こんにちは" vector = openai.Embedding.create(input=text, deployment_id=ADA_DEPLOYMENT_NAME)["data"][0]["embedding"] print(vector)
Embeddings: v1系での実装方法
v1系で明示的に numpy を入れる必要はなくなり、実装もこんな感じに。
import os from openai import AzureOpenAI ADA_DEPLOYMENT_NAME = "text-embedding-ada-002" client = AzureOpenAI( azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), api_key=os.getenv("AZURE_OPENAI_KEY"), api_version="2023-12-01-preview" ) text = "こんにちは" vector = client.embeddings.create(input=text, model=ADA_DEPLOYMENT_NAME).data[0].embedding print(vector)
ちなみに Embeddings の API で利用できる api_version は こちら に記載がありますが、こちらも今のところ 2023-05-15
のままでいっかって感じですかね。
あとは先ほども書きましたが、API のレスポンスには model_dump_json()
ってメソッドがついてるのでレスポンスの確認はしやすくなりました (embeddings の結果はあんま確認しないか...)。
response = client.embeddings.create(input=text, model=ADA_DEPLOYMENT_NAME) print(response.model_dump_json(indent=2))