인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

博客园 - work hard work smart

5 分钟上手:为 Cline 配置一个免费的 MCP 天气服务 Neo4j 图数据库安装与 Spring Boot 集成实战指南 LangFuse 实战指南:用 @observe 三行代码给 LLM 应用加上全链路追踪 Function Call 深度解析:让大模型从"嘴炮"到"实干"的技术革命 Spring AI 提示词模板实战:告别硬编码,实现提示词工程化管理 LangChain4j 实战指南:用 Java 轻松构建 AI 应用 - work hard work smart Spring AI 对话短期记忆实战:让大模型拥有"记忆力" Spring AI 提示词工程实战:让大模型更懂你的意图 Spring AI ChatClient 深度解析:优雅构建大模型应用的利器 Spring AI Alibaba DashScopeChatModel 实战 Spring 中 SSE 流式输出的多种实现方式详解 OpenSandbox 实战指南:为 AI Agent 构建安全的代码执行沙箱 在本机启动 LangGraph 开发服务器:完整指南 为什么选择 Go 开发 Web 接口?从入门到实践 智能搜索DeepAgent笔记 RAG学习笔记2--系统查询流程 RAG学习笔记1--系统文件导入流程 百炼 WebSearch 快速入门指南 Python 连接 MongoDB 完整指南:从连接配置到增删改查实战 一行命令搞定 MongoDB 开发环境:Docker Compose 部署 + 可视化管理 使用 Attu 可视化管理 Milvus 向量数据库 在 Windows Docker 中快速安装 Milvus 2.5.6 minio使用 Spark 集群搭建 hadoop集群安装 Spring AI Alibaba 入门实战 Windows 安装 OpenClaw 实战指南 MyBatis 核心流程和原理 Idea中安装Claude code插件 Spark 编程 使用Matplotlib 绘制直方图 Flink安装部署 Flume安装 查找导致cpu过高的代码方法 JVisualVM监控远程Java进程 jmap jacoco多模块生成java单元测试报告实践 arthas 使用demo LockSupport Exchanger CyclicBarrier CountDownLatch 手把手教你用python开始第一个机器学习项目
DeepAgents에서 Backend의 비밀: AI 에이전트가 파일 조작 능력을 갖게 하기
work hard wo · 2026-05-24 · via 博客园 - work hard work smart

지능 에이전트(AI Agent)를 구축할 때, 우리는 종종 에이전트가 파일을 읽고, 쓰고, 검색하고, 편집할 수 있도록 해야 합니다. DeepAgents 프레임워크는 Backend(백엔드) 메커니즘을 통해 이 기능을 구현하여 에이전트에게 안전하고 제어 가능한 파일 작업 환경을 제공합니다. 본 글에서는 Backend의 개념과 사용 방법을 심층적으로 탐구하고, 네 가지 점진적인 예제를 통해 그 강력한 기능을 보여줍니다.

Backend는 무엇인가?

Backend는 DeepAgents 프레임워크의 핵심 추상 개념으로, 에이전트가 파일 시스템과 어떻게 상호작용할지 정의합니다. Backend를 통해 에이전트는 다음과 같은 작업을 수행할 수 있습니다:

  • 파일과 디렉토리를 나열 ls_info
  • 파일 내용을 읽기 read)
  • 새 파일에 쓰기 (write)
  • 파일 내용 검색 (grep_raw)
  • 패턴 일치 파일 (glob_info)
  • 기존 파일 편집 (edit)

Backend의 핵심 가치는 보안 유연성에 있습니다:Agent의 파일 작업을 특정 디렉토리 내에서 제한하여 권한 상승 접근을 방지하고, 다양한 저장 매체(로컬 파일 시스템, 메모리, 클라우드 저장소 등)를 지원합니다.

Backend의 사용 사례

  1. 코드 생성 및 편집:Agent가 사보트 환경에서 코드를 작성하고 수정하도록 합니다.
  2. 데이터 분석:Agent가 데이터 파일을 읽고 처리하며 생성합니다.
  3. 문서 처리:자동화된 문서 생성 및 콘텐츠 업데이트
  4. 구성 관리:동적으로 구성 파일을 생성하고 수정합니다.

DeepAgents이 지원하는 Backend 유형

DeepAgents 프레임워크는 다양한 Backend 구현을 제공하여 다양한 시나리오의 요구사항을 충족합니다:

1. FilesystemBackend - 로컬 파일 시스템

  • 기능:로컬 디스크 파일을 직접 조작합니다
  • 특징:영구 저장, virtual_mode 보안 격리 지원
  • 적용:파일 영구 저장, 다른 시스템과 파일 공유가 필요한 시나리오

2. LocalShellBackend - 로컬 Shell 실행

  • 기능:파일 작업 + 로컬 Shell 명령 실행
  • 특징:스크립트 실행 및 시스템 도구 호출(깃, 도커 등)을 지원합니다.
  • 적용:코드 컴파일, 스크립트 실행, 복잡한 명령 실행이 필요한 시나리오에 적합합니다.

3. SandboxBackend - 원격 사상환경

  • 기능:분리된 사상환경에서 명령 및 파일 작업을 수행합니다.
  • 특징:완전히 분리된 실행 환경, 클라우드 사상(예: OpenSandbox, Daytona)을 지원합니다.
  • 자식 클래스 구현
    • OpenSandboxBackend:OpenSandbox를 기반으로 한 오픈 소스 사상 솔루션
    • DaytonaBackend:Daytona를 기반으로 한 클라우드 사상 솔루션
  • 에 적용됩니다:고보안 격리가 필요하고 신뢰할 수 없는 코드를 실행하며 클라우드 실행 환경

4. 커스텀 Backend - 완전한 유연성

  • 기능BackendProtocol 인터페이스를 구현하여 커스텀 저장 로직을 정의
  • 특징:모든 종류의 저장 매체(메모리, 데이터베이스, 클라우드 저장소 등)와 연동 가능
  • 예시DictBackend(메모리 저장)、RedisBackend(Redis 저장) 등
  • 에 적용됩니다:특수 요구사항、테스트 환경、커스텀 저장 로직

백엔드 유형 비교

백엔드 유형 파일 작업 명령 실행 영구 저장 보안 격리 표준 시나리오
FilesystemBackend 중간(가상 모드) 로컬 파일 처리
LocalShellBackend ✅(지역) 중간(가상 모드) 지역 스크립트 실행
SandboxBackend ✅(사상장) 선택 높음(완전 분리) 클라우드 보안 실행
사용자 정의 Backend 사용자 정의 사용자 정의 사용자 정의 사용자 정의 특별 요구사항

4가지 점진적 예시

예시 1: Backend 없는 기본 Agent

가장 간단한 Agent 구성은 Backend를 사용하지 않고, 오직 도구 호출에만 의존하여 작업을 수행합니다:

from deepagents import create_deep_agent
from langgraph.checkpoint.memory import InMemorySaver

# 创建内存检查点保存器
checkpointer = InMemorySaver()

# 创建基础Agent
agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    #checkpointer=checkpointer,
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

특징

  • 외부 API 호출(예: 웹 검색)만 필요한 경우에 적합합니다
  • 파일 작업을 할 수 없습니다
  • 설정이 간단하고, 시작이 빠르다

예시 2: FilesystemBackend - 파일 시스템 사보이

Agent이 파일을 작동해야 할 때,FilesystemBackend가장 흔하게 선택되는 것입니다:

import os
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend
from langgraph.checkpoint.memory import InMemorySaver

checkpointer = InMemorySaver()

# 创建Agent工作目录
temp_workspace = "./agent_workspace"
os.makedirs(temp_workspace, exist_ok=True)

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=FilesystemBackend(
        root_dir=temp_workspace,
        virtual_mode=True,  # 防止Agent通过`../../`跳出根目录
    ),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

핵심 파라미터

  • root_dir:지정된 Agent의 작업 루트 디렉토리
  • virtual_mode=True:가상 모드를 활성화하여 경로 통과 공격(예: ../../etc/passwd)을 방지합니다.

적용 시나리오

  • 는 파일을 영구적으로 저장해야 합니다.
  • Agent이 생성한 파일이 디스크에 유지되어야 합니다.
  • 파일을 다른 시스템과 공유해야 합니다.

예시 3: LocalShellBackend - 명령 실행을 지원합니다.

Agent이 파일 작업뿐만 아니라 shell 명령을 실행해야 하는 경우, LocalShellBackend는 더 나은 선택입니다:

import os
import sys
from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend, LocalShellBackend
from langgraph.checkpoint.memory import InMemorySaver

checkpointer = InMemorySaver()

temp_workspace = "./agent_workspace"
os.makedirs(temp_workspace, exist_ok=True)

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=LocalShellBackend(
        root_dir=temp_workspace,
        virtual_mode=True,
        timeout=30,  # 命令执行超时时间(秒)
        max_output_bytes=50000,  # 命令输出最大字节数
        env={
            "PATH": f"{os.path.dirname(sys.executable)};{os.environ.get('PATH', '')}",
        },
    ),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

새로운 기능

  • 은 shell 명령어를 실행할 수 있습니다(예: python script.py, ls -la)
  • 은 타임아웃 시간과 출력 제한을 구성할 수 있어 악의적이거나 비효율적인 명령을 방지합니다
  • 은 환경 변수를 사용자 정의하여 명령이 올바른 환경에서 실행되도록 합니다

적용 시나리오

  • 스크립트를 실행하거나 코드를 컴파일해야 할 때
  • 시스템 도구(예: git, docker)를 호출해야 할 때
  • 복잡한 데이터 처리 파이프라인을 실행해야 할 때

예시 4: 사용자 정의 Backend - DictBackend

DeepAgents의 강점은 그 확장성에 있습니다. 이를 통해BackendProtocol인터페이스를 통해 완전히 사용자 정의 가능한 Backend를 만들 수 있습니다:

from deepagents.backends.protocol import BackendProtocol, WriteResult, EditResult
from deepagents.backends.utils import FileInfo, GrepMatch
from datetime import datetime
import re

class DictBackend(BackendProtocol):
    """将文件存储在内存字典中的自定义后端"""
    
    def __init__(self):
        self.files = {}  # 路径 -> 内容
        self.metadata = {}  # 路径 -> 元数据
    
    def ls_info(self, path: str) -> list[FileInfo]:
        """列出文件和目录信息"""
        result = []
        seen_dirs = set()
        for file_path in self.files.keys():
            if file_path.startswith(path):
                remaining = file_path[len(path):]
                if '/' in remaining:
                    dir_name = path + remaining.split('/')[0] + '/'
                    if dir_name not in seen_dirs:
                        seen_dirs.add(dir_name)
                        result.append(FileInfo(path=dir_name, is_dir=True))
                else:
                    meta = self.metadata.get(file_path, {})
                    result.append(FileInfo(
                        path=file_path,
                        is_dir=False,
                        size=meta.get('size', 0),
                        modified_at=meta.get('modified_at')
                    ))
        return result
    
    def read(self, file_path: str, offset: int = 0, limit: int = 2000) -> str:
        """读取文件内容,支持分页"""
        if file_path not in self.files:
            return f"Error: File '{file_path}' not found"
        content = self.files[file_path]
        lines = content.splitlines(keepends=True)
        start_line = offset
        end_line = start_line + limit if limit > 0 else len(lines)
        selected_lines = lines[start_line:end_line]
        result = ''.join(f"{start_line + i + 1}: {line}" for i, line in enumerate(selected_lines))
        return result if result else "(end of file)"
    
    def write(self, file_path: str, content: str) -> WriteResult:
        """写入新文件(仅创建,不覆盖)"""
        if file_path in self.files:
            return WriteResult(error=f"File '{file_path}' already exists (create-only).")
        self.files[file_path] = content
        self.metadata[file_path] = {
            'size': len(content),
            'modified_at': datetime.now().isoformat()
        }
        return WriteResult(path=file_path, files_update=None)
    
    def grep_raw(self, pattern: str, path: str | None = None, glob: str | None = None) -> list[GrepMatch] | str:
        """正则表达式搜索文件内容"""
        try:
            re.compile(pattern)
        except re.error as e:
            return f"Invalid regex pattern: {e}"
        matches = []
        for file_path, content in self.files.items():
            for i, line in enumerate(content.splitlines()):
                if re.search(pattern, line):
                    matches.append(GrepMatch(path=file_path, line=i+1, text=line))
        return matches
    
    def glob_info(self, pattern: str, path: str = "/") -> list[FileInfo]:
        """通配符匹配文件"""
        import fnmatch
        all_files = [
            FileInfo(path=p, is_dir=False, size=self.metadata[p]['size'], 
                    modified_at=self.metadata[p]['modified_at']) 
            for p in self.files.keys() if p.startswith(path)
        ]
        matched = [fi for fi in all_files if fnmatch.fnmatch(fi.path, path.rstrip('/') + '/' + pattern)]
        return matched
    
    def edit(self, file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult:
        """编辑文件内容"""
        if file_path not in self.files:
            return EditResult(error=f"File '{file_path}' not found")
        content = self.files[file_path]
        if replace_all:
            new_content = content.replace(old_string, new_string)
            occurrences = content.count(old_string)
        else:
            if content.count(old_string) != 1:
                return EditResult(error=f"Found {content.count(old_string)} occurrences. For safety, edit requires exactly one match unless replace_all=True.")
            new_content = content.replace(old_string, new_string, 1)
            occurrences = 1
        if new_content == content:
            return EditResult(error=f"String '{old_string}' not found.")
        self.files[file_path] = new_content
        self.metadata[file_path]['size'] = len(new_content)
        self.metadata[file_path]['modified_at'] = datetime.now().isoformat()
        return EditResult(path=file_path, files_update=None, occurrences=occurrences)

사용자 지정 백엔드 사용

from deepagents import create_deep_agent
from deepagents.backends import FilesystemBackend, LocalShellBackend
from langgraph.checkpoint.memory import InMemorySaver

from my_backend import DictBackend

checkpointer = InMemorySaver()

agent = create_deep_agent(
    model=llm,
    tools=[web_search],
    checkpointer=checkpointer,
    backend=DictBackend(),
    system_prompt='你是一个助手,请根据用户输入的指令,进行相应的操作。'
)

커스텀 백엔드의 장점

  • 완전한 통제: 어떤 저장 로직(데이터베이스, 클라우드 저장소, 암호화 저장소 등)을 정의할 수 있습니다
  • 보안 분리: 에이전트 작동은 완전히 메모리 내에서 이루어지며, 실제 파일 시스템에 영향을 주지 않습니다
  • 테스트 가능성: 단위 테스트 및 디버깅을 위한 편의
  • 성능 최적화특정 시나리오에 맞춰 읽기/쓰기 성능 최적화

백엔드 선택 가이드

시나리오 추천 백엔드 이유
API 호출만 필요하며 파일 작업이 필요 없음 백엔드 없음 간단하고 효율적
지속적인 파일 저장이 필요함 FilesystemBackend 직접 디스크 파일 작업
shell 명령 실행이 필요함 LocalShellBackend 명령 실행 및 파일 작업 지원
완전한 격리 또는 커스텀 저장이 필요함 사용자 정의 Backend 유연하고 제어 가능하며 특수 요구 사항에 적합

최선의 관행

  1. 항상 virtual_mode를 활성화:경로 침투 공격을 방지하고 Agent가 사보트 내에서 작동하도록 보장
  2. 합리적인 타임아웃과 제한을 설정:악의적이거나 비효율적인 명령이 과도한 자원을 소모하는 것을 방지
  3. checkpointer를 사용하여 상태를 저장:대화 이력 복원과 중단 지점 이어가기 지원
  4. 사용자 정의 Backend 시 완전한 인터페이스 구현:모든 메서드가 올바르게 구현되어 있음을 보장하고 런타임 오류 방지
  5. Backend 작업 로그 기록:디버깅과 감사를 위해 Agent 행동을 용이하게 합니다

요약

Backend는 DeepAgents 프레임워크에서 AI Agent와 파일 시스템을 연결하는 다리입니다. 유연하게 선택하거나 커스터마이징한 Backend를 통해 우리는 Agent에게 안전하고 효율적이며 제어 가능한 파일 작업 환경을 제공할 수 있습니다. 단순한 Backend 구성 없이, 기능이 강력한 LocalShellBackend까지, 완전히 커스터마이징된 DictBackend까지 DeepAgents는 다양한 응용 시나리오를 만족시키기 위한 풍부한 옵션을 제공합니다.

Backend 사용법을 익히면 더욱 강력하고 실용적인 AI Agent를 구축할 수 있으며, 지능형 에이전트가 실제로 "动手" 능력을 갖추게 할 수 있습니다!