13
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?

はじめに

部署配属後、初めて参画したプロジェクトで一番難しかった実装内容についての記録です。

この記事を読むと

  • FileUploadAPIとは/FileUploadAPIをAzure Functionsで呼ぶコード
  • Azure FunctionsをHULFT SquareのRESTコネクターで実行する方法

がわかります<(_ _)>

長いですが最後まで読んでいただけたら嬉しいです(^-^)

実装した処理の目的

トークン数に引っかかるような大容量ファイルをAOAIで分析する。
↑をHULFT Squareで実行させたい!

image.png

(AIに直接ファイルをアップロードする(置く)イメージだよ by先輩)

行ったこと

1. Blobストレージ上にあるファイルをAOAIにアップロードする関数を作る
2. この関数をAzure開発環境(クライド)にデプロイする
3. RESTコネクターを用いてHULFT Squareで実行する

の3工程!
かなり大変だったのに文字に起こすと少ない(´;ω;`)

前提知識

私はAzureってなんだ??レベルで始めたので、必要な前提知識も記録。

  • Blobストレージ:エクスプローラの様なもの

  • AOAI(=Azure OpenAI Service):Azureで使える生成AI

  • Azure Functions:

  • Assistants API:

FileUploadAPIとは

Assistants APIのひとつです。

主な概要

ローカルファイルをAzure(クラウド)にアップロードし、それをAIサービスの入力データとして使用できるようにするためのAPIのこと。ファイルが入力データになるので、トークン数に引っかかるような大容量ファイルをAIで分析することができます。

Azure Functionsへコードをデプロイする

デプロイ方法

1. 関数をローカルで実行できるか確認
2. Azure環境にデプロイ

の2工程です!

(Azure初心者の為、記録しています<(_ _)>)

作成したAzure Functionsのコード

工夫した点は、アップロードするファイル名を動的に取得できるようにしたことです✨

まずファイル名を固定値で取得する→json型の入力値で動的に取得するという風に作成しました!

function_app.py
import azure.functions as func
import logging
import requests
from azure.storage.blob import BlobServiceClient
import json


# 設定
OPENAI_API_UPLOAD_URL = "https://your-openai-service-name.openai.azure.com/openai/files?api-version=2024-05-01-preview"  
#↑URL構造:AOAIのエンドポイント/リソースパス?クエリパラメータ

# Azure Blob Storageからファイルをダウンロードする関数
def download_blob(connection_string, container_name, blob_name):
    blob_service_client = BlobServiceClient.from_connection_string(connection_string)
    blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)

    file_data = blob_client.download_blob().readall()
    print(file_data)

    return file_data

# OpenAIにファイルをアップロードする関数
def upload_to_openai(api_key,blob_name,file_data):
    headers = {
        'api-key': f'{api_key}'
    }
    files = {
        'file': (blob_name,file_data)   
    }
    # purposeの指定
    data = {
        'purpose' : 'assistants'
    }
    response = requests.post(OPENAI_API_UPLOAD_URL, headers=headers, files=files,data=data)
    return response.json()

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

@app.route(route="blob_to_aoai_fileupload", methods=[func.HttpMethod.POST])
def blob_to_aoai_fileupload(req: func.HttpRequest) -> func.HttpResponse: #トリガー
    logging.info('Python HTTP trigger function processed a request.')
  
    # name = req.params.get('name') #デフォルトのやつリクエストのbodyを取り出したい
    # if not name:
    #     try:
    #         req_body = req.get_json()
    #     except ValueError:
    #         pass
    #     else:
    #         name = req_body.get('name')

    # if name:
    #     return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    # else:
    #     return func.HttpResponse(
    #          "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
    #          status_code=200
    #     )
    
    try:
        req_body = req.get_json()
        logging.info(f'Request JSON: {req_body}')
    except ValueError as e:
        logging.error(f'Invalid JSON body: {e}')
        return func.HttpResponse(
            "Invalid JSON body",
            status_code=400
        )
    
    #JSONボディから必要な情報を取得
    connection_string = req_body.get('connection_string')
    logging.info('get connection_string successfully')
    container_name = req_body.get('container_name')
    logging.info('get container_name successfully')
    blob_name = req_body.get('blob_name')
    logging.info('get blob_name successfully')
    api_key = req_body.get('api_key')

    # Azure Blob Storageからファイルをダウンロード
    result=download_blob(connection_string, container_name, blob_name)

    logging.info("ok/download")

    # ダウンロードしたファイルをOpenAIにアップロード
    response = upload_to_openai(api_key, blob_name,result)
    logging.info(response)
    logging.info("ok/upload")
    return func.HttpResponse(
        json.dumps({
            "message": "File uploaded successfully to OpenAI.",
            "openai_response": response
        }),
        status_code=200,
        mimetype="application/json"
    )

RESTコネクターで使用するコネクションを作成する

この章は先輩の記事↓を、DataSpiderではなくHULFT SquareのRESTコネクターでやってみたという内容です。この記事とほぼ同じ内容なので、違うところだけを記述させていただきます。

グローバルリソースの作成をRESTコネクターで行う

上記の記事と違う手順は1つだけ、

1 RESTアダプタでAzure Functionsの関数を実行
c DataSpiderでの設定
 ①グローバルリソースの作成←ここ!!!

HULFT Squareでは、コネクションで作成します。
image.png

Azureで作成した関数アプリのURLを入力します↓
image.png

さらに、コネクションを使用できるようAPIクライアントを作成します。

こちらに関しては公式ドキュメントをご参照ください↓

これ以降は、先輩の記事通りです<(_ _)>

その他事前準備(RESTコネクターに必要な情報)

  • blobの接続文字列
  • blobにあるファイル名
  • ファイルがあるコンテナ名
  • AOAIのAPIキー値

をAzure環境で確認する!

作成したデザイナ画面

私が作成した、Azure Functionsを実行するスクリプトのデザイナ画面です!!

image.png

上記添付の環境変数設定のところで、blobストレージの接続文字列や、キー値(etc..)などを設定しています↓。

image.png

最後に

この経験を通して、Azure FunctionsやそれをHULFT Squareで実行する方法を実践的に学ぶことができました。

同時に、この連携が社内的に初めての試みだったこともあり、他者に伝えるための過程を残すことがとても大切だと知った実装でもあります。

たくさんの方々に大変お世話になりました<(_ _)>
ありがとうございました!!

13
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
13
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?