Azure AI Studioを触ってみる

# Azure AI Studioことはじめ
Azure AI StudioがGenerally Availableになりました。Buildの発表からもこれからはAIのプロジェクト向けの開発環境はこちらを使ってね感がひしひしと感じられます。

でもマイクロソフトの新しい技術にありがちで、実際の使ってる人の触ってみたレポがあまりないので、ちょうどTrainingがあったので触ってみます。

いきなりドキュメントを読むのが辛い人にはTrainingは最高のスタートですね！

## 参考リンク

https://learn.microsoft.com/ja-jp/training/paths/create-custom-copilots-ai-studio/

https://microsoftlearning.github.io/mslearn-ai-studio/

### Azure AI Studioとは
参考リンクからの抜粋。

> - AI プロジェクトを作成して管理する:Azure AI Studio では、すべての AI プロジェクトに対して一元化されたハブが提供されるため、リソースの管理、チーム メンバーとの共同作業、ワークフローの効率化を行うことができます。
> - 生成 AI アプリケーションを開発する:コンテンツを生成したり、独自のプロンプト フローを構築したりできるアプリケーションの開発が目的の場合は、Azure AI Studio の生成 AI 機能が不可欠です。
> - 使用可能な AI モデルを調べる:Azure AI Studio のモデル カタログで、OpenAI、Microsoft、Hugging Face などのさまざまな AI モデルを試します。
> - 検索拡張生成 (RAG) を活用する:取得と生成の力を組み合わせる必要があるプロジェクトの場合、Azure AI Studio の RAG 機能により、生成されたコンテンツの品質と関連性が向上します。
> - AI モデルを監視し評価する:Azure AI Studio には、プロンプト フローと AI モデルの評価と監視のための堅牢なツールが用意されており、望ましいパフォーマンス メトリックを確実に満たします。
> - Azure サービスと統合します。AI アプリケーションが他の Azure サービスとシームレスに連携する必要がある場合、Azure AI Studio は簡単に統合できるため、複雑で多面的なプロジェクト向けに多用途に使用できます。
> - 責任を持ってビルドする:Azure AI Studio では、AI の責任ある使用に重点を置いており、アプリケーションが倫理的な標準とベスト プラクティスに準拠していることを確認するためのガイダンスとツールを提供します。

最低限以下のようなものがデプロイされる。
> - コアとなる AI ハブ リソースに加え、補助的なサービスを提供するその他の Azure リソースが作成されます。 次のような方法があります。
> - ストレージ アカウント。AI プロジェクトのデータがセキュリティで保護された方法で格納されます。
> - キー コンテナー。外部リソースへのアクセスに使われる資格情報と、その他の機密性の高い値がセキュリティで保護されます。
コンテナー レジストリ。AI ソリューションで使われる Docker イメージを格納します。
> - Application Insights リソース。使用状況とパフォーマンスのメトリックを記録します。
> - アプリケーションに生成 AI モデルを提供する Azure OpenAI Service リソース。

### LLMアプリの開発ライフサイクル

https://learn.microsoft.com/ja-jp/training/modules/get-started-prompt-flow-ai-studio/2-understand-lifecycle

①目標を定義する
②サンプル データセットを収集
③基本的なプロンプトを作成する
④フローを設計する
⑤実験する
⑤評価・調整する
⑥デプロイする
⑦監視する

これらのことがAzure AI Studioから全部できるようになるらしい。

# 先に結論
個人的に触ってみた感触だとStudio自体はGAになったかもしれないが、2024年6月現在では個別の機能がまだPreviewらしく不安定さを感じる。また、個々のStudioやAzure Portalから実施するより機能が限られている。

このStudioからAI開発の全てができる、というコンセプトはわからないではないが、精度を追い求めるとカスタマイズが必要になり、そうするとGUIからだと辛い気がする。結局インデクシングの際にキーワード抽出や翻訳やいろんな前処理・エンリッチメント処理を挟む必要がある。そういう意味でRAGをどう組むかはデータ次第だけど、そのうえでLangChainのようなライブラリからRAGを使うのが良い気がする。

やっぱりファイルアップロードしただけで、はいRAGできあがりーという甘い世界ではないのだ。

ただ、トレースログが見やすかったり、Prompt FlowからRAGの評価が簡単にできたり、使ってみたいなという機能もあった。Azure AI Studioの外で個々にリソースを作って、それを後から接続することもできるらしいので、Prompt FlowのRAG Evaluationなどポイントを絞って利用するのが今の時点ではベストだと考える。


# とりあえず触ってみる
まずはAll Hubs > AIHubを作る。Azure AI Searchとの接続は後回し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/6299c566-fa82-d0bb-db34-df980b9f37ff.png)

Location Helperというのがあり、Modelを選択するとどのLocationにすればいいかがわかるようになっていた。便利だが、DallE-3tとかが載ってない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/3d8a5980-f150-f707-650e-7a03073db259.png)

最終的にこんな感じのリソースが作られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/76117bda-c7f2-f564-35db-7e7c2f85ffad.png)

Portalから見るとこんな感じ。（AI SearchやMachine Learningは後で接続した・されたもの。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/666eaf5d-84f5-86ca-32a7-d3ef4b6c9859.png)

次は何はともあれプロジェクトを作る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/5d1127b7-911a-da44-3231-cd42008242b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/70f6e6e7-9e6b-4ad2-3c8c-e3bccc0859e3.png)

DeploymentsからモデルをDeployする。この辺Azure OpenAI Studioに似てる、というかもうそのままでは。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/903ab136-0700-c8b4-c164-ca53ac9bd931.png)
もうAzure Open AI Studioはいらない子なのか？という思いがよぎる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/532f0c8f-f724-ba2c-978f-228162871a9c.png)

# Prompt Flowで各リソースを組み合わせて開発してみる
Azure AI Studioからプロンプトフローという技術でMachine Learningと組み合わせてLLMアプリ開発を行う。Machine Learning Studioの機能が合体しているぽい。（あまりMachine Learningは使ったことがないので想像です。）

## Prompt Flow
Prompt Flow＝処理パイプラインのようにとらえればいい。
Prompt Flowの種類は以下の通り。
> - 標準フロー: 一般的な LLM ベースのアプリケーション開発に最適で、多目的に使用することができるさまざまなツールを提供します。
> - チャット フロー: 会話型アプリケーション向けに設計されており、チャット関連機能のサポートが強化されています。
> - 評価フロー: パフォーマンス評価に重点を置き、以前の実行に関するフィードバックを通じて、モデルまたはアプリケーションの分析と改善をすることができます。

利用可能なツールは以下の通り。
> - LLM ツール:大規模言語モデルを使用して、カスタム プロンプトを作成することができるようにします。
> - Python ツール:カスタム Python スクリプトの実行を許可します。
> - プロンプト ツール:複雑なシナリオまたは他のツールとの統合用に、文字列としてプロンプトを用意します。
> - 独自カスタムツール

外部ツールを扱うためにはConnectionから必要なリソースを定義しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/11250d91-c3ec-c657-b122-5fe229b68201.png)

New Connectionを見るとこれらのものが接続できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9177c639-c7d8-4240-4303-f9241cff86c8.png)

裏ではコンピューティングリソースとランタイム（必要なパッケージとライブラリ）環境が自動的に起動するらしい。

## 評価
Prompt Flowの評価機能により、LLMアプリのパフォーマンスを評価できる。「LLM 予測と期待される応答または "グラウンド トゥルース" 応答を比較して正確性と関連性を測定」とある通り、よくある事前定義したQ&AとLLMアプリの応答を比較するということができる。

以下のような項目を評価できる。
> groundedness: LLM アプリケーションの出力と入力ソースまたはデータベースの一致度を測定します。
> "関連性": LLM アプリケーションの出力が与えられた入力にどの程度関連しているかを評価します。
> "一貫性": LLM アプリケーションのテキストの論理フローと読みやすさを評価します。
> "流暢性": LLM アプリケーションの出力の文法的および言語的な正確性を評価します。
> "類似性": LLM アプリケーションの出力とグラウンド トゥルースの間のコンテキストとセマンティックの一致を定量化します。

## Prompt Flowを触ってみる
ちゃんとしたレポートは以下のような素晴らしい記事を参照してください。

https://qiita.com/lazy-kz/items/5f6f8dc821d25fc484db

いろんなTemplateがあるが、まずはStandardを触ってみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/104c7543-6c85-4554-8821-07b4843b7c19.png)

例えばこんなエンティティ抽出処理を実行したい。
2つのInputとエンティティ抽出と1つの出力がある。（NERとはNatural Entity Recognitionの略らしい。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/4ea9d47d-f40e-0c43-8ece-444653b8742b.png)

Prompt FlowはGUIエディターから開発できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/f7b22639-898c-9ef2-daa6-d09dabde5e60.png)

裏ではYaml形式で書かれている。OpenAIにはエンティティタイプとしてjob-titleを抽出してと投げている。
```
id: template_standard_flow
name: Template Standard Flow
inputs:
  entity_type:
    type: string
    is_chat_input: false
  text:
    type: string
    is_chat_input: false
outputs:
  entities:
    type: string
    reference: ${cleansing.output}
nodes:
- name: NER_LLM
  type: llm
  source:
    type: code
    path: joke.jinja2
  inputs:
    deployment_name: gpt-4o
    temperature: 1
    top_p: 1
    max_tokens: 256
    entity_type: ${inputs.entity_type}
    text: ${inputs.text}
  provider: AzureOpenAI
  connection: ai-simaaihubai8261782448839798_aoai
  api: chat
  module: promptflow.tools.aoai
  use_variants: false
- name: cleansing
  type: python
  source:
    type: code
    path: echo.py
  inputs:
    entities_str: ${NER_LLM.output}
  use_variants: false
node_variants: {}
environment:
  python_requirements_txt: requirements.txt
```

実行してみるとエンティティが抽出された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/a5fddf5d-6579-67a4-d1a0-bc96d6401496.png)

裏ではVMが起動しているらしい。1時間アイドルでシャットダウンする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/d6c4af3e-8f8c-29fa-bc5c-5a2eecb71688.png)

ボタン1つでWebにEndpointをDeployもできる。これはVMが立つらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/8fd0860b-b574-4505-d871-347237ba7c3a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/061b294c-1a70-3beb-24d7-bdec63c7ea5a.png)

DeployしてEndpointを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c1b727a2-1afb-1ec5-acbd-ace6836dcd35.png)

キー認証がついている。Swagger Endpointとかもあるらしい。（キー認証があるため、普通に叩いたら拒否された。。後で開く。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/d0d3baab-825b-d84f-e1cb-ad87951d632a.png)

デプロイしたエンドポイントに対してのテスト機能とか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/fae64d1c-6a51-8cbc-c6ec-d41fabf6bd1f.png)

Endpointにリクエストを投げるためのサンプルコードとか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/bc4a149c-e2be-bf93-6209-0795283f3b4a.png)

モニタリング機能もある。下で作ったEvaluationとも連携できるぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c2070074-c7c5-953f-b7a0-336d63e0b70a.png)

ログ監視もある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9adb8454-2b62-2639-3924-d058bf3a5446.png)

でもこのDeployしたEndpointのポータルには停止ボタンがないんだけど、、起動しっぱなし？？Azure Portalを見てもVMは立っていなかった。裏でAzure側が管理しているらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/d8fba87a-5acc-bcbb-365b-51d366afa045.png)

### Prompt Flowの評価
評価フローを構築できる。テストデータが必要ぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c11a8be2-04e7-e1cf-1121-08e71ada85c1.png)

テストデータはDownload data templateからダウンロードし、超適当に作ってみた。jsonl形式？というらしい。CSVでもいいぽいけど。
```
{"question":"The nurse is looking after patients","answer":"nurse"}
{"question":"The teacher is giving students lessons","answer":"teacher"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/5aff7d93-ed88-1f1a-4da0-d89042d215ea.png)

どんな指標を計測するかをチェック。今回は単純なのでRAGはなし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9ad5ba0f-9857-ae46-e93d-fa9892ef081e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/0f1141b7-c91e-1786-2145-078caa42e5fa.png)

評価が出た。ふむふむ。なんとなくやり方は理解。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/db7e0b64-0572-9df9-aae9-db22a1e1c34a.png)

## Prompt FlowにRAGを組み込む

https://learn.microsoft.com/ja-jp/training/modules/build-copilot-ai-studio/4-build-copilot

まずはEmbedding用モデルをDeploy。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/43094ee4-3a19-705f-9b4f-4003b45e8df3.png)

Azure AI Searchを接続。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/fa868f62-1180-7ae1-0409-62c5767b9808.png)

Project > Dataから自分のデータをアップロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9323ab20-fe0c-2d59-2b09-aed659a70e95.png)

Project > IndexesからAzure AI Searchへインデックスデータを格納。Azure AI SerchのImport and VectorizeをAzure AI Studioからやっているイメージか。

https://qiita.com/smr1/items/2d13a3753d5da0bc9d78

（でもPreviewだったり、結局スキルとか使えないし、Portalからやるより機能が限られているでなんだかなーという気分になったのは否めない。OverlapとかChunkも詳細設定できないしね。こういう細かいのをやりたければプログラム書いたり、それぞれ個別のStudioやPortalを使えということなんだろうなと感じる。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/d868317b-5073-c766-cfff-e1ff5a905274.png)

インデクサーが走る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/dba5ee8c-2e9e-516f-a319-500c5f66b322.png)

インデクシング完了。て、Data Source Type見て気づいたけど、これ結局Azure AI On Your Dataそのものなのね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/463609f2-941d-d222-8edd-d5cfb6e7cf35.png)

ここでもOpenAI StudioのAdd your Dataができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/20e963bb-979f-8fc4-02bc-640399f8948a.png)

Prompt Flowで「Multi-Round Q&A on Your Data」というのを使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/08bfcca6-1cae-5a1e-d765-107bfd45cd9b.png)

さっきのStandardより複雑ぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9ee8da17-25d5-4caf-6d7e-56795c70cd96.png)

RAGができた。右上のChatから試せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/2efa7416-1dca-5e0b-c37f-fc61b1c07139.png)

# Content Filter
Responsible AI上必須のContent Filter、自分好みにカスタマイズできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/135c1af3-1c69-02d6-58ea-a13b4fce581f.png)

この辺のカテゴリ。
> ヘイト：差別や侮蔑を表す言葉。
性的：性的に露骨な表現、乱暴な表現。
暴力：暴力を描写、擁護、賛美する言葉。
自傷行為：自傷行為を描写または助長する言葉。

InputとOutputの両方をフィルタリングできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/1105cea1-5e8d-dd0d-0e71-b8bfa5e077a2.png)

と、、ここでAzure AI Studioがエラーを吐いてしまいContent Filterを作ることができなかった。やっぱりPreviewだからかまだ不安定さを感じる。

ただContent Filterって触ったことなかったなと思い、Azure OpenAI Studioからやってみることにする。なので以下はAzure AI Studioは関係ない。でもおそらく大体同じ事ができると思ってよいのではないか、多分。

Content Filterについては長くなったのでこちらにまとめました。

https://qiita.com/smr1/items/4d48f19cb722b85d6bca