32
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

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

事前準備

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

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

Pythonのバージョンは3.10.6で動作確認を行っています。ライブラリは下記の通りです。

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のバージョンを確実に固定してください。

ベクトルインデックスの作成

最初に環境変数を定義しておきます。

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>"
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を読み込んでテキストに分割します。

# 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でチャンクサイズやオーバーラップを指定し、テキストを分割します。

出力
{
  "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のインデックスとして登録します。

# 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

PDFLoader vs Azure Document Intelligence(旧Form Recognizer)

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

元のPDF

image.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"を指定します。

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ですね。

出力
{
  "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"を指定します。

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です。

出力
{
  "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を使う方法をご紹介します。

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に検索スコアが表示されます。

出力
###############
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 の⽐較

インデックスの削除

念のため使ったインデックスを削除する方法も載せておきます。

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アーキテクチャの実装方法について紹介したいと思います。

32
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?