AI専用の独自「Google検索」を構築:SearXNGとLangChainを組み合わせて知識の限界を超える

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

LLMの壁:AIが「今」何が起きているかを知らない時

AIソリューションを導入して半年、私は大きな問題に直面しました。GPT-4やClaudeがいかに賢くても、過去のデータに縛られている(ナレッジカットオフ)という点です。もし今朝8時のビットコインの価格や、リリースされたばかりのNext.js 15の変更点について尋ねれば、AIは「推測」を始めるか、回答を拒否してしまいます。

これを解決するには、RAG(検索拡張生成)の仕組みをグローバルな規模で適用する必要があります。数個のPDFファイルに限定するのではなく、SearXNGを通じてAIにGoogle、Bing、DuckDuckGoへのアクセス権を与えます。これにより、プライバシーを確保しながら、AIを常に最新の状態に保つことができます。

AIプロジェクトにはどの検索APIを選ぶべきか?

私はいくつかの方法を試しました。検討に役立つ実際の比較表を以下に示します。

  • Google/Bing Search API: 費用がかなり高く、1,000クエリにつき約5ドルかかります。Cloud Consoleでの登録手続きも非常に煩雑で、検索データが大手企業に収集されてしまいます。
  • Tavily / Exa.ai: AI向けに最適化されているため、結果は非常にクリーンです。しかし、無料プランは月間1,000リクエストまで。本番環境で動かす場合、コストが大きな課題になります。
  • SearXNG (最適な選択肢): オープンソースのメタ検索エンジンです。Dockerでセルフホストでき、APIキー不要、検索回数無制限で、データを完全にコントロールできます。

なぜSearXNGはLangChainと相性が良いのか?

SearXNGを選んだ理由は、非常に標準的な JSONデータを返してくれる点にあります。これにより、LangChainは複雑な処理コードを書くことなく、情報を迅速に抽出できます。専用サーバーで実行すると、システムは非常にスムーズに動作します。

最大のメリットはその柔軟性です。もしGoogleがIPをブロックしても、SearXNGは自動的にDuckDuckGo、Qwant、またはBrave Searchから結果を取得するようにルーティングします。システムが中断されることはほとんどありません。

具体的な導入手順

ステップ1:DockerでSearXNGを構築する

自分専用の検索エンジンを構築するのに、わずか2分しかかかりません。まず、docker-compose.ymlファイルを作成します。

version: '3'

services:
  searxng:
    container_name: searxng
    image: searxng/searxng:latest
    ports:
      - "8080:8080"
    volumes:
      - ./searxng:/etc/searxng
    environment:
      - SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml
    restart: always

settings.ymlファイルで、AIが読み取れるようにJSON形式を有効にする必要があります。

search:
    formats:
        - html
        - json
server:
    port: 8080
    bind_address: "0.0.0.0"
    secret_key: "ここにセキュアなキーを入力"

docker-compose up -dコマンドを入力します。localhost:8080にアクセスして検索画面が表示されれば、半分完了です。

ステップ2:LangChainのエージェントに統合する

LangChainにはSearxSearchWrapperが用意されているため、接続は非常に簡単です。以下のコマンドでライブラリをインストールします。

pip install langchain langchain-openai

リアルタイムでWeb検索ができるAIエージェントを作成するためのPythonコードの構造は以下の通りです。

import os
from langchain_community.utilities import SearxSearchWrapper
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, Tool, AgentType

os.environ["SEARXNG_URL"] = "http://localhost:8080"

# 検索ツールの初期化
search = SearxSearchWrapper(searx_host=os.environ["SEARXNG_URL"])
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="現在の出来事やインターネット上の最新情報について回答する必要がある場合に使用します。"
    )
]

# GPT-4を使用、または完全にローカルで実行するためにOllamaに置き換え可能
llm = ChatOpenAI(temperature=0, model="gpt-4-turbo")

agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, 
    verbose=True
)

response = agent.run("今日のSJC金価格はいくらですか?昨日と比較してどう変動しましたか?")
print(response)

6ヶ月間の運用から得た貴重な教訓

システムを実環境で安定して動作させるために、以下の4つの重要なポイントに注意してください。

1. レスポンス時間の制御

複数のソースからデータを収集するため、SearXNGのレスポンスが遅くなることがあります。タイムアウトを10〜15秒程度に設定することをお勧めします。特定の検索エンジンに問題が発生した際に、エージェントが無限待機状態に陥るのを避けるためです。

2. 入力データの「ノイズ除去」

インターネットは不要な情報であふれています。settings.ymlファイルで、Reddit、Wikipedia、大手ニュースサイトなどの質の高いソースを優先するように設定してください。データがクリーンであるほど、AIのハルシネーション(幻覚)は減少します。

3. IPブロックへの対策戦略

頻繁にクエリを投げると、GoogleはサーバーのIPをブラックリストに入れる可能性があります。解決策は、ローテーションプロキシを使用するか、単純にGoogleエンジンをオフにすることです。DuckDuckGoやBrave Searchは比較的制限が緩いため、これらを活用しましょう。

4. 要約によるトークンの節約

SearXNGからの結果は非常に長くなることがあり、LLMのコンテキストウィンドウを溢れさせがちです。私は通常、最終的な質問に投入する前に、検索スニペットを500〜1000文字程度に要約するサブプロンプトを使用しています。この方法でAPIコストを40〜60%削減できます。

おわりに

SearXNGで独自のAI検索エンジンを構築することは、コスト削減だけでなく、絶対的なコントロールをもたらします。あなたのシステムは、古い記憶に頼るのではなく、現実世界を観察するための「目」を持つことになります。企業向けチャットボットを開発しているなら、これは間違いなく最も持続可能な方向性です。

Share: