powered by TechFeed
表示モード
Deep Dive

LLMの「古い知識問題」をAPI1回で解決 — BraveのWeb検索グラウンディングはRAGのスクレイピング地獄を置き換えるか

10月1日、Braveが「AI web grounding: how to ground your LLMs and agents in live web data」と題した記事を公開した。LLMをリアルタイムのWeb情報に接地(グラウンディング)させる手法として、Brave Search APIのLLM Contextエンドポイント1回の呼び出しで検索・抽出・チャンク分割・リランキングを完結させるアプローチが紹介されている。従来のスクレイピングパイプラインとの具体的な比較と、OpenAI互換のAnswersエンドポイントを使った実装例も示されており、実装者にとって即座に参照価値がある内容だ。

10月1日、Braveが「AI web grounding: how to ground your LLMs and agents in live web data」と題した記事を公開した。LLMをリアルタイムのWeb情報に接地(グラウンディング)させる手法として、Brave Search APIのLLM Contextエンドポイント1回の呼び出しで検索・抽出・チャンク分割・リランキングを完結させるアプローチが紹介されている。従来のスクレイピングパイプラインとの具体的な比較と、OpenAI互換のAnswersエンドポイントを使った実装例も示されており、実装者にとって即座に参照価値がある内容だ。


RAGとWebグラウンディングの違いを整理する

混同されがちな2つの概念を記事は明確に区別している。

  • RAG(Retrieval-Augmented Generation)はアーキテクチャ。ドキュメントを検索して、それを元に回答を生成するパターン。社内ドキュメントやサポートチケットのような静的・内部ナレッジに強い。
  • Webグラウンディングはゴール。モデルの出力を現実の検証可能な事実に紐付けること。RAGはその手段のひとつ。

社内RAGでは「今朝のインシデント」「先週のリリースノート」「直近の四半期実績」には答えられない。そこにリアルタイムのWebグラウンディングが必要になる。

また、規制が厳しい業界や本番運用を見据えたプロダクト開発において、回答にソースURLとタイトルを付与できることは大きい。「概念実証」と「出荷可能なプロダクト」の差になると記事は指摘している。


LLMの「知識の鮮度問題」をWebグラウンディングで解決する

LLMはトレーニング時点でデータが凍結されているため、最新情報に関する質問に対して自信満々に間違った回答を返す。これが「ハルシネーション」と「データの陳腐化」という2つの失敗パターンだ。

Webグラウンディングは、クエリ実行時にリアルタイムのWeb情報をモデルに供給することでこの問題に対処する。モデルが「記憶から推測する」のではなく「ソースを引用して答える」状態に変わる。


従来の実装パイプラインの問題点

多くのチームはWebグラウンディングを以下の4ステップで実装している。

  1. Search APIを叩いてリンクを取得
  2. PlaywrightやPuppeteerなどのヘッドレスブラウザで各ページをフェッチ
  3. カスタムHTMLパーサとregexでマークアップをクリーニング
  4. テキストをチャンク分割してエンベディング

このパイプラインはレイテンシ・コスト・保守コストを積み上げるだけでなく、ナビゲーションバンや広告などのボイラープレートがトークン数を増やし、推論コストを圧迫する。


1回のAPI呼び出しで完結するLLM Contextエンドポイント

Brave Search APIのLLM Contextエンドポイント(/llm/context)は上記パイプライン全体を単一のAPI呼び出しに集約している。検索・コンテンツ抽出・チャンク分割・関連度ランキングをまとめて処理し、プロンプトに直接注入できる状態のテキスト・テーブル・コードを返す。

主なパラメータは以下の3つだ。

  • maximum_number_of_tokens(1024〜32768):返却するコンテキスト量を上限制御し、プロンプトのトークン予算を守る
  • context_threshold_mode(strict / balanced / lenient):低関連度コンテンツを自動的に除外
  • goggles:特定ドメインのブーストや除外をインラインで設定(後処理不要)
import requests

url = "https://api.search.brave.com/res/v1/llm/context"
headers = {
    "Accept": "application/json",
    "X-Subscription-Token": "YOUR_BRAVE_API_KEY",
}
params = {
    "q": "How to implement asyncio in Python 3.12",
    "maximum_number_of_tokens": 4096,
    "context_threshold_mode": "strict",
    "goggles": "$discard,site=pinterest.com\n$discard,site=quora.com",
}

resp = requests.get(url, headers=headers, params=params)
data = resp.json()

# grounding.generic に抽出済みスニペットが格納されている
context = "\n\n".join(
    f"{item['title']} ({item['url']}):\n" + "\n".join(item["snippets"])
    for item in data["grounding"]["generic"]
)

# sources はURL別のメタ情報。引用の付与に使う
for source_url, meta in data["sources"].items():
    print(source_url, "—", meta.get("title"))

レスポンスはgrounding(本文コンテンツ)とsources(URLキーのメタデータ)に分離されており、引用の実装はsourcesをそのまま使うだけで済む。


OpenAI SDKをそのまま使えるAnswersエンドポイント

既存のOpenAIクライアントをそのまま流用したい場合、Answersエンドポイントが使える。base_urlを変更してmodel="brave"を指定するだけで、既存のチャットボットにリアルタイムWeb検索が加わる。

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_BRAVE_API_KEY",
    base_url="https://api.search.brave.com/res/v1",
)

stream = client.chat.completions.create(
    model="brave",
    messages=[
        {"role": "user", "content": "What were the major updates in the latest PyTorch release?"}
    ],
    stream=True,            # 引用にはstreamingが必須
    extra_body={"enable_citations": True},
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

注意点として、引用機能はstream=Trueが必須。引用はストリームされる各デルタのcontentフィールドにJSON形式でタグ付けされて流れてくる。具体的には、引用箇所が[{"url": "...", "title": "..."}]形式のJSONブロックとして本文テキストに埋め込まれる形式であり、ストリームを受け取りながらこのブロックを検出・分離する処理が実装側で必要になる。詳細なスキーマと処理例はAnswersドキュメントを参照のこと。


エージェント・MCP・各フレームワークへの統合

AIエージェントの文脈では、Webグラウンディングは「ツールコール」として機能する。エージェントが新鮮な情報を必要と判断したとき、検索エンドポイントを呼び出して結果を推論に使う。

公式のBrave Search MCPサーバーを使えばModel Context Protocol(MCP)対応クライアントから直接Webグラウンディングをツールとして使える。LangChainおよびLlamaIndex向けの統合も用意されている。


従来スタックとの比較

タスク 従来のグラウンディングスタック Brave Search API
検索 サードパーティAPIまたはスクレイパー 独自Webインデックス(※Brave自社の主張による)
抽出 ヘッドレスブラウザ(Puppeteer / Playwright) 組み込みスマートチャンキング(/llm/context)
クリーニング カスタムHTMLパーサ・regex 整形済みテキスト・テーブル・コード
リランキング ベクターDB + エンベディングモデル インラインGoggles + 閾値モード
レイテンシ 高(複数サービスの直列処理) 低(シングルAPI呼び出し)

インデックスの独立性とプライバシー

Braveは400億ページ以上の独自Webインデックスを保有しており、Big Tech以外でこのスケールを持つのは数少ない。他エンジンの結果を再販しているプロバイダーとは異なり、クローラーからAPIエンドポイントまでスタック全体を自社で運営している。

プライバシー面では、標準プランではクエリ記録を最大90日間保持(課金・トラブルシューティング・不正防止に限定利用)。エンタープライズ向けにはZero Data Retention(ZDR)オプションもあり、クエリが一切保持されないアーキテクチャを選択できる。

APIキーの取得と月額5ドル分の無料クレジットからトライアルを始められる。

詳細はAI web grounding: how to ground your LLMs and agents in live web dataを参照していただきたい。