2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

LangChain的DeepAgents工具体系全解析:MCP、Skills 与沙箱安全怎么配合

发布日期:2026-03-27 04:18:20 浏览次数: 2715
作者:与AI同行之路

微信搜一搜,关注“与AI同行之路”

推荐语

DeepAgents 工具设计揭秘:如何让Agent从实习生变身靠谱助手?

核心内容:
1. 内置工具的巧妙设计:从任务管理到文件操作,每个工具都暗藏玄机
2. Skills系统如何封装领域最佳实践,实现工作流复用
3. MCP与沙箱安全机制如何构建完整的工具生态系统

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

 

有个问题我琢磨了很久:为什么同样的底层模型,有的 Agent 用起来像个实习生,有的却像个靠谱助手?

答案往往不在模型本身,而在工具。更准确点说,在"工具是怎么被设计出来的"。

去年我评估过几个开源 Agent 框架,发现它们对工具的理解差异巨大。有的框架把工具当成"函数调用",只要能执行就行;有的框架考虑到了工具描述怎么写才能让模型理解;但真正做得好的,会把工具当成一个完整的"接口设计"问题来思考——包括工具怎么组织、怎么发现、怎么安全执行。

DeepAgents 在工具这块下了很大功夫。它不是只塞给你几个内置工具,而是试图把整个工具生态搭起来:Skills 负责复用工作流,MCP 负责接外部服务,沙箱模型负责把执行边界收住。这一篇我们就顺着这条线,一层层往下剥。

内置工具不是摆设

先回到基础。DeepAgents 默认给你的工具,不是摆在那里凑数的,每一个都带着明确的使用意图。

write_todos 看似简单,但它的提示词里藏着细节:

Use this tool to track multi-step tasks. Break down complex objectives into concrete, actionable items.
Mark items as complete when done. Update the list as requirements change.

它其实是在引导 Agent 形成"规划-执行-检查"的工作习惯。看起来只是待办清单,背后其实是任务管理的思维方式。

文件操作工具族的设计也很有讲究。read_file 支持指定行范围,edit_file 支持字符串替换,glob 和 grep 支持批量搜索。这套组合覆盖了代码分析的完整工作流:先搜索定位,再细读内容,再修改保存。

特别想提一下 edit_file。它不是简单的"覆盖写入",而是支持类似 sed 的替换操作:

edit_file(
    path="/path/to/file.py",
    old_string="def old_function():",
    new_string="def new_function():"
)

为什么是替换而不是直接写?因为替换天然带一点"验证"意味。如果 old_string 在文件里找不到,工具会报错,而不是盲目写入把文件搞坏。这种防御性设计,在生产环境里能少掉很多低级事故。

但这些只是基础。真正的扩展能力来自 Skills 和 MCP。

Skills:可复用的工作流

Skills 是 DeepAgents 里我很喜欢的设计。它解决了一个特别实际的问题:怎么让 Agent 掌握某个领域里已经被验证过的最佳实践?

举个例子。假设你有个内部流程:每次代码审查都要检查安全漏洞、性能隐患、是否符合编码规范。你当然可以把这套流程写成文档给 Agent 看,但那毕竟是静态的。Skills 的价值在于,它能把这套流程变成可复用的模块。

Skill 的结构

一个 Skill 就是一个目录,里面必须有个 SKILL.md 文件:

/skills/code-review/
├── SKILL.md          # 核心定义
└── helper.py         # 可选的辅助代码

SKILL.md 的格式是 YAML frontmatter + Markdown 内容:

---
name: code-review
description: Perform comprehensive code review focusing on security, performance, and maintainability
license: MIT
---


# Code Review Skill


## When to Use


Use this skill when:
-
 User asks you to review code
-
 Pull request needs analysis
-
 Security audit is required

## Review Checklist


### Security

-
 [ ] Check for SQL injection vulnerabilities
-
 [ ] Validate input sanitization
-
 [ ] Review authentication logic

### Performance

-
 [ ] Identify N+1 queries
-
 [ ] Check for unnecessary loops
-
 [ ] Review memory usage patterns

### Maintainability

-
 [ ] Verify code follows project conventions
-
 [ ] Check documentation completeness
-
 [ ] Assess test coverage

## Output Format


Provide findings in this structure:

Critical Issues (must fix)

  • • ...

Warnings (should fix)

  • • ...

Suggestions (nice to have)

  • • ...

Skills 系统会解析这个文件,提取元数据(name, description, license),然后把 Markdown 内容注入到 Agent 的系统提示里。

渐进式披露

Skills 系统有个很精妙的设计叫"渐进式披露"(Progressive Disclosure)。

第一次加载 Skill 时,系统只读取 YAML frontmatter(也就几十 tokens),知道有这么个 Skill、大概干什么的。只有当 Agent 真正决定用这个 Skill 时,才把完整的 Markdown 内容加载进来。

看 skills.py 里的实现:

class SkillMetadata(TypedDict):
    path: str
    name: str
    description: str
    # ... 其他元数据


class
 SkillsMiddleware(AgentMiddleware):
    def
 __init__(self, backend, sources):
        # 启动时只加载元数据

        self
._skills_metadata = self._load_metadata(sources)

    def
 modify_request(self, request):
        # 第一次只注入元数据

        skills_intro = self._format_skills_intro()
        # ...


    def
 _get_skill_full_content(self, skill_name):
        # 真正用到时才加载完整内容

        return
 self._backend.read_file(self._skill_paths[skill_name])

这个设计非常实用。你想想,假设有 20 个 Skill,每个平均 5KB,如果全塞进系统提示,那上下文一下就鼓起来了,token 成本也跟着爆。渐进式披露的好处就是,启动成本主要跟 Skill 数量有关,而不是跟 Skill 正文长度正相关。

Skill 的层级

Skills 可以从多个来源加载,形成层级覆盖:

agent = create_deep_agent(
    skills=[
        "/skills/base/"
,      # 公司基础规范
        "/skills/team/"
,      # 团队特定规则
        "/skills/project/"
,   # 项目定制流程
    ]
)

同名的 Skill,后面的覆盖前面的。这种设计让组织可以建立 Skill 体系:基础层提供通用能力,上层逐级定制。

MCP:打破围墙花园

Skills 解决的是"复用"问题,但还有另一个更现实的问题:怎么跟外部世界连接?

你的 Agent 可能需要查数据库、发 Slack 消息、操作 GitHub PR。这些能力不应该硬编码在 Agent 里,而是通过标准协议动态接入。

这就是 MCP(Model Context Protocol)的用武之地。

MCP 是什么

简单说,MCP 就像 AI 应用的"USB 接口"。它定义了一套标准协议,让任何服务都可以暴露给 LLM 使用,而不用在 Agent 侧关心后端到底是什么。

一个 MCP Server 可以提供:

  • • Tools —— 可调用的函数
  • • Resources —— 可读取的数据
  • • Prompts —— 可复用的提示模板

DeepAgents 通过 langchain-mcp-adapters 集成 MCP:

from langchain_mcp_adapters import load_mcp_tools
from
 deepagents import create_deep_agent

# 连接到一个 MCP Server

mcp_tools = load_mcp_tools("https://my-mcp-server.com/sse")

agent = create_deep_agent(
    tools=mcp_tools + [my_custom_tool]
)

实战:接入数据库查询

假设你有个内部数据库,想让 Agent 能查询。传统做法一般是写个 query_database 工具,把连接字符串和查询逻辑都硬编码进去。但这样耦合太紧了。

MCP 的做法是:单独部署一个 MCP Server,专门处理数据库访问。

# mcp_server.py
from
 mcp.server import Server

server = Server("database-server")

@server.tool()

async
 def query_database(sql: str) -> str:
    """Execute SQL query and return results"""

    # 连接数据库、执行查询、返回结果

    return
 results

@server.resource("schema://tables")

async
 def get_tables() -> str:
    """Return database schema"""

    return
 schema_info

然后在 DeepAgents 里接入:

from langchain_mcp_adapters import load_mcp_tools

# Agent 通过 MCP 协议使用数据库,不用关心具体实现

db_tools = load_mcp_tools("http://localhost:8000/sse")

agent = create_deep_agent(tools=db_tools)

好处很明显:

  • • 数据库逻辑独立维护,可以热更新
  • • 多个 Agent 可以共用同一个 MCP Server
  • • MCP Server 可以自己控制权限、审计、限流
  • • Agent 侧代码干净,只关心业务逻辑

MCP 生态

MCP 协议是 Anthropic 发起的,但正在形成开放生态。目前已经有官方和社区实现的 Server:

  • • 文件系统 —— 读写本地文件
  • • PostgreSQL —— 数据库查询
  • • GitHub —— 操作 PR、Issues
  • • Slack —— 发送消息
  • • Puppeteer —— 浏览器自动化

DeepAgents 的思路很清楚:内置工具覆盖通用需求,MCP 接住特定场景。这样既保留开箱即用的体验,又不会把扩展空间封死。

沙箱安全模型

工具能力越强,安全问题越突出。DeepAgents 有个 execute 工具能执行 shell 命令,如果滥用就是远程代码执行漏洞。

DeepAgents 的安全哲学很简单:Trust the LLM,但把边界 enforcement 放在工具层。

这不是说"相信模型不会干坏事",而是说"就算模型想干坏事,工具层也得拦得住"。

Backend 的安全层级

DeepAgents 的 Backend 设计体现了这种分层安全思想。

最底层是 BackendProtocol,定义文件操作的基本接口。然后有 SandboxBackendProtocol 扩展,增加了执行能力:

class BackendProtocol:
    """基础后端:只支持文件操作"""

    def
 read_file(self, path: str) -> ReadResult: ...
    def
 write_file(self, path: str, content: str) -> WriteResult: ...

class
 SandboxBackendProtocol(BackendProtocol):
    """沙箱后端:额外支持执行"""

    def
 execute(self, command: str) -> ExecuteResult: ...

注意这个继承关系。execute 不是基础能力,是额外能力。只有显式使用支持 Sandbox 的 Backend,execute 工具才可用。

后端类型对比

StateBackend —— 最安全的选项

from deepagents.backends import StateBackend

agent = create_deep_agent(backend=StateBackend)
  • • 文件存在内存里,不对真实文件系统做操作
  • • 不支持 execute,调用会返回错误
  • • 适合不需要持久化的场景,或者纯粹的分析任务

FilesystemBackend —— 有持久化需求时用

from deepagents.backends import FilesystemBackend

agent = create_deep_agent(
    backend=FilesystemBackend(root_dir="./safe_zone")
)
  • • 文件写入真实磁盘,但限制在 root_dir 下
  • • 仍然不支持 execute
  • • 适合需要保存结果,但不需要执行命令的场景

Sandbox Backends —— 需要执行时用

DeepAgents 支持多种沙箱后端:

# Modal 沙箱
from
 deepagents.backends.sandbox import ModalBackend

agent = create_deep_agent(
    backend=ModalBackend(
        image="python:3.11",
        secrets=["MY_API_KEY"]
    )
)

# Daytona 沙箱

from
 deepagents.backends.sandbox import DaytonaBackend

agent = create_deep_agent(
    backend=DaytonaBackend(
        timeout=300,
        language="python"
    )
)

这些沙箱后端在隔离环境里执行命令,有资源限制、超时控制、网络隔离。即使 Agent 执行了恶意代码,也只影响沙箱内部。

最小权限原则

配置 Agent 时,问自己:这个任务真的需要执行权限吗?真的需要写文件吗?

如果只需要读文件分析,用 StateBackend。如果需要保存结果但不需要执行,用 FilesystemBackend。只有确实需要运行命令(比如构建项目、运行测试),才上 Sandbox。

这种"默认拒绝,显式开启"的设计,很符合安全领域的最小权限原则。

Human-in-the-Loop

沙箱是第一道防线,但有时候业务需要更细粒度的控制。比如允许 Agent 读任何文件,但写文件需要人工确认。

DeepAgents 的 interrupt_on 配置就是干这个的:

agent = create_deep_agent(
    backend=FilesystemBackend(root_dir="./workspace"),
    interrupt_on={
        "write_file"
: True,      # 写文件前暂停
        "edit_file"
: True,       # 编辑前暂停
        "execute"
: {             # 执行命令时根据内容决定
            "condition"
: lambda tool_call: "rm" in tool_call["args"]["command"]
        }
    }
)

当 Agent 调用这些工具时,执行会暂停,系统抛出中断,等待人类审批。审批可以修改工具参数,或者直接拒绝。

这在生产环境里特别重要。你可以让 Agent 自动处理常规任务,但在关键操作前,比如写生产代码、删文件、发邮件,再让人来拍板。

自定义 Backend 开发

如果现有的 Backend 都不满足需求,你可以自己实现。

Backend 的核心是实现 BackendProtocol

from deepagents.backends.protocol import BackendProtocol, ReadResult, WriteResult, LsResult

class
 MyCustomBackend(BackendProtocol):
    def
 __init__(self, config):
        self
.config = config
        # 初始化你的存储连接


    def
 read_file(self, path: str) -> ReadResult:
        # 实现读取逻辑

        content = self._fetch_from_my_storage(path)
        return
 ReadResult(content=content)

    def
 write_file(self, path: str, content: str) -> WriteResult:
        # 实现写入逻辑

        self
._save_to_my_storage(path, content)
        return
 WriteResult(success=True)

    def
 ls(self, path: str) -> LsResult:
        # 实现列表逻辑

        files = self._list_my_storage(path)
        return
 LsResult(files=files)

然后在创建 Agent 时使用:

agent = create_deep_agent(
    backend=lambda runtime: MyCustomBackend(config)
)

为什么这里要用 lambda?因为某些 Backend(比如 StateBackend)需要运行时 context 才能初始化。lambda 的作用,就是把 Backend 的创建延迟到真正需要的时候。

实战:S3 Backend

假设你想把文件存在 AWS S3 而不是本地磁盘:

import boto3
from
 deepagents.backends.protocol import BackendProtocol, ReadResult, WriteResult

class
 S3Backend(BackendProtocol):
    def
 __init__(self, bucket: str):
        self
.s3 = boto3.client('s3')
        self
.bucket = bucket

    def
 read_file(self, path: str) -> ReadResult:
        try
:
            response = self.s3.get_object(Bucket=self.bucket, Key=path)
            content = response['Body'].read().decode('utf-8')
            return
 ReadResult(content=content)
        except
 self.s3.exceptions.NoSuchKey:
            return
 ReadResult(error="file_not_found")

    def
 write_file(self, path: str, content: str) -> WriteResult:
        self
.s3.put_object(
            Bucket=self.bucket,
            Key=path,
            Body=content.encode('utf-8')
        )
        return
 WriteResult(success=True)

# 使用

agent = create_deep_agent(
    backend=lambda rt: S3Backend(bucket="my-agent-bucket")
)

这样 Agent 的所有文件操作都透明地落在 S3 上,天然支持多实例共享、持久化、备份。

小结

这一篇其实想说明一件事:真正把 Agent 做强的,往往不是模型参数,而是工具体系是不是成型。

内置工具解决的是最常见的脏活累活,Skills 解决的是经验复用,MCP 解决的是外部连接,沙箱和 Human-in-the-Loop 解决的则是边界控制。把这几层拼起来,你得到的就不再是"能调几个函数的 Agent",而是一套能逐步接近生产环境的工作系统。

所以我更愿意把 DeepAgents 理解成"工具生态框架",而不只是"多塞了几个工具的 Agent 封装"。这两者看起来差不多,落到实际项目里差别会非常大。

 


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅