3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Grounding With Bing Searchを触ってみた:信頼性の高い検索応答の実装ガイド

3
Last updated at Posted at 2026-02-08

1. はじめに

近年、生成AIの活用が急速に広がる中で、RAG (Retrieval-Augmented Generation)は、より信頼性の高い回答を生成するための重要なアーキテクチャとして注目されています。

RAGにおけるBing Searchは、外部情報を取得するための主要なWeb検索エンジンとして利用されています。しかし2025年8月11日をもってBing Search APIは廃止され、代替としてGrounding With Bing Searchがリリースされました。

Bing Search APIを2025年8月11日をもって廃止しました。
Bing Search APIの廃止

Grounding With Bing Searchは、単なるAPIの置き換えではなく、検索で得た情報をAIの回答に紐づけ、その根拠(URLやタイトル)をあわせて提示できる点が最大の特徴です。
これにより、「検索結果だけ返す」仕組みとは異なり、ユーザーはAIの応答を参照元とともに確認できるようになり応答の信頼性が向上します。

本記事では、Grounding With Bing Searchの概要と特徴を整理したうえで、Azure AI FoundryとPythonを用いて実際に動作させる方法を解説します。

2. Grounding With Bing Searchの概要

2.1 Grounding With Bing Searchとは?

Grounding With Bing Searchは、従来のBing Search APIを進化させた新しい検索基盤であり、生成AIとの統合を前提に設計されています。最大の特徴は、検索結果を単に返すだけでなく、AI応答の根拠(Grounding)として組み込む仕組みを提供する点です。

「Grounding」とは、生成AIが回答を生成する際に、信頼できる情報源に基づいて生成することを目指すことを言います。これにより、AIの回答はより正確で、コンテキストに沿ったものとなります。

2.2 従来のBing Searchとの違い(比較表)

項目 Bing Search API Grounding With Bing Search
主な目的 Web検索結果の取得 AI応答の信頼性向上
出力 検索結果のみ 検索結果 + Grounding情報
認証 APIキー Entra ID認証(推奨)

3. 実装手順(Azure AI Foundry + Python)

本章では、Grounding With Bing Searchの動作を具体的に確認するために、天気情報の検索を題材として、AIの回答とともに根拠情報が取得できることを確認します。
Grounding With Bing Searchを利用するために、Azure環境で以下の設定を行います。

3.1 構成図

image.png
この構成では、Entra IDで認証されたAzure AI FoundryがGrounding With Bing Searchを利用して、Web検索機能をLLMに統合する仕組みを提供します。

  • Azure AI Foundry
    LLMを活用し、Web検索結果と社内データを組み合わせて応答を生成します(CopilotやRAGアプリの基盤)
  • Grounding With Bing Search
    最新のWeb情報を取得し、AI応答の根拠として統合します
  • Azure Functions
    アプリケーションロジックを実装し、検索結果やAI応答を処理します(APIエンドポイントとして利用可能)
  • 認証用アプリケーション
    Entra ID上に登録し、Azure AI Foundryへのアクセスを安全に管理します

3.2 前提条件

  • Azureサブスクリプションを所有していること
  • Entra IDで認証用アプリケーションを登録済みであること
  • Azure AI Foundryが利用可能な状態であること
  • Bingリソースをデプロイ済みであること

3.3 Entra ID認証用アプリケーション

登録済みの認証用アプリケーションでクライアントシークレットを発行し、Azure AI Foundryの認証用に下記の情報を控えます。
 ・ ディレクトリ(テナント)ID
 ・アプリケーション(クライアント)ID
 ・クライアントシークレットの値

image.png

3.4 Azure AI Foundry設定

  • Azure AI Foundryポータルから新しいエージェントを追加します
    ※エージェントIDを控えます

image.png

  • ナレッジの追加から「Bing検索を使用したグラウンド」を選択し、デプロイ済みである、Bingリソースを選択し、追加します

image.png

3.5 フォルダ構成

フォルダ構成は、Azure FunctionsでPythonを利用する際の標準的な構成です。
function_app.pyに関数ロジックを記載し、local.settings.jsonで認証情報やエンドポイントを管理します。

.
├ .venv
│ └...
├ .vscode
│ └...
├ _pycache_
│ └...
├ .funcignore
├ .gitignore
├ function_app.py
├ host.json
├ local.settings.json
└ requirements.txt

3.6 Pythonからエージェント呼び出し

環境変数の設定(local.settings.json)

AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRETはEntra IDで登録したアプリケーションの認証情報です。
BING_PROJECT_ENDPOINTBING_AGENT_IDはAzure AI Foundryで作成したプロジェクトとエージェントに対応します。

local.settings.json
{
    "AZURE_CLIENT_ID" : "アプリケーション(クライアント)ID",
    "AZURE_TENANT_ID" : "ディレクトリ(テナント)ID",
    "AZURE_CLIENT_SECRET" : "クライアントシークレットの値",
    "BING_PROJECT_ENDPOINT" : "Azure AI Foundryプロジェクトのエンドポイント",
    "BING_AGENT_ID" : "エージェントID",
}

Grounding With Bing Search関数(function_app.py)

この関数は、Azure AI FoundryのエージェントをPythonから呼び出し、Grounding With Bing Searchを実行するためのロジックです。
主なポイントは以下の通りです:

  • 認証DefaultAzureCredentialを利用し、環境変数から認証情報を取得します
  • スレッド管理:検索処理ごとにスレッドを作成し、処理後に削除することでリソースをクリーンアップします
  • Grounding指定tool_choice={"type": "bing_grounding"}を指定することで、Bing検索を利用したGroundingを明示的に指定して実行します
  • 結果の構造化:検索結果のタイトルとURLを抽出し、LLM応答とともに返却することで、RAGに活用できます
function_app.py

import logging
import os

from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import ListSortOrder

#クライアントの作成
project = AIProjectClient(
    credential=DefaultAzureCredential(),
    endpoint=os.getenv("BING_PROJECT_ENDPOINT")
)

#Grounding With Bing Search関数(content:プロンプト)
def grounding_with_bing_search(content):
    logging.info("grounding_with_bing_searchを開始します。")
    #エージェントの取得
    agent = project.agents.get_agent(os.getenv("BING_AGENT_ID"))
    #スレッドの作成
    thread = project.agents.threads.create()

    web_search_results = project.agents.messages.create(
        thread_id=thread.id,
        role="user",
        content=content
    )

    run = project.agents.runs.create_and_process(
        thread_id = thread.id,
        agent_id = agent.id,
        tool_choice={"type": "bing_grounding"}
    )

    #検索結果のTitleとURLを格納
    web_contents_metadata = []
    #検索結果を格納
    assistant_messages = []

    if run.status == "failed":
        print(f"Run failed: {run.last_error}")
    else:
        web_search_results = project.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)

    for web_search_result in web_search_results:
        logging.info(f"web_search_result : {web_search_result}")
        if web_search_result.role == "assistant":
            try:
                last_message_text = web_search_result.text_messages[-1].text.value
                annotations = web_search_result.text_messages[-1].text.annotations

                #LLMの回答生成に追加すべきフォーマット済みのメッセージ
                assistant_messages.append({"role" : "user", "content" : content})
                assistant_messages.append({"role" : "assistant", "content" : last_message_text})

                #回答根拠となるWebタイトルとURLを格納
                for annotation in annotations:
                    url_citation = annotation.get("url_citation")
                    title = url_citation.get('title')
                    url = url_citation.get('url')
                    if title and url :
                        web_contents_metadata.append({
                            "subject": title,
                            "url": url
                        })
            except Exception as e:
                logging.warning(f"Web search result parsing failed: {str(e)}")

    #作成したスレッドの削除
    project.agents.threads.delete(thread_id=thread.id)
    
    return assistant_messages, web_contents_metadata

3.7 実行結果(サンプル)

ここでは、grounding_with_bing_search関数に対して、contentに「今日の東京の天気は?」というリクエストを送信した場合の応答例を示します。

応答例

assistant_messages
ユーザーの質問とAIによる回答が含まれます。

[
    {
        "role": "user",
        "content": "今日の東京の天気は?"
    },
    {
        "role": "assistant",
        "content": "今日、2025年12月15日の東京の天気は「晴れ」です。気温は予想最高が9〜15°C、最低が2〜8°Cと、冷え込みがある日になります【3:1†source】【3:4†source】。"
    }
]

web_contents_metadata
回答の根拠となるWebページのタイトルとURLが格納されています。
この情報をUIに表示することで、ユーザーは「回答の信頼性」を確認できます。


[
    {
        "subject": "2025年12月15日の東京都, 東京都の天気予報 - WeatherTAB",
        "url": "https://www.weathertab.com/ja/long-range-weather/12/15/japan/tokyo-to/tokyo/"
    },
    {
        "subject": "東京 今日(15日)の天気 (2025年12月15日) - エキサイトニュース",
        "url": "https://www.excite.co.jp/news/article/SportsHochi_20251214_OHT1T51138/"
    }
]

3.8 トラブルシューティング(よくあるエラーと対処)

認証や権限設定の不備によってエラーが発生する場合があります。ここでは、実装時に遭遇しやすい代表的なエラーと、その確認ポイントをまとめます

401 Unauthorized

認証に失敗しています。以下を確認してください:

  • AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRETが正しいか
  • Azure Functionsで環境変数が正しく設定されているか

403 Forbidden

アクセス権限が不足しています。以下を確認してください:

  • Entra 管理センターから「APIアクセス許可」を追加し、管理者の同意を付与
  • エージェントに「Bing検索を使用したグラウンド」が正しく追加されているか

4. おわりに

いかがだったでしょうか。
Grounding With Bing SearchはRAGを構成する重要な要素です。
Bing検索は単なる情報取得ではなく、信頼できる情報に基づいたAI応答を目指すものです。

実際に社内では、Microsoft 365ライセンスや契約に関する問い合わせ対応の効率化に取り組む中で、このGrounding技術を活用した仕組みを適用しています。AIが根拠を提示しながら回答することで、問い合わせの回答品質が向上したと感じています。
今後は、こうした取り組みをMicrosoft 365領域にとどまらず、他のサポート業務や参照データの対象を広げ、より幅広い社内業務を支援できる仕組みへと発展させていきたいと考えています。
今回の実装を参考に、RAGアプリの開発に活用していただければ幸いです。

We Are Hiring

BIPROGYでは一緒に働く仲間を募集しています。ご興味ある方は下記をご参照ください。

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?