1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure Functions でAOAIのAPIを実行する

Posted at

Azure OpenAI ServiceのAPIをFunctionsから実行する

環境とプロジェクトのひな型を用意する

前回書いたこの記事を参考に用意する

Azure OpenAI Serviceのリソース作成

Azure Portalからリソースを作成する
image.png

リソース作成後、Azure OpenAI Studioを起動する
image.png

言語モデルをデプロイするため、左のメニューからデプロイを選択し、新しいデプロイの作成を行う
image.png

使用したいモデルを選択し、デプロイ時の名前を適当に決めて作成する
image.png

ちょっと待ってから、左のメニューのチャットを選択し、
適当に何か送信し応答が返ってきたらリソースの作成は完了
image.png

必要なライブラリを追加インストールする

requirements.txtを編集する

「langchain-openai」を追加する
image.png

仮想環境をアクティベート

VSCodeのターミナルでプロジェクトの仮想環境をアクティベートする

.\.venv\Scripts\activate

image.png

ライブラリのインストールを実行

pip install -r requirements.txt 

image.png

local.settings.jsonに環境変数を追記

Valuesの要素に追記する

"AZURE_OPENAI_API_KEY":"Your Azure OpenAI Key",
"AZURE_OPENAI_ENDPOINT":"Your Azure OpenAI Endpoint",
"AZURE_OPENAI_API_VERSION":"Your Azure OpenaI API Version",
"AZURE_OPENAI_CHAT_DEPLOYMENT_NAME":"Your OpenAI Deployment NAme"

image.png

各変数に設定する値は、Azure OpenAI Studioのチャットプレイグラウンドで「コードの表示」のところから取得する
image.png

関数の本体コードを書く

HTTPのリクエストをトリガーにする関数を作る。
要求の本文で以下のようなJSONを受け取る想定にしておく

{"messagelist":[
    {"type":"system","message":"あなたは優秀なアシスタントです。日本語で回答してください"},
    {"type":"human","message":"おすすめのプログラミング言語を教えて"}
    ]
}

会話を重ねる場合は、リストに追加された状態で来るイメージ。
会話していくとテキストの量が増えるので、CosmosDBとかに突っ込んでおいて必要最低限やり取りするだけで良いかもだが、今回はテストなのでこの形式で進める

{"messagelist":[
    {"type":"system","message":"あなたは優秀なアシスタントです。日本語で回答してください"},
    {"type":"human","message":"おすすめのプログラミング言語を教えて"},
    {"type":"ai","message":"python,C#,javaの3つです"},
    {"type":"human","message":"C#の理由を簡潔に教えて"}
    ]
}

関数の中身はこんな感じにしておく

function_app.py
import azure.functions as func
import logging
import os
from langchain_core.messages import HumanMessage,SystemMessage,AIMessage
from langchain_openai import AzureChatOpenAI
#import json

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

@app.route(route="http_trigger_simple_chat")
def http_trigger_simple_chat(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    model = AzureChatOpenAI(
        openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"],
        azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"],
    )

    data = req.get_json()
    #print(data)
    message_lists = []
    for item in data['messagelist']:
        if item['type'] == 'system':
            message_lists.append(SystemMessage(content=item['message']))
        elif item['type'] == 'human':
            message_lists.append(HumanMessage(content=item['message']))
        elif item['type'] == 'ai':
            message_lists.append(AIMessage(content=item['message']))
    
    #print(message_lists)
    response = model.invoke(message_lists)
    #print(response.content)

    if response.content:
        return func.HttpResponse(response.content)
    else :
        return func.HttpResponse(
            "This HTTP triggered function executed successfully. But an unexpected error occurred with the Azure OpenAI Service API.",
            status_code=200
        )

ローカルで実行

コマンドパレットからエミュレータ起動

Azurite:Start

image.png

F5キーでプログラム実行する。実行するとrequirements.txtに書かれたライブラリのインストールが実行され、ローカルのエンドポイントが表示される。
image.png

ローカルのワークスペースから関数を実行するが、もしエラーが表示されていたら最新化する
image.png

関数を右クリックし、「Execute Function now...」を選択する
image.png

コマンドパレットの表示エリアにHTTPリクエストの要求本文を入力する。
ここでは先ほどの入力想定のJSONをコピペしてEnter
image.png

うまくいけば通知エリアに応答文が通知される
image.png

Azureにデプロイする

ワークスペースのFunctionsのアイコンから「Deploy to Function App」選択する
image.png

ここでは、前回記事でデプロイした関数を指定して上書きするが、新しくリソースを作成しても良い
image.png

うまくいけばSucceededが表示される
image.png

Azure上で環境変数を設定する

ローカル実行する際にAPI Keyなどをlocal.settings.jsonに書き込んだが、Azure上で実行する場合はポータルから環境変数を設定しておく必要がある(環境変数の呼び出す場所が違うため)
デプロイした関数の左のメニューから環境変数を開き「Add application setting」からlocal.settings.jsonで設定した項目と同じように設定を追加する。
追加後は「適応」をクリックして設定を保存する。
image.png

VSCode以外から実行してみる
コマンドプロンプト起動して下記を実行してみる。
関数URLはAzurePortal上から取得して書き換える(認証レベルをFUNCTIONにしてる場合は関数キー付きを使用する)

command
curl -X POST "https://example.com/api" -H "Content-Type: application/json" -d "{\"messagelist\":[{\"type\":\"system\",\"message\":\"あなたは優秀なアシスタントです。日本語で回答してください\"},{\"type\":\"human\",\"message\":\"おすすめのプログラミング言語を教えて\"},{\"type\":\"ai\",\"message\":\"python,C#,javaの3つです\"},{\"type\":\"human\",\"message\":\"C#の理由を簡潔に教えて\"}]}"

うまくいけば応答が返ってくるはず
image.png

おわり

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?