ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #47 – Deep Agents (LangChain)」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
Deep Agents
今回は、よく使われているAIエージェントの構成を汎用化した、LangChainの「Deep Agents」をキャッチアップしました。
Deep AgentsのGitHubリポジトリはこちらです。
LangChain公式ブログの記事はこちらです。
今回のポイント
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などあれば教えてください!
コメント