LoginSignup
0
0

【AWS】Azure OpenAIをAWS Lambdaで呼び出そう!

Last updated at Posted at 2024-06-24

はじめに

Azure OpenAIをAWS Lambdaから呼び出したい!

マルチクラウドっぽく、AzureのサービスをAWSから呼び出したかった。
さらに、Azure OpenAIもAWSから呼び出せたらいいですよね。
しかしながら、呼び出しまでにいろいろつまずいたのでエラーメッセージとともに対応方法を共有します。

構成

構成はこんな感じ:point_down:です。

image.png

やること

 1. Azure OpenAIを作成、モデルをデプロイする。
 2. AWS Lambdaを作成する。
 3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。
  3-1. AWS Lambdaレイヤーを作成する。
  3-2. レイヤーを追加する。
 4. AWS LambdaでAzure OpenAIを呼び出すようにする。←この記事のメイン

では、やってみましょう!

1. Azure OpenAIを作成、モデルをデプロイする。

手順は以下を参照ください。

2. AWS Lambdaを作成する。

手順は以下を参照ください。

3. AWS Lambdaレイヤーを作成、レイヤーの追加をする。

3-1. AWS Lambdaレイヤーを作成する。

AWS LambdaでOpenAIのモジュールをimportしたいため、レイヤーを作成します。

まず、AWS Lambdaレイヤーを作成します。

手っ取り早く作成するため、AWS CloudShellを使います。
AWS CloudShellを開いて以下のコマンドを実行します。

CloudShell
mkdir python
pip install -t ./python openai fastapi==0.99.0
zip -r openai.zip ./python

pip install -t ./python openai fastapi==0.99.0 コマンド

インストールしたopenaiのバージョンが1.x系であることを確認します。
0.x系の場合、手順4でエラーが出ます。エラーについては後述。
バージョンは ls -al ./python で確認できます。
image.png

また、上記コマンドを pip install -t ./python openai で実行すると手順4でエラーが出ます。エラーについては後述。

作成したopenai.zipをAWS CloudShellからダウンロードします。
AWS CloudShell右上の「アクション」>「ファイルのダウンロード」からダウンロードできます。

image.png

Lambdaの左メニューから「レイヤー」をクリックし、「レイヤーの作成」ボタンをクリックします。

image.png

ダウンロードしたopenai.zipでAWS Lambdaレイヤーを作成します。
今回は「x86_64」、「Python 3.12」でAWS Lambdaを作成します。

image.png

3-2. レイヤーを追加する。

手順2で作成したLambdaのコードタブ一番下にあるレイヤーからレイヤーを追加します。
「レイヤーの追加」ボタンをクリックします。

image.png

「カスタムレイヤー」を選択し、手順3-1で作成したレイヤーを選択します。
「追加」ボタンをクリックします。

image.png

4. AWS LambdaでAzure OpenAIを呼び出すようにする。

AWS LambdaでPythonコードを書いていきます。

Pythonコードの書き方

OpenAIのバージョンによって異なります。以下を参照ください。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/migration?tabs=python-new%2Cdalle-fix#name-changes

Lambdaをテストした時に、問題なく動作すれば :ok: です!

自分はエラーが出ました...


:x: [ERROR] APIRemovedInV1: You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0
エラーメッセージ
[ERROR] APIRemovedInV1: You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface. Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742

openaiのバージョンを1.0.0以上にする必要がありそうです。
手順3-1においてインストールしたopenaiのバージョンを確認しましょう。
もしopenaiのバージョンが0.x系の場合は、以下のコマンドを実行して再度レイヤーを作成してください。
--upgrade を追加しています。

CloudShell
pip install --upgrade -t ./python openai

:x: [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core’
エラーメッセージ
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core’

インストールしたopenaiのモジュールに「'pydantic_core._pydantic_core’」が無いようです。
既知の情報のようですので、以下のコマンドを実行して再度レイヤーを作成してください。
fastapi==0.99.0 を追加しています。

CloudShell
pip install -t ./python openai fastapi==0.99.0

:x: [ERROR] NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist.
エラーメッセージ
[ERROR] NotFoundError: Error code: 404 - {'error': {'code': 'DeploymentNotFound', 'message': 'The API deployment for this resource does not exist. If you created the deployment within the last 5 minutes, please wait a moment and try again.’}}

デプロイしているAzure OpenAIが見つからないようです。
Lambdaの中で「model」を指定している箇所があります。
そこに「gpt-35-turbo」などモデルを指定するのではなく、デプロイ名を指定します

image.png

デプロイ名はAzureのAzure OpenAI Studioの「デプロイ」画面で確認できます。

image.png


エラー対応したAWS Lambdaのコードを載せておきます。

Lambdaコード
lambda_function.py
import os
from openai import AzureOpenAI

def lambda_handler(event, context):
    client = AzureOpenAI(
        azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
        api_key = os.getenv("AZURE_OPENAI_API_KEY"),
        api_version = "2024-02-01",
    )
    completion = client.chat.completions.create(
        model = '[Azure OpenAIのデプロイ名]',
        messages=[
            {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
            {"role": "user", "content": "Who were the founders of Microsoft?"}
        ]
    )
    print(completion.model_dump_json(indent=2))
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

さいごに

  • お試しのため、Azure OpenAIやLambdaにアクセス制限をかけておりません。
  • AWS Bedrockでいろんなモデルが試せるけど、これでOpenAIのモデルも試せますね。
  • 少しでもみなさんの参考になりますように!
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0