はじめに:AIの「知ったかぶり」を物理的に排除するグラウンディング
LLMは学習データに含まれていない「最新の製品価格」「本日の株価・為替」「最近改定された法律条文」について質問されると、それらしい嘘(ハルシネーション)をもっともらしく答えてしまう性質があります。
この問題を解決するのが「Grounding(グラウンディング=事実の接地)」です。
推論前に検索APIを実行して最新のWebページからスニペットを抽出し、それを根拠情報(Grounding Context)としてLLMに渡すことで、100%正確な事実と引用リンクを出力させます。
1. グラウンディングシステムの設計フロー
[ ユーザーの質問: 「2026年のシマノ新製品リールの定価は?」 ]
│
▼
【1. 検索クエリ生成 (LLM)】
・「シマノ リール 2026 新製品 定価」等の最適キーワードを抽出
│
▼
【2. リアルタイムWeb検索 (SearXNG / Tavily / Google API)】
・上位5件のWebページのタイトル、スニペット、URLを取得
│
▼
【3. グラウンディング・プロンプト組み立て】
・取得した検索結果をコンテキストに挿入
・「必ずコンテキスト内の情報のみに基づいて回答し、引用元URLを添えよ」と指示
│
▼
[ 正確な回答 + 出典リンク一覧の出力 ]
2. Pythonによる実装コード例
import requests
import json
import os
GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
def search_web(query: str):
"""DuckDuckGoまたは検索APIから上位結果を取得"""
# 実装例: SearXNGまたはTavily API
url = f"https://api.tavily.com/search"
resp = requests.post(url, json={"api_key": "YOUR_KEY", "query": query, "max_results": 3})
return resp.json().get("results", [])
def answer_with_grounding(user_question: str):
search_results = search_web(user_question)
context_str = "\n\n".join([
f"【ソース {i+1}】\nタイトル: {r['title']}\nURL: {r['url']}\n内容: {r['content']}"
for i, r in enumerate(search_results)
])
prompt = f"""
以下の検索結果情報のみに基づいて、ユーザーの質問に回答してください。
検索結果に書かれていない情報は絶対に推測して答えないでください。
回答の末尾に、参照したソースの番号とURLを明記してください。
【検索結果】
{context_str}
【ユーザーの質問】
{user_question}
"""
headers = {"Authorization": f"Bearer {GROQ_API_KEY}", "Content-Type": "application/json"}
payload = {
"model": "llama-3.3-70b-versatile",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.1
}
resp = requests.post("https://api.groq.com/openai/v1/chat/completions", headers=headers, json=payload)
return resp.json()["choices"][0]["message"]["content"]
常に変化する現実世界のデータを扱うサービスにおいて、グラウンディングは信頼性を担保するための必須インフラです。