「AIエージェントキャッチアップ #47 – Deep Agents (LangChain)」を開催しました

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

「AIエージェントキャッチアップ #47 – Deep Agents (LangChain)」という勉強会を開催しました。

generative-agents.connpass.com

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

www.youtube.com

Deep Agents

今回は、よく使われているAIエージェントの構成を汎用化した、LangChainの「Deep Agents」をキャッチアップしました。

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

github.com

LangChain公式ブログの記事はこちらです。

blog.langchain.com

今回のポイント

Deep Agentsとは

Deep Agentsは、Function callingを繰り返すだけの「浅い」エージェントではなく、Claude CodeやDeep Researchのように長期タスクを実行可能なエージェントを指しています。

以下の4つがDeep Agentsの特徴だとされています。

  • 詳細なシステムプロンプト
  • 計画ツール
  • サブエージェント機能
  • ファイルシステムの操作ツール

LangChainは、Deep Agentsを簡単に構築するために「deepagents」というパッケージを公開しています。

Deep Agentsを動かしてみた

実際にDeep Agentsを動かしてみました。

uv add deepagentsでインストールしたあと、以下のようなコードを実行しました。

from deepagents import create_deep_agent

def internet_search(
    query: str,
    max_results: int = 5,
    topic: Literal["general", "news", "finance"] = "general",
    include_raw_content: bool = False,
):
    :

research_instructions = "..."

agent = create_deep_agent(
    [internet_search],
    research_instructions,
)

result = agent.invoke({"messages": [{"role": "user", "content": "LangGraphとは?"}]})

LangSmithでトレースを確認すると、Deep Agentsが動いている様子を確認できました。

組み込みのツールには、かなり手厚いdescriptionが書かれていることが分かります。

Deep Agentsの組み込みツール

Deep Agentsには、デフォルトで以下の6つのツールが組み込まれています。

  • write_todosツール
  • write_fileツール
  • read_fileツール
  • lsツール
  • edit_fileツール
  • taskツール

taskツール以外の5つについては、create_deep_agentのパラメータで無効化することもできます。

Serenaと組み合わせてみた

Deep Agentsのwrite_fileなどのファイル操作ツールは、実際にファイルを読み書きするのではなく、LangGraphのState上の仮想的なファイルを操作するものです。

Deep AgentsをSerenaと組み合わせることで、実際のファイルを操作させてみました。

実行したコードの概要は以下になります。

from deepagents import async_create_deep_agent
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.checkpoint.memory import InMemorySaver
    :
async def create_agent() -> CompiledStateGraph:
    client = MultiServerMCPClient(
        {
            "serena": {
                "command": "uvx",
                "args": [
                    "--from",
                    "git+https://github.com/oraios/serena",
                    "serena",
                    "start-mcp-server",
                    "--project",
                    "/workspaces/workspace",
                ],
                "transport": "stdio",
            },
        },
    )
    mcp_tools = await client.get_tools()

    builtin_tools = ["write_todos"]

    agent = async_create_deep_agent(
        [internet_search, *mcp_tools],
        research_instructions,
        builtin_tools=builtin_tools,
    )
    checkpointer = InMemorySaver()
    agent.checkpointer = checkpointer

    return agent


async def main() -> None:
    agent = await create_agent()

    config = {"configurable": {"thread_id": "1"}}

    while True:
        query = input("Enter a query: ")
        if query == "exit":
            break
        async for chunk in agent.astream(
            {"messages": [{"role": "user", "content": query}]},
            config=config,
            stream_mode="values",
        ):
            if "messages" in chunk:
                chunk["messages"][-1].pretty_print()


asyncio.run(main())

実際に「docsディレクトリに、日本語のポエムを1つ、と英語のポエムを1つ書いてください」というタスクを依頼したところ、ToDoリストとして計画を立て、順次実行する様子が観察できました。

Deep Agentsの組み込みツールでTODOリストを管理しながら、Serenaのツールによってファイルの読み書きをしたということになります。

Human-in-the-Loopの設定

Deep Agentsでは、Human-in-the-Loopの設定もサポートされています。

以下のようにinterrupt_configを設定すると、create_text_fileツールが呼び出された際にInterruptが発生することを確認できました。

    agent = async_create_deep_agent(
        [internet_search, *mcp_tools],
        research_instructions,
        builtin_tools=builtin_tools,
        interrupt_config={
            "create_text_file": True,
        },
    )

次回のご案内

以上、今回は「Deep Agents (LangChain)」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #48 – Vibe Kanban」ということで、コーディングエージェントへの作業依頼を効率化する「Vibe Kanban」がテーマです!

generative-agents.connpass.com

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

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




Source link

関連記事

コメント

この記事へのコメントはありません。