次の方法で共有


チュートリアル: チャット モデルを使用してデータを検索する (Azure AI 検索 での RAG)

Azure AI 検索での RAG ソリューションの特徴は、インデックス付きコンテンツに対する会話形式の検索エクスペリエンスのため、大規模言語モデル (LLM) にクエリを送信することです。 基本的な部分だけを実装すれば、驚くほど簡単に実行できます。

このチュートリアルでは、次の作業を行いました。

  • クライアントを設定する
  • LLM の手順を記述する
  • LLM 入力用に設計されたクエリを提供する
  • 結果を確認し、次の手順を調べる

このチュートリアルは、前のチュートリアルに基づいています。 インデックス作成パイプラインによって作成された検索インデックスがあることを前提としています。

前提条件

サンプルのダウンロード

以前のインデックス作成パイプラインのチュートリアルと同じノートブックを使用します。 LLM に対してクエリを実行するためのスクリプトは、パイプラインの作成手順に従います。 ノートブックをまだお持ちでない場合は、GitHub からダウンロードしてください。

クエリを送信するためのクライアントを構成する

Azure AI 検索の RAG パターンでは、グラウンディング データを取得するために検索インデックスに対する一連の同期接続を行い、その後にユーザーの質問に対する応答を作成するために LLM に対する接続を行います。 両方のクライアントで同じクエリ文字列が使用されます。

2 つのクライアントを設定するため、両方のリソースに対するエンドポイントとアクセス許可が必要です。 このチュートリアルでは、承認された接続のロール割り当てを設定することを前提としていますが、サンプル ノートブックでエンドポイントを指定する必要があります。

# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"

プロンプトとクエリのサンプル スクリプト

クライアントをインスタンス化し、プロンプトを定義し、クエリを設定する Python スクリプトを以下に示します。 このスクリプトをノートブックで実行すると、チャット モデルのデプロイからの応答を生成できます。

Azure Government クラウドの場合は、トークン プロバイダーの API エンドポイントを "https://cognitiveservices.azure.us/.default" に変更します。

# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
     api_version="2024-06-01",
     azure_endpoint=AZURE_OPENAI_ACCOUNT,
     azure_ad_token_provider=token_provider
 )

deployment_name = "gpt-4o"

search_client = SearchClient(
     endpoint=AZURE_SEARCH_SERVICE,
     index_name=index_name,
     credential=credential
 )

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# Provide the search query. 
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    select=["title", "chunk", "locations"],
    top=5,
)

# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct. 
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model=deployment_name
)

print(response.choices[0].message.content)

結果を確認する

この応答では、検索エンジンによって最も関連性が高いと判断されたチャンクで構成される 5 つの入力 (top=5) に基づいて回答が作成されます。 プロンプト内の指示では、sources または書式設定された検索結果の情報のみを使用するように LLM に指示しています。

最初のクエリ "What's the NASA earth book about?" の結果は、次の例のようになります。

The NASA Earth book is about the intricate and captivating science of our planet, studied 
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex 
system, observed through various cycles and processes such as the water cycle and ocean 
circulation. The book combines stunning satellite images with detailed scientific insights, 
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and 
air seen from above. It aims to inspire and demonstrate that the truth of our planet is 
as compelling as any fiction.

Source: page-8.pdf

プロンプトとクエリが変更されていない場合でも、LLM が異なる回答を返すことが予想されます。 結果はこの例とは大きく異なる場合があります。 詳細については、「再現可能な出力を使用する方法」を参照してください。

Note

このチュートリアルをテストしたところ、さまざまな応答が見られ、その中には他の応答よりも関連性の高いものもありました。 数回、同じ要求を繰り返すと応答の質が低下しましたが、これはおそらくチャット履歴の混乱が原因で、繰り返しの要求を生成された回答に対する不満としてモデルが記録した可能性があります。 チャット履歴の管理はこのチュートリアルの範囲外ですが、アプリケーション コードにそれを含めると、この動作が軽減されるか、完全に排除されるはずです。

フィルターを追加する

応用 AI を使用して、エンティティ認識スキルによって認識された場所が設定された locations フィールドを作成したことを思い出してください。 locations のフィールド定義には filterable 属性が含まれています。 前の要求を繰り返しましょう。ただし、今回は locations フィールドに ice という用語を選択するフィルターを追加します。

フィルターでは、包含または除外の条件が導入されます。 検索エンジンでは、引き続き "What's the NASA earth book about?" でベクトル検索が実行されていますが、ice を含まない一致は除外されるようになりました。 文字列コレクションとベクトル クエリでのフィルター処理の詳細については、「テキスト フィルターの基礎」とコレクション フィルターについて、およびベクトル クエリへのフィルターの追加に関するページを参照してください。

search_results 定義を、フィルターを含む次の例に置き換えます。

query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")

# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
    search_text=query,
    vector_queries= [vector_query],
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select=["title", "chunk", "locations"],
    top=5,
)

sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])

search_results = search_client.search(
    search_text=query,
    top=10,
    filter="search.ismatch('ice*', 'locations', 'full', 'any')",
    select="title, chunk, locations"

フィルター処理されたクエリの結果は、次の応答のようになります。 ice cover (氷量) に重点が置かれていることに注目してください。

The NASA Earth book showcases various geographic and environmental features of Earth through 
satellite imagery, highlighting remarkable landscapes and natural phenomena. 

- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by 
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements 
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through 
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and 
- heat absorption ([source](page-153.pdf)).
  
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems 
and natural changes.

入力を変更する

LLM への入力数を増減すると、応答に大きな影響を与える可能性があります。 top=8 設定後に同じクエリを再度実行してみてください。 入力を増やすと、クエリが変更されていない場合でも、モデルは毎回異なる結果を返します。

以下は、入力を 8 つに増やした後にモデルから返される結果の一例です。

The NASA Earth book features a range of satellite images capturing various natural phenomena 
across the globe. These include:

- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic 
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes 
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from 
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various 
locations recorded by different Landsat missions (Source: page-168.pdf).

Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic 
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.

モデルはグラウンディング データにバインドされているため、入力のサイズを大きくすると、回答はより広範囲になります。 関連性チューニングを使用すると、より焦点を絞った回答を生成できる可能性があります。

プロンプトを変更する

出力の形式やトーンを制御したり、プロンプトを変更することでモデルが独自のトレーニング データで回答を補完するかどうかを制御したりするために、プロンプトを変更することもできます。

科学的研究のための場所を特定するプロンプトに再度フォーカスした場合の LLM 出力の別の例を次に示します。

# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""

プロンプトだけを変更し、それ以外は前のクエリのすべてのアスペクトを保持した場合の出力は、次の例のようになります。

The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery, 
highlighting natural phenomena and geographic features. For instance, the book includes:

- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.

(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)

ヒント

チュートリアルを続行する場合は、プロンプトを以前の値 (You are an AI assistant that helps users learn from the information found in the source material) に戻すことを忘れないでください。

パラメーターとプロンプトを変更すると、LLM からの応答に影響します。 ユーザーが自分で探索する場合は、次の点に注意してください。

  • top 値を上げると、モデルで使用可能なクォータを使い果たす可能性があります。 クォータがない場合、エラー メッセージを返すか、モデルが "わからない" を返す場合があります。

  • top 値を上げても、必ずしも結果が改善するとは限りません。 上位でテストしていると、回答が劇的に良くなるわけではないことに気づくことがあります。

  • では、何が役に立つのでしょうか? 通常、その答えは関連性のチューニングです。 Azure AI 検索の検索結果の関連性を向上させることが、通常、LLM の有用性を最大化するための最も効果的なアプローチです。

次のチュートリアル シリーズでは、関連性を最大化し、クエリ パフォーマンスを最適化して速度と簡潔さを高めることに焦点を移します。 関連性機能を実装するためにスキーマ定義とクエリ ロジックを見直しますが、残りのパイプラインとモデルについてはそのままです。

次のステップ