現場で活用するための AI エージェント実践入門

第 1 章 AI エージェントの概要

AI エージェントとは?

AI エージェントとは、目標に向けて環境と相互作用しながらタスクをこなす知能システムです。AI エージェントを代表する特性は自律性と知性です。自律性は人間を介さず独立して自ら判断しタスクを遂行するう性質です。知性は思考能力や理解力、判断能力、知識の適応力の総称的な総称であり、人間らしい振る舞いをすることを重視しています。

AI エージェントの技術的な位置付け

AI エージェントの作り方は学習か、推論か

AI エージェントを以下の二つでわかれます。

  • プロンプトを駆使する推論重視の方式
  • 教師データを用意して LLM を学習させる学習重視の方式

長期的な分析や計画をするタスクは学習の方が精度が良く、推論方針はリアルタイムな情報や社内情報への適用など、新しいタスクに即座に対応する必要がある場合に適しています。
まずは推論方式で作り、多くのユースケースで検証し、ビジネス的に価値があると判断できれば学習データを集めるフェーズに進むのがよい。

LLM から AI エージェントまでの階段

  1. LLM: Web 上のデータから学んだ知識と指定したフォーマットで文章を生成できる
  2. RAG: LLM に足りない知識を補完できるようになる
  3. Tool Use: ツール利用により外部環境とインタラクションできるようになる
  4. AI エージェント: タスク完遂のための計画、事故修正ができる

第 2 章 AI エージェントの構成

AI エージェントはユーザーの指示などから事前に与えられたプロフィール(Profile)に基づき、目標に向けて過去の経験をメモリ(Memory)から参照しながら計画(Planning)し、行動(Action)を行い環境(Environment)に作用します。

プロフィール

AI エージェントが目指す目標やその背景、AI エージェントが担う役割を指します。

目的

  • 役割を明確にしたい
  • 自分の好みに応じた対話を行いたい
  • 複数の視点から物事を考える必要があったり、複数の状態を統合することで精度の向上
  • 批判役やフィードバック役を加え、回答の質を高める

どのようなプロフィールがある?

プロフィール 概要
目標 達成すべきこと、目標に関する背景情報
基本情報 演じるペルソナの基本的な情報(職業、性別、年齢、年収、趣味、国籍など)
心理的特性 キャラクターの性格や行動パターン(社交的、楽観的、野心的など)
社会的関係 エージェントと他のエージェントの社会的関係(上司や部下、他のチームメイトの存在との関係性)
特定の人物・集団 実在する特定の人物や集団(アニメや映画の人物、俳優、歴史上の人物、民族など)
スタイル 話し方、口癖、方言、態度など

## ツール呼び出し

目的

  • 学習の対象から外れた文脈情報(社内情報、最新情など)を考慮したい
  • 正確な論理演算やプログラム実行を行いたい
  • 業務で使用しているソフトウェアを操作したい

設計で気を付けるべきこと

ツールの説明文を詳細に記述する

ツールの役割を詳細に記述するほど、正確なツール選択をが可能になります。「対象行為をどのように行うか(手続き記憶)」と「事実や出来事を言葉で説明する知識(宣言的記憶)」の両側面が必要です。手続き記憶は魚のおろし方、包丁の使い方など、宣言的記憶は包丁は食べ物の調理に使う薄くて平たい刃物などを指す。

ツールは必要最小限にする

ツールを増やせばやすほど

  • 組み合わせのパターンが複雑になり、タスクの達成率が下がる
  • ツールの説明などコンテキストの使用量が増えてしまう

自己修正

目的

  • 人間の介入をなるべく減らし、効率化したい
  • 予想外のことにも強いシステムになってほしい

パターン

内省(Reflection)

LLM が自らが生成した内容をプロンプトに入れ、改善すべきことはないかを評価する方法です。

  • LLM に確信度を出力させる
  • 批判的思考をさせる
  • 理由を説明させる

マルチエージェント討論(Multi-Agent Debate)

複数のモデルが互いに批評や意見交換を行いながら最終的に結論に達する方法。

知識のフィードバック

評価プロンプトに人間が作成した評価基準リストを与えて修正点を見つける方法。

人間からのフィードバック

最終手段として人間によるフィードバックでプロセスを修正する方法。

実装上で気を付けるべきこと

内在的な自己修正は頭打ち

論文では内在的な自己習性には限界があるとされています。自分の過ちに外部のフィードバックなしで気づくことができない。
なるべく外部フィードバックを使いましょう。

コンテンツ作成の自己修正

特にコンテンツ生成の自己修正は感性による部分があるため難しいですが、実用性のある明確な基準があれば評価ができます。

どのくらい自己修正すると良いか

5回まで自己修正を許容した場合が精度が向上したという研究がある。まずは最大3回までの自己修正を設定するのが良い。

いつ自己修正するといいのか

自己修正を入れるほど、回答までに時間がかかるので回答正答率とのトレードオフではある。外部フィードバックが与えられるポイントで自己修正を入れる方がよい。

メモリ

目的

  • 似たようなタスクで精度向上をしたい
  • ユーザーの好みやスタイルを記憶して、パーソナライズしたい
  • プロンプトのコンテキスト管理をしたい

何を保存するのか

人間との対話履歴や AI エージェントの行動履歴から情報を要約・抽出して保存するのを推奨。

マルチエージェント

目的

  • 人間社会のシミュレーションをしたい
  • 目的や機能単位でサブタスクに分割することで、責務が小さくなり複雑な課題解決の性能が向上する

実装上で気を付けるべきこと

いつ適しているのか

まずは解決したい課題の業務プロセスを整理して下さい。意思決定が必要な箇所、ツールを必要とする箇所、作業が分かれる箇所、専門的な知識が必要となる箇所などでサブエージェントに切り出すポイントが見えてくる。

第 3 章 AI エージェントの開発準備

構造化出力(Structured Output)

AI の出力を構造化データとして出力したいケースに利用できる。100% の精度で指定した構造化された出力ができたと報告されている。

response = client.chat.completions.create(
  model="gpt-4o",
  response_format={"type": "json_object"},
  messages=[
    {"role": "system", "content": "あなたは JSON を出力するようにせっけいされた便利なアシスタントです。"},
    {"role": "assistant", "content": '{"winner": String}'},
    {"role": "user", "content": "2020 年のワールドシリーズの優勝者は誰ですか?"}
  ]
)

Prompt Caching

以前に使用した入力トークンを再利用する機能。実行コストやレスポンス速度に大きな影響があるため、積極的に利用する方が良い。

Function Calling

LangChain を用いることで @tool デコレータを使用することで簡単に作成することができる。

@tool(args_schema=AddArgs)
def add(a: int, b: int) -> int:
  """
  この Tool は 2 つの整数を引数として受け取り、それらの合計を返します。

  Args:
    a (int): 加算する最初の整数
    a (int): 加算する 2 つ目の整数

  Returns:
    int: 2 つの整数の合計値

  使用例:
    入力: { "a": 3, "b": 5 }
    出力: 8
  """
  return a + b

どんな引数なのか、どういう返り値なのかを詳細に記述しましょう。

LangGraph によるエージェントワークフローの構築

LLM を活用して、複数のエージェント間で情報をやり取りしながらタスクを進める複雑なワークフローを簡単に構築できます。

第 4 章 ヘルプデスク担当者を支援する

ヘルプデスク業務について知る

ヘルプデスク業務の課題

課題 内容
専門知識の理解 会計・人事などの専門知識が必要
質問の複雑さ ・複数の質問事項を含む
・意図の読み取りに推測が必要
情報収集の困難さ ・情報源が複数存在
・必要な情報への到達が困難
回答品質の担保 ・内容の正確性
・適切な表現の選択

なぜ AI エージェントを用いるのか

専門知識の理解、情報収集、回答品質の確保などは LLM が得意とする分野であるから。複雑な自然言語を理解し、文脈に応じた適切な回答を生成できる能力を持っている。また、大量の情報を効率的に処理し、必要な情報を素早く抽出して整理することも可能です。

Plan-and-Execute 型エージェントについて

概要

まず問題をいくつかの小さいな問題に分割(計画)し、それぞれを個別に解決(行動)していくことで最終的な回答を得る方法です。これは分割統治法と呼ばれ、元の問題を管理しやすい小さな問題に分割し、それぞれの問題を解いて最後に統合することで元の問題を解くアプローチです。

この手法には以下のメリットがあります。

  • 複雑な入力への対応: 入力を細分化し、それぞれの結果を取得、統合する
  • プロンプト設計の柔軟性: プロンプトを個別に調整できる
  • 保守性の向上: 実行ステップのプロンプトだけを変更できるため、デグレリスクを抑えやすい

ヘルプデスクよう計画実行型エージェント

  1. 計画作成: 質問を細分化し、サブタスクリストを作成
  2. サブタスク実行: 各サブタスクを個別に実行
  3. ツール選択: LLM が適切なツールを判断・選択
  4. ツール実行: 選択したツールを実行して結果を取得
  5. 回答生成: ツールの実行結果から回答を作成
  6. 自己修正: 回答の適切性をチェック。NG の場合は原因分析とアドバイスを生成し、ツール選択から再実行
  7. 最終回答作成: 全サブタスクの回答を統合して最終回答を生成

ポイントは

  • 計画をやり直さないこと: やり直しはコストとレイテンシーを増加させ、ユーザー体験を損なう可能性があるため
  • サブタスク間に依存関係を持たせない: 処理を複雑化させないため
  • サブタスクに自己修正を適用していること: 複数の情報源ある場合に情報の探し方を変更でき、情報の収集漏れを防げる
  • サブタスクの数を制限させる: サブタスクの数が多すぎると処理が複雑になることや不要な計画を含める可能性が高い
  • 計画の具体例を示す

RAG vs ロングコンテキスト

プロンプトにそのまま入れる長文脈言語モデルが一貫して RAG より高いパフォーマンスを示す。
RAG はロングコンテキストで圧倒的にコストパフォーマンスが高いという強みがある。

検索ツールの改善

データ準備

ポイント 説明
チャンク化 ドキュメントを適切に分割(チャンク化)しないと、検索時に意図した情報が得られないことがある。
大きすぎると不要な情報が混在し、小さすぎると文脈が失われる。
メタデータの活用 データ量が多い場合や類似の内容が多く含まれる場合は意図した検索結果が検索上位に来ないことがある。
メタデータ(作成日時、著者、カテゴリ、タグなど)を活用し、検索時に絞り込みを行うことで目的の情報を見つけやすくなる
ベクトル化の工夫 質問と回答ペアのみをベクトル化してインデックスを構築し、ユーザーの質問文としてベクトル化したもの同士で検索を行います。ペアとなる回答は結果の質問 ID などから辿れるようにしておくことでベクトル空間上で離れてしまう問題を緩和できる。

検索・生成

仮に検索インデックスが適切に構築されたとしても、適切な検索結果が得られない場合がある。

原因 説明 解決策
クエリが曖昧 ユーザーが入力する検索クエリが不明確または曖昧であると検索エンジンは適切な結果を返せません ・クエリ拡張: ユーザーの入力クエリを LLM で拡張する手法
・UI/UX による支援: 検索に有効な情報をユーザーが与えてくれるような仕組みを UI/UX から考える
検索手法が不適切 ベクトル検索が呈している場面でキーワード検索のみを使用すると、意味的な関連性を見逃す可能性がある ベクトル検索とキーワード検索を適切に組み合わせたハイブリッド検索

第 6 章 情報収集者を支援する

設計

  1. ユーザーヒアリング: ユーザーからのメッセージを分析し、追加情報が必要かどうかを判断
  2. ヒューマンフィードバック: もし追加情報が必要であれば、ユーザーからの回答を待ち、再度ユーザーヒアリングに戻る
  3. ゴール設定: ユーザーが求める内容のゴールを整理し、レポートの受け入れ条件を明文化する
  4. タスク分解: ゴール設定で明文化した内容に基づいて、タスクを分解し、サブタスクを生成する
  5. 論文調査: サブタスクごとに、論文の検索、取捨選択、分析を行う
  6. 論文検索: 論文データベースから検索する
  7. 論文分析: 取得した論文について、ゴール設定やサブタスクとの関連性の評価、内容の要約を行う
  8. 関連セクションの抽出: ゴール設定やサブタスクと関連する論文ないのセクションを抽出する
  9. 関連セクションの十分評価: 抽出したセクションに、ゴール設定やサブタスクに対して十分な情報があるかどうかを評価する
  10. 関連性がない論文の除外: ゴール設定やサブタスクと関連性がない論文を除外する
  11. サブタスクに対する回答の作成: 抽出されたセクションの内容から重要部分について回答を作成する
  12. 検索・分析結果の整理: 分析結果を整理し、必要な情報を抽出する
  13. タスク実行結果の評価: ゴール設定に対して十分な情報が集まったかどうかを評価し、不足しているなら再度タスク分解に戻る
  14. レポート生成: 必要な情報が集まったら、レポートを生成して終了する

ポイントは、

  • セクションごとにチャンクを分割する: チャンク間のコンテキストが失われてしまうため、関連するセクション(章)だけを抜き出すアプローチ。論文全体を評価対象に入れてしまうと、金銭的なコストと処理時間にも影響する。
  • 最終回答生成の前に、セクションに十分な情報があるのか評価する: LLM による処理は入力のコストよりも出力コストのほうが速度的な面でも、金銭的な面でも高くなってしまう。

LangGraph による実装ポイント

checkpointer

チェックポインターは、グラムのステートを保持するための仕組み。チェックポインターを指定しておくことで、ヒューマンフィードバックの際に処理が一時停止しても、フィードバックを得られた後にステートを復元して処理を再開することができる。

  def _create_graph(self) -> CompiledStateGraph:
      workflow = StateGraph(
        state_schema=ResearchAgentState,
        input=...,
        output=...,
      )
      workflow.add_node("user_hearing", self.user_hearing)
      ....

      return workflow.compile(checkpointer=MemorySaver())

Command

ノードから Command オブジェクトを返すことで、遷移先のノードを動的に切り替えることができる。

def __call__(self, state: dict) -> ...:
  messages = state.get("messages", [])
  hearing = self.run(messages)
  next_mode = (
    "human_feedback" if hearing.is_need_human_feedback else "goal_setting"
  )
  return Command(
    goto=next_node,
    update={"hearing": hearing, "messages": message}
  )

interrupt

interrupt を利用することで、ノードの実行を一時中断して、ユーザーからのフィードバックを受け取ることができるようになる

def _human_feedback(self, state: ResearchAgentState) -> ...:
  last_message = state["messages"][-1]
  human_feedback = interrupt(last_message.content)

Seed

Send オブジェクトを活用すると複数のノードの呼び出しを一度に行うことが可能です。

for reading_result in reading_results:
  gotos.append(
    Send(
      "analyze_paper",
      PaperAnalyzerAgentInputState(
        goal=state.get("goal", "")
        reading_result=reading_result,
      ),
    )
  )
return Command(
  goto=next_node,
  update={"reading_results": reading_results}
)

第 9 章 AI エージェントの活用

AI エージェントと UX

AI エージェントの性能を高めるために人間の力が必要になります。また人間に AI エージェントを信頼してもらう UX を丁寧に設計する必要がある。

ユーザー対話

人間はチャットインターフェースを通じて、AI エージェントに指示を出したり、様子を確認することができます。

  • AI エージェントにどのような指示ができるのかを明確化する
  • 指示の曖昧さを解消できるようにテンプレートを用意する
  • AI エージェントの思考や行動をリアルタイムに可視化する

システム指示

AI の性能を向上させるためにするためにプロンプトチューニングするのは老直がかかる作業です。労力を下げる工夫にプロンプトの初期設定を自動生成したり工夫があります。

  • ユーザーがプロンプトを改善できるようにドラフトを作ったり、改善提案をする
  • AI エージェントが守るべきこと、優先すべきことを書きやすくする
  • AI エージェントの行動範囲や記憶範囲を説明する

ツール

  • 人間しか実行できない部分を人間に依頼できるようにする
  • 特定のツールを利用する(更新/削除など)前に人間に確認を取るようにする
  • ツールの説明文を編集できるようにする

ナレッジ

  • AI エージェントのナレッジの利用状況をユーザーに表示し、ナレッジの価値を伝える
  • ユーザーがナレッジを追加・管理しやすい動線を作る

計画

  • 計画を公開する・残りの実行すべき手順を示す
  • ユーザーが計画のステぷを編集できるようにする

メモリ

  • 過去の行動履歴に成功か失敗のフィードバックをできるようにする
  • ユーザーがよく参照しているメモリ内容を分析・編集できるようにする(パーソナライズ用

AI エージェントのモニタリング

なぜ必要なのか?

AI エージェントの出力が不確実な要素を含み、最終出力に至るまでの過程を出力結果だけから把握することが困難だから。

  • 問題が発生した時のデバック
  • AI/LLM の予想外のコスト

何をモニタリングするか

分散トレーシングと同じように Trace で各 LLM やエージェントをモニタリングします。

第 10 章 各社の AI エージェントの実用化に向けた取り組み

AI エージェントの開発

ドメインエキスパートの AI の活用は先行すべきである

毒メインエキスパートによる生成 AI の活用は、特定業務における AI エージェントの導入に先行すべきである。AI 活用によって業務効率を改善できない場合、AI エージェントによる特定業務の代行は難しいと判断されます。開発者が自ら業務代行として振る舞うことで業務解像度を上げることも可能。

高品質なガードレールを作り性能を測定する

AI エージェントでは複数のサブタスク間でエラーが伝播しやすいため、望ましくない出力や危険な動作を検知する「ガードレール」の設計が重要。ガードレールでは正規表現や文字数制限などのチェックから、LLM-as-a-Judge を用いたチェックまで様々な手法を採用することができる。これにより、「回答の正確性」などでハルシネーションの発生率やエラーの発生率を間接的に測定できる。