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

完走賞のQiitanぬいぐるみをお迎えするためにUnityでゲーム作ってみるAdvent Calendar 2023

Day 21

Azure OpenAI Service ワークショップに参加したので復習してみる(ベクター化)

Last updated at Posted at 2023-12-21

はじめに

前回、CosmosDBのChange Feedを使って、登録されたデータをリアルタイムでAI Searchのインデックスにデータ登録までをする機能を作成しました。
今回はインデックス登録にベクターの値を格納するためのフィールドを追加します。また、Azure Open AIを使って、データをベクター化してもらいます。

今回実装してみるところ

下の図の赤枠のところです。
Azure Open AIを使ってベクター化し、その結果をAI Searchのフィールドに格納します。

image.png

ベクター検索

データをベクトル形式で表現し、その類似性に基づいて検索を行う手法。
テキストや画像などの非構造化データもベクター化できる。
text-embedding-ada-002では1536次元。

環境

windows11
Visual Studio Code
Python v3.10.11
Azure Core Tools v4.0.5455(x64)

新たに必要なリソース

  • Azure Open AI (申請が必要なので注意)
    • text-embedding-ada-002モデルを作成する必要がある

(前回まで)

  • CosmosDB
  • AI Search(プランはBasic)
  • Azure Functions(ローカルに作成)

AI Searchでインデックスのフィールドを追加

フィールドの追加から、画像の内容でフィールドを追加します。
ここで、ベクター検索プロファイルを作成するため、作成ボタンを押します。

image.png

続いて、アルゴリズムの構成を作成するため、作成ボタンを押します。

image.png

デフォルトのまま保存します。

image.png

そのまま保存します。次の画面でも保存をクリックします。

image.png

保存されると以下の画像のように、フィールドが追加されます。

image.png

Functionsの実装を追加

設定値はAZURE_OPENAI_ENDPOINTとAZURE_OPENAI_API_KEYが追加されています。

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
    "COSMOS_CONNECTION": "",
    "AI_SEARCH_ENDPOINT": "",
    "AI_SEARCH_ADMIN_KEY": "",
    "AZURE_OPENAI_ENDPOINT": "",
    "AZURE_OPENAI_API_KEY": ""
  }
}

AZURE_OPENAI_ENDPOINTの値👇

image.png

AZURE_OPENAI_API_KEYの値👇

image.png

追加とコメントのある部分のソースコードが追加された部分です。

import azure.functions as func
import logging
import os

from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient

# 追加
from openai import AzureOpenAI
from typing import List

app = func.FunctionApp()

# 追加
ADA_DEPLOYMENT_NAME = "text-embedding-ada-002"

COSMOS_DATABASE_NAME = ""
COSMOS_CONTAINER_NAME = ""
AI_SEARCH_INDEX_NAME = ""

# 追加
aoai_client = AzureOpenAI(azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
                          api_key=os.getenv("AZURE_OPENAI_API_KEY"),
                          api_version="2023-05-15")

search_client = SearchClient(os.getenv("AI_SEARCH_ENDPOINT"),
                             AI_SEARCH_INDEX_NAME,
                             AzureKeyCredential(os.getenv("AI_SEARCH_ADMIN_KEY")))

@app.cosmos_db_trigger(arg_name="items",
                       connection="COSMOS_CONNECTION",
                       database_name=COSMOS_DATABASE_NAME, 
                       container_name=COSMOS_CONTAINER_NAME, 
                       create_lease_container_if_not_exists=False,
                       feed_poll_delay=5000,
                       lease_container_name="leases")
def indexer(items: func.DocumentList):
    logging.info('Python HTTP trigger function processed a request.')
    documents_to_upsert = []
    for item in items:
        
        # 追加
        # content の内容を Azure OpenAI Service にアクセスしてベクター化
        vector_content = get_vector(item["content"])

        documents_to_upsert.append({
            "id": item["id"],
            "title": item["title"],
            "category": item["category"],
            "content": item["content"],
            "contentVector": vector_content}) # 追加
        # ベクター化された値を見るためのログ
        logging.info(vector_content)

    search_client.merge_or_upload_documents(documents_to_upsert)
    logging.info(f"{len(documents_to_upsert)} document(s) uploaded")

# 追加 (ベクター化する関数)
def get_vector(text: str) -> List[float]:
    return aoai_client.embeddings.create(input=text, model=ADA_DEPLOYMENT_NAME).data[0].embedding

試す

CosmosDBからデータを登録してみます。

image.png

ベクターされた値を見るためにソースコードにログをはりました。
ログを見てみると、謎の数字がたくさん現れています。(長いので省略)

image.png

これがデータが数値のベクトルに変換された証です。

インデックスにデータもしっかり登録されています。

image.png

おわりに

ベクター検索をする準備ができました。
公式ドキュメントを見ても私の頭ではチンプンカンプンだったりしたところなので、今回のハンズオンで理解が深まりました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?