DatabricksからAzure OpenAIとLlamaIndexを利用してみる

こちらの続きです。

https://qiita.com/taka_yayoi/items/ef62d14a4f7d4874e68c

今更ながらにAzure OpenAIサービスを使い始めてみました。

最初にサインアップが必要です。手順はこちらにまとめられています。

https://www.softbank.jp/biz/blog/cloud-technology/articles/202305/azure-openai-setup/

# エンドポイントの作成

利用できるようになるとエンドポイントを作成できるようになります。
![Screenshot 2024-01-19 at 10.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/20d62f9b-d663-9391-1925-d6da06209d37.png)

リソースグループやエンドポイント名を指定します。
![Screenshot 2024-01-19 at 10.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/635f648c-5841-b79e-4ffe-7bc2f2ea146c.png)
![Screenshot 2024-01-19 at 10.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05348db8-4574-1687-8d78-7d2d8a0ff856.png)
![Screenshot 2024-01-19 at 10.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2191b6fc-be00-fb15-31ed-098d3c8729a8.png)
![Screenshot 2024-01-19 at 10.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4423f8b9-1e40-dd7a-e98a-151a85f0369b.png)
![Screenshot 2024-01-19 at 10.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f90fac7b-b79f-0c1c-b995-aaa36dede3b3.png)

これでAPIキーとエンドポイントURLを入手できました。
![Screenshot 2024-01-19 at 10.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9ce7a261-0e5a-c35e-3dfd-29ced3d0d75e.png)

ですが、これだけでは動かなくて、モデルをデプロイして**デプロイメント**を作成する必要があります。

# デプロイメントの作成

Azure OpenAI Studioにアクセスして、以下のモデルをデプロイします。これらは後でLlamaIndexから利用します。

- LLM: gpt-35-turbo
- エンベディングモデル: text-embedding-ada-002

![Screenshot 2024-01-19 at 11.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c6ff2fd0-67bf-2702-7b8e-4320e1575a03.png)
![Screenshot 2024-01-19 at 11.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05bce0b8-2a5b-aeba-5730-60943a405459.png)

このような形でデプロイメントできました。**Deployment name**をメモしておきます。
![azure_openai_deployments.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/927efedd-2055-dfc0-f7a5-674d6bdb9e0d.png)

# LlamaIndexからAzure OpenAIを利用する

LlamaIndexはデフォルトではOpenAIを呼び出すので、そのままではAzure OpenAIを利用できません。こちらで説明されているように、`ServiceContext`の設定が必要です。[ServiceContext](https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context.html)はLlamaIndexのパイプライン、アプリケーションでインデックスを作成したり、クエリーを行う際に使用される共通リソースのバンドルです。`ServiceContext`で上記のLLMとエンベディングモデルを指定します。

https://docs.llamaindex.ai/en/stable/examples/customization/llms/AzureOpenAI.html

以下がコードサンプルです。

```py
%pip install -U llama-index
dbutils.library.restartPython()
```

## 環境変数の設定

実際に利用される際にはAPIキーなどは[シークレット](https://docs.databricks.com/ja/security/secrets/secrets.html)に格納してください。

```py
import os

os.environ["OPENAI_API_KEY"] = "<APIキー>"
os.environ[
    "AZURE_OPENAI_ENDPOINT"
] = "<エンドポイントURL>"
os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
```

## ライブラリのインポート

ドキュメントのパス`TEXT_DIR`は適宜変更してください。

```py
from llama_index import VectorStoreIndex, SimpleDirectoryReader, ServiceContext
from llama_index.llms import AzureOpenAI
from llama_index.embeddings import AzureOpenAIEmbedding

TEXT_DIR = "/Volumes/takaakiyayoi_catalog/llama_index/data/corpus"
```

## デプロイメントの参照

```py
# Azure AI Studioのデプロイメントを指定
llm = AzureOpenAI(
  deployment_name="gpt-35", temperature=0.0
)

embed_model = AzureOpenAIEmbedding(
  deployment_name="embedding-ada" 
)
```

LLMの動作確認をしておきます。

```py
response = llm.complete("The sky is a beautiful blue and")
print(response)
```

> the sun is shining brightly. Fluffy white clouds float lazily across the sky, creating a picturesque scene. The vibrant blue color of the sky brings a sense of calm and tranquility. It is a perfect day to be outside, enjoying the warmth of the sun and the gentle breeze. The sky seems to stretch endlessly, reminding us of the vastness and beauty of the world around us. It is a reminder to appreciate the simple pleasures in life and to take a moment to admire the natural wonders that surround us.

## コンテキストの設定

上のLLMとエンベディングモデルをコンテキストから参照するようにします。

```py
service_context = ServiceContext.from_defaults(
    llm=llm,
    embed_model=embed_model
)
```

## ドキュメントのロード、インデックスの作成

```py
documents = SimpleDirectoryReader("/Volumes/takaakiyayoi_catalog/llama_index/data/corpus").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context)
```

## インデックスへのクエリー

```py
# インデックスに対するクエリー
query_engine = index.as_query_engine()
response = query_engine.query("幼少期、著者は何をしましたか？")
print(response)
```

> 幼少期、著者は短編小説を書いたり、プログラミングを試みたりしました。彼はIBM 1401というコンピューターでプログラムを書いた経験もあります。また、彼は友人と一緒にヒースキットのキットでマイクロコンピューターを組み立てたりもしました。

動きました！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)