【Build 2024 速報】Azure OpenAI の Assistants API v2 が公開され、ファイル検索ツール（ベクトルストア）が追加

5月21日、Microsoft Build 2024 において Azure OpenAI の Assistants API v2 が公開されました。ファイル検索および Browse ツール、強化されたデータ セキュリティ機能、改善されたコントロール、新しいモデル、リージョン サポートの拡張、さまざまな機能強化、新機能が含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/8151e0ac-8f99-7f91-3f8a-43e274e03b20.png)


## 新機能
- **ファイル検索ツールとベクトルストア**の追加(パブリック プレビュー)
- **Azure OpenAI On Your Data** 連携 *2024 年 7 月に提供予定
- **Browse ツール**（Bing Web Search） *2024 年 7 月に提供予定
- Assistant 出力の制御とコストの管理(パブリック プレビュー)
- Assistant オブジェクトと Run オブジェクトでの `pressure`、`response_format` (JSON モード)、`top_p` などの一般的なモデルパラメーターのサポート
- アシスタントのスレッド状態とファイルのカスタマーマネージド キー (CMK) サポート

## モデルサポートの拡張
- **`GPT-4o` のサポート**(パブリック プレビューは 2024 年 6 月に予定)
- Finetuned モデルのサポート(パブリック プレビュー)
- **Vision サポート**(パブリック プレビューは 2024 年 6 月に予定)
- 利用可能な地域の拡大(パブリック プレビュー): **東日本**、英国南部、インド南部、米国西部、米国西部3（→まだ反映されていないようだ）

## 拡張機能
- ストリーミングとポーリングのサポート
- スレッド内のカスタム会話履歴 (パブリック プレビュー)
- Python、JavaScript/TypeScript、.NET、Java、Go SDK のサポート(パブリック プレビュー)　.NET のサポートは 6 月に、Java/Go は 7 月に予定
- PromptFlow SDK を使用したアシスタントのトレースと評価(パブリック プレビューは 2024 年 6 月に公開予定)
- AutoGen 連携（GPTAssistantAgent）→すでに[検証済み](https://qiita.com/nohanaga/items/517d01f7c0f987d82548)
- Azure Logic Apps を利用して関数呼び出しを備えたアシスタントを構築(パブリック プレビュー)

# 注目の新機能
## ファイル検索ツールとベクトルストアの追加 (プレビュー)
Retrieval としての[ファイル検索ツール](https://learn.microsoft.com/azure/ai-services/openai/how-to/file-search?tabs=python)によって簡単に RAG 機能を実現できます。さらにドキュメントを自動的に解析してチャンク化し、Embeddings を作成して保存し、ベクトル検索とキーワード検索の両方を使用して関連コンテンツを取得してユーザーのクエリに答えます。

### ファイル検索ツールの機能
- **ユーザークエリを書き換え**て検索用に最適化
- 複雑なユーザー クエリを**複数の検索に分割**し、**並列処理**
- アシスタントとスレッド ベクトルストアの両方で**キーワード検索とセマンティック検索の両方を実行**
- 最終的な応答を生成する前に、**検索結果をリランク**して最も関連性の高いものを選択
- デフォルトでは、ファイル検索ツールは次の設定を使用
  - チャンクサイズ: 800 トークン
  - チャンクの重複: 400 トークン
  - Embeddings モデル: `text-embedding-3-large` 256 次元
  - コンテキストに追加されるチャンクの最大数: 20
- 各ベクトルストアには最大 10,000 個のファイルを保存できる
- 最大ファイルサイズは512M
  - ファイルごとに 5,000,000 トークン以下である必要がある
- ベクトルストアはアシスタントとスレッドの両方にアタッチできる
- 現在、アシスタントには最大 1 つのベクトル ストアをアタッチでき、スレッドには最大 1 つのベクトル ストアをアタッチできる

https://learn.microsoft.com/azure/ai-services/openai/how-to/file-search?tabs=python

なるほど、セマンティック検索、リランキングを使ったベクトルストアですか…🤔 Build 2024 の [Keynote](https://www.youtube.com/watch?v=8OviTSFqucI&t=2209s) では Satya が以下のように発言していますので、Assistants API のバックエンドには Azure AI Search が使われているということです。

> In Fact, ChatGPT supports for GPTs, their Assistants API are all powerd by Azure AI Search today.

https://qiita.com/nohanaga/items/b00f960ac20a4ce536a9

あと `text-embedding-3-large` を 3072 -> 256 に次元削減しても運用できる精度だったということ？

## ファイル検索を有効にする
`tools` に `{"type": "file_search"}` を追加します。

```python
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

assistant = client.beta.assistants.create(
  name="Travel Assistant",
  instructions="あなたは Contoso 社の社員の出張を支援するためのアシスタントです。あなたは以下の業務を遂行します。",
  model="gpt-4-turbo",
  tools=[{"type": "file_search"}],
)
```

## ベクトルストアの作成とファイルの追加
単一の API 呼び出しでベクトルストアを作成し、そこにファイルを追加できます。
```python
vector_store = client.beta.vector_stores.create(
  name="Travel Documentation",
  file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5']
)
```
ベクトルストアへのファイルの追加は非同期操作です。操作を確実に完了するには、公式 SDK の「作成とポーリング」ヘルパー `create_and_poll` を使用することをお勧めします。

## ベクトルストアのアタッチ
`tool_resources` パラメーターを使用して、ベクトルストアをアシスタントまたはスレッドにアタッチできます。
```python
assistant = client.beta.assistants.create(
  instructions="あなたは Contoso 社の社員の出張を支援するためのアシスタントです。あなたは以下の業務を遂行します。",
  model="gpt-4-turbo",
  tools=[{"type": "file_search"}],
  tool_resources={
    "file_search": {
      "vector_store_ids": ["vs_1"]
    }
  }
)

thread = client.beta.threads.create(
  messages=[ { "role": "user", "content": "有楽町駅近辺でイタリアンのレストランを探しています。"} ],
  tool_resources={
    "file_search": {
      "vector_store_ids": ["vs_2"]
    }
  }
)
```

## 有効期限ポリシーによるコストの管理
`vector_store` オブジェクトに関連するコストの管理を支援するために、`vector_store` オブジェクトに有効期限ポリシーのサポートが追加されました。これらのポリシーは、`vector_store` オブジェクトの作成または更新時に設定できます。デフォルトは最後にアクティブになった後 (ベクトルストアが実行の一部であった最後の時間として定義) 7 日間という有効期限ポリシーがあります。

```python
vector_store = client.beta.vector_stores.create_and_poll(
  name="Product Documentation",
  file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5'],
  expires_after={
	  "anchor": "last_active_at",
	  "days": 7
  }
)
```

後ほどさらなる検証を行います。

# 参考
https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/announcing-azure-openai-service-assistants-public-preview/ba-p/4143217

# 関連記事
### Azure OpenAI の Assistants API によるエージェント開発メモ①

https://qiita.com/nohanaga/items/fa9f5260cf85a7fddc52

### Assistants API 解説
https://www.youtube.com/watch?feature=shared&t=1299&v=tVnj-Weas5E