BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

openai の v1 系での Azure OpenAI へのアクセス (Python)

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 modeseed の指定も可能となっています。

余談その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))