BLOG

ブログ

langgraphによるaiエージェント構築

背景

 2025年はまさに「AIエージェント元年」と呼ぶにふさわしく、数多くのAIエージェントサービスが登場しています。例えば、AIエンジニアエージェント「Devin」はスタートアップやメガベンチャーを中心に、すでに実務の現場で広く利用されています。

近い将来、企業のみならず個人までもがAIエージェントを所有し、エージェント同士が直接取引するような構想すら現実味を帯び始めています。こうした展望の中、各事業体は自社独自のAIエージェント構築、あるいはAIエージェントが利用しやすいサービスインターフェースの設計といった選択を迫られています。この選択を誤れば、時代に取り残され、長期的な競争優位性を失うことにもなりかねません。

こうした背景から、現場レベルでもAIエージェントに対する理解が必要不可欠となってきています。本記事では、AIエージェントの基本系であるReActエージェントを実際に構築して、その仕組みや実装上の要点を紹介します。

ReActエージェントの概要

 ReAct(Reasoning and Acting)エージェントとは、大規模言語モデル(LLM)を用いて論理的な推論(Reasoning)と具体的な行動(Acting)を繰り返し実行し、問題解決やタスクの達成を目指す基本的なAIエージェントフレームワークです。

ChatGPT-3のような旧世代のLLMモデルが単発の質問応答や推論のみを行うのに対し、ReActエージェントは、推論と行動を明示的に切り分け、それらを交互に繰り返すことでより複雑で実用的なタスクを処理可能にしています。

ReActエージェントの仕組み

ReActエージェントは以下のプロセスを繰り返します。

  1. Reasoning(思考)
    • 現在の状況と取りうる選択肢を整理し、何を行うべきかを論理的に考察します。
    • 取りうる選択肢としては、ユーザーに返答する、利用可能なツールを利用してActingを行う、Reasoningを繰り返し行うの3つがあります。
  2. Acting(行動)
    • Reasoningで決定した行動を実際に実行します。
    • 具体的にはWeb検索、データベース検索、API呼び出しなどのツールが一般的です。
  3. Observation(観察)
    • 行動の結果を観察し、新たな情報として取得します。
    • この観察結果を次のReasoningに利用します。

このReasoning→Acting→Observationのサイクルを繰り返しながら最終的な目標を達成します。

また、利用可能なツールはエージェント本体とは別に用意する必要があるため、開発者は用途に応じでどのようなツールが必要になるか考慮してツールの開発も行う必要があります。

他のエージェントフレームワークの紹介

ReActエージェント以外にも、以下のようなAIエージェントフレームワークがあります。

  • BabyAGI: タスクを細分化して自己生成的に目標を設定し、エージェント自らがタスクを自動的に推進。
    • 例えば、「マーケティングレポート作成」という大きなタスクを、「データ収集」「分析」「レポート執筆」という細かいタスクに分割し、自動的に処理を進めることができます。
  • MetaGPT: エージェント同士が役割を分担しながら協調してタスクを進めるコラボレーション型エージェント。
    • 例えば、エージェントが「プロダクトマネージャー」「エンジニア」「デザイナー」などの役割を持ち、共同でプロジェクトを推進することができます。

これらのフレームワークはそれぞれ異なる特徴を持ちますが、構造を分解していくといずれもReActエージェントに類似した最小構造から成っています。こうした発展的なエージェントフレームワークを理解する上でも、まずはReActエージェントに慣れていることが重要な基礎となります。

ReAct Agentのアーキテクチャー

(Using LangChain ReAct Agents with Qdrant and Llama3 for Intelligent Information Retrieval)

ReActエージェントの実装

それでは実際にReActエージェントを実装してみます。今回はWeb検索で天気の確認を行ってもらう簡単な例と、企業の求人ニーズを自律的に深掘りする発展的な例を作ってみます。

天気の確認の例

まずはReActエージェントを構築します。

ReActエージェントは構造が比較的単純であるため、ノードやエッジを具体的に定義してスクラッチで構築することもそれほど難しくありません。

しかし、LangGraphのcreate_react_agentを利用するとさらに簡単にReActエージェントのインスタンスを定義することができます。

ここではTavilySearchResultsをツールとしてReActエージェントに渡している点と、MemorySaverによってthreadごとに会話の履歴を管理している点にご注目ください。

import os

from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.prebuilt import create_react_agent

# ReActエージェントの構築
memory = MemorySaver()
model = ChatOpenAI(model='gpt-4o-mini', api_key=os.getenv('OPENAI_API_KEY'))
search = TavilySearchResults(max_results=5, tavily_api_key=os.getenv('TAVILY_API_KEY'))
tools = [search]
agent_executor = create_react_agent(model, tools, checkpointer=memory)

# エージェントラッパーの作成
def create_agent_thread(thread_id):
  """スレッドごとにエージェントを作成"""
  config = {"configurable": {"thread_id": thread_id}}
 
  def invoke_stream(message):
      input_data = {"messages": [HumanMessage(content=message)]}
      stream_output = agent_executor.stream(
          input=input_data,
          config=config,
          stream_mode="values",
      )
      for step in stream_output:
          step["messages"][-1].pretty_print()
      return stream_output
 
  return invoke_stream

実際にエージェントを実行してみます。

agent = create_agent_thread("thread_1")
agent(message = "私の名前は太郎です。東京に住んでいます。よろしくね")
================================ Human Message =================================

私の名前は太郎です。東京に住んでいます。よろしくね
================================== Ai Message ==================================

こんにちは、太郎さん!東京に住んでいるんですね。何か特別にお話ししたいことや質問があれば、お気軽にどうぞ!よろしくお願いします。

通常のLLMとの会話のような返答が返ってきました。挨拶をしただけなのでWeb検索が実行されていませんが、これは予想通りの挙動です。

次に、明日の天気を尋ねてみます。この回答にはWeb検索が必要となるはずです。

agent(message = "私の住んでいるエリアの明日の天気はどうなるかな?")
================================ Human Message =================================

私の住んでいるエリアの明日の天気はどうなるかな?
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_uifVezzfJUQCJalmZKCzXaMF)
Call ID: call_uifVezzfJUQCJalmZKCzXaMF
  Args:
    query: 東京 明日 天気予報
================================= Tool Message =================================
Name: tavily_search_results_json

[{“url”: “https://www.toshin.com/weather/detail?id=66124”, “content”: “…今日\n2025年\n2月8日(土)\n9℃/1℃\n0%\n明日\n2025年\n2月9日(日)\n11℃/2℃\n0%\n今日から2週間分まで先の予報が時間ごとに見られます。\n1時間予報\n今日から1ヶ月先、1ヶ月以上先の予報が見られます。\n90日間予報\n14日間の天気日付をクリックすると、1時間ごとの天気やその日の詳細が見られます。\n日付\n天気\n最高気温\n最低気温\n降水確率\n8(土)\n9℃\n1℃\n0%\n9(日)…”}, {“url”: “https://www.nhk.or.jp/kishou-saigai/pref/weather/tokyo/”, “content”: “発表:気象庁 17時\n天気概況東京都\n西日本から東日本は、高気圧に覆われています。…}]
================================== Ai Message ==================================

明日の東京の天気予報は、以下の通りです:

**日付**: 2025年2月9日 (日)
**天気**: 晴れのち曇り
**最高気温**: 11℃
**最低気温**: 2℃
**降水確率**: 0%

全体的に穏やかな天気のようですが、夜にかけて曇りがちになる予想です。特に雨の心配はなさそうです。元気に1日をお過ごしください!

詳しい情報は [こちら](https://www.toshin.com/weather/detail?id=66124) でも確認できます。

実際にWeb検索が行われたことが確認できます。

以下のような実行の流れになっているようです。

①ユーザーの入力を受け取る

②ツールの実行とツール実行のパラメタを決定。Reasoningに対応します。ここでは「東京 明日 天気予報」という検索クエリが自律的に決定されました。

③ツールを実際に実行。Actingに対応します。

④ツール実行の結果を元にユーザーへの返答を決定。ObservationとReasoningに対応します。

また、注目に値する点としては「私の住んでいるエリア」という入力の意図を前回の会話をもとに「東京」と判断している点です。こうした便利な機能がこの行数で実装できてしまうのは大きな驚きです。

求人ニーズ調査の例

次に、企業の求人ニーズを自律的に深掘りする発展的なユースケースを実装してみます。これは実用性を意識した例で、例えばSES会社が営業先リストを作成する際のプロセスとして利用できるかもしれません。

実装とはいっても、ReActエージェント自体はすでに定義できているので、実はプロンプトの調整を行うだけで完了してしまいます。

以下のプロンプトでは調査に必要となる具体的なステップと、そのステップを必要に応じて繰り返す指示を与えています。

ここでは例として東急電鉄株式会社様における生成AIエンジニアの採用ニーズについて調査してみます。(筆者が東急沿線沿いで日頃お世話になっているので東急電鉄株式会社様を例に採用しました。)

company_hiring_search_message = """
あなたはプロの求人調査エージェントです。
ユーザーが入力した企業名について、生成AIエンジニア職の求人と関連事業部の情報を調査してください。
以下の手順に従ってください。

# ステップ
1. 「<企業名> 生成AIエンジニア 正社員」などのキーワードでWeb検索を行ってください。
2. 検索結果から最大3件まで、求人サイトの正社員求人ページのURLを抽出してください。
3. それぞれの求人ページのURLを読み込み、次の情報を抽出してください:
  - ポジション名(明記されていれば)
  - 求人概要(主な業務内容や必要スキル)
4. 事業内容から募集の背景を調査してください。
  - 求人内に「部署名」や「事業部」の情報が含まれていれば、その事業部について別途検索し、事業内容を要約してください。
  - 求人内に「部署名」や「事業部」の情報が含まれていない場合は、全社的な生成AI関連の取り組みについて別途検索し、内容を要約してください。
5. 求人情報や事業内容について、十分な情報が得られるまで繰り返し調査してください。
6. 以下の形式で求人ごとに結果をまとめてください(求人が複数ある場合は繰り返してください):

# 出力形式
- ポジション名:
- 求人URL:
- 求人概要:
- 事業部・生成AI事業概要:
- 事業概要URL

# 制約
- Web検索やURL要約などの外部ツールの使用は、合計で最大10回までにしてください。

企業名:  {company_name}
"""
agent = create_agent_thread("thread_2")
agent(message = company_hiring_search_message.format(company_name="東急"))

実行結果は非常に長くなっているため一部省略しています。

以下のような実行の流れになっているようです。

①ユーザーの入力を受け取る

②ツールの実行とツール実行のパラメタを決定。「東急 生成AIエンジニア 正社員」という検索クエリが生成されました。

③次のツールの実行を決定。「東急 データサイエンティスト 生成AI」と検索して事業内容を確認しているようです。

④事業内容の収集結果を不十分と判断して追加で検索をしています。「東急 生成AIエンジニア job description」、「東急 事業部 生成AI」のふたつのクエリで検索しています。

⑤ツール実行の結果を元にユーザーへの返答を決定。具体的な求人ニーズと対応業務の領域を返答しています。

このように、適切な指示をプロンプトとして与えることでReActエージェントはツールを活用した自律的なタスクの遂行が行えるようになります。

================================ Human Message =================================

あなたはプロの求人調査エージェントです。

企業名:  東急

================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_lJfSITQz9fqhlnUpZ9t14aJc)
Call ID: call_lJfSITQz9fqhlnUpZ9t14aJc
  Args:
    query: 東急 生成AIエンジニア 正社員
================================= Tool Message =================================
Name: tavily_search_results_json

[{“url”: “https://xn--pckua2a7gp15o89zb.com…”, “content”: “正社員 年休120日~. データサイエンティスト・生成系AIエンジニア. 東急池上線 – 東京都 大田区 蓮沼駅; 月給26万円~50万円 / 賞与あり・昇給あり. とりあえずキープする”}, {“url”: “https://hrmos.co/pages/kakakucom/jobs/1014365”, “content”: “募集要項. 職種 / 募集ポジション名: 生成AIエンジニア/テックリード/プロダクトマネージャー 【AIトランスフォーメーション推進部】; 雇用形態: 正社員 … 東急東横線「”}…]
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_dNMRI771k6h0nuUWoyMNrtMi)
Call ID: call_dNMRI771k6h0nuUWoyMNrtMi
  Args:
    query: 東急 データサイエンティスト 生成AI
================================= Tool Message =================================
Name: tavily_search_results_json

[…, {“url”: “https://nobdata.co.jp/report/conference_summary/03/”, “content”: “…こちらは東急株式会社によるtoCや社内向けのサービスである「TsugiTsugi」に、生成AIを導入して新機能を追加した際の事例を紹介いただきました。講演の概要としてはサブタイトルにもあるように、生成AIには完璧な回答は求めずに、多少の誤差は許容してもらえるようなUIの作成やリスクマネジメントを行ったというものでした。…}, {“url”: “https://ai-ready-education.org/keynote/”, “content”: “データサイエンティストのネットワークを構築し、日本企業に対して最新のAI戦略提案からAI開発まで一貫したAI支援を提供。 東急ホテルズ&リゾーツ株式会社が擁する3名のDX”}]
================================== Ai Message ==================================
Tool Calls:
  tavily_search_results_json (call_HbHWaiilLgy6XtlIkLtpcguF)
Call ID: call_HbHWaiilLgy6XtlIkLtpcguF
  Args:
    query: 東急 生成AIエンジニア job description
  tavily_search_results_json (call_WbFk4Xxzh5XcsGu65wPreb1J)
Call ID: call_WbFk4Xxzh5XcsGu65wPreb1J
  Args:
    query: 東急 事業部 生成AI
================================= Tool Message =================================
Name: tavily_search_results_json

[{“url”: “https://www.arsaga.jp/work/tokyu-livable-generative-ai-system/”, “content”: “「TOKYU LIVABLE Generative AI System」は、生成AIを活用し、SNS投稿用の文章作成業務を支援する社内向けシステムです。2024年11月より、本システムの運用を開始しました。…}, {“url”: “https://aismiley.co.jp/ai_news/tokyu-exabase-ir-assistant-generativeai/”, “content”: “東急は、Exa Enterprise AIの「exaBase IRアシスタント」を導入しました。IR担当者の業務DXを推進し、より付加価値の高い情報開示の体制実現を図り”}, ================================== Ai Message ==================================

以下に、東急の生成AIエンジニア職に関する求人情報と関連事業概要をまとめました。

### 求人情報

1. **ポジション名:**
  生成AIエンジニア / テックリード / プロダクトマネージャー

  **求人URL:**
  [求人ページリンク](https://hrmos.co/pages/kakakucom/jobs/1014365)

  **求人概要:**
  – AIトランスフォーメーション推進部での職務です。
  – 生成AIの開発及び導入、関連システムの設計・実装。
  – 必要スキル: 機械学習、データサイエンス、Python、API設計。

  **事業部・生成AI事業概要:**
  – AIトランスフォーメーション推進部は、東急のDX推進を担う部署で、生成AIを利用した新たなビジネスモデルの創出を目指しています。

  **事業概要URL:**
  [東急の事業概要ページ](https://www.tokyu.co.jp/corporate/)

2. **ポジション名:**
  データサイエンティスト・生成系AIエンジニア

  **求人URL:**
  [求人ページリンク](https://xn--pckua2a7gp15o89zb.com/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88-%E6%AD%A3%E7%A4%BE%E5%93%A1%E3%81%AE%E4%BB%95%E4%BA%8B-%E6%9D%B1%E6%80%A5%E6%9D%B1%E6%A8%AA%E7%B7%9A)

  **求人概要:**
  – ビッグデータを基にした分析業務及び生成AIシステムの開発。
  – 必須条件: データ分析業務経験、論理的思考力。

  **事業部・生成AI事業概要:**
  – デジタルテクノロジー部門で、AIによる業務改善と新サービスの開発を進めています。

  **事業概要URL:**
  [東急のデジタル戦略ページ](https://www.tokyu.co.jp/strategy/digital/)

これらの求人は、生成AIに関連した事業活動を強化するための人材を求めており、東急はデジタルトランスフォーメーションを推進するために、生成AI技術を駆使した新たな製品開発や業務改善を行っています。

まとめ

本記事ではLangGraphを用いてReActエージェントを実装しました。非常に短いコードでエージェントの実装が可能であることを示し、プロンプトの工夫次第で高度な挙動を実現できることを解説しました。ReActエージェントは様々なAIエージェントモデルの基礎となるものであり、本記事がより複雑なモデルへの理解や、実際のAIエージェントサービス開発への挑戦につながる礎となれば幸いです。

参考リンク

SinkCapitalではデータに関する支援を行っています

弊社はスペシャリスト人材が多く在籍するデータ組織です。 データ分析や分析基盤の設計などでお困りの方がいらっしゃれば、 まずは無料で、こちらから各分野のスペシャリストに直接相談出来ます。