💡

AIエンジニアがAI Agentの活用で考えていること

に公開

はじめに

こんにちは、@edegp です。12月20日に投稿した「RAGの取引発見システム」では、多くの方に反響をいただけました。企業の事例でなかなか記事になることはない内容なので、まだ読んでいない方の中で少しでも興味がある方は読むことをお勧めします。

さて、今回はAI Agentを作るときに何を考えているのか?という視点で、少し思想的な記事を書こうと思います。というのも、AI Agentを作り始めてから1年が経とうとしています。

かれこれ、5つ以上のAIプロジェクトに参加してきました。これまでやってきたことの振り返りと何を考えるべきなのかについてまとめることは、自分の中のAI関連の知識を棚下ろすという意味でも重要です。

様々なAI活用をしてきましたが、AIを作るときに何が問題になって、何がうまくいくのか、AIを活用するときに何を考えるべきなのかについての備忘録としての記事が書ければなと思います。

AIを使うということ

皆さん、AIを使って何かの課題を解決しようとするときに何を考えますか?

  • 「モデル」
  • 「Agentの手法」
  • 「データの前処理」
  • 「フレームワーク」etc...

いろいろなことを考えた人が多いと思います。AIを作る時に考えることは沢山あリます。

では、AIを作る時に重要なことはなんでしょうか?

  • 「精度」
  • 「スピード」
  • 「自律性」etc...

重要なことはたくさんありますが、重要なものはプロジェクト、プロダクトによって異なるはずです。

もう一つ質問です。AIをなぜ使うのでしょうか?

  • 「なんでもできそうだから」
  • 「要約ができるから」
  • 「情報を調べられるから」

AIでできることは、近年だいぶ増えてきました。

最後の質問です。その課題に、AIを使う必要はあるんですか?

「...」

この質問に答えられる方は、AIに対する視座がかなり高いと思います。なぜなら、AIが何をできて、何ができなくて、その課題(ユースケース)にAIがどう使えるのかをある程度理解していなければ答えられない質問だからです。

AI Agentの技術選定の前に、「解決したい課題は何で、AIをなぜ使うのか?」は絶対に考えるべきです。AIはまだまだ新しい技術であるため、課題とAIができることが曖昧になりがちです。自分の経験上ここの設定が曖昧なプロジェクトは、大抵いい結果にはなりません。最初に課題とAI手法を明確にし、一対一で対応させる必要があります。

どうやって「課題」・「AIができること」を考えるのか

最近は、自分はプロジェクトを始める時、必ず「このプロジェクトで解決しなければならない問題・課題を一つだけ挙げるとしたら何か」を考えます。その課題に対して、何をどうすれば楽に、早く、安く実現できるのかを考えます。 最近では、AIが課題解決のツールとして優秀なので、使用する機会が増えてきましたが、AIエンジニアだからといって、必ずAIを使うというわけではありません。

AIを使わない時もあります。例えば、社内のデータから支払明細書をexcelとして自動出力するプロジェクトでは、AIも使うことはできるが、Google App Script(GAS)の機能で十分であると判断し、GASで実装しました。そのコードは今でも社内でも問題なく使用できています。

逆に、まだAIにできない(かなり難しい)ことをAIでやろうとして失敗したことがあります。あまり詳しくは話せませんが、「AI AgentでWeb上の長いリストのデータを取ってくる」という課題にチャレンジしましたが、コンテキスト長とコスト、不確実性という壁に阻まれ、実際に実用に耐えるアプリケーションにできずに終了してしまったプロジェクトがありました。

自分の工夫が足りなかったこともありますが、基本的にAIの性能以上のタスクを完遂するには、アプリケーションでかなりの工夫が必要になるため、予算と時間に余裕がない場合はトライするべきではないです。

この二つの事例から言えることは、課題を明確にして、AIができることのスコープとリソース(予算・人員・時間)を考えた上で、AIをどのように使うか、はたまた使わないのかを判断すべきであるということです。

そのため、最も重要なのは「一番重要な課題は何か」と「その課題はAIがどこまでできるのか」を高い解像度で理解することがプロジェクトの成功に繋がります。これらの解像度を高くするために必要なのは、経験だけではなく、はじめに深く課題を考え、最新のAIの動向を知ることが必要です。

最近のユースケースの紹介

最近というか今、カウンターワークスの社内課題の解決に取り組んでいます。
カウンターワークスでは、「キャンセル業務」という、取引がキャンセルされた時に必要な業務があり、この業務がカスタマーエクスペリエンス部署のリソースを圧迫しているという現状があります。

なぜ、リソースを圧迫しているのかというと、キャンセル時に様々な場所に散らばっている情報をまとめて、様々な場所に入力し確認する必要があり、必要以上に手順が煩雑になっているためです。

例えば、煩雑な業務フローの一つとして

  1. 案件定義とロジック確認
  2. 実行前準備(下書き)
  3. 本番環境でのオペレーション
  4. 証跡の記録
  5. 外部コミュニケーション(情報収集・報告)
  6. エビデンスのデータ化
  7. 経理処理・承認申請
  8. 周知・連携
  9. 各種マスタ・進捗管理の同期
  10. 最終整合性チェック

といったものが挙げられ、社内では通常時でも人員不足気味であるため、こういった定型業務かつ煩雑なものはなるべく自動化したいという会社の意向があります。このユースケースに必要なAI・技術はなんでしょうか?

今回は、複雑な手順を様々なツールを使って実現する必要があるため、AI Agentを使用するのが適切であると判断し話を進めます。

AI Agent 技術選定

AI Agentを使うことは決まりましたが、どのように実装すれば良いでしょうか?

  • フルスクラッチ
  • AI Agentフレームワーク
  • No-code・Low-codeのAI Agentサービス

フルスクラッチでは、今回は規模が小さく用途に関してもタスク自体の難易度が高くないため、コストに見合う成果が出せるかは微妙です。
逆に、No-code・Low-code系では使うToolの種類が多く、フローが複雑に入り組んでいるため、複雑なフローを作る際に痒いところに手が届かない可能性があります。

AI Agentフレームワークを採用するのが良さそうです。
AI Agentフレームワークはどんなものがあるのか調べると多くの選択肢が考えられます。

フレームワーク名 開発元 主なコンセプト 特徴・強み 開発難易度
LangGraph LangChain グラフ構造・状態管理 循環(ループ)や条件分岐を厳密に制御可能。商用アプリ向き。
CrewAI CrewAI 役割ベース(Role-based) 「役割」「タスク」を定義するだけで、人間のようにチームで協力。
AutoGen Microsoft エージェント間対話 エージェント同士がチャットで相談しながら解決。拡張性が高い。
Mastra TSネイティブ。ワークフロー、RAG、評価が一体化。 TypeScript / Node.js Next.jsなどでAIアプリを爆速で作るWebエンジニア
Pydantic AI 高度な型安全。LLMの入出力を厳密にバリデーション。 Python (Pydanticベース) 大規模・商用システムでエラーを許容したくない開発者
OpenAI Swarm 驚くほど軽量。エージェントの「引き継ぎ」が簡単。 Python (OpenAI公式例) シンプルなマルチエージェントを試したい人
VoltAgent 可観測性(ログ・追跡)に特化したTS系。 TypeScript エージェントの挙動を詳細にデバッグ・監視したい人
Phidata アシスタント(記憶・ツール・知識)の構築が容易。 Python 金融分析や研究など、知識ベースが重要なアプリを作る人
LlamaIndex LlamaIndex データ連携(RAG)特化 膨大な知識ベースとの連携。検索結果に基づいた高度な判断が可能。
Semantic Kernel Microsoft 既存アプリへの統合 C# / Python / Java対応。法人向け既存システムへの組み込み。
Dify Dify.ai ローコードプラットフォーム GUI上で部品を繋いで構築。プログラミング不要で高度なRAGが可能。
MetaGPT DeepWisdom SOP(標準作業手順) ソフトウェア開発会社の役職を模倣。要件定義からコードまで自動化。

今回は複雑なステップを踏むため、処理の「やり直し」や「複雑な分岐」をグラフとして定義できるようなlanggraphもしくはMastraを採用するのが良さそうです。

さらに、社内ではPythonが得意なエンジニアが少なくWebアプリケーションを扱っているエンジニアが多くいため、アプリケーションライクな仕様で、型安全であるTypescipt採用しているMastraが最良の選択肢となりそうです。また、Mastrahuman-in-the-loopを簡単に実装できるという点も好ましいです。

Mastraの実装

import { Workflow, Step } from '@mastra/core';

// 1. ワークフローの定義
const myWorkflow = new Workflow({
  name: 'approval-workflow',
});

myWorkflow
  .addStep(new Step({ id: 'initial-process', execute: async () => ({ data: 'Wait for approval' }) }))
  // 2. 中断ポイント:ここで人間による入力を待つ
  .addStep(new Step({ 
    id: 'human-approval', 
    execute: async ({ context }) => {
      // 外部から再開されるまで、このステップで一時停止するイメージ
      return context.getStepResult('initial-process');
    } 
  }))
  .addStep(new Step({ id: 'final-process', execute: async () => ({ status: 'Done' }) }));

// 3. 実行と再開
// 実行中に「suspend」状態になれば、DBに状態が保存される
const { runId } = await myWorkflow.execute();

// (後ほど、UIやSlackなどで承認ボタンが押された際)
await myWorkflow.resume({
  runId,
  stepId: 'human-approval',
  input: { approved: true }
});

langgraphの実装

from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver

# 1. 状態(State)の定義
class State(TypedDict):
    input: str
    approved: bool

# ステップ1: 処理の準備
def process_request(state: State):
    print("--- 処理を準備中 ---")
    return {"input": state["input"] + " (processed)"}

# ステップ2: 承認後の最終実行
def final_step(state: State):
    print("--- 最終実行完了 ---")
    return {"approved": True}

# 2. グラフの構築
workflow = StateGraph(State)
workflow.add_node("process_request", process_request)
workflow.add_node("final_step", final_step)

workflow.add_edge(START, "process_request")
workflow.add_edge("process_request", "final_step")
workflow.add_edge("final_step", END)

# 3. 永続化(チェックポインタ)の設定
memory = MemorySaver()

# 4. コンパイル時に「final_step の前で止める」と指定
app = workflow.compile(
    checkpointer=memory,
    interrupt_before=["final_step"]
)

# --- 実行フェーズ ---
config = {"configurable": {"thread_id": "user_1"}}

# 初回実行(process_requestまで進んで停止する)
for event in app.stream({"input": "データA"}, config):
    print(event)

print("\n[待機中] 人間が内容を確認し、再開を許可します...")

# 再開(同じthread_idを渡すと、中断した場所から動き出す)
# 入力は None でOK(状態が保持されているため)
app.invoke(None, config)

Mastraの方が直感的な実装が可能です。

実際の検証や細かい仕様は、今回は省略します。

まとめ

最後まで読んでいただきありがとうございます。
AIエンジニアの考えていることは、いかがだったでしょうか?
今回はAIを活用する時に何を考えているかを記事に書き起こしてみました。
他にも、ビジネス上の調整、細かい実装などはプロジェクトによって異なりますが、最初に考えることはほぼ変わりません。

  • 解決したい課題
  • AIはどこまでできるのか?

を立ち止まって考えることが重要です。

まだまだ、至らないところはありますが、AI活用をもっと多くの企業で導入できるように精進していきたいと思います!


COUNTERWORKSでは、このようなAI/MLを活用したプロダクト開発に興味のあるエンジニア・インターンを募集しています!

https://counterworks.co.jp/recruit/

COUNTERWORKS テックブログ

Discussion