機械学習
記事内に商品プロモーションを含む場合があります

LangChainでWeb検索エージェントを構築する方法(ローカルLLM + Tavily)

Aru

通常のLLMは学習済みの過去データに依存するため、最新情報への対応が苦手です。本記事では、LangChainのエージェント機能とTavily検索APIを組み合わせ、Web検索を活用して最新情報に回答できるAIを構築する方法を解説します。ローカルLLM(LM Studio)を利用することで、APIコストをかけずに実験・開発できる点も特徴です。

あわせて読みたい
LM StudioにWebアクセス機能を追加!|MCPホスト機能活用ガイド
LM StudioにWebアクセス機能を追加!|MCPホスト機能活用ガイド

ここで作成するプログラム

ここで作成するプログラムは、

「LangChainを使って、Web検索用のツールを呼び出し、その検索結果を使って回答する」

エージェントです。

本記事では、ローカルLLMとTavilyを組み合わせてWeb検索を行う方法を解説します。 ローカルLLMを利用してテストすることには、以下のようなメリットがあります。

ローカルLLMを使うメリット
  • 多様なモデルを手軽に試せる
    LMStudioを使えば、GemmaやQwenなど様々なオープンモデルを簡単にダウンロードして切り替えられるため、モデルごとの精度の違いをテスト出来ます
  • APIコストが無料
    OpenAIやAnthropicなどの商用APIと違い、何度実行してもLLMの利用料がかかりません。プロンプトの調整など、試行錯誤が多い実験には最適です。
  • 機密性が高い
    プロンプトに入力した情報はご自身のPC内で処理されるため、意図せず外部のAIサーバーにデータが学習されたり送信されたりする心配がありません
    ※ただし、今回はWeb検索を行うため、検索キーワード自体はTavilyのAPIへ送信されます)。

ここでは、LangChainを使った基本的な手順に絞ったシンプルなコードを紹介します。

Tavilyの設定

Tavilyとは

Tavilyは、LLM(大規模言語モデル)やAIエージェント向けに設計された検索APIです。

一般的なWeb検索APIよりも、AIが回答を生成しやすい形で検索結果を返してくれるのが特徴です。

Tavilyには、無料枠が1000クレジット分あり、よほど使わない限り、個人がちょっとした実験を行うには十分なクレジット量です。検索に対して2クレジット消費しますが、500回は検索できることになります(毎月リセットされます)

アカウントの作成

  1. Tavilyの公式サイト(https://tavily.com/)にアクセスします
  2. アカウントを作成していない場合は、「Sign Up」のボタンをクリックしてアカウントを作成します
    • Googleなどのアカウントでログイン、または、メールアドレスでアカウントを作成できます

キー(KEY)の取得

  1. ログイン後、Overviewの画面に移動します
  2. 画面上にある「API Keys」のセクションを確認します
  3. デフォルトで作成されているAPIキーをコピーするか、「+」を押して、新しく生成し、キーをコピーします(ここでコピーしたキーはプログラム内で使用します)。
tavilyの画面、APIキーは”*”でマスクされています。

ローカルLLMの設定

LMStudioの起動

今回はローカルでLLMを動かすために「LMStudio」を使用します。

  1. LMStudioを起動し、使用したいモデル(今回は google/gemma-4-26b-a4b を使用しています)をダウンロード・ロードしておきます。
  2. 左側のメニューから「Developer(アイコン)」を開きます。
  3. 「Status: 」の部分のトグルスイッチをクリックしてAPIサーバーを起動します
    (デフォルトでは http://localhost:1234/v1 で起動します)
  4. 「+Load Model」ボタンを押して、モデルをロードします。

LangChainを用いたプログラム

今回作成するプログラムでは、LangChainの強力な機能である「エージェント(Agent)」を構築します。

通常のLLMは事前に学習したデータ(過去の知識)のみに基づいて回答しますが、LangChainのエージェント機能を使うと、LLMに「ツール(今回はTavilyによるWeb検索)」を与え、いつ、どのようにそのツールを使うかをLLM自身に判断させることができます。

これにより、
「ユーザーの質問を理解する」
  →「最新情報が必要か判断し、必要ならWeb検索ツールを実行する」
   →「検索結果を読み解く」
    →「最終的な回答を生成する」
という、自律的なリサーチアシスタントのような動作を実現できます。

なお、今回作成するのは、単一のエージェントがツールを使ってタスクをこなす基本的な構成です。複数のエージェントが連携して複雑な処理を行うようなものではありませんが、LangChainのエージェント機能の基礎を学ぶに十分な構成です。

今回のコードでは、langchainはバージョン1.2.17を利用しています。バージョンが異なると、動かない可能性があります。バージョンのチェックには、以下のコードを実行します

import langchain
print(langchain.__version__) 

ライブラリのインストール

必要なLangChain関連のパッケージをインストールします。ターミナル(コマンドプロンプト)で以下のコマンドを実行してください。

pip install langchain langchain-community langchain-core langchain-openai langchain-tavily

コード

以下のコードが全体像です。your-tavily-api-key の部分は、先ほどTavilyのダッシュボードで取得したAPIキーに書き換えてください。

また、model_nameは、利用するモデル名に合わせてください。以下のコードでは、gemma-4-26b-a4bを設定しています。

import os
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain.agents import create_agent

# Tavilyのキーを設定(検索は外部APIで行うため必須です)
os.environ["TAVILY_API_KEY"] = "your-tavily-api-key"

# 1. ツールの準備
# 最大3件の検索結果を取得するツールとして設定
tools = [TavilySearchResults(max_results=3)]

# 2. LLMの準備 (LM Studio)
llm = ChatOpenAI(
    base_url="http://localhost:1234/v1", 
    api_key="not-needed", # ローカルLLMのためダミーでOK
    model_name="google/gemma-4-26b-a4b", # ロードしているモデル名に合わせてください
    temperature=0
)

# 3. プロンプトの定義
system_message = "あなたは優秀なリサーチ助手です。最新の情報が必要な場合はツールを使用して調査してください。"

# 4. エージェントの構築
agent_executor = create_agent(model=llm, tools=tools, system_prompt=system_message)

# 5. 実行
try:
    # ユーザーからの質問を定義
    msg = "今日の福岡の天気と、それに合わせたおすすめの服装、さらに近くで開催されているイベントを教えて"
    
    # エージェントを実行して回答を取得
    response = agent_executor.invoke({"messages": [("user", msg)]})
    
    # 結果の表示
    print(response["messages"][-1].content)
except Exception as e:
    print(f"エラー: {e}")

コードの解説

1. ツールの準備

TavilySearchResults(max_results=3) で、Tavilyを使った検索ツールを初期化しています。max_results を指定することで、取得する検索結果の件数を制限できます。

tools = [TavilySearchResults(max_results=3)]

2. LLMの準備

ChatOpenAI クラスを使用していますが、接続先(base_url)をLMStudioのローカルサーバー(http://localhost:1234/v1)に変更しています。これにより、OpenAIのAPIと同じ使い勝手でローカルLLMを操作できます。APIキーは不要なのでダミーの文字列を入れています。

llm = ChatOpenAI(
    base_url="http://localhost:1234/v1", 
    api_key="not-needed", # ローカルLLMのためダミーでOK
    model_name="google/gemma-4-26b-a4b", 
    temperature=0
)

3. プロンプト設定

システムプロンプト(system_message)で、AIに対して「リサーチ助手であること」「必要に応じてツールを使うこと」を指示しています。

system_message = "あなたは優秀なリサーチ助手です。最新の情報が必要な場合はツールを使用して調査してください。"

4. エージェントの構築

create_agent を使い、設定した「LLM」「ツール」「システムプロンプト」を組み合わせて、自律的に思考してツールを使用できるエージェントを構築します。

agent_executor = create_agent(model=llm, tools=tools, system_prompt=system_message)

エージェントの構造は以下のようなシンプルなものになります。

グラフは以下のようなコードで出力可能です。

agent_executor.get_graph().draw_mermaid_png(output_file_path="graph.png")

5. 実行

agent_executor.invoke にユーザーのメッセージを渡し、エージェントを実行します。エージェントは入力された質問の意図を分析し、自身の知識で回答可能か、あるいは最新情報が必要かを自律的に判断します。情報不足と判断した場合にのみTavilyでWeb検索を行い、得られた検索結果を整理・統合した上で、ユーザーにとって分かりやすい最終的な回答を生成して出力します。

try:
    # ユーザーからの質問を定義
    msg = "今日の福岡の天気と、それに合わせたおすすめの服装、さらに近くで開催されているイベントを教えて"
    
    # エージェントを実行して回答を取得
    response = agent_executor.invoke({"messages": [("user", msg)]})
    
    # 結果の表示
    print(response["messages"][-1].content)
except Exception as e:
    print(f"エラー: {e}")

ここでは、質問をプログラムに埋め込んでいますが、msgを引数などで外部から与えるようにすることで、内容に応じて応答するように変更できます。

実行結果

実際に実行してみた結果の出力例です。(※検索結果に基づいた出力のため、実行するタイミングによって内容は変化します)

出力結果(Markdown形式)

今日(2024年5月23日)の福岡の天気、おすすめの服装、および開催中のイベント情報をお伝えします。

🌤️ 今日の福岡の天気と服装

※検索結果に基づいた現在の予報です。

  • 天気: おおむね晴れの予報です。
  • 気温: 最高気温は20℃〜23℃前後、最低気温は13℃〜15℃程度となる見込みです。
  • おすすめの服装:
    • 日中は過ごしやすいですが、朝晩は少し肌寒く感じることがあります。
    • 「長袖シャツ」や「パーカー・スウェット」など、脱ぎ着しやすい羽織りものがあると安心です。
    • 紫外線レベルが「普通〜やや強い」予報が出ているため、日焼け対策も忘れないようにしましょう。

🎡 福岡周辺で開催中のイベント情報

現在、福岡市内や近郊で楽しめるイベントをいくつかピックアップしました。

  1. 博多町家思い出図画展(博多町家ふるさと館)
  • 内容: 昔の博多の風景や暮らしを描いた作品が展示されています。
  • 期間: 〜6月20日(木)まで開催中。
  • 場所: 博多旧市街エリア
  1. 博多人形節句人形展(はかた伝統工芸館)
  • 内容: 端午の節句に合わせ、個性豊かな博多人形の展示・販売が行われています。
  • 期間: 〜5月6日(水)まで(※終了間近のため、もし行かれる場合はお早めに!)
  1. 【注目】呑山観音寺 バラまつり(篠栗町)
  • 内容: 約350本のバラが咲き誇る美しい庭園「花筵庭」が特別公開されます。蚤の市(観音市)も併設されています。
  • 期間: 5月23日(土) 〜 6月14日(日)
  • 場所: 福岡県糟屋郡篠栗町
  1. 九州芸文館 コレクション展「Fashion」(筑後市)
  • 内容: ファッションをテーマにした、芸術的なコレクション展示です。
  • 期間: 5月23日(土) 〜 6月14日(日)
  • 場所: 九州芸文館

お出かけの際は、気温の変化に合わせて調節しやすい服装で、ぜひ楽しんできてくださいね!

まとめ

本記事では、LangChainとTavily、そしてLMStudioを組み合わせることで、Web上の最新情報を自律的に取得し、的確に回答するAIエージェントを非常に簡単な手順で作成できることを確認しました。通常のLLMが抱える「学習データが古い」「ハルシネーション(事実に基づかない嘘をつくこと)を起こしやすい」といった弱点も、検索ツールと連携させることで効果的に補うことができます。

さらに、LMStudioを利用してローカル環境でLLMを稼働させているため、OpenAIなどのAPI利用料を一切気にすることなく、完全無料で開発を進められる点は大きなメリットです。コストゼロで何度でもプロンプトの微調整を行ったり、異なるオープンソースモデルの比較検証を納得いくまで繰り返すことができます。

今回はWeb検索のみをツールとして持たせましたが、LangChainを使えば社内ドキュメントの検索機能や、複雑な計算を行うツールなど、後から様々な機能を追加していくことも容易です。ぜひ本記事のコードをベースに、自分好みにカスタマイズした専用のリサーチアシスタントを作成し、多様なタスクに挑戦してみてください。

社内ドキュメントを利用する例
LangChainのFaissを活用した近似最近傍探索の手順を解説
LangChainのFaissを活用した近似最近傍探索の手順を解説

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中 保有資格:CFP, マンション管理士、管理業務主任、宅建士など
記事URLをコピーしました