LangChainでCognitive SearchのベクトルDBを構築する

# はじめに
今回はLangChainを使ってCognitive SearchにベクトルDBを構築する方法について解説していきます。前回の記事ではベクトルDBの構築方法を詳しく取り上げましたが、それはCognitive Search側がデータソースに対して定期的にスキャンを行う、いわゆるPull型の仕組みとしています。

https://qiita.com/tmiyata25/items/875f563ba7a91f3da823


一方、ユーザーに特定のドキュメントをベクトルDBに登録してもらうなどのユースケースでは、Push型（イベントドリブン）のアーキテクチャを採用することが考えられます。今回紹介するLangChainを利用したベクトルDBの構築は、このPush型の方法に基づいています。この方法は簡潔に実装できるため、PoC（概念実証）の段階での利用にも適しています。なお、Cognitive Searchの言語アナライザーは日本語をサポートしています。

※2023年8月22日時点で、Cognitive SearchのベクトルDBはプレビュー版である点をご留意ください。

## 事前準備
コードはこちらのレポジトリに置いています。

https://github.com/teshi22/llm_sample/blob/main/langchain/1_create_index_cognitive_search.ipynb

今回の記事に対応するLangChainの公式ドキュメントはこちらです。

https://python.langchain.com/docs/integrations/vectorstores/azuresearch

Pythonのバージョンは```3.10.6```で動作確認を行っています。ライブラリは下記の通りです。
```text:requirements.txt
ipykernel
python-dotenv
pypdf
langchain==0.0.268
openai==0.27.8
tiktoken==0.4.0
azure-search-documents==11.4.0b6
azure-identity==1.13.0b4
```
LangChainのバージョンは```0.0.268```です。Cognitive SearchのSDKは```azure-search-documents==11.4.0b6```のバージョンを確実に固定してください。

## ベクトルインデックスの作成
最初に環境変数を定義しておきます。
```txt:env
AZURE_OPENAI_ENDPOINT="https://<resource-name>.openai.azure.com/"
AZURE_OPENAI_API_KEY="<api-key>"
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME="<deploy-name>"

AZURE_SEARCH_ENDPOINT="https://<service-name>.search.windows.net"
AZURE_SEARCH_SERVICE_NAME="<service-name>"
AZURE_SEARCH_API_KEY_ADMIN="<api-key-admin>"
```

```python
import os
from dotenv import load_dotenv
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores.azuresearch import AzureSearch
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import PyPDFLoader
from azure.search.documents.indexes.models import (
    SearchableField,
    SearchField,
    SearchFieldDataType,
    SimpleField
)

load_dotenv()

# Azure OpenAIのエンドポイントとAPIキー
AZURE_OPENAI_ENDPOINT=os.getenv("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_API_KEY=os.getenv("AZURE_OPENAI_API_KEY")
# Embeddingモデルのデプロイ名
AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME=os.getenv("AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME")
# Azure SearchのエンドポイントとAPIキー
AZURE_SEARCH_ENDPOINT=os.getenv("AZURE_SEARCH_ENDPOINT")
AZURE_SEARCH_SERVICE_NAME=os.getenv("AZURE_SEARCH_SERVICE_NAME")
AZURE_SEARCH_API_KEY_ADMIN=os.getenv("AZURE_SEARCH_API_KEY_ADMIN")
```

次にPDFを読み込んでテキストに分割します。
```python
# PDFを読み込んで、テキストを分割する
loader = PyPDFLoader("../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf")

documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# 分割後のドキュメントを表示
for doc in docs:
    print(doc.json(indent=2, ensure_ascii=False))
```
```PyPDFLoader```でPDFを読み込み、```CharacterTextSplitter```でチャンクサイズやオーバーラップを指定し、テキストを分割します。
```text:出力
{
  "page_content": "Azure OpenAI Service とは\n[アーティクル ]•2023/05/01\nAzure OpenAI Service では、 GPT-3 、 Codex 、 Embeddings モデル  シリーズなど\nOpenAI の強⼒な⾔語モデルを  REST API として使⽤できます。  さらに、新しい  GPT-4\nおよび  ChatGPT (gpt-35-turbo) モデル  シリーズがプレビューで利⽤可能になりまし\nた。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ\nンテンツの⽣成、まとめ、セマンティック検索、⾃然⾔語からコードへの翻訳などで\nす。 ユーザーは、 REST API 、 Python SDK 、または  Azure OpenAI S tudio の  Web ベース\nのインターフェイスを介してサービスにアクセスできます。\n機能 Azur e OpenAI\n使⽤できるモデル 新しい  GPT-4 シリーズ  ( プレビュー )\nGPT-3 ベース  シリーズ\n新しい  ChatGPT (gpt -35-turbo) ( プレビュー )\nCodex シリーズ\n埋め込みシリーズ\n詳細については、 モデルに関するページを参照してください。\n微調整 Ada\nBabbage\nCurie\nCushman*\nDavinci*\n* 現在は利⽤できません。  ** ⽶国東部と⻄ヨーロッパでは、現在新\n規のお客様は微調整を利⽤できません。  ⽶国ベースのトレーニング\nには、⽶国中南部をご利⽤ください\nPrice こちらで⼊⼿可能\n仮想ネットワークのサポ\nート & プライベート  リン\nクのサポートはい\nマネージド  ID はい、 Azure Active Directory 経由\nUI エクスペリエンス アカウントとリソースの管理には  Azur e Portal、\nモデルの探索と微調整には  Azur e OpenAI Ser vice S tudio\nリージョン別の提供状況 ⽶国東部\n⽶国中南部\n⻄ヨーロッパ機能の概要",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 0
  }
}
{
  "page_content": "機能 Azur e OpenAI\nコンテンツのフィルター\n処理プロンプトと⼊⼒候補は、⾃動システムを使ってコンテンツ  ポリシ\nーに対して評価されます。  重⼤度の⾼いコンテンツはフィルターで\n除外されます。\nMicrosoft は、⼈を第⼀に考える原則に基づいて、 AI の発展に取り組んでいます。\nAzure OpenAI で使⽤できる⽣成モデルには、かなりの潜在的利益がありますが、慎重\nな設計と熟考した軽減策がない場合、そのようなモデルによって、正しくない、また\nは有害なコンテンツが⽣成される可能性があります。  Microsoft は、悪⽤や意図しない\n損害から保護するために多⼤な投資を⾏っています。たとえば、明確に定義したユー\nス ケースを⽰すことを申請者の要件とする、 責任ある  AI 使⽤に関する  Microsoft の原\n則を取り⼊れる、顧客をサポートするコンテンツ  フィルターを構築する、オンボー\nドされた顧客に対して責任ある  AI 実装のガイダンスを提供するなどです。\nAzure OpenAI にアクセスするにはどうすればよいですか ?\n⾼い需要、今後の製品の機能強化、 Microsoft の責任ある  AI へのコミットメント を\n考慮し、現在、アクセスは制限されています。  現在のところ、 Microsoft と既存のパー\nトナーシップ関係があるお客様、リスクの低いユース  ケース、軽減策の取り⼊れに取\nり組んでいるお客様を対象としています。\nより具体的な情報は、申請フォームに記載されています。  Azure OpenAI に対するアク\nセスを拡⼤できるよう、責任を持って取り組んでいますので、しばらくお待ちくださ\nい。\nアクセスはこちらからお申し込みください。\n[今すぐ適⽤する ]\nAzure OpenAI Service では、 OpenAI GPT-4 、 GPT-3 、 Codex 、 DALL-E モデルを使⽤し\nた⾼度な⾔語  AI を顧客に提供し、 Azure のセキュリティとエンタープライズの約束を\n実現します。  Azure OpenAI は  OpenAI と共に  API を共同開発し、互換性を確保し、⼀\n⽅から他⽅へのスムーズな移⾏を保証します。責任ある  AI\nAzure OpenAI にアクセスするにはどうすれば\nよいですか ?\nAzure OpenAI と  OpenAI の⽐較",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 1
  }
}
...
```

次に分割したテキストをベクトル化して、Cognitive Searchのインデックスとして登録します。
```python
# emmbeddingモデルを定義
embeddings = OpenAIEmbeddings(
    openai_api_type="azure",
    model='text-embedding-ada-002',
    openai_api_base=AZURE_OPENAI_ENDPOINT,
    openai_api_key=AZURE_OPENAI_API_KEY,
    deployment=AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME)

# Cognitive Searchのインデックスを作成
fields = [
    SimpleField(
        name="id",
        type=SearchFieldDataType.String,
        key=True,
        filterable=True,
    ),
    SearchableField(
        name="content",
        type=SearchFieldDataType.String,
        searchable=True,
        analyzer_name="ja.lucene",
    ),
    SearchField(
        name="content_vector",
        type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
        searchable=True,
        vector_search_dimensions=len(embeddings.embed_query("Text")),
        vector_search_configuration="default",
        
    ),
    SearchableField(
        name="metadata",
        type=SearchFieldDataType.String,
        searchable=True,
    ),
]

# インデックス名
index_name = "sample-index"

# ベクトルストアを作成
vector_store = AzureSearch(
    azure_search_endpoint=AZURE_SEARCH_ENDPOINT,
    azure_search_key=AZURE_SEARCH_API_KEY_ADMIN,
    index_name=index_name,
    embedding_function=embeddings.embed_query,
    fields=fields
)

# ベクトルDBに追加
vector_store.add_documents(documents=docs)
```

言語アナライザーが日本語であること```analyzer_name="ja.lucene"```を確認します。

Azure Portalから先ほど作成したインデックスを確認してみましょう。[Cognitive Search]->[リソース名]->[インデックス]->[sample-index]からインデックスが作成されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/69bdbbf7-58dd-b3ab-6867-c11a25900325.png)

### PDFLoader vs Azure Document Intelligence(旧Form Recognizer)
余談として、PDFをテキストに変換する際の精度を検証しました。今回はPythonのPDFLoaderライブラリを使用しましたが、前回はCognitive Searchの内部で利用されているAzure Document Intelligence（旧Form Recognizer）を使用しました。これら二つのツールの精度を比較してみました。

#### 元のPDF
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681297/1a70dbb5-4287-0fbf-7951-5c279bac5dbd.png)


#### PythonのPDFLoader
概ねそのまま取り込めていますが、行が変わる毎に```\n```が入ったり、最後から2行目で```Azur e OpenAI Ser vice S tudio```のように文字が分離している箇所があります。```\n```や空白を削除する前処理を加えてから、ナレッジ登録する方が良さそうです。
> Azure OpenAI Service とは\n[アーティクル ]•2023/05/01\nAzure OpenAI Service では、 GPT-3 、 Codex 、 Embeddings モデル  シリーズなど\nOpenAI の強⼒な⾔語モデルを  REST API として使⽤できます。  さらに、新しい  GPT-4\nおよび  ChatGPT (gpt-35-turbo) モデル  シリーズがプレビューで利⽤可能になりまし\nた。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ\nンテンツの⽣成、まとめ、セマンティック検索、⾃然⾔語からコードへの翻訳などで\nす。 ユーザーは、 REST API 、 Python SDK 、または  Azure OpenAI S tudio の  Web ベース\nのインターフェイスを介してサービスにアクセスできます。\n機能 Azur e OpenAI\n使⽤できるモデル 新しい  GPT-4 シリーズ  ( プレビュー )\nGPT-3 ベース  シリーズ\n新しい  ChatGPT (gpt -35-turbo) ( プレビュー )\nCodex シリーズ\n埋め込みシリーズ\n詳細については、 モデルに関するページを参照してください。\n微調整 Ada\nBabbage\nCurie\nCushman*\nDavinci*\n* 現在は利⽤できません。  ** ⽶国東部と⻄ヨーロッパでは、現在新\n規のお客様は微調整を利⽤できません。  ⽶国ベースのトレーニング\nには、⽶国中南部をご利⽤ください\nPrice こちらで⼊⼿可能\n仮想ネットワークのサポ\nート & プライベート  リン\nクのサポートはい\nマネージド  ID はい、 Azure Active Directory 経由\nUI エクスペリエンス アカウントとリソースの管理には  Azur e Portal、\nモデルの探索と微調整には  Azur e OpenAI Ser vice S tudio\nリージョン別の提供状況 ⽶国東部\n⽶国中南部\n⻄ヨーロッパ機能の概要

#### Azure Document Intelligence(旧Form Recognizer)
こちらは行が変わる部分で```\n```が入ることもありませんし、単語が崩れていることもざっとみた感じ無かったです。
> "Azure OpenAI Serviceとは\n[アーティクル] • 2023/05/01\nAzure OpenAI Serviceでは、GPT-3、Codex、Embeddingsモデルシリーズなど OpenAIの強力な言語モデルをREST APIとして使用できます。さらに、新しいGPT-4 およびChatGPT (gpt-35-turbo)モデルシリーズがプレビューで利用可能になりまし た。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ ンテンツの生成、まとめ、セマンティック検索、自然言語からコードへの翻訳などで す。ユーザーは、REST API、Python SDK、またはAzure OpenAI StudioのWebベース のインターフェイスを介してサービスにアクセスできます。\n機能の概要\n機能\nAzure OpenAI\n使用できるモデル\n新しいGPT-4シリーズ(プレビュー)\nGPT-3ベースシリーズ\n新しいChatGPT (gpt-35-turbo) (プレビュー)\nCodexシリーズ\n埋め込みシリーズ\n詳細については、モデルに関するページを参照してください。\n微調整\nAda\nBabbage\nCurie\nCushman*\nDavinci*\n*現在は利用できません。**米国東部と西ヨーロッパでは、現在新\n規のお客様は微調整を利用できません。米国ベースのトレーニング\nには、米国中南部をご利用ください\nPrice こちらで入手可能\n仮想ネットワークのサポ\nはい\nー\nト&プライベートリン\nクのサポート\nマネージドID\nはい、Azure Active Directory経由\nUIエクスペリエンス\nアカウントとリソースの管理にはAzure Portal、\nモデルの探索と微調整にはAzure OpenAI Service Studio\nリージョン別の提供状況\n米国東部\n米国中南部\n西ヨーロッパ 機能\nAzure OpenAI\nコンテンツのフィルター 処理\nプロンプトと入",


## ベクトル検索
ベクトル検索を行う場合は、```search_type="similarity"```を指定します。
```python
result_docs = vector_store.similarity_search(
    query="Azure OpenAIで使えるモデルを教えて",
    k=3,
    search_type="similarity"
    )

for doc in result_docs:
    print(doc.json(indent=2, ensure_ascii=False))
```
下記の通り、検索結果が表示されています。```page=0```の内容がトップに来ていれば、想定通りの検索結果なので、OKですね。
```txt:出力
{
  "page_content": "Azure OpenAI Service とは\n[アーティクル ]•2023/05/01\nAzure OpenAI Service では、 GPT-3 、 Codex 、 Embeddings モデル  シリーズなど\nOpenAI の強⼒な⾔語モデルを  REST API として使⽤できます。  さらに、新しい  GPT-4\nおよび  ChatGPT (gpt-35-turbo) モデル  シリーズがプレビューで利⽤可能になりまし\nた。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ\nンテンツの⽣成、まとめ、セマンティック検索、⾃然⾔語からコードへの翻訳などで\nす。 ユーザーは、 REST API 、 Python SDK 、または  Azure OpenAI S tudio の  Web ベース\nのインターフェイスを介してサービスにアクセスできます。\n機能 Azur e OpenAI\n使⽤できるモデル 新しい  GPT-4 シリーズ  ( プレビュー )\nGPT-3 ベース  シリーズ\n新しい  ChatGPT (gpt -35-turbo) ( プレビュー )\nCodex シリーズ\n埋め込みシリーズ\n詳細については、 モデルに関するページを参照してください。\n微調整 Ada\nBabbage\nCurie\nCushman*\nDavinci*\n* 現在は利⽤できません。  ** ⽶国東部と⻄ヨーロッパでは、現在新\n規のお客様は微調整を利⽤できません。  ⽶国ベースのトレーニング\nには、⽶国中南部をご利⽤ください\nPrice こちらで⼊⼿可能\n仮想ネットワークのサポ\nート & プライベート  リン\nクのサポートはい\nマネージド  ID はい、 Azure Active Directory 経由\nUI エクスペリエンス アカウントとリソースの管理には  Azur e Portal、\nモデルの探索と微調整には  Azur e OpenAI Ser vice S tudio\nリージョン別の提供状況 ⽶国東部\n⽶国中南部\n⻄ヨーロッパ機能の概要",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 0
  }
}
{
  "page_content": "Azure OpenAI を使⽤すると、顧客は  OpenAI と同じモデルを実⾏しながら、 Microsoft\nAzure のセキュリティ機能を使⽤できます。  Azure OpenAI では、プライベート  ネット\nワーク、リージョンの可⽤性、責任ある  AI コンテンツのフィルター処理が提供されま\nす。\n⼊⼒候補エンドポイントは、 API サービスのコア  コンポーネントです。  この  API は、\nモデルのテキストイン、テキストアウト  インターフェイスへのアクセスを提供しま\nす。 ユーザーは、英語のテキスト  コマンドを含む⼊⼒ プロンプトを⼊⼒するだけで、\nモデルによってテキスト ⼊⼒候補が⽣成されます。\n単純なプロンプトと⼊⼒候補の例を次に⽰します。\nプロンプト : \"\"\" count to 5 in a for loop \"\"\"\n⼊⼒候補 : for i in range(1, 6): print(i)\nAzure OpenAI では、テキストをトークンに分割して処理します。  トークンには、単語\nまたは⽂字のチャンクのみを指定できます。  たとえば、 \"hamburger\" という単語はト\nークン  \"ham\"、 \"bur\" 、 \"ger\" に分割されますが、 \"pear\" のような短くて⼀般的な単語\nは 1 つのトークンです。  多くのトークンは、 \"hello\" や  \"bye\" などの空⽩で始まりま\nす。\n所与の要求で処理されるトークンの合計数は、⼊⼒、出⼒、および要求パラメーター\nの⻑さによって異なります。  処理されるトークンの量は、モデルの応答待機時間とス\nループットにも影響します。\nAzure OpenAI は、 Azure の新しい製品オファリングです。  Azure OpenAI は、他の\nAzure 製品と同じように、 Azure サブスクリプションにこのサービス⽤の リソースまた\nはインスタンスを作成 して使⽤を開始できます。  Azure のリソース管理設計 について\n詳しくご覧いただけます。主要な概念\nプロンプトと⼊⼒候補\nトークン\nリソース\nデプロイメント",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 2
  }
}
{
  "page_content": "機能 Azur e OpenAI\nコンテンツのフィルター\n処理プロンプトと⼊⼒候補は、⾃動システムを使ってコンテンツ  ポリシ\nーに対して評価されます。  重⼤度の⾼いコンテンツはフィルターで\n除外されます。\nMicrosoft は、⼈を第⼀に考える原則に基づいて、 AI の発展に取り組んでいます。\nAzure OpenAI で使⽤できる⽣成モデルには、かなりの潜在的利益がありますが、慎重\nな設計と熟考した軽減策がない場合、そのようなモデルによって、正しくない、また\nは有害なコンテンツが⽣成される可能性があります。  Microsoft は、悪⽤や意図しない\n損害から保護するために多⼤な投資を⾏っています。たとえば、明確に定義したユー\nス ケースを⽰すことを申請者の要件とする、 責任ある  AI 使⽤に関する  Microsoft の原\n則を取り⼊れる、顧客をサポートするコンテンツ  フィルターを構築する、オンボー\nドされた顧客に対して責任ある  AI 実装のガイダンスを提供するなどです。\nAzure OpenAI にアクセスするにはどうすればよいですか ?\n⾼い需要、今後の製品の機能強化、 Microsoft の責任ある  AI へのコミットメント を\n考慮し、現在、アクセスは制限されています。  現在のところ、 Microsoft と既存のパー\nトナーシップ関係があるお客様、リスクの低いユース  ケース、軽減策の取り⼊れに取\nり組んでいるお客様を対象としています。\nより具体的な情報は、申請フォームに記載されています。  Azure OpenAI に対するアク\nセスを拡⼤できるよう、責任を持って取り組んでいますので、しばらくお待ちくださ\nい。\nアクセスはこちらからお申し込みください。\n[今すぐ適⽤する ]\nAzure OpenAI Service では、 OpenAI GPT-4 、 GPT-3 、 Codex 、 DALL-E モデルを使⽤し\nた⾼度な⾔語  AI を顧客に提供し、 Azure のセキュリティとエンタープライズの約束を\n実現します。  Azure OpenAI は  OpenAI と共に  API を共同開発し、互換性を確保し、⼀\n⽅から他⽅へのスムーズな移⾏を保証します。責任ある  AI\nAzure OpenAI にアクセスするにはどうすれば\nよいですか ?\nAzure OpenAI と  OpenAI の⽐較",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 1
  }
}
```
## ハイブリッド検索
ベクトル検索を行う場合は、```search_type="hybrid"```を指定します。

```python
result_docs = vector_store.similarity_search(
    query="Azure OpenAIで使えるモデルを教えて",
    k=3,
    search_type="hybrid"
    )

for doc in result_docs:
    print(doc.json(indent=2, ensure_ascii=False))
```
ベクトル検索と比べて上位2位と3位は変わりましたが、トップに来ているのでは想定通り```page=0```なのでOKです。
```txt:出力
{
  "page_content": "Azure OpenAI Service とは\n[アーティクル ]•2023/05/01\nAzure OpenAI Service では、 GPT-3 、 Codex 、 Embeddings モデル  シリーズなど\nOpenAI の強⼒な⾔語モデルを  REST API として使⽤できます。  さらに、新しい  GPT-4\nおよび  ChatGPT (gpt-35-turbo) モデル  シリーズがプレビューで利⽤可能になりまし\nた。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ\nンテンツの⽣成、まとめ、セマンティック検索、⾃然⾔語からコードへの翻訳などで\nす。 ユーザーは、 REST API 、 Python SDK 、または  Azure OpenAI S tudio の  Web ベース\nのインターフェイスを介してサービスにアクセスできます。\n機能 Azur e OpenAI\n使⽤できるモデル 新しい  GPT-4 シリーズ  ( プレビュー )\nGPT-3 ベース  シリーズ\n新しい  ChatGPT (gpt -35-turbo) ( プレビュー )\nCodex シリーズ\n埋め込みシリーズ\n詳細については、 モデルに関するページを参照してください。\n微調整 Ada\nBabbage\nCurie\nCushman*\nDavinci*\n* 現在は利⽤できません。  ** ⽶国東部と⻄ヨーロッパでは、現在新\n規のお客様は微調整を利⽤できません。  ⽶国ベースのトレーニング\nには、⽶国中南部をご利⽤ください\nPrice こちらで⼊⼿可能\n仮想ネットワークのサポ\nート & プライベート  リン\nクのサポートはい\nマネージド  ID はい、 Azure Active Directory 経由\nUI エクスペリエンス アカウントとリソースの管理には  Azur e Portal、\nモデルの探索と微調整には  Azur e OpenAI Ser vice S tudio\nリージョン別の提供状況 ⽶国東部\n⽶国中南部\n⻄ヨーロッパ機能の概要",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 0
  }
}
{
  "page_content": "機能 Azur e OpenAI\nコンテンツのフィルター\n処理プロンプトと⼊⼒候補は、⾃動システムを使ってコンテンツ  ポリシ\nーに対して評価されます。  重⼤度の⾼いコンテンツはフィルターで\n除外されます。\nMicrosoft は、⼈を第⼀に考える原則に基づいて、 AI の発展に取り組んでいます。\nAzure OpenAI で使⽤できる⽣成モデルには、かなりの潜在的利益がありますが、慎重\nな設計と熟考した軽減策がない場合、そのようなモデルによって、正しくない、また\nは有害なコンテンツが⽣成される可能性があります。  Microsoft は、悪⽤や意図しない\n損害から保護するために多⼤な投資を⾏っています。たとえば、明確に定義したユー\nス ケースを⽰すことを申請者の要件とする、 責任ある  AI 使⽤に関する  Microsoft の原\n則を取り⼊れる、顧客をサポートするコンテンツ  フィルターを構築する、オンボー\nドされた顧客に対して責任ある  AI 実装のガイダンスを提供するなどです。\nAzure OpenAI にアクセスするにはどうすればよいですか ?\n⾼い需要、今後の製品の機能強化、 Microsoft の責任ある  AI へのコミットメント を\n考慮し、現在、アクセスは制限されています。  現在のところ、 Microsoft と既存のパー\nトナーシップ関係があるお客様、リスクの低いユース  ケース、軽減策の取り⼊れに取\nり組んでいるお客様を対象としています。\nより具体的な情報は、申請フォームに記載されています。  Azure OpenAI に対するアク\nセスを拡⼤できるよう、責任を持って取り組んでいますので、しばらくお待ちくださ\nい。\nアクセスはこちらからお申し込みください。\n[今すぐ適⽤する ]\nAzure OpenAI Service では、 OpenAI GPT-4 、 GPT-3 、 Codex 、 DALL-E モデルを使⽤し\nた⾼度な⾔語  AI を顧客に提供し、 Azure のセキュリティとエンタープライズの約束を\n実現します。  Azure OpenAI は  OpenAI と共に  API を共同開発し、互換性を確保し、⼀\n⽅から他⽅へのスムーズな移⾏を保証します。責任ある  AI\nAzure OpenAI にアクセスするにはどうすれば\nよいですか ?\nAzure OpenAI と  OpenAI の⽐較",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 1
  }
}
{
  "page_content": "Azure OpenAI を使⽤すると、顧客は  OpenAI と同じモデルを実⾏しながら、 Microsoft\nAzure のセキュリティ機能を使⽤できます。  Azure OpenAI では、プライベート  ネット\nワーク、リージョンの可⽤性、責任ある  AI コンテンツのフィルター処理が提供されま\nす。\n⼊⼒候補エンドポイントは、 API サービスのコア  コンポーネントです。  この  API は、\nモデルのテキストイン、テキストアウト  インターフェイスへのアクセスを提供しま\nす。 ユーザーは、英語のテキスト  コマンドを含む⼊⼒ プロンプトを⼊⼒するだけで、\nモデルによってテキスト ⼊⼒候補が⽣成されます。\n単純なプロンプトと⼊⼒候補の例を次に⽰します。\nプロンプト : \"\"\" count to 5 in a for loop \"\"\"\n⼊⼒候補 : for i in range(1, 6): print(i)\nAzure OpenAI では、テキストをトークンに分割して処理します。  トークンには、単語\nまたは⽂字のチャンクのみを指定できます。  たとえば、 \"hamburger\" という単語はト\nークン  \"ham\"、 \"bur\" 、 \"ger\" に分割されますが、 \"pear\" のような短くて⼀般的な単語\nは 1 つのトークンです。  多くのトークンは、 \"hello\" や  \"bye\" などの空⽩で始まりま\nす。\n所与の要求で処理されるトークンの合計数は、⼊⼒、出⼒、および要求パラメーター\nの⻑さによって異なります。  処理されるトークンの量は、モデルの応答待機時間とス\nループットにも影響します。\nAzure OpenAI は、 Azure の新しい製品オファリングです。  Azure OpenAI は、他の\nAzure 製品と同じように、 Azure サブスクリプションにこのサービス⽤の リソースまた\nはインスタンスを作成 して使⽤を開始できます。  Azure のリソース管理設計 について\n詳しくご覧いただけます。主要な概念\nプロンプトと⼊⼒候補\nトークン\nリソース\nデプロイメント",
  "metadata": {
    "source": "../data/Azure OpenAI Service とは - Azure Cognitive Services _ Microsoft Learn.pdf",
    "page": 2
  }
}
```



## スコア付き検索
スコア付き検索を行いたい場合、LangChainの```similarity_search_with_score()```メソッドを使いたいのですが、現在実装がTBDになっています。従って、ネイティブなAzureのSDKを使う方法をご紹介します。
```python
from azure.search.documents import SearchClient
from azure.core.credentials import AzureKeyCredential

query = "Azure OpenAIで使えるモデルを教えて"

vector = embeddings.embed_query(query)
search_client = SearchClient(
    endpoint=AZURE_SEARCH_ENDPOINT,
    index_name=index_name,
    credential=AzureKeyCredential(AZURE_SEARCH_API_KEY_ADMIN)
    )

results = search_client.search(search_text="", vector=vector, vector_fields="content_vector", top_k=3)

for result in results:
    #print(json.dumps(result, indent=2, sort_keys=True))
    print("###############")
    print(f"ID: {result['id']}")  
    print(f"Score: {result['@search.score']}")  
    print(f"Metadata: {result['metadata']}")  
    print(f"Content: {result['content']}")  
```
```@search.score```に検索スコアが表示されます。
```txt:出力
###############
ID: Nzg4NmMzN2QtMjhkNS00ZWRmLTlkODgtMjNmMTAzYTk0NWJj
Score: 0.9002142
Metadata: {"source": "../data/Azure OpenAI Service \u3068\u306f - Azure Cognitive Services _ Microsoft Learn.pdf", "page": 0}
Content: Azure OpenAI Service とは
[アーティクル ]•2023/05/01
Azure OpenAI Service では、 GPT-3 、 Codex 、 Embeddings モデル  シリーズなど
OpenAI の強⼒な⾔語モデルを  REST API として使⽤できます。  さらに、新しい  GPT-4
および  ChatGPT (gpt-35-turbo) モデル  シリーズがプレビューで利⽤可能になりまし
た。 これらのモデルは、特定のタスクに合わせて簡単に調整できます。たとえば、コ
ンテンツの⽣成、まとめ、セマンティック検索、⾃然⾔語からコードへの翻訳などで
す。 ユーザーは、 REST API 、 Python SDK 、または  Azure OpenAI S tudio の  Web ベース
のインターフェイスを介してサービスにアクセスできます。
機能 Azur e OpenAI
使⽤できるモデル 新しい  GPT-4 シリーズ  ( プレビュー )
GPT-3 ベース  シリーズ
新しい  ChatGPT (gpt -35-turbo) ( プレビュー )
Codex シリーズ
埋め込みシリーズ
詳細については、 モデルに関するページを参照してください。
微調整 Ada
Babbage
Curie
Cushman*
Davinci*
* 現在は利⽤できません。  ** ⽶国東部と⻄ヨーロッパでは、現在新
規のお客様は微調整を利⽤できません。  ⽶国ベースのトレーニング
には、⽶国中南部をご利⽤ください
Price こちらで⼊⼿可能
仮想ネットワークのサポ
ート & プライベート  リン
クのサポートはい
マネージド  ID はい、 Azure Active Directory 経由
UI エクスペリエンス アカウントとリソースの管理には  Azur e Portal、
モデルの探索と微調整には  Azur e OpenAI Ser vice S tudio
リージョン別の提供状況 ⽶国東部
⽶国中南部
⻄ヨーロッパ機能の概要
###############
ID: YjVjNGM2YjAtZjQwZi00YWViLTk2ZjQtYTA0MTMxOTgyYjAx
Score: 0.88651544
Metadata: {"source": "../data/Azure OpenAI Service \u3068\u306f - Azure Cognitive Services _ Microsoft Learn.pdf", "page": 2}
Content: Azure OpenAI を使⽤すると、顧客は  OpenAI と同じモデルを実⾏しながら、 Microsoft
Azure のセキュリティ機能を使⽤できます。  Azure OpenAI では、プライベート  ネット
ワーク、リージョンの可⽤性、責任ある  AI コンテンツのフィルター処理が提供されま
す。
⼊⼒候補エンドポイントは、 API サービスのコア  コンポーネントです。  この  API は、
モデルのテキストイン、テキストアウト  インターフェイスへのアクセスを提供しま
す。 ユーザーは、英語のテキスト  コマンドを含む⼊⼒ プロンプトを⼊⼒するだけで、
モデルによってテキスト ⼊⼒候補が⽣成されます。
単純なプロンプトと⼊⼒候補の例を次に⽰します。
プロンプト : """ count to 5 in a for loop """
⼊⼒候補 : for i in range(1, 6): print(i)
Azure OpenAI では、テキストをトークンに分割して処理します。  トークンには、単語
または⽂字のチャンクのみを指定できます。  たとえば、 "hamburger" という単語はト
ークン  "ham"、 "bur" 、 "ger" に分割されますが、 "pear" のような短くて⼀般的な単語
は 1 つのトークンです。  多くのトークンは、 "hello" や  "bye" などの空⽩で始まりま
す。
所与の要求で処理されるトークンの合計数は、⼊⼒、出⼒、および要求パラメーター
の⻑さによって異なります。  処理されるトークンの量は、モデルの応答待機時間とス
ループットにも影響します。
Azure OpenAI は、 Azure の新しい製品オファリングです。  Azure OpenAI は、他の
Azure 製品と同じように、 Azure サブスクリプションにこのサービス⽤の リソースまた
はインスタンスを作成 して使⽤を開始できます。  Azure のリソース管理設計 について
詳しくご覧いただけます。主要な概念
プロンプトと⼊⼒候補
トークン
リソース
デプロイメント
###############
ID: Yzg4YjM5ZDctYjI1MS00YmY4LWFjMmItZTY4MjMzOTU0OGZm
Score: 0.8847311
Metadata: {"source": "../data/Azure OpenAI Service \u3068\u306f - Azure Cognitive Services _ Microsoft Learn.pdf", "page": 1}
Content: 機能 Azur e OpenAI
コンテンツのフィルター
処理プロンプトと⼊⼒候補は、⾃動システムを使ってコンテンツ  ポリシ
ーに対して評価されます。  重⼤度の⾼いコンテンツはフィルターで
除外されます。
Microsoft は、⼈を第⼀に考える原則に基づいて、 AI の発展に取り組んでいます。
Azure OpenAI で使⽤できる⽣成モデルには、かなりの潜在的利益がありますが、慎重
な設計と熟考した軽減策がない場合、そのようなモデルによって、正しくない、また
は有害なコンテンツが⽣成される可能性があります。  Microsoft は、悪⽤や意図しない
損害から保護するために多⼤な投資を⾏っています。たとえば、明確に定義したユー
ス ケースを⽰すことを申請者の要件とする、 責任ある  AI 使⽤に関する  Microsoft の原
則を取り⼊れる、顧客をサポートするコンテンツ  フィルターを構築する、オンボー
ドされた顧客に対して責任ある  AI 実装のガイダンスを提供するなどです。
Azure OpenAI にアクセスするにはどうすればよいですか ?
⾼い需要、今後の製品の機能強化、 Microsoft の責任ある  AI へのコミットメント を
考慮し、現在、アクセスは制限されています。  現在のところ、 Microsoft と既存のパー
トナーシップ関係があるお客様、リスクの低いユース  ケース、軽減策の取り⼊れに取
り組んでいるお客様を対象としています。
より具体的な情報は、申請フォームに記載されています。  Azure OpenAI に対するアク
セスを拡⼤できるよう、責任を持って取り組んでいますので、しばらくお待ちくださ
い。
アクセスはこちらからお申し込みください。
[今すぐ適⽤する ]
Azure OpenAI Service では、 OpenAI GPT-4 、 GPT-3 、 Codex 、 DALL-E モデルを使⽤し
た⾼度な⾔語  AI を顧客に提供し、 Azure のセキュリティとエンタープライズの約束を
実現します。  Azure OpenAI は  OpenAI と共に  API を共同開発し、互換性を確保し、⼀
⽅から他⽅へのスムーズな移⾏を保証します。責任ある  AI
Azure OpenAI にアクセスするにはどうすれば
よいですか ?
Azure OpenAI と  OpenAI の⽐較
```

## インデックスの削除
念のため使ったインデックスを削除する方法も載せておきます。
```python
from azure.search.documents.indexes import SearchIndexClient

si_client = SearchIndexClient(
    endpoint=AZURE_SEARCH_ENDPOINT,
    credential=AzureKeyCredential(AZURE_SEARCH_API_KEY_ADMIN)
    )

si_client.delete_index(index_name)
```

# まとめ
LangChainを使用してCognitive SearchのベクトルDBの構築方法を解説しました。LangChainを活用することで、効率的にベクトルDBを作成することができます。次回は、このベクトルDBを使ってRAGアーキテクチャの実装方法について紹介したいと思います。