BEACHSIDE BLOG

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

MarkItDown を使って Excel や PDF や画像を Markdown に変換するのを試す

幅広いデータソースを Markdown に変換してくれる Microsoft の OSS: MarkItDown を試してみます。

github.com

使った感想

とりあえず最初に書いておきます。

  • すごーくシンプルなファイルに対してはシンプルな実装で読み取りできるので、いいなと。
  • 部分的にでも Azure の Document Intelligence にかわる要素があればと思ったけど、私が絡んでるお仕事での活用は現段階では精度的に厳しい。
  • なにが厳しかったかを、後述のサンプル実装で書いていきます。

MarkItDown の概要

Micrososft の OSS でいろんなデータソースを読んでマークダウンに変えてくれるライブラリ。 対象ファイルに Excel とか Word も入ってるのがうれしい。画像やオーディオもいけるようですごくよさそう。

  • PDF (.pdf)
  • PowerPoint (.pptx)
  • Word (.docx)
  • Excel (.xlsx)
  • Images (EXIF metadata, and OCR)
  • Audio (EXIF metadata, and speech transcription)
  • HTML (special handling of Wikipedia, etc.)
  • Various other text-based formats (csv, json, xml, etc.)

といってもゴリゴリに新しい要素があるってほどではなく、Python の各種ライブラリをまとめて使いやすくしたって感じに見えてます。

Python で試す準備

今回私が試すのに pip install で必要なのは以下3つ。

python-dotenv
markitdown
onepai

PDF を試す

PDF も余裕で読み込めるだろうと思っているが...。

コードの実装はシンプルでこんな感じ。

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("sample_files/sample3.pdf")
print(result.text_content)

結論からいうと、シンプルに文字が並んでる PDF しか読めない印象。

2段組の PDF

2段組みを理解できずぐちゃぐちゃに...やはり段組みは LLM/SLM の力がないと厳しかー。

図多めの PDF

文字を何とか読み取ってくれるけど、ほかのライブラリ同様に図としての構造は理解しないので厳しい。

pptx を試す

15ページ中ほとんどがシンプルに構成された文字と、1ページだけがっつり図の pptx を試してみます。 コードは PDF の時と変わらんので省略。

  • 文字列はある程度読み込めたけど、箇条書きで書かれてる文字もプレーンなテキストで出力されてるので、Markdown で出力できてないという意味で精度は低い。
  • 図 (というか pptx 内でのオブジェクト) は全然だめっぽい。まー図だからそうだよね。

Excel を試す

こちらも実装は PDF の時と変わらんので省略。 CSV くらいシンプルな表なら読めるけど、以下図のような Excel だともう壊滅する。

こんな感じ。まー Excel はいつでもつらいのだけれども。

画像の解析

  • 現時点で画像でサポートしてる拡張子は、".jpg", ".jpeg", ".png" のみ
  • 画像を読み込むには LLM が必須なので、.env のファイル作って以下の感じで構成。
AOAI_ENDPOINT=xxx
AOAI_API_KEY =xxxx
AOAI_API_VERSION=2024-10-21
AOAI_DEPLOYMENT_CHAT=xxxxx

画像の解析: とりあえず動かす

Azure OpenAI の LLM を使ってこんな感じで動かしてみる。

import os

from dotenv import load_dotenv
from markitdown import MarkItDown
from openai import AzureOpenAI

load_dotenv()

aoai_client = AzureOpenAI(
    azure_endpoint=os.environ['AOAI_ENDPOINT'],
    api_key=os.environ['AOAI_API_KEY'],
    api_version=os.environ['AOAI_API_VERSION']
)

markitdown = MarkItDown(
    mlm_client=aoai_client,
    mlm_model=os.environ["AOAI_DEPLOYMENT_CHAT"]
)

result = markitdown.convert("./sample_files/autogen.jpg")
print(result.text_content)

MarkItDown の中のテスト用に含まれてた Autogen の概要的な画像を読み込ませたが、いまいち。それはプロンプトの指定が以下のようにシンプルになっていたせいかなぁ。

MLM Prompt:
Write a detailed caption for this image.

画像の解析: プロンプトをカスタマイズする

プロンプトはカスタマイズできるかなと思ってソースをみたらあったので変えてみる。

以下のように convert() の引数に mlm_prompt を追加すれば OK。「画像に書かれている内容を OCR のようにすべて読み込んでください」と指示してみる。

result = markitdown.convert(
    "./sample_files/autogen.jpg",
    mlm_prompt="画像に書かれている内容の markdown で構造化して出力して"
)

え...だめなんだ。。。
じゃー次はprompt を「画像に書かれている内容の markdown で構造化して出力して」にしてもう一度実行してみると、それっぽくでた。 これだと、GPT-4o とかに普通になげるので十分ではという印象だけど、音声とか

さいごに

  • 私が絡んでるお仕事のデータソース、古の時代から錬成された Excel や Word や PDF ですら単純なフォーマットのものはほとんどないので現時点では厳しい。

Cosmos DB for NoSQL の Vector Search 関連の機能アップデートまとめ

今週 (2024-11-18週) に開催中の Microsoft Ignite 2024 で、Cosmos DB for NoSQL の Vector search に関わる機能について以下の発表がありました。

  • Cosmos DB for NoSQL の Vector Search 機能と DiskANN Vector Index 機能が GA
  • Full Text Search (BM25) の Public Preview
  • Hybrid Search (RRF) が Public Preview

来年も推していく機能なので、今回の発表の内容をまとめておきます。

Cosmos DB for NoSQL の Vector Search 機能と DiskANN Vector Index 機能が GA

2024年5月に Preview として発表され、それ以来推しとして利用してきた機能が GA しました。Azure 界隈で Vector Search といえば AI Search だった文化を一蹴して、Production 環境でも心置きなく利用していけます。

また、GA に合わせて以下が発表されました。

  • パフォーマンスの改善:
    • 検索の待ち時間の改善
    • 精度を向上させるための新しい最適化の実装を追加
  • Public Preview 中に制限されていた機能が利用可能に。
    • ※ 11/21時点で試したらまだ利用できなかったで、利用できるようになるのはもう少し先かも
    • バックアップはレガシーな Periodic のみでしたが、Continuous も利用可能に。
    • 以前利用できなかった Customer managed Key の利用が可能に。
    • Fablic へのミラーリングが利用可能に
  • Vector index のパラメーター追加:
    • quantizationByteSize (Quantized Flat と DiskANN): Vector を量子化する際のバイト数を設定可能。値を大きくすると RU もレイテンシーも上がるが精度が高くなる。
    • indexingSearchListSize (DiskANN のみ): インデックス構築時に、近傍のデータポイントをいくつにするか設定可能に。値を大きくするとベクトル構築の時間が長くなるが精度が高くなる。デフォルトはシステムが動的に決定、1-512 で設定可能。
  • Vector search 時のパラメーター追加:
    • vector search 実行時検索リストのサイズを指定可能に。数値を大きくするとRU を消費 + 待ち時間が長くなるが、精度は向上する可能性あり。Default は 5、1-100 で設定可能。

フルテキスト検索が Public Preview で登場

※ こちらも11月21日時点で試したらまだ利用できなかったで、利用できるようになるのはもう少し先かもですね。

まずはフルテキスト検索の概要はこんな感じ。

  • ステミング、ストップワードの除去、トークン化などの機能ももちろんついている。
    • インデックスを作るときに language の指定はできそうだが言語アナライザーは MS のやつ使ってるのかしら?
  • BM25 では、用語の出現頻度、逆文書頻度、ドキュメントの長さなどの要因を考慮してドキュメントのスコア付けとランク付けをしている。

また、フルテキストについて

  • 初期プレビューでは、英語のみ対応
  • フルテキスト検索をサポートする新しい関数が追加:
    • FullTextContains: キーワードや用語を含むドキュメントを見つけるのに利用。
    • FullTextContainsAll: 指定されたキーワードと用語をすべてを含むドキュメントを見つけるのに利用。
    • FullTextContansAny: 指定されたキーワードと用語のいずれかを含むドキュメントを見つけるのに利用。
    • FullTextScore: キーワードの頻度とその他のドキュメント要素に基づいて、BM25 スコア、ドキュメントの関連性を計算。
    • ORDER BY RANK: FullTextScore と一緒に使用し、最も関連性の高いスコア (BM25 スコアが最も高い) から最も関連性の低いスコアまでの順序でクエリ結果を並べ替える。

使い方は こちらのドキュメント に書かれています。

ハイブリッド検索が Public Preview で登場

Vector search と Full-text search の長所を組み合わせたハイブリッド検索も利用可能に Public Preview でなりました。Full-text search が初期プレビューだと英語のみなので日本語の検証はまだ先ですかね。

  • 新しい組み込みの関数 RRF を使ってサクッと使える感じです。

おわりに

来週くらいには早く試せるようになるといいなと。

参考

Prompty 入門 - プロンプトの管理を Prompty で効率的に

2024年7月に開催された AOAI DevDay で以外にも注目度が高かった、かつあまり認知されていないように見えた Prompty の入門編をブログにしてみました。

OpenAI のエンドポイントにも対応していますが、ここでは Azure OpenAI の利用を想定して書いています。

Prompty とは

Azure OpenAI などの LLM を使うのにエンドポイントをたたく際、プログラムを書いたり Azure OpenAI Studio や Azure AI Studio のプレイグラウンドを利用するのがよくある方法です。

Prompty は、VS Code でプロンプト単位でファイルとして管理するもので、そのままエンドポイントにアクセスできます。 そのため、プロンプトを試すのが気軽であり、保存もしやすいです。そしてプログラムからの呼び出しも可能なので、プロンプトの管理をコードとして管理できるようになるのがメリットです。

ちなみに公式のドキュメントがあるのですが、GitHub に repo が公開されて以来 2024年8月時点までずーっと Coming soon のままです🥲

準備

Prompty を利用するには、以下の2つの準備が必要です。

  • VS Code の拡張をインストール
  • Azure OpenAI のリソースを作成

VS Code の拡張をインストール

VS Code の Extensions (①) で検索に「prompty」と入力 (②) すると、"Prompty" が出てきます (③) のでインストールします。これで完了。

Azure OpenAI のリソース

Azure OpenAI のリソース作成の操作はここでは触れませんが、Azure Portal や Azure AI Studio から作っておきましょう。

Prompty のはじめ方

prompty のファイルを作って、LLM にアクセスするための構成をすればすぐに実行できます。

Prompty ファイルを作る

まずは prompty とか適当なフォルダを作ってそこを VS Code で起動しましょう。

そして VS Code の Explorer の適当な空欄のところで右クリックすると、"New Prompty" というメニューが出てきますのでそれをクリックします。

出てこない場合は前述の拡張がインストールされていない可能性があるので確認しましょう。

これで "basic.prompty" という、拡張子が prompty のファイルが作られます。

ファイル構成をざっくり解説

このブログを書いてる時点だと、basic.prompty の中身は以下です。

---
name: ExamplePrompt
description: A prompt that uses context to ground an incoming question
authors:
  - Seth Juarez
model:
  api: chat
  configuration:
    type: azure_openai
    azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT}
    azure_deployment: <your-deployment>
  parameters:
    max_tokens: 3000
sample:
  firstName: Seth
  context: >
    The Alpine Explorer Tent boasts a detachable divider for privacy, 
    numerous mesh windows and adjustable vents for ventilation, and 
    a waterproof design. It even has a built-in gear loft for storing 
    your outdoor essentials. In short, it's a blend of privacy, comfort, 
    and convenience, making it your second home in the heart of nature!
  question: What can you tell me about your tents?
---

system:
You are an AI assistant who helps people find information. As the assistant, 
you answer questions briefly, succinctly, and in a personable manner using 
markdown and even add some personal flair with appropriate emojis.

# Customer
You are helping {{firstName}} to find answers to their questions.
Use their name to address them in your responses.

# Context
Use the following context to provide a more personalized response to {{firstName}}:
{{context}}

user:
{{question}}

ファイルの構成は、ヘッダー (--- でくくられたセクション)、system:user: の3つのセクションに分かれていると思ってください。

ヘッダー (--- でくくられたセクション) - (1-23行目):

  • model > configuration で Azure OpenAI への接続に関する情報をセットします。
    • API Key で認証する場合は api_key を追加して値を書きます。認証関連はまた後述します。
    • paramameters で LLM にアクセスする際の parameters (例えば temperature: 0 とか) を構成できます。
  • sample 内で、システムメッセージに埋め込む変数を定義できます。RAG としてシステムメッセージに埋め込みたい値を定義する感じです。
  • name/description/authors は LLM でアクセスする際には使われないですが、なんのプロンプトかわかるように書いておくとよいです。

system:

  • システムメッセージを定義します。前述 --- の中で定義した sample 配下の変数を埋め込むには {{}} で可能です。

user:

  • ユーザーメッセージ、ようはユーザーからの質問を定義します。これも前述 ---sample 配下の変数を埋め込むこともできるし、直接記載しても問題ないです。

認証と Prompty の実行

あとは Azure OpenAI と接続するための endpoint や API key などの情報をセットすればすぐに使えます。その情報を定義するのは「.env ファイル」「VS Code の Settings 」を使う2パターン、そしてプラスアルファの推奨設定として API Key は使わず Managed Identity を使う方法がります。

env ファイルで構成

まずは .env ファイルに書く方法からです。

basic.prompty と同じ階層に .env というファイルを作り以下のように書きましょう。値は自身の Azure OpenAI の正しい値をセットします。

AOAI_ENDPOINT=https://xxxxx.openai.azure.com
AOAI_API_KEY=xxxxxxx
AOAI_DEPLOYMENT_NAME=gpt-4o
AOAI_API_VERSION=2024-06-01

あとは、prompty のファイルで model のセクションを以下のように構成します。

model:
  api: chat
  configuration:
    type: azure_openai
    azure_endpoint: ${env:AOAI_ENDPOINT}
    azure_deployment: ${env:AOAI_DEPLOYMENT_NAME}
    api_version: ${env:AOAI_API_VERSION}
    api_key: ${env:AOAI_API_KEY}
※ 以下略

basic.prompty 全体は以下のように構成しました。system message とか書き換えてます。

---
name: ExamplePrompt
description: 関西弁アシスタント
authors:
  - BEACHSIDE
model:
  api: chat
  configuration:
    type: azure_openai
    azure_endpoint: ${env:AOAI_ENDPOINT}
    azure_deployment: ${env:AOAI_DEPLOYMENT_NAME}
    api_version: ${env:AOAI_API_VERSION}
    api_key: ${env:AOAI_API_KEY}
  parameters: 
    max_tokens: 500
    temperature: 1.0
sample:
  firstName: BEACHSIDE
  context: >
    パワーパフガールズは2024年に K-POP アイドルの NewJeans とコラボして話題となりました。
    パワーパフガールズのキャラクターの特徴は以下です。
    ブロッサム: 頭がよくて、正義感が強い、優等生タイプ。 3人の中では、お姉さん的な存在!!作戦を立てるのは、おもにブロッサムの役目で、彼女の指示で、3人は一致団結して、悪に立ち向かう! 長い髪が自慢のおしゃれさん。「氷の息」はブロッサムだけのスーパーパワー!!
    バブルス: かわいいものが大好きな、キュートな声の女の子。ちょっぴり赤ちゃんぽい甘えん坊で、泣き虫だけど、怒らせるとプッツンしちゃって、とっても怖い。パンチのパワーは天下一品。動物が大好きで話すこともできます。お絵かきも大好き!!
    バターカップ: 一番のおてんばで、かわいいとか、か弱いなんて大嫌い。ガンコさと口の悪さは、折り紙つき。その上、口よりも先に手がでちゃうという、ストレートな行動を取るので、困ったものです。目からの光線は破壊力ばつぐん! パワーのもとはお気に入りの毛布!?
  question: すぐに泣くのは誰ですか
---

system:
あなたは関西弁で会話をする AI アシスタントです。
マークダウンを使用して質問に簡潔かつ親しみやすい方法で答え、適切な絵文字で個人的な趣向を加えることもできます。
あなたは {{firstName}} が質問の答えを見つけるのを手伝っています。回答では相手の名前を使って呼びかけてください。

# Context
{{firstName}} に対してよりパーソナライズされた応答を提供するために、次のコンテキストを使用してください。

{{context}}

user:
{{question}}

これで、VS Code の右上にある実行ボタンをクリック (またはコマンドパレットで Prompty: Run) すると、OUTPUT が返ってきます。

簡単に LLM をコールすることができ、試したプロンプトを保存しておくこともできるので、Azure OpenAI Studio とか開くのめんどいと思っている私は、基本的にこっちばかり使っています。

VS Code の settings で構成

さて、先ほどの実行では正常に動作しているのに右下に "Can't find model configuration: default" と出ています。これは、VS Code の Settings の中で "prompty.modelConfigurations" が登録されていないためです。

この設定をしておくと、VS Code の Settings で認証とかの情報を管理でき、.env を用意する必要がなくなります。

設定は、まず VS Code の Settings を開きます (Windows の場合 CTRL + ,、Mac の場合 Command + ,)。

検索で「prompty」と入力 (①) → Extensions の中の "Prompty" をクリック (②) → Propmty: Model Configurations の下にある "Edit in settings.json" をクリックします。

後は、prompty に必要な key と value を設定します。複数定義も可能です。例としてはこんな感じ。

ここで設定した項目は、prompty の model > configuration の中に埋め込まれます。全部設定しておけば configuration のセクションが無くても大丈夫です。オーバーライドしたい項目があればその項目だけを直接 configuration のセクションに書けば OK です。

env ファイルと VS Code の setting で構成が共存している場合で、同じ key がある場合は .env で登録されている値でオーバーライドされます。

VS Code は利用しているデバイス共通で Settings を定義しておくことができる (詳細は以下リンク) ので、この設定をしておくことで、どの PC を使っても同じ設定で使いまわせるので便利です。

基本的な使い方はこれだけなので気軽に利用できます。

Tips

私が個人的によく使うちょっとした Tips の紹介です。

詳細のログが知りたい

prompty を実行すると、下部に表示される OUTPUT で回答がいい感じに表示されるようになっています。これはデフォルトで Prompty Output が選択されているためです。

ここを下図のように Prompty Output (Verbose) に変えると、REST API のレスポンスを表示することができるので、消費したトークン数など実際のレスポンスに含まれる詳細の情報を確認することが可能です。

データファイルの利用

色々試しているうちに、sample 配下に色々と書くのが辛くなってきます。その場合、外部のファイルから読み込むことが可能です。

※ 🚧大文字のファイル名が、小文字に変換される影響でファイルが読み込めなくなるケースがありますのでご注意ください🚧 (VS Code の拡張機能のバグだったり時期次第では直ったりの可能性あるので、ファイルが読めなかったときはターミナルのログをみるとよいです)

まずは、prompty と同じ階層に sample-data.json というファイルを作り、中身は以下とします。

{
  "firstName": "ATSUSHI",
  "context": "パワーパフガールズは2024年に K-POP アイドルの NewJeans とコラボして話題となりました。\nパワーパフガールズのキャラクターの特徴は以下です。\nブロッサム: 頭がよくて、正義感が強い、優等生タイプ。 3人の中では、お姉さん的な存在!!作戦を立てるのは、おもにブロッサムの役目で、彼女の指示で、3人は一致団結して、悪に立ち向かう! 長い髪が自慢のおしゃれさん。「氷の息」はブロッサムだけのスーパーパワー!!\nバブルス: かわいいものが大好きな、キュートな声の女の子。ちょっぴり赤ちゃんぽい甘えん坊で、泣き虫だけど、怒らせるとプッツンしちゃって、とっても怖い。パンチのパワーは天下一品。動物が大好きで話すこともできます。お絵かきも大好き!!\nバターカップ: 一番のおてんばで、かわいいとか、か弱いなんて大嫌い。ガンコさと口の悪さは、折り紙つき。その上、口よりも先に手がでちゃうという、ストレートな行動を取るので、困ったものです。目からの光線は破壊力ばつぐん! パワーのもとはお気に入りの毛布!?",
  "question": "一番の勉強ができるのはだれですか"
}

読み込み方は2パターンありますのでそれぞれ書いていきます。

データファイルの読み方: パターン1

シンプルなパターンで、sample 配下を以下のようにします。

sample: ${file:./sample-data.json}

後は以下のように書くことで、sample-data.json の内容を使えます。

system:
あなたは関西弁で会話をする AI アシスタントです。
マークダウンを使用して質問に簡潔かつ親しみやすい方法で答え、適切な絵文字で個人的な趣向を加えることもできます。
あなたは {{firstName}} が質問の答えを見つけるのを手伝っています。回答では相手の名前を使って呼びかけてください。

# Context
{{firstName}} に対してよりパーソナライズされた応答を提供するために、次のコンテキストを使用してください。

{{context}}

user:
{{question}}

データファイルの読み方: パターン2

この書き方は、ファイルからのデータを読み込む + 直接 prompty に書くのを併用したい場合に使えます。

sample 配下を以下のようにします。

sample:
  data: ${file:./sample-data.json}
  question: 最近コラボしたアイドルは

こう定義すると、ファイルの中は {{data.xxx}} で呼び出し、prompty に直接書いた question は通常通り {{question}} で呼び出します。

system:
あなたは関西弁で会話をする AI アシスタントです。
マークダウンを使用して質問に簡潔かつ親しみやすい方法で答え、適切な絵文字で個人的な趣向を加えることもできます。
あなたは {{data.firstName}} が質問の答えを見つけるのを手伝っています。回答では相手の名前を使って呼びかけてください。

# Context
{{data.firstName}} に対してよりパーソナライズされた応答を提供するために、次のコンテキストを使用してください。

{{data.context}}

user:
{{question}}

細かい設定をするには

基本的にプログラムでできることはほとんど prompty のファイルでも設定ができます。

細かい設定を構成したい場合は、以下リンクに prompty で構成できる定義が書かれているので必要に応じて見るとだいたいできます。

以下のリンクか、以下のリンクからたどれる GitHub の repo の yaml を直接見るかって感じですね。

https://prompty.ai/docs/prompty-file-spec

Managed Identity による認証

Prompty の README とかにも書かれてますが、Managed Identity (日本語だと「マネージド ID」って訳されていたり、「Microsoft Entra ID 認証」と書かれていることあり) の設定を構成しておくことで API key を書く必要がなくなるのでおすすめされています。

IAM に Cognitive Services OpenAI User または Cognitive Services OpenAI Contributor を付与すれば OK ですがリソースによって若干異なります。

  • Azure OpenAI のリソースの場合はそのリソースの IAM で権限を付与
  • AI Hub 系のリソース (Azure AI Studio でも使えるリソース) の場合は AI Hub に紐づく Azure AI Services の IAM に権限

全部手順書くのが長くなるなーと思ったのでここでは設定方法は記載しませんが、興味のある方はぜひ構成してみてください。

Prompt Flow で環境変数やシークレットを利用する

Prompt Flow で Python のコードを実行する際、環境変数やシークレットを利用する方法のメモです。

Connections で Custom を使って実現できます。

余談ですが、公式のドキュメントだと Connections の翻訳が「つながり」になってたり、他の単語も変な翻訳があって混乱するので Prompt Flow 関連のドキュメントや Azure Machine Learning Studio は英語で見た方が良いと個人的に感じてます。

Connections を構成する

Azure Machine Learning Studio の Prompt Flow で、"Connections" タブをクリック → "Create" ボタンをクリック → "Custom" を選びます。

Name を入力して、あとは必要な Key と value を入力していきます。シークレットは "is secret" のチェックを入れましょう。

最後に "Save" ボタンをクリックして作成完了です。

作成した Connection をみるとこんな感じ。シークレットとして登録した値は、"Show" ボタンをクリックしてみることはできるので、そこまで制約として強くないですが、Permission で見えないように制御はできるみたい。

Prompt Flow の Python 側で利用する

Flow を作って Python tool で以下のようにコードを変えます。

  • 2行目にあるように from promptflow.connections import CustomConnection を追加します。
  • 5行目のようにメソッドの型が CustomConnection の引数を追加します。
  • 6, 7 行目で書いた感じでキーを指定して値の取得が可能です。

あとは、どの custom connection を利用するかですが、この Python tool の inputs から指定します。ただ、私の環境ではいつも以下図のようにコードで追加した conn が表示されないです。その場合は、一度実行してエラーにするとよいです (実行が遅いからだるいですが...)。

※ Row file mode で flow.dag.yaml に直接書くのが早そうですが、私の環境で何度か試しても2024年6月現時点では Flow を実行すると値が空っぽになってしまいます💦

実行して一度エラーになると、以下図のように Inputs でメソッドの2つ目の引数が指定できるようになります。値は利用可能な Connections が選択可能となっています。

ようやく設定ができましたのでこれで実行すると、こんな感じで正しく取得できてることが確認できます。

Azure Cosmos DB (NoSQL) の機能を整理 - 2024年5月編

Azure Portal で Cosmos DB のリソースを開いたときに表示される Features (機能) の一覧をみたら、いつのまに結構増えてるし 2024年5月時点だと1年くらい preview のままのも多い気がするので改めて整理しようと思いました。

※ ブログのタイトルにある "機能" は、Azure portal 内の Cosmos DB の中のメニューのことです。

Vector Search for NoSQL API (preview)

2024年5月に発表の NoSQL API でも Vector sotre として利用できる機能。

これは別途まとめてる途中なのでドキュメントのリンクだけ。

Per Region and Per Partition Autoscale (preview)

  • 2023年11月ごろ発表の機能。2023年11月15日以降で作成した Cosmos DB アカウントでのみ利用可能だが、既存のアカウントに対しても段階的に利用可能になる予定。

概要:

  • 以前までは、たとえばマルチリージョンアカウントの Cosmos DB では、最も利用頻度の高いリージョンに基づいてすべてのリージョンでスケールされていたためコストが割高になっていた。
  • この機能の導入で、リージョンごと、パーティションごとにスケールできるようになり、コストが効率的になった。
  • 具体的なユースケースによるコスト (RUの計算) がどうなるかは、以下のドキュメントで例が示されてるのでみるとわかりやすいです。

ドキュメント:

Priority based execution (preview)

2023年5月ごろ発表の機能。

概要:

  • RU の上限を超えるリクエストが発生したときに、優先度の高いリクエストの実行を優先的に実行できる仕組み。
  • 優先度が高いリクエストが保証されるわけではなく、ベストエフォートでの実行になる。
  • 実装は、.NET の SDK (v3.33.0-preview 以降)だと ItemRequestOptions のプロパティPriorityLevel = PriorityLevel.HighPriorityLevel.Low を設定する感じ。
    • PriorityLevel のデフォルト値が PriorityLevel.High なので既存のコードに Htigh だけのコードを追加しても意味ないのは注意。

ドキュメント:

Burst Capacity

概要:

  • 各物理パーティションごとで最大5分のアイドルされてると RU を貯めることができ、Max 3000RU/秒で消費できる。基本的に有効化しておいて損がない機能。
  • 機能を有効化したときの具体的なイメージはこんな感じ。
    • 1000 RU の DB で、5分 (=300秒) 間完全にアイドル状態だったら、1000 RU x 300 秒 で 300000 RU 蓄積の状態になる。
    • その直後に大量のトラフィックが来た場合以前なら MAX 1000RU/秒 の性能しか出せないが、Burst Capacity により 3000 RU x 100秒間リクエストをさばくことができる。
  • 3,000 RU/秒未満の物理パーティションを持つ Cosmos DB account が対象という条件はあり。

ドキュメント:

Partition merge (preview)

2024年1月の機能。

概要:

  • SQL Server だと運用してる間にインデックスが断片化してきて再構築や再編成をすることでパフォーマンス改善をしますが、Cosmos DB の Partition merge 機能は似たような位置づけで container に使われいる物理パーティションを再調整して減らすことで RU の効率化に繋げる機能。
  • ドキュメントには、patition merge すべき container を識別するためのメトリクスの見方も書いてるので、長く運用してる Cosmos があるなら見てみるとよいかもですね。

ドキュメント:

この機能と全然関係ないけど、今年 Partition Key を変更できるようになったのも地味にあついですね。

Materialized Views for NoSQL API (preview)

一年前の2023年5月の Build で出た機能だっけ...

概要:

  • 以前は、1つの container のデータをもとに Materialized View として別の container にデータを入れたい場合、Change Feed とか使って自分で処理を実装していた。
  • この機能の登場で、設定だけで Materialized View を構成できる。自身で実装してた時に既存の RU の削減とか cross partition query の軽減などの恩恵が得れる。
  • まだ結構制限も多いので、細かいことしたいなら自分で実装するしかないケースも少なくない印象。

ドキュメント:

Diagnostics full-text query

これはずっと昔からある機能。常に有効だとコストが増えるので多少の注意は必要。

ドキュメント:

Azure OpenAI 関連: Microsoft Build 2024 の更新情報

Microsoft Build 2024 の自分用のメモです。

Azure OpenAI 関連の更新情報で気になった内容の一部をさっとまとめました。
ブログに公開するつもりがなかったので雑なメモ程度に書いてたやつです。
まだドキュメントをさらっとみた段階で実際さわってはないので、認識間違いはあるかもってのは注意です。

Azure OpenAI 関連

Exploring the New Frontier of AI: OpenAI's GPT-4-o For Indic Languages のまとめ

前提知識として、GPT-4o は 2024-5-13 導入のモデルで入力はテキスト・ビデオなど、出力はテキスト・オーディオ・画像などに対応。その特徴の紹介。

o200k_base という新しい tokenizer を導入:

  • Tokenization (トークン化) は、テキストをトークンとよばれる小さな単位に分割する自然言語処理における重要なプロセス。
  • tokenizer の設計に応じてテキストは単語、サブワード、または文字になる場合がある。
  • o200k_base は以前のバージョンより高速かつ効率的。

Features and Capabilities:

  • Multimodal Inputs and Outputs: 人間と様々なフォーカットでやり取りを反映できる、複雑なタスクを実行できる「Omni」モデルという意味からネーミングされたよう。
  • Improved Token Generation Speed: トークンの生成速度が以前の2倍と言われている。試したけどもっと早いかもって体感。
  • Cost-Effectiveness: 価格は以前の GPT-4の半額。tokenizer によるトークン数の削減も考慮するとコストはそれプラスαくらい効率的になった。
  • Enhanced Vision Capabilities: 画像認識の精度が向上。
  • デプロイに関しては、今まで通りの特定のリージョンにデプロイする "standard" と、新たに "global standard" ができた。
    • global standard だと、トラフィックをいい感じルーティングしてくれる。その分 quata limit も大きい。現状使えるのは US。デプロイすると US の一部リージョンに分散される。
    • global-standard と以前の他のタイプの特性の比較表はこちら
    • global standard と standard それぞれの rate limit の違いはこちら
      • rate limit で記載の "enterprise cusomer" は EA 契約の customer のよう (←こちらより)
    • 現時点 (今だと US のみ) の使えるリージョンに関する情報はこちら

Announcing the General Availability of GPT-4 Turbo with Vision on Azure OpenAI Service

  • こちらはマルチモーダルの GPT-4-turbo-2024-04-09 の話。このモデルの登場で古い3つのモデル (gpt-4-1106-preview / @gpt-4-0125-preview/gpt-4-vision-preview`) は全て 2024-04-09 を使えば OK って話。
    • 古い3つのモデルでモデルばーしょんを「自動更新」にしていると、6/10以降で 2024-04-09 に随時アップデートされる。
  • ただ、GPT-4o の登場で性能的にも価格的にも GPT-4o を利用するだけでよさそう。
  • 今後数週間で、入力に画像が含まれる推論リクエストに JSON mode と Function calling がリリース予定。
  • GPT-4 Vision Enhancements (Document Intelligence とインテグレーションする機能) は非対応に。

Announcing Fine Tuning for GPT-4, AI Studio Support, and API improvements with Azure OpenAI Service

  • GPT-4 の Fine-tuning が public preveiw に。
  • Fine-tuning された後のモデルを評価するされた機能も。
    • Responsible AI 的に有害となるリスクと評価された場合デプロイ不可なので、再トレーニングが必要に。
    • トレーニングデータも有害コンテンツじゃないかを評価できる。

Announcing New Capabilities for Azure OpenAI On Your Data

Azure AI Studio/Azure OpenAI Studio の機能 "Azure OpenAI On Your Data" の機能追加の話。近日公開の機能やプレビュー機能も一色単に書いてますで詳細はドキュメントを要確認。

  • Microsoft Defender for Cloud との統合が可能に。
  • Managed Identity での接続が可能に。
  • Teams アプリにシームレスにデプロイ可能に。
  • 選択できるデータソースが増加。AI Search, Cosmos DB の MongoDB vCore, Web アドレス、ローカルファイルに加えて Pinecone と Elasticsearch が追加
  • Customizable parameters の設定が可能に (チャンクストラテジーや advanced output mode などを実現するための各種パラメーター)
  • GPT-4o や text-embedding-3 シリーズのサポート

Announcing key updates to Responsible AI features and content filters in Azure OpenAI Service のまとめ

改善されたコンテンツフィルターとResponsible AI 機能のリリース (の発表):

  • 新しい "Unified content filters":
    • AOAI, Azure AI Studio, Azure AI Content Safety などの様々なプロダクトに渡るコンテンツフィルターの設定プロセスが合理化。
  • DALL-E および GPT-4 Turbo Vision デプロイ用のカスタマイズ可能なコンテンツフィルターの提供が開始。
  • Asynchronous Filters が申請無しで利用可能に。
  • "Safety System Messages" の設定が可能となり、より安全な回答の生成が可能に。
    • System message ( = metaprompt, system prompt) の指示に加え、"Safety System Messages" の設定することで望ましくない危険な動作を軽減できることを目的としてる。
    • 今のところ Azure AI Studio/Azure OpenAI Studio の Chat playground の UI から試せる。
    • プログラミングからはどう指定するんだろうって疑問。以下のドキュメント見る限り現時点だと特別なプロパティで指定するわけではなさそう?
    • ドキュメントは一応こちら: Announcing Safety System Messages in Azure AI Studio and Azure OpenAI Studio

Protected Material Detection の v2.0:

  • Protected Material Detection とは
    • 既知のテキストコンテンツ (歌詞、記事、レシピなど) と一致するかを識別し、言語モデルの出力に出ないようにブロックする機能
    • 2024-5時点では英語のみ
  • 試すにはこちら:

Updated Features in Azure OpenAI Service DALL-E:

  • キャラクターや現代アートワークなど、特定の種類の既知のクリエイティブコンテンツに酷似した作品を生成することを禁止しており、これに関する機能が強化された。
    • Protected Material Detection はテキスト用で、こちらは画像用って感じかな。
    • ようは、既存のアニメなどのキャラとほとんど類似の画像の生成を禁止する機能。
    • 例として、以前ならマリオやスポンジボブなどをプロンプトに入力するとほぼ類似の画像が生成されたが、多少違うキャラが生成されるようになった。
  • テキストプロンプトを DALL-E に再解釈し、クリエイティブコンテンツカテゴリに関連付けられたキーワードやフレーズを削除することによって行われます。

"Custom Categories" という機能が追加 (される予定というアナウンス):

  • Azure AI Language を利用して、テキスト分類と生成のための自然言語を提供するサービス。
  • "Custom Categories の機能により、機密コンテンツの検出、ユーザー作成コンテンツの管理、または地域の規制の遵守など、コンテンツ フィルタリングと AI の安全性に対する特定のニーズに基づいて独自のカスタマイズされた分類子を作成できる。
  • カスタム カテゴリを使用すると、独自のカスタム コンテンツ フィルターを簡単かつ柔軟にトレーニングおよび展開できる。
  • 詳細はこちら:

Model Customization for Azure AI

顧客とパートナーシップを組んでカスタマイズしたモデルを作れますよって発表。 今までだとヘルスケアや金融ってドメインでのモデルがあったけど、それと同様に特定のドメイン特化のモデルを作れる感じの話と思ってる。

Announcing Azure OpenAI Service Assistants Public Preview Refresh

2023年公開された Assistants API は多くの場合は大規模なエンジニアリングやサードパーティライブラリの利用など多くのインテグレーションが必要だったが、今回の改善でより使いやすくなったよう。

まずは新機能の紹介。

  • File Search (Public Preview)
    • データソースに簡単に接続し vector search を有効することで、RAG を簡単に実装できる。
    • Assistant ごとに10000 ファイルをサポート (以前の500倍以上に増えた...)
    • マルチスレッド検索サポート
    • re-rank と query rewriting をサポート
    • vector store の API が備わっており、ファイルが vector store に追加されると、自動解析、chunk, embeddings してくれる。
    • File search は text-embedding-3-large で 256 次元、デフォルトの chunk size 800, overrap 400 になってる。
    • もちろん有料だが、最初の1GBは free 。
  • Bring Your Indexes to File Search (6月より public preview 予定)
    • Azure OpenAI On Your Data でも File Search に接続可能になる予定。
  • Browse (7月より public preview 予定)
    • Assistant が Bing の検索エンジンに接続して web の情報を検索できる機能。

セキュリティ関連の更新情報:

  • 入出力のトークンの制御や Assistants API で実行に使用されるトークンの最大数の制御の設定が可能に。
  • temperature, response_format (JSON mode), top_p のサポート。
  • Cross-Prompt Injection Attack (XPIA) Mitigation (Public Preview) のサポート。
    • Assisntans で利用している deployment に対して Contents filter の "追加モデル" で "間接的な攻撃に対するプロンプト シールド" を有効にすれば OK 。

その他の更新情報:

  • GPT-4o のサポート: 7月より public preview 予定
  • Fine-tuned のモデルサポート: 一部リージョンで GPT-35-turbo(0125) のモデルから。
  • Vision のサポート: モデルは gpt-4-turbo (0409) 。画像を使用して会話が可能。
  • 利用可能なリージョンの拡大: 東日本でも利用可能に...でも使えるモデルがまだしょぼい。詳細はこちら
  • Streaming と polling がサポート。
  • Assistants API の SDK のサポート (public preview)
    • Python はいつもの openai のやつ
    • JS/TS: openai/openai-node
    • .NET, Java, Go は7月ごろ
  • Prompt Flow の評価機能を使って品質と安全性の評価や比較が容易に。
  • Assistants と AutoGen を組み合わせてマルチエージェントの構築が可能に。
  • Logic Apps との integration も可能に。

Azure AI Model Inference API

  • Azure AI Studio の model catalog では Command R+ や Llama や Mixtral など様々な model が利用可能だが、これらの model の機能に一貫してアクセスできるように Azure AI Model Inference API を公開。
  • Azure AI Studio で Serverless API としてデプロイしたすべての model で Azure AI Model Inference API が既に利用可能 (今後セルフホストでデプロイされた方にも利用可能になる)。
  • Python だと LiteLLM を使って実装するよう。
  • Introducing the Azure AI Model Inference API - Microsoft Community Hub

Azure AI の model catalog 関連

Model catalog に新しい model 導入:

HuggingFace とのパートナーシップ強化で、Azure AI の model catalog へより多くの model の導入や AMD GPU の導入、HggingFace と VS Code の integration など。

AI Studio の "Model benchmarks" の機能拡張:

  • embeddings のモデルのベンチマークも取得可能に。
  • パフォーマンスのベンチマーク (スループットやレイテンシーのメトリクスなど) は、近日サポートされるようになるとのこと。

モデルデプロイ時のセキュリティ対策

モデルの評価とモニタリングの新機能

AI Studio でモデルを評価、モニタリングしてみることができる機能の紹介。評価は Prompt Flow でして結果を見れる感じかな。

Phi-3 の更新情報

設計・実装のベストプラクティス

新しいリファレンスアーキテクチャと実装ガイダンスが公開されたので、このベストプラクティスを参考にアーキテクチャを検討するのによい感じですね。

また、Azure ランディング ゾーンの概念に基づいて、Azure ランディング ゾーン Terraform モジュールも。

その他

AI Application Templates

AI application を開発するためのテンプレート機能の紹介。CI/CD やモデルの評価とかの GitHub Actions が含まれている AI Project Starter Templates や、Azure Developer CLI で AI 用の機能の追加、Prompty が含まれるみたいだが、使ってみないとイメージつかんところ。

Azure AI Models as a Service と ClearML、Arize AI、Dataloop と統合

AI Toolkit for Visual Studio Code

VS Code の拡張機能 "AI Tookit" に関する話。

  • Azure AI Studio のモデルカタログの中で、ローカル実行に適したモデルを選んで色々できるようで、今日試したら Phi-3 シリーズと mistral-7b が見れた。
  • このモデルを使ってローカル環境で試したり、Fine-Tuning もできるよう。
  • FIne-Tuning したモデルを Azure の Container Apps や AI Studio にデプロイできる。
  • モデルとプロンプトの評価もできるよう。Prompt Flow の SDK を使ってカスタムな評価もできる。
  • ローカルの NVIDIA の GPU かクラウド上の GPU リソースを使う感じ。

Azure OpenAI の Asynchronous Modified Filter (非同期変更フィルター) で Streaming のレスポンスを劇的改善する

Azure OpenAI でストリーミングのレスポンスを使うと、遅すぎて思ってたのと違うんだが...と思うことありませんか? それを解消する手段の一つが Asynchronous Modified Filter (非同期変更フィルター) です。

Asynchronous Modified Filter (非同期変更フィルター) とは

(前置き) コンテンツフィルターとは

「本家の OpenAI よりレスポンス遅いのなんで」「ストリーミングのレスポンスが本家 OpenAI の API と動きが違ってカックカク」みたいな話を聞きます。その原因として考えられるひとつが、Azure OpenAI Service の機能のひとつ「コンテンツフィルタ―」の影響です。

コンテンツフィルターは Azure OpenAI にデフォルトで備わっている機能で、敵対的なプロンプト (Adversarial Prompting) から守るためのフィルターです。

もう少しかみ砕くと、有害なコンテンツを出力させないようにしたりプロンプトインジェクションやジェイルブレイクから守るためのフィルターです。色々と設定ができますが、詳細を知りたい方は公式ドキュメントが参考になります。

Asynchronous Modified Filter (非同期変更フィルター) とは

コンテンツフィルターのデフォルトの機能だとコンテンツをバッファしてある程度たまったらフィルターします。バッファされた分の文字数がドバっとレスポンスされます。そのため streaming のレスポンスを UI で見るとすごーく微妙に感じます。

Asynchronous Modified Filter は、バッファなしですぐにコンテンツを返します。コンテンツフィルターのチェックは非同期で実行して問題があればちょっと遅れてシグナルを返します。これで本家の OpenAI に近い感じにストリーミングのレスポンスを返すことが可能になります。ずっと Azure OpenAI でデフォルトのコンテンツフィルターを使っていた場合、感動するくらいには変わります (※ 感動するかについては個人差あり)

早くなる理由を書いたのがそのままのデメリットにもなるようなトレードオフもあるので、先ほども紹介したドキュメントの中の "コンテンツストリーミング" のセクション (以下リンク) を確認しましょう。

Asynchronous Modified Filter のコンテンツフィルターをモデル (デプロイ) に適用する

ここからは Asynchronous Modified Filter の適用方法です。

以前は申請が必要だったけど

以下のリンクに「申請ページはこちら」ってところから申請が必要です。

※ 2024年5月の Microsoft Build 2024 でのアナウンスで申請不要になったっぽいです (私が既に使える状態だから、いつから申請不要で利用できるかの確認はできてないです)。

コンテンツフィルターの作成

Azure OpenAI Studio で "コンテンツフィルター" のメニューをクリック → 新規に作成するなら "カスタマイズ済みのフィルターを作成" をクリック。

コンテンツフィルター作成時に、「ストリーミングモード (省略可能) - プレビュー」で、非同期変更フィルター を選択して進めて作成すれば OK です。

モデル (デプロイ) への適用

既存のデプロイに適用するのであれば、Azure OpenAI Studio のメニュー "デプロイ" で対象のデプロイをクリックして "デプロイの編集" をクリックします。

詳細設定オプションの中で、先ほど作成したコンテンツフィルターを選んで保存すれば、あとは普通に使えます。

動作確認

動画取るのめんどかったのでここで載せませんが、通常のコンテンツフィルターでの Streaming のレスポンスを見慣れていた場合、 Asynchronous Modified Filter に変えて初めて Streaming のレスポンスを受け取った私は普通に感動しました。

※ Streaming のレスポンスが早くなると書くと語弊がありそうですが、UI でみるとスムーズに文字が流れるだけなので、トータルのレスポンスが短くなるわけではないです。軽く検証したところ数パーセント早くなる程度でしたので誤差かもくらい) 。 それでも UX は劇的に改善します (と個人的に感じています) 。

実装で気をつけたいポイント

Asynchronous Modified Filter を使ったときに限った話でもないですが、Contents Filter に引っかかったときに正しく処理するよう実装は気を付けましょう。細かい話は以下の公式ドキュメントに書かれています。

自分用に雑に streaming 時に気にすることをざっくりまとめると:

  • HTTP レスポンスステータスコード: 400 返ってきたときにはアウト (プロンプトインジェクションとかでがっつりフィルターに引っかかった場合即400が返るはず)
  • HTTP レスポンスステータスコード: 200 で返ってきたときでも "finish_reason":"content_filter" だったらアウト
    • レスポンスが id が空文字の場合、Prompt annotation message か Annotation message (Contents Filter の結果)。この時に "finish_reason":"content_filter" がくる場合がある。これ時点で streaming は止まる。
    • Streaming のレスポンスで id があるものは Completion token message (Assistant からの回答が入ってるやつ) 。この時はセーフ。

Azure OpenAI Service を監視するための第一歩 (Azure OpenAI Insights)

今回は、Azure workbooks を使って Azure OpenAI の Insights を監視する第一歩の踏み出し方って感じの話です。

監視をするには

Azure では、Azure portal からほとんどのリソースで "Metric" や "Log Analytics" を使って Insights を監視・分析することも可能です。
Azure OpenAI Service のリソースでももちろんリクエスト数やトークンの使用量などを確認したり、状況に応じてアラートをあげることが可能です。

ただ、本番環境で Azure OpenAI Service を利用することを考えると、サービスごとや顧客ごとで model をデプロイしてクオータを制御したりメトリックを監視するようになってくるようになり、慣れていないとどんなダッシュボードを作ろうか悩んだり、考え抜いたダッシュボードを作る手間が発生します。

今回のネタである Azure OpenAI Insights と名付けられた Azure workbook を構成すると、考えたり作る手間をなくして、汎用的かつカスタマイズ性に優れた監視のダッシュボードをサクッと構成できます。

ということでセットアップして、どんなメトリックがみれるかを確認していきます。

Azure OpenAI Insights の workbook をセットアップ

Azure portal で、上部検索バーで「azure workbooks」と入力して "Azure Workbooks" をクリックします。

Azure Workbooks の一覧が表示されるので、"Create" をクリックします。

Grallery が表示されるので、"New" をクリックします。

"Advanced Editor" のアイコンをクリックします。

ここで、一旦ブラウザの別タブを開き、以下の URL を開きます。

右上の方にある "Copy raw file" をクリックしてファイルの内容をコピーします。

さきほどまで開いていた Azure portal を開き、以下の操作をします。

  • Gallery Template が選択されていることを確認する (①)
  • ②の部分を一度すべて空にしてから、コピーした workbook の内容を貼り付ける
  • Apply をクリック (①)

上部の "Save" をクリックします。

Save As のウインドウが表示されるので、監視したいリソースにあった情報を入力して "Apply" をクリックすると、この workbook が保存されます。

これでセットアップは完了です。できた workbook をサクッと見ていきます。

Azure OpenAI Insights を確認する

この workbook を開いたら、まずは上部で Subscription や Azure OpenAI Service のインスタンス、Time range を絞り込むことができます。

そのすぐ下に "Overview", "Monitor", "Insights" の3つのタブがあるのでそれぞれ見ていきます。

Overview タブ

デフォルトで Overview タブが表示されます。リソースグループごとやリージョンごとの概要レベルのグラフが表示されます。ここはみたままで大した内容がないので説明は省きます。

Momitor タブ

Monitor タブを開くとそのすぐ下に、"Overview", "HTTP Requests", "Token-Based Usage" などそれぞれに特化したグラフが用意されています。

それぞれのメトリックが何を意味しているかは、UI 上で親切に説明してくれているのがいい感じです。また、以下のドキュメントでも確認可能です。

また、それぞれのグラフに "Open in Metric Explorer" のボタンがついてるので (下図の矢印)、ボタンをクリックして細かい時間軸で分析が可能です。

Insights タブ

Insights タブは Log Analytics の KQL での集計を利用するため、Azure OpenAI のリソースから diagnostic settings (診断設定) で Log Analytics への送る構成をしておく必要があります。構成方法は以下のドキュメントに書かれています。

あとは、Insights タブをクリックし、Log Analitics workspace を選択したらダッシュボードが見えます。

Insights タブ内で以下3つのタブに分かれています。

  • "Overview": HTTP Request 関連のダッシュボード
  • "By CallerIP": アクセスしてきた Client 側の IP 毎のダッシュボード
  • "All Logs": Request / Response のログ。細かい分析は Logs のアイコンをクリックして KQL でクエリして確認って感じ。

終わりに

ということで Azure OpenAI Insights のセットアップ方法とどんな感じで見れるかの話でした。

Workbook や Metric 自体がカスタマイズ性にも優れているので、ここを出発点に自分にあったダッシュボードにカスタマイズすることも容易ですね。
あとはこれを必要に応じてアラートを構成したり、Azure portal の Dashboard として構成しておけばより実用的に監視が捗ると思っています。

最後に、Azure OpenAI の監視については以下を読んでおくと基本的な知識が身に付くと思います。

Azure OpenAI の Code Interpreter を気軽に試す (2024年2月編)

Code Interpreter とは

Assistants 機能のひとつとして 2024年2月に追加されました。

  • まず Assisntants で既存にある Function calling は、自分で用意した関数のコードを、質問に応じて良しなに実行してくれる機能です。
  • それに対し Code interpreter は、ユーザーの質問に応じて Assistant が動的にコードを生成し実行して、回答を生成してくれる機能です。
    • Code interpriter の利用イメージとして、数学の問題を python のコードを生成して回答したり、データを与えることでグラフを生成してくれたりしますが、具体的な操作は後述します。
    • コードの生成や実行は Azure OpenAI 側で用意されたサンドボックス環境で実行されますので、使えるモジュールや機能に制限があります。
    • チャットで利用したコードやファイルは、他の Azure OpenAI の機能と同様に MS でサービス改善のために利用することはないのでご安心を。

Azure OpenAI での利用

2024年2月8日現在だと利用できるリージョンが少ないですので、とりあえず以下のドキュメントで使えるリージョンを確認しておきましょう。

自分でコードを実装してアプリに組み込むことが可能ですが、Azure OpenAI Studio の Playground でサクッと試すことが可能ですので、まずはここから始めるのが良いです。

Azure OpenAI Studio でのはじめ方

Azure OpenAI Studio (https://oai.azure.com) を開き、左側のメニューで Assistants (Preview) を選びます。

Code Interpreter を使うための準備

利用できないリージョンのリソースを使っていると以下の画面になります。

その場合は、使えるリージョンに Aazure OpenAI のリソースを作りましょう。2024年2月8日現在で日本からだと Australia East が近いです。

また、新しくリソースを作成したら model のデプロイも必要です。利用できる model もリージョンによって若干異なるので注意です。

model のバージョンについては料金が安くなった最新のバージョンを使いましょう。バージョンに関して詳しくは以下のブログで言及しています。

blog.beachside.dev

リソースを作成したら、Azure OpenAI Studio の右上の自分のアイコン付近をクリック → リソースの "Switch" をクリックして Assistants が利用できるリソースへ変更します。

これで、左側のメニュー "Assisntans" から Code interpreter が利用可能となります。

Code Interpreter を試す

あとは Assistants plyground で Assisntant をセットアップしていきます。下の方にある Code interpreter のトグルを ON にして、他の項目は適宜入力して "Save" をクリックすればセットアップです。

保存をすることで Assistant を永続的に保存できるため、後日 "Open" ボタンから再利用することもできるのもいいですね。

OpenAI では長らくある機能なので機能自体に新鮮味はないですが、軽くいじってみましょう。

数学の問題を試す

こんな問題を出してみました。正しい答えがでてますが、ChatGPT のように python のコードは表示されないのか。

ログを見てみましょう。Assistant playground では右側の Logs で API をコールしたログが記録されており、クリックするとその結果をみれたりするので便利です。 ということで Get run steps をクリックしてみます。

以下の json が表示されました。Code interpreter を利用していることが確認できます。

{
  "object": "list",
  "data": [
    {
      "id": "step_gGd9LbQTrZLwRgJ8SDJhlKDm",
      "object": "thread.run.step",
      "created_at": 1707380860,
      "run_id": "run_Z3JoCJAcplU0D1NyFxACrg6y",
      "assistant_id": "asst_HEdZc4jN70am9nWVVKLI03Ng",
      "thread_id": "thread_aO9R4Y831UNG4NTyZGvwMith",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1707380861,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_QvzJI3BukC4vSAl40HqJsc1m"
        }
      }
    },
    {
      "id": "step_Zq7Aou6UPd0C9dw7UGf52weJ",
      "object": "thread.run.step",
      "created_at": 1707380845,
      "run_id": "run_Z3JoCJAcplU0D1NyFxACrg6y",
      "assistant_id": "asst_HEdZc4jN70am9nWVVKLI03Ng",
      "thread_id": "thread_aO9R4Y831UNG4NTyZGvwMith",
      "type": "tool_calls",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1707380860,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "tool_calls",
        "tool_calls": [
          {
            "id": "call_6BofWwu80F1aKK9DEv09ZXSP",
            "type": "code_interpreter",
            "code_interpreter": {
              "input": "from sympy import symbols, Eq, solve\r\n\r\n# シンボル定義\r\nx, y = symbols('x y')\r\n\r\n# 方程式の設定\r\neq1 = Eq(x, 0.3*x + 5*y)\r\neq2 = Eq(100*x + 200*y, 1000)\r\n\r\n# 方程式を解く\r\nsolutions = solve((eq1, eq2), (x, y))\r\nsolutions[x]  # レンガ1個の重さを求める",
              "outputs": [
                {
                  "type": "logs",
                  "logs": "7.81250000000000"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "id": "step_e9mJVVS3GZ46549jInuhUCyH",
      "object": "thread.run.step",
      "created_at": 1707380838,
      "run_id": "run_Z3JoCJAcplU0D1NyFxACrg6y",
      "assistant_id": "asst_HEdZc4jN70am9nWVVKLI03Ng",
      "thread_id": "thread_aO9R4Y831UNG4NTyZGvwMith",
      "type": "message_creation",
      "status": "completed",
      "cancelled_at": null,
      "completed_at": 1707380845,
      "expires_at": null,
      "failed_at": null,
      "last_error": null,
      "step_details": {
        "type": "message_creation",
        "message_creation": {
          "message_id": "msg_Wbj9Ww5YDeV5l7Log50KD55j"
        }
      }
    }
  ],
  "first_id": "step_gGd9LbQTrZLwRgJ8SDJhlKDm",
  "last_id": "step_e9mJVVS3GZ46549jInuhUCyH",
  "has_more": false
}

ちなみにコードを表示してとコメントすると、表示してくれます。

他の活用例

よくありそうな例を書いておきます。

  • Assistant set up の Files に分析させたいデータをアップロードして、チャットで指示して分析させたりチャートを作らせたりすることができます。
  • 後述で詳しく書きますが実行環境に pptx や xlsx を生成するモジュールも入っていたので、パワポの資料を作ることもできるはずです (が、試したら生成はしてくれたけど何度やってもファイルが破損してて開けなかった... まぁ OpenAI の方では普通にできるので、きっとどうにかなるでしょう...)

余談: Code Interpreter の実行環境はどうなってるのか

2024年2月8時点の pip list は以下です。つまりこの中にないライブラリを使うことはできないはず。それもどうにかしたければ Code Interpreter を諦めて Open Interpreter でも使う感じですかね。

👉ここをクリックして開くと pip list が表示されます👈

Package                    Version             
-------------------------- --------------------
absl-py                    2.1.0               
affine                     2.4.0               
aiohttp                    3.8.1               
aiosignal                  1.3.1               
analytics-python           1.4.post1           
anyio                      3.7.1               
anytree                    2.8.0               
argcomplete                1.10.3              
argon2-cffi                23.1.0              
argon2-cffi-bindings       21.2.0              
arviz                      0.15.1              
asn1crypto                 1.5.1               
asttokens                  2.4.1               
async-timeout              4.0.3               
attrs                      23.2.0              
audioread                  3.0.1               
Babel                      2.14.0              
backcall                   0.2.0               
backoff                    1.10.0              
backports.zoneinfo         0.2.1               
basemap                    1.3.2               
basemap-data               1.3.2               
bcrypt                     4.1.2               
beautifulsoup4             4.8.2               
bleach                     6.1.0               
blinker                    1.7.0               
blis                       0.7.11              
bokeh                      2.4.0               
branca                     0.7.1               
Brotli                     1.1.0               
cachetools                 5.3.2               
cairocffi                  1.6.1               
CairoSVG                   2.5.2               
camelot-py                 0.10.1              
catalogue                  2.0.10              
certifi                    2019.11.28          
cffi                       1.16.0              
chardet                    4.0.0               
charset-normalizer         2.1.1               
click                      8.1.7               
click-plugins              1.1.1               
cligj                      0.7.2               
cloudpickle                3.0.0               
cmudict                    1.0.18              
comm                       0.2.1               
compressed-rtf             1.0.6               
countryinfo                0.1.2               
cryptography               3.4.8               
cssselect2                 0.7.0               
cycler                     0.12.1              
cymem                      2.0.8               
Cython                     0.29.36             
databricks-sql-connector   0.9.1               
dbus-python                1.2.16              
debugpy                    1.8.0               
decorator                  4.4.2               
defusedxml                 0.7.1               
deprecat                   2.1.1               
dill                       0.3.8               
distro-info                0.23+ubuntu1.1      
dlib                       19.22.1             
dnspython                  2.5.0               
docx2txt                   0.8                 
ebcdic                     1.1.1               
EbookLib                   0.18                
einops                     0.3.2               
email-validator            2.1.0.post1         
entrypoints                0.4                 
et-xmlfile                 1.1.0               
exceptiongroup             1.2.0               
exchange-calendars         3.4                 
executing                  2.0.1               
extract-msg                0.28.7              
Faker                      8.13.2              
fastapi                    0.95.2              
fastjsonschema             2.19.1              
fastprogress               1.0.3               
ffmpeg-python              0.2.0               
ffmpy                      0.3.1               
filelock                   3.13.1              
Fiona                      1.8.20              
flask                      3.0.2               
Flask-CacheBuster          1.0.0               
Flask-Cors                 4.0.0               
Flask-Login                0.6.3               
folium                     0.12.1              
fonttools                  4.48.1              
fpdf                       1.7.2               
frozenlist                 1.4.1               
future                     0.18.3              
fuzzywuzzy                 0.18.0              
gensim                     4.1.0               
geographiclib              1.52                
geopandas                  0.10.2              
geopy                      2.2.0               
gradio                     2.2.15              
graphviz                   0.17                
gTTS                       2.2.3               
h11                        0.14.0              
h2                         4.1.0               
h5netcdf                   1.1.0               
h5py                       3.6.0               
hpack                      4.0.0               
html5lib                   1.1                 
httpcore                   1.0.2               
httptools                  0.6.1               
httpx                      0.26.0              
hypercorn                  0.14.3              
hyperframe                 6.0.1               
idna                       2.8                 
imageio                    2.33.1              
imageio-ffmpeg             0.4.9               
IMAPClient                 2.1.0               
imgkit                     1.2.2               
importlib-metadata         7.0.1               
importlib-resources        6.1.1               
iniconfig                  2.0.0               
ipykernel                  6.29.1              
ipython                    8.12.3              
ipython-genutils           0.2.0               
isodate                    0.6.1               
itsdangerous               2.1.2               
jax                        0.2.28              
jedi                       0.19.1              
Jinja2                     3.1.3               
joblib                     1.3.2               
json5                      0.9.14              
jsonpickle                 3.0.2               
jsonschema                 4.21.1              
jsonschema-specifications  2023.12.1           
jupyter-client             7.4.9               
jupyter-core               5.1.3               
jupyter-server             1.23.5              
jupyterlab                 3.4.8               
jupyterlab-pygments        0.2.2               
jupyterlab-server          2.19.0              
keras                      2.6.0               
kerykeion                  2.1.16              
kiwisolver                 1.4.5               
korean-lunar-calendar      0.3.1               
librosa                    0.8.1               
llvmlite                   0.41.1              
loguru                     0.5.3               
lxml                       5.1.0               
markdown2                  2.4.12              
markdownify                0.9.3               
MarkupSafe                 2.1.5               
matplotlib                 3.4.3               
matplotlib-inline          0.1.6               
matplotlib-venn            0.11.6              
mistune                    3.0.2               
mizani                     0.9.3               
mne                        0.23.4              
monotonic                  1.6                 
moviepy                    1.0.3               
mpmath                     1.3.0               
mtcnn                      0.1.1               
multidict                  6.0.5               
munch                      4.0.0               
murmurhash                 1.0.10              
mutagen                    1.45.1              
nashpy                     0.0.35              
nbclassic                  0.4.5               
nbclient                   0.9.0               
nbconvert                  7.15.0              
nbformat                   5.9.2               
nest-asyncio               1.6.0               
networkx                   2.6.3               
nltk                       3.6.3               
notebook                   6.5.1               
notebook-shim              0.2.3               
numba                      0.58.1              
numexpr                    2.8.6               
numpy                      1.21.2              
numpy-financial            1.0.0               
odfpy                      1.4.1               
olefile                    0.47                
opencv-python              4.5.2.54            
openpyxl                   3.0.10              
opt-einsum                 3.3.0               
orjson                     3.9.13              
oscrypto                   1.3.0               
packaging                  23.2                
pandas                     1.3.2               
pandocfilters              1.5.1               
paramiko                   3.4.0               
parso                      0.8.3               
pathlib-abc                0.1.1               
pathy                      0.11.0              
patsy                      0.5.6               
pdf2image                  1.16.3              
pdfkit                     0.6.1               
pdfminer.six               20191110            
pdfplumber                 0.5.28              
pdfrw                      0.4                 
pexpect                    4.9.0               
pickleshare                0.7.5               
Pillow                     8.3.2               
pip                        20.0.2              
pkgutil-resolve-name       1.3.10              
platformdirs               4.2.0               
plotly                     5.3.0               
plotnine                   0.10.1              
pluggy                     1.4.0               
pooch                      1.8.0               
preshed                    3.0.9               
priority                   2.0.0               
proglog                    0.1.10              
prometheus-client          0.19.0              
prompt-toolkit             3.0.43              
pronouncing                0.2.0               
psutil                     5.9.8               
ptyprocess                 0.7.0               
pure-eval                  0.2.2               
py                         1.11.0              
PyAudio                    0.2.11              
pycountry                  20.7.3              
pycparser                  2.21                
pycryptodome               3.20.0              
pycryptodomex              3.20.0              
pydantic                   1.10.2              
pydot                      1.4.2               
pydub                      0.25.1              
pydyf                      0.8.0               
pygments                   2.17.2              
PyGObject                  3.36.0              
pygraphviz                 1.7                 
PyJWT                      2.8.0               
pylog                      1.1                 
pyluach                    2.2.0               
pymc3                      3.11.5              
PyMuPDF                    1.19.6              
PyNaCl                     1.5.0               
pyOpenSSL                  21.0.0              
pypandoc                   1.6.3               
pyparsing                  3.1.1               
PyPDF2                     1.28.6              
pyphen                     0.14.0              
pyproj                     3.5.0               
pyprover                   0.5.6               
pyshp                      2.1.3               
pyswisseph                 2.10.3.2            
pytesseract                0.3.8               
pytest                     6.2.5               
pyth3                      0.7                 
python-apt                 2.0.1+ubuntu0.20.4.1
python-dateutil            2.8.2               
python-docx                0.8.11              
python-dotenv              1.0.1               
python-multipart           0.0.7               
python-pptx                0.6.21              
pyttsx3                    2.90                
pytz                       2024.1              
PyWavelets                 1.4.1               
pyxlsb                     1.0.8               
PyYAML                     6.0.1               
pyzbar                     0.1.8               
pyzmq                      25.1.2              
qrcode                     7.3                 
rarfile                    4.0                 
rasterio                   1.2.10              
rdflib                     6.0.0               
referencing                0.33.0              
regex                      2023.12.25          
reportlab                  3.6.1               
requests                   2.31.0              
requests-unixsocket        0.2.0               
resampy                    0.4.2               
rpds-py                    0.17.1              
scikit-image               0.18.3              
scikit-learn               1.0                 
scipy                      1.7.1               
seaborn                    0.11.2              
semver                     3.0.2               
Send2Trash                 1.8.2               
sentencepiece              0.1.99              
setuptools                 45.2.0              
shap                       0.39.0              
Shapely                    1.7.1               
six                        1.14.0              
slicer                     0.0.7               
smart-open                 6.4.0               
sniffio                    1.3.0               
snowflake-connector-python 2.7.12              
snuggs                     1.4.7               
sortedcontainers           2.4.0               
SoundFile                  0.10.2              
soupsieve                  2.5                 
spacy                      3.1.6               
spacy-legacy               3.0.12              
SpeechRecognition          3.8.1               
srsly                      2.4.8               
stack-data                 0.6.3               
starlette                  0.27.0              
statsmodels                0.13.1              
svglib                     1.1.0               
svgwrite                   1.4.1               
sympy                      1.8                 
tables                     3.6.1               
tabula                     1.0.5               
tabulate                   0.8.9               
tenacity                   8.2.3               
terminado                  0.18.0              
text-unidecode             1.3                 
textblob                   0.15.3              
textract                   1.6.4               
Theano-PyMC                1.1.2               
thinc                      8.0.17              
threadpoolctl              3.2.0               
thrift                     0.16.0              
tifffile                   2023.7.10           
tinycss2                   1.2.1               
toml                       0.10.2              
tomli                      2.0.1               
toolz                      0.12.1              
torch                      1.10.0              
torchaudio                 0.10.0              
torchtext                  0.6.0               
torchvision                0.11.1              
tornado                    6.4                 
tqdm                       4.64.0              
traitlets                  5.14.1              
trimesh                    3.9.29              
typer                      0.4.2               
typing-extensions          4.5.0               
tzlocal                    5.2                 
ujson                      5.9.0               
unattended-upgrades        0.1                 
urllib3                    1.25.8              
uvicorn                    0.27.0.post1        
uvloop                     0.19.0              
Wand                       0.6.13              
wasabi                     0.10.1              
watchfiles                 0.21.0              
wcwidth                    0.2.13              
weasyprint                 53.3                
webencodings               0.5.1               
websocket-client           1.7.0               
websockets                 10.3                
werkzeug                   3.0.1               
wheel                      0.34.2              
wordcloud                  1.8.1               
wrapt                      1.16.0              
wsproto                    1.2.0               
xarray                     2023.1.0            
xarray-einstats            0.5.1               
xgboost                    1.4.2               
xlrd                       1.2.0               
XlsxWriter                 3.1.9               
xml-python                 0.4.3               
yarl                       1.9.4               
zipp                       3.17.0              
zopfli                     0.2.3               

参考

.NET8 での Azure Functions の開発を始めるための準備 ( C# )

Azure Functions 開発入門として、.NET のバージョンが更新する度に Visula Studio 2022 での恒例の作業のなった Azure Functions のツールセットの更新の方法の話です。

Azure Functions に新しい .NET のバージョンが選べない?!

更新前の状態で Visual Studio 2022 を起動して Azure Functions のプロジェクトを作ろうとすると、.NET8 がない状態とします (去年スクショだけとっておいてよかった←ブログ書くの放置してた💦) 。

新しいバージョンないやん!と困ったときに、Azure Functions のツールセットの更新をすることで解決できる可能性は大です。

Azure Functions でツールセットの更新

Visual Studio 2022 が開いてない状態であれば "コードなしで続行" して起動し、上部のメニューで、"ツール" → "オプション" をクリックします。

"プロジェクトおよびソリューション" の中の "Azure Functions" → "更新の確認" → "ダウンロードしてインストール" をクリックします。画面上ダウンロードしてる雰囲気が出てないですが、 "ダウンロードしてインストール" のボタンが消えると更新完了です。

これで最新の状態なります。プロジェクトを作成すると、今回だと .NET 8 (Isolated) も表示されるようになりました (in-process ではない点注意!)。

isolated は,まだまだ完成度が高いとはいえないのでで、個人的には .NET 8 では in-process が来るのを待ちます。in-process については、公式だと以下のリンクで2024年はじめにはくる予定と書かれています。

.NET on Azure Functions – August 2023 roadmap update - Microsoft Community Hub

あとは、あまり頻度が高くないですが Azure Functions のプロジェクトのテンプレートの更新が来た時も使うので、.NET のバージョンだけでなくプロジェクト作成時のテンプレートが周りの人と違うなーとか古いなーってときにも更新してみるとよいかもしれませんね。