「AIエージェントキャッチアップ #21 - HumanLayer」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #21 - HumanLayer」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

HumanLayer

今回は、「HumanLayer」について、公式ドキュメントを読んだり動かしたりしてみました。

HumanLayerのGitHubリポジトリはこちらです。

github.com

公式ドキュメントはこちらです。

www.humanlayer.dev

今回のポイント

HumanLayerの概要

HumanLayerは、Human-in-the-Loopを実装するためのクラウドサービス(HumanLayer Cloud)とそのSDKです。

HumanLayer Cloudに登録し、そのUIとSDKを使ってHuman-in-the-Loopを含むAIエージェントを実装することになります。

HumanLayer Cloudは、無料から使い始めることができます。

www.humanlayer.dev

HumanLayerがサポートするHuman-in-the-Loop

HumanLayerがサポートするHuman-in-the-Loopとしては、以下の2つがあります。

  • Function callingの承認
  • 人間へのコンタクト

Function callingの承認

まず、Function callingの承認の例をみていきます。

HumanLayerを使うには、まずはHUMANLAYER_API_KEYを環境変数に設定したうえで、HumanLayerのインスタンスを作成します。

from humanlayer import HumanLayer

hl = HumanLayer(
    verbose=True,
    run_id="openai-math-example",
)

その後、承認を必要としたいツールに@hl.require_approval()というデコレーターを設定すると、関数の呼び出し時に承認が必要になります。

@hl.require_approval()
def multiply(x: int, y: int) -> int:
    """multiply two numbers"""
    return x * y

または、以下のようにhl.fetch_approvalを使用することもできます。

from humanlayer.core.models import FunctionCallSpec

resp = hl.fetch_approval(
    FunctionCallSpec(
        fn="my_func",
        kwargs={"x": 1, "y": 2},
    ),
).as_completed()

これらを実行すると、HumanLayer Cloudの「Approvals」画面に、承認待ちとして表示され、画面上で承認すると処理が進む、ということになります。

人間へのコンタクト

もう1つの人間へのコンタクトの機能については、hl.create_human_contactのように使うことができます。

from humanlayer.core.models import HumanContactSpec

hl.create_human_contact(
    spec=HumanContactSpec(
        msg="test-msg",
        state={"test-key": "test-value"},
    ),
)

こちらを実行すると、HumanLayer Cloudの「Requests」画面に、人間の回答待ちとして表示され、画面上で回答すると処理が進む、ということになります。

人間の承認や回答は、HumanLayer Cloudの画面上以外に、メールやSlackで実施することもできるようです。

Webhookと状態管理

実際のアプリケーションでHuman-in-the-Loopを実装する際は、プログラム上の処理がどこまで進んだかという状態を管理し、人間の承認・回答のタイミングで処理がそこから再度始まるようにする必要があります。

LangGraphの場合は、SQLiteやPostgreSQLといったデータベースに状態を保存し、グラフ構造のワークフローを続きから実行することでHuman-in-the-Loopが実現されています。

一方HumanLayerでは、Human-in-the-Loopで停止する際に、任意の状態データをHumanLayer Cloudに送信できます。 そして人間が承認・回答したタイミングで、Webhookで人間の入力とともに保持していた状態を送信することで、続きから処理できるようになっています。 HTMLのhidden属性で次のリクエストに情報を持ち越すようなイメージですね。

www.humanlayer.dev

FastAPIでの実装例も公開されているので、詳細が気になる場合は以下のコードを読んでみるのがおすすめです。

github.com

AIエージェントのフレームワークを考えるとHuman-in-the-Loopの実装方法がなかなか悩ましいのですが、その一例として参考になりますね。

Outer Loop Agents

最後に、HumanLayerのドキュメントにあった「Outer Loop Agents」について紹介します。

www.humanlayer.dev

このページでは、LLMアプリケーションを3世代に整理しています。

  • 第1世代:チャット
  • 第2世代:アシスタントエージェント
  • 第3世代:自律エージェント

第2世代と第3世代の違いは、以下の画像で説明されています。

画像引用元:https://www.humanlayer.dev/docs/core/outer-loop-agents

第2世代では人間の呼び出しに対してAIエージェントのループが存在するのに対して、第3世代ではAIエージェントのループの中に人間が存在します。

人間とAIエージェントの関係が逆転していることを「Outer Loop」と表現するのは、分かりやすく面白い表現ですね。

次回のご案内

以上、今回は「HumanLayer」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #22 - LangMem (LangChain)」ということで、LangChainが公開したAIエージェントの長期記憶のライブラリ「LangMem」がテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!