メインコンテンツへスキップ
見出し画像

AIエージェントの教科書【現場のITエンジニアが考えた】

    はじめに

    最近生成AI界隈で話題沸騰の

    「AIエージェント」

    について執筆してみることにしました。

    画像

    2024年後半あたりから一気に話題が沸騰してきました。
    トレンドを見ても、急激に検索数が伸びているのがわかります。(青色の線がAIエージェントです)


    画像
    https://arxiv.org/abs/2308.11432

    上記は2023年8月の情報ですが、この時点で生成AIを活用したAIエージェントの話題は右肩上がりでした。

    ChatGPT登場当時、AutoGPTやBabyAGIなどを使って遊んでみた人も多いのではないでしょうか。

    当時は、
     「これすごい! 見てて面白いよねー」

     「で、いつ誰が使うんだっけ? これだとあまり役に立たないな・・・」

    という感じで終わっていたと思います。


    それが数年も経たないうちに、世界中で研究、検証が進められ、AIエージェントのベストプラクティスのようなものが整いつつあります。
    2025年は一気に実用的なAIエージェントが湯水のように湧き出てきそうです。

    そんなAIエージェントの背景から要素技術、仕組みの正体、今後の展望まで盛りだくさんな内容にしたいと思います。


    AIエージェントとは?


    画像
    https://www.insightpartners.com/ideas/ai-agents-disrupting-automation/

    上記のような「カオスマップ」をよく見かけるようになりました。

    体系的な分類が一目でわかりますので、知らないツールやサービスを探す場合に便利です。

    「AIエージェント」と一言で言っても、つかみどころがなく「何の話?」かわかりにくいので体系的に整理して、「AIエージェントとは」を定義するのは大事です。

    自分の会社の製品を売り込みたい人などは、

    「うちのAIエージェントはこれだけすごい!」

    と必死にアピールします。
    浮ついたセールスに惑わされないようにしなければなりません。
    結局、実態は使ってみないとわからないことも多いので、体系的に分類して、どの領域の話なのかを把握することが重要になってきます。


    ざっと以下に例を挙げるといろんなツールやサービスがどんどん登場していることがわかります。

    分類は適当にしてみましたが、ツールやサービスによっては複数の分類にまたがっているケースもあるので、なかなか分類分けもセンスが必要になってきます。


    画像
    • ワークフロー

      • Dify、Jinbaflow等

    • 開発者向けフレームワーク

      • LangChain、LangGraph、AutoGen、Swarm、AWS Bedlock等

    • 一般向けサービス

      • OpenAI GPTs、satto(ソフトバンク)

    • 開発エージェント

      • replit agent、Bolt.new

    • その他・・・


    以下の表は、OpenAI社が提唱している「AIの進化5段階レベル」です。

    ちょうど、現在はレベル2とレベル3の間のレベル2.5くらいでしょうか。

    今のAI進化スピードを考えると、2025年にはレベル3の「Agents」に達しそうです。
    (当初OpenAIのo1が「Agents」レベル相当と言われてましたが、期待が高かっただけにやや期待外れでしたでしょうか)


    画像
    OpenAI社提唱のAI進化5段階レベル

    おそらくですが、上記の表の「Agents」はLLM自体の能力として「AIエージェント」を実現するレベル定義だと思っています。

    そう考えると、現在の「AIエージェント」は、

    「レベル2のLLMをうまく活用して、レベル3のAIエージェントっぽいものを実現している」

    という表現がいいのかもしれません。


    言葉の定義があいまいなまま、このあたりの議論が始まるとややこしくなってきますので、まず「AIエージェントとは?」という点を深堀していきましょう。


    画像


    「AIエージェント」を語るために、上の図が重要になります。

    周りの人と「AIエージェント」で議論したときに、

     「いつも、話が発散して終わってしまう」
     「いつも、ふわっとした議論で話が進まない」
     「言ってることがかみ合わない」
     「うちの会社もAIエージェント推進したいのに何から手を付けていいかわからない」
     「最近、AIエージェント製品の売り込みを受けることが多いが、何ができるかよくわからない」

    ・・・といったことが多くないでしょうか?


    おそらく、以下のような「期待、売り込み」と「今実現できることの現実」のギャップが、議論が平行線になってしまう一つの要因です。
    (あとは「エージェント」といっても領域が幅広すぎるので、それも一つの要因ではありますが、領域の話は後述します)



    画像


    • 【期待、売り込み】

      • 「AIエージェントってすごいでしょ! 自律的に自分で仕事をしてくれる!」 、「これは、今までのチャットではない新しいテクノロジーだ!」

      • 「AIエージェント」をビジネスにする人は汎用型で知的な「AIエージェント」の概念で語ることが多いですよね。

      • 「AIエージェントがすごい」と思わせないとお金にならないのです。

    • 【今できることの実態】

      • 所詮、今実現できるAIエージェントは「生成AI(LLM)エージェント」のレベルです。

      • つまり、生成AI(LLM)が実現できること以上のことはできないのです。

      • 技術というよりLLM活用テクニックです。

      • 「AIエージェントって何でもできるんでしょ?」という期待とのギャップに苦しむ



    画像



    以下の3つの言葉の定義について深堀していきましょう。

    • エージェント

    • AIエージェント

    • 生成AI(LLM)エージェント


    エージェントの定義

    まず、「エージェント」の定義ですが、Wikipediaには以下の記載があります。

    本人から委任あるいは授権された代理権限の範囲内で、本人に代わって取引、契約など法律行為をなす者である。日本語では代理人のことを示す。

    Wikipedia

    「本人に代わって何かを代行する、代理人」という意味があります。
    これが「エージェント」と言われます。

    スポーツ選手なども契約に関わるところは、「エージェント」と呼ばれる人たちが登場しますがあのイメージです。


    AIエージェント(知的エージェント)

    次に、「AIエージェント」があります。

    これは以前から概念としては存在してましたが、SFの世界や夢物語なので、映画や小説の中で登場するくらいでした。

    「知的エージェント」、「自律型知能エージェント」という言葉もありますが、本記事ではまとめて「AIエージェント」とします。

    有名な映画『マトリックス』でエージェント・スミスという登場人物がいましたが、あれも一種の「AIエージェント」と言えるでしょう。

    マトリックスの世界の秩序を守る、セキュリティ型AIエージェントだと考えられます。

    マトリックスの真相に気付いてしまった人間、マトリックスから自らを解放しようとする人間などを排除したり、マトリックス内のバグの後始末をしたりといった、マトリックス内の秩序を保つのが任務であり、

    Wikipedia

    おそらく、一般の人が「AIエージェント」として期待するのは、この「AIエージェント」の領域に近いですね。

    さすがに、エージェント・スミスまでは期待しないでしょうが、「人間の仕事は何でもやってくれる」ようなAIエージェントを一般の人は期待します。

    「AGI(汎用型人工知能)」もこの「AIエージェント」の領域になると思います。

    中には「生成AIこそAGIだ!」、「生成AIでAGIは達成した!」という人もチラホラいますが、OpenAI社のレベル5分類上もまだまだ実現できてないと定義されてますので、実態はまだもう少し先になりそうです。



    生成AI(LLM)エージェント

    最後に「生成AI(LLM)エージェント」です。

    これが今話題になっている「AIエージェント」の正体です。

    AIエージェントの概念は、前述のとおり昔から存在していました。

    2022年11月30日 ChatGPTの登場により、生成AIによるチャットが世界を驚かせました。

    人間が投げかけた会話に対して、的確に回答を返してくれます。(「的確」といってもAIは「嘘」をつくのも皆さんご存知のとおりです。AIが嘘を付く「ハルシネーション」という単語も同時に広まりました)


    ChatGPT使っているとあることに気づいた人がいました。

    「これって、指示の仕方(プロンプト)次第でChatGPT自体が自律的に動いてくれるのでは?」

    そうですね。これが「生成AI(LLM)エージェント」の始まりです。

    ご存知の方も多いと思いますが、Auto-GPTやBabyAGIなど、自律的に生成AIが動いてアウトプットを出してくれる、フレームワークも登場し始めました。

    ただ、これらはどちらかというとデモンストレーションレベルのもので、見ていると確かに面白いのですが、実用的かといわれると、なかなか使い道無いなー。というものでした。

    今では、LangChain、LangGraph、AutoGen、Swarmなど、多種多様なエージェントフレームワークも登場しており、容易にシステムとして組み込めるようになってきました。

    上のフレームワークがなくても、自分で生成AI(LLM)エージェントは簡単に作れます。

    とはいえ、やはり「面白いデモレベル」と「実用的なユースケース」の差が大きいです。



    逆に、生成AI(LLM)でできないことは、生成AI(LLM)エージェントでもできないのです。

    ここに、「期待」と「現実」のギャップが生まれるポイントでもあります。

    重要なポイントなので繰り返しますが、

    「生成AI(LLM)にできないことは、生成AI(LLM)エージェントでもできない」

    のです。

    現在の世の中では、「AIエージェント」=「生成AI(LLM)エージェント」ですので、言い換えると

    「生成AI(LLM)にできないことは、AIエージェントでもできない」

    ということです。


    「AIエージェント」という革新的なテクノロジーがあるわけではなく、「生成AI(LLM)」の活用テクニックが、「生成AI(LLM)エージェント」なのです。


    「生成AI(LLM)エージェント」の要素技術については、後述していこうと思います。

    以降、「AIエージェント」とは「生成AI(LLM)エージェント」と定義して説明していきます。

    そして、一般の人が期待する「AIエージェント」については、「汎用型知的AIエージェント」と定義しておきます。



    画像



    AIエージェントがもたらす革命

    所詮、今のAIエージェントが「生成AI(LLM)エージェント」レベルとはいえ、ポテンシャルがあるから、騒ぎになっています。

    汎用型AIに期待してしまう人類にとっては、「今度こそAGIの登場か?」
    と期待感を持っています。

    以下の図を見てみましょう。

    画像

    これがAIエージェントの世界観です。

    生成AIが登場して、業務効率化、時短が実現できてきていると思いますが、それでも仕事の主体は「人間」です。

    生成AIも道具の一つとして、それ以外にもネットや社内から情報を探して加工したり、ExcelやPowerPointという道具を使って、人に説明するために情報をまとめたり、結局仕事をするのは人間です。

    一方、AIエージェントが実現すると、仕事の主体は「AI」にとって代わります。

    情報を探し回るのも、道具を使いこなすのもAIがやってくれます。


    よく「チャットからの脱却」と言われていますが、指示を与えるために毎回チャットを繰り返すのは少し面倒です。

    人に何かお願いする場合は、もう少し丸っとお願いすることが多いですよね?

    「これよろしく」
    「今度の会議のために、いい感じの資料を用意しておいて」

    という感じです。

    人にお願いする場合は、背景とか前提条件とか行間を理解している場合が多いので、だいたいこれでも通じることが多いです。

    あと細かいところの目的や納期、レベル感などを確認すれば事足りる場合も多いでしょう。

    残念ながら、今の生成AIではこの程度の指示では、フワッとした回答しかしてくれないので、当たり障りのない意味の回答が来るだけです。

    そこで登場するのが「プロンプトエンジニアリング」というテクニックですが、そうそう万人が使いこなせるものでもありません。


    そんな生成AI(LLM)の課題を解決するために登場したのが「AIエージェント」です。


    これまでの「チャット主体」と「エージェント」では何が違うのでしょうか?


    画像


    • Before

      • チャットによる指示が主体

      • 回答はチャットの回答

      • 要約、翻訳、議事録生成などタスクの遂行が主体

      • 事細かく指示を出さないといけない

    • After

      • 業務の指示が主体

      • 回答は成果物としてアウトプット

      • タスクより広い業務の遂行が主体

      • 細かく指示を出さなくても背景、前提条件が必要な場合は自分から情報を取得する


    「AIエージェント」の実現によって、これまで人間が行ってきた「作業」をAIが代わりにやってくれます。

    人間は「作業」をする必要が無くなるのです。


    では、人間は何をするのでしょうか?

    「Will」を伝えて、アウトプットに対して良し悪しの「判断」をするだけです。

    「仕事」、「作業」は全てAIエージェントにお任せです。

    人間: 「ああしたい」、「こうしたい」
    AIエージェント: 「わかりました。結果こうでした。理由はあれこれです。案A、B、Cのメリット・デメリットはこれこれです。いかがでしょう?」
    人間: 「ふむ。では案Aで」
    AIエージェント: 「わかりました。案Aで進めます」

    ・・・という感じですね。

    何年か前までは夢物語でしたが、生成AIの登場でAIエージェントの実現が現実のものとなってきました。

    AIエージェントは、人間がおこなってきた作業を自律的に動いて自動化してくれるのです。


    AIエージェントの構成要素

    AIエージェントで夢のような世界は広がっています。

    とはいえ、そうそう上手く夢がすんなり実現できるわけではありません。
    まずは今現在におけるAIエージェントの中身について見ていきましょう。

    AIエージェントの構成要素は大きく分類すると以下の2つです。

    • ワークフロー

    • プロンプトテンプレート

    これだけ? と思う人もいるかもしれません。

    世の中のAIエージェントの定義があいまいですが、ワークフローとプロンプトテンプレートが実装されていれば、「AIエージェント」と呼べます。

    Difyをご存知でしたらDifyをイメージするとわかりやすいと思います。

    Difyの「ワークフロー」で、ワークフローが作れます。

    LangGraphなどでも、ワークフローを作ってAIエージェントを実現しています。


    画像
    Difyの画面




    画像
    Difyのワークフロー画面




    さて、構成要素が2つだけだと寂しいので、もう1つ何か考えてみましょう。

    そうですねー、追加するとしたらFunction Callingくらいでしょうか。


    LangChainのAgents機能でよく使われていたDuckduckGo、TavilySearchなどの外部検索機能がこれにあたります。

    LLMのモデル自身がFunction Call機能も持ってることが多いです。
    ClaudeはTool Useと呼ばれているみたいですね。

    生成AI(LLM)に外部Toolを実行させるというものですが、実態はFunction Callingの名前のとおり、あらかじめ用意した文章(description)とマッチするプロンプトが投げられた場合、あらかじめ用意しておいたFunction(関数)を実行させる仕組みです。

    あたかも生成AI(LLM)が、自律的に思考して道具を使っているようにも見えるので、この機能だけでも「AIエージェント」と呼んでいる場合もあります。

    実際、LangChainもこの機能は「Agents」という呼び方をしています。


    • ワークフロー

    • プロンプトテンプレート

    • Function Callling(tool実行)



    以下は、Tool実行のイメージです。
    LangChainのAgentsを使う際に、よく「ReAct」というキーワードが出てくると思いますが、「ReAct」という仕組みで定義された動作をします。

    • 思考

    • 行動

    • 観察

    のように生成AI(LLM)自身が自律的に思考するのが特徴です。


    画像


    一見、複雑な技術が使われてそうな印象もありますが、実現しているのはやはりプロンプトです。

    ということを考えると、開発者にとってはプロンプトエンジニアリングは重要ですね。

    以下はReActを実現しているプロンプトテンプレートです。

    「Thought」、「Action」、「Observation」という文字があると思いますが、このプロンプトテンプレートで文字通り「思考」、「行動」、「観察」の機能を実現しています。


    ReActのプロンプトテンプレート

                template = '''Answer the following questions as best you can. You have access to the following tools:
    
                {tools}
    
                Use the following format:
    
                Question: the input question you must answer
                Thought: you should always think about what to do
                Action: the action to take, should be one of [{tool_names}]
                Action Input: the input to the action
                Observation: the result of the action
                ... (this Thought/Action/Action Input/Observation can repeat N times)
                Thought: I now know the final answer
                Final Answer: the final answer to the original input question
    
                Begin!
    
                Question: {input}
                Thought:{agent_scratchpad}'''
    




    AIエージェントの技術要素


    AIエージェントアーキテクチャ概要図です。

    生成AI(LLM)のAIエージェントは、3つの要素で分類しています。

    • ワークフロー

    • プロンプトテンプレート

    • Function Call

    画像


    参考までに、以下4つに分類する場合もありますが、これだと実態がよくわからないので、僕としては上の3つの分類がおすすめです。

    画像
    https://github.com/Paitesanshi/LLM-Agent-Survey



    ワークフロー

    まず、1つ目のワークフローについて見ていきましょう。

    画像



    処理A→処理B→処理C というのがワークフローです。

    改めて考えると「ワークフロー」の定義ってなんでしょうかね?

    勝手ながら
    「ノードが2つ以上あり、1つ以上のエッジでつながってること」=「ワークフロー」
    とするとどうでしょうか。

    「ノード」、「エッジ」というのはグラフ理論で定義されている用語で、コンピュータ用語としては、様々なところで使われています。

    ノード(node): 節点・頂点、点
    エッジ(edge): 枝・辺、線

    RAGの1種であるGraphRAGでも同じ用語使っています。


    このワークフローをGUIで操作できるようににしたのが、人気のあるDifyの特徴です。
    この手のツールはいろいろありますが、使い勝手の良さとわかりやすさでDifyは1つ頭が抜けていると思います。

    LangGraphでも、同じようにワークフローが作れます。
    LangGraphの場合はコーディング主体でワークフローを作るのがDifyとの違いです。

    LangGraph StudioのようなGUIで作れるものもありますが、Difyに比べると使い勝手は悪そうです。

    そして、「処理」をするノードでLLMを動かせば、そのLLMの回答をもとに次の処理を実行できます。

    つまりLLM同士が会話してるように、連鎖しながらフローを動かすことができます。

    PowerAutomateなど、RPA製品も一種のワークフローですね。

    PowerAutomateでも、処理の中でLLMを呼び出せばDifyと似たようなことは実現できます。

    さらに、処理するLLMごとに別々の役割を持たせることで、複数のAIエージェントが動いているように見えます。
    これを「マルチエージェント」と呼びます。


    画像
    https://github.com/langchain-ai/langgraph/blob/main/docs/docs/tutorials/multi_agent/agent_supervisor.ipynb

    上の例では、「Supervisor」というのが親玉エージェントみたいなイメージで、下の「Agent1」などが子分エージェントという感じで動きます。

    親玉が子分に命令をあたえて、結果を親玉がまとめてユーザに回答を返すという感じですね。


    例えば、アプリケーション開発の業務でマルチエージェントを実現する場合は、以下のようなマルチエージェントを構成することができます。



    • 要件定義エージェント: LLMに要件定義スペシャリストのスキルを与える

    • 基本設計エージェント: LLMに基本設計スペシャリストのスキルを与える

    • 詳細設計エージェント: LLMに詳細設計スペシャリストのスキルを与える

    • 製造/テストエージェント: LLMに製造/テストスペシャリストのスキルを与える


    「スキルを与える」というのはどういうことでしょうか?

    これはプロンプトエンジニアリングの世界の話になりますが、必要なスキルをプロンプトに記載します。
    あとは、RAGを使ってそのスキルに必要な情報を与えるという方法もあります。

    いずれにしてもプロンプトの工夫とワークフローでマルチエージェントは実現できます。


    「マルチエージェントってすごい! これなら組織丸ごとマルチエージェントにしていまえば、業務効率化が実現できるのでは!」

    と思っちゃいますよね?

    そうなんです。マルチエージェントなどで組織丸ごと模倣することはできます。
    ただし、そう簡単には期待どおり動かないのが今の「AIエージェント」の残念なところなんです。

    詳しくは後述します。



    プロンプトテンプレート

    さて、次はプロンプトテンプレートですが、これはもうみなさん想像がつくと思います。

    チャットインターフェースの場合は、チャットの都度プロンプトで記載することになりますが、AIエージェントの場合はあらかじめシステムにプロンプトテンプレートとして組み込んでおきます。

    生成AI(LLM)に指示したい内容を組み込むことで、意図したとおりの動きや出力ができるようになります。

    生成AI(LLM)の登場で「プロンプトエンジニアリング」という言葉が生まれましたが、そのプロンプトエンジニアリングのテクニックをあらかじめシステムにテンプレートとして組み込むのです。

    単純な仕組みですが、一般の非エンジニアの人がプロンプトエンジニアリングを使いこなすのは困難なので、あらかじめシステムに組み込んでおくことで、プロンプトエンジニアリングを意識することなく、目的を指示するだけで済むようになるのです。

    マルチエージェントで必要となってくるロール、スキルをエージェントに与えるのも、このプロンプトテンプレートの役割です。

    LangChainが利用しているReAct用のプロンプトテンプレートを前述しましたが、このようなテンプレートを用意することで、エージェントの動作を制御します。


    画像




    Function call (Tool use)

    最後にFunction callです。

    プロンプトで指示された内容と、あらかじめ用意しているToolと紐づいたdescriptionの文章を照らし合わせて、生成AI(LLM)が必要に応じて、必要なToolを自ら実行します。

    プロンプトをif文とか正規表現でtoolを呼び出すようにプログラミングするのは少々大変です。

    言葉の揺れに対応するには、キーワードをたくさん書き並べなけらばならないので、ここの分岐処理を自然言語の類似度で判断させるのが特徴です。

    多少語弊はありますが、わかりやすく説明すると、

    『graph_tool(): グラフを作成するときに使用できます。』

    と定義しておけば生成AI(LLM)は、
    「グラフを使うときはgraph_tool()関数を実行しよう」
    と認識して該当の関数を実行します。

    関数はプログラミングの世界なので、外部APIを実行したり、SQLを書いてDBにアクセスしたり、PowerPointのOffice製品のファイルを出力したり、プログラミングでできることは何でもできます。

    特にPythonはライブラリが豊富で、グラフ化やPowerPoint出力など、ありとあらゆることが実現できます。

    つまり、AIエージェントはプログラミングで実現できることであれば、ありとあらゆることができるのです。

    お手軽に実行できて効果があるのが外部Web検索機能をToolとして使う例がよく登場します。

    あとはお決まりのSlack連携など。

    外部検索はLangChainなどで利用できるものもがメジャーですがたくさん種類はあります。

    • DuckduckGo

    • TavilySearch

    • GoogleSearch

    • BingSearch

    • など

    一長一短はあると思いますが、お手軽に始めたい場合はDuckduckGoであれば、APIキー取得など必要なく簡単に使えると思います。

    その他、LangChainのドキュメントにいろいろなTool群がありますので参考にしてください。

    AIエージェントの3大要素について説明しました。

    AIエージェントの仕組みがイメージできてきましたでしょうか?

    比較的単純な仕組みでエージェントを実現していることがわかります。
    そして、「今現在のAIエージェントは生成AI(LLM)でできること以上のことはできない」
    という話がご理解いただけたかと思います。

    「AIエージェント」という新しい技術ができたわけではなく、実は「生成AI(LLM)の活用テクニック」でAIエージェントを実現しているのです。

    ここがなかなかわかりにくいところなので、ここが理解できてないと延々と

    「AIエージェントってすごそうだけど、何ができるかよくわからない」

    ということになりますので、しっかり理解しておきましょう。



    AIエージェントはどうやって作ればいいのか?

    AIエージェントを作る環境

    さあ、問題はここからです。

    どうやってAIエージェントを作るのでしょうか?

     
     
    現役ITエンジニア | ChatGPT・生成AI活用×ブレインテック | OSS、クラウド推進 | エンジニアのための最新の生成AI活用情報発信 | KDP出版 → http://amazon.co.jp/dp/B0C1VWSPV8

    あなたへのおすすめ