从代码解释器到AI代理沙盒:构建安全可扩展的执行环境

news2026/4/30 10:01:12
1. 项目概述一个为AI代理打造的“沙盒游乐场”如果你和我一样一直在探索如何让ChatGPT这类大语言模型LLM真正“动手”做事而不仅仅是“动嘴”聊天那么你肯定对OpenAI官方的“代码解释器”Code Interpreter功能又爱又恨。爱的是它终于能让GPT运行Python代码处理数据、生成图表恨的是它限制重重——只能跑Python文件操作受限网络访问更是奢望感觉像是给一个天才程序员配了一台不能联网、只能运行特定软件的“阉割版”电脑。今天要聊的这个项目e2b-dev/llm-code-interpreter虽然其README已标注为“已弃用”并引导至新的Code Interpreter SDK但其核心思想极具启发性在我看来它提供了一个截然不同的解题思路。它不是一个简单的代码执行器而是一个为AI代理Agent量身定制的、全功能的云端沙盒环境。你可以把它想象成给ChatGPT插件系统装上了一台完整的、安全的云端虚拟机。在这个沙盒里AI可以像真正的开发者一样使用Linux操作系统、通过apt-get或npm安装任何它需要的软件包、在文件系统中自由创建、读取和删除文件、运行任何语言的进程Node.js, Go, Rust, Java...并且拥有完整的互联网访问权限。这个项目的核心价值在于它通过极简的API运行命令、读文件、写文件暴露了底层强大的沙盒能力将复杂的云环境管理抽象化让开发者可以专注于构建更智能、能执行复杂工作流的AI代理。它回答了一个关键问题当AI需要的不只是计算而是一个完整的、可交互的操作环境时我们该如何提供接下来我将深入拆解这个项目的设计哲学、实现原理并分享如何基于类似思路构建你自己的“超级代码解释器”。2. 核心设计哲学从“解释器”到“执行环境”的范式转变2.1 传统代码解释器的局限性分析在深入e2b的方案之前我们有必要先厘清传统“代码解释器”模式的瓶颈。以ChatGPT的官方功能为例其工作模式通常是语言单一通常仅支持Python这直接将大量生态如系统管理、Web服务器、原生应用排除在外。环境隔离但封闭虽然在一个临时的、容器化的环境中运行保证了基础安全但环境是高度预设和受限的。你无法安装新的系统级依赖如ffmpeg、chromium无法启动一个常驻的后台服务如数据库。资源与生命周期受限会话结束后环境即销毁无法进行需要持久化状态或长时间运行的任务。网络隔离出于安全考虑通常无法访问外部网络这限制了从互联网获取数据或调用外部API的能力。这种设计适合完成一次性的、纯数据计算或分析任务但远远无法满足一个“智能代理”的需求。一个真正的代理应该能根据任务动态配置环境、安装工具、处理文件、并与外界服务交互。2.2 E2B的“沙盒游乐场”理念E2B项目提出的“AI Playgrounds”概念正是针对上述局限的解决方案。其设计哲学可以概括为以下几点提供原始的操作系统能力与其封装高级函数不如提供最基础的构建块PrimitivesRunCommand,ReadFile,WriteFile。这类似于给AI提供了Shell访问权限。有了这三个原语理论上AI可以组合出无限复杂的操作因为整个软件世界都是建立在文件系统和进程之上的。安全的沙盒是前提允许“运行任何代码”的前提是有一个牢靠的隔离环境。E2B的沙盒 likely 基于轻量级虚拟化如gVisor、Firecracker或深度容器化技术确保用户代码不会危及主机系统或其他用户。这是整个方案可行的基石。为“代理”而设计而非为“人”这个环境预期的主要使用者不是人类开发者通过SSH连接而是另一个程序AI Agent。因此其API设计需要是机器友好、易于被LLM理解和调用的。OpenAPI规范和清晰的指令描述至关重要。云原生与弹性环境按需创建、运行和销毁可以动态分配资源并且天生具备网络访问能力。这使得代理可以执行如git clone、curl下载资源、npm install等需要网络的操作。注意这种“赋予AI原始系统权限”的做法带来了巨大的灵活性同时也带来了更高的复杂性和安全考量。在设计和实现自己的类似系统时必须将安全隔离作为最高优先级仔细考虑资源配额、命令黑名单、网络防火墙、文件系统监控等机制。2.3 极简API背后的强大功能项目只暴露了三个核心端点我们来看看它们如何支撑起复杂的功能RunCommand(执行命令)这是能力的核心。通过它AI可以调用任何已安装或可安装的命令行工具。例如RunCommand({“command”: “python3 -c \“print(‘Hello, World!’)\“”})执行Python代码。RunCommand({“command”: “node -e \“console.log(12)\“”})执行JavaScript代码。RunCommand({“command”: “apt-get update apt-get install -y ffmpeg”})安装多媒体处理工具。RunCommand({“command”: “curl -s https://api.github.com/repos/e2b-dev/llm-code-interpreter | jq .stargazers_count”})调用网络API并处理JSON响应。ReadFile(读取文件)允许AI读取它自己或系统生成的文件内容。这对于处理配置文件、读取程序输出、分析日志至关重要。WriteFile(写入文件)允许AI创建或修改文件。这是编写脚本、配置文件、生成报告的基础。通过这三个API的组合一个AI代理可以完成“克隆仓库 - 安装依赖 - 运行测试 - 修改代码 - 提交更改”的完整开发工作流。这远远超出了“代码解释”的范畴进入了“代码执行与管理”的领域。3. 技术架构与实现原理深度解析虽然原项目仓库主要是一个ChatGPT插件的客户端实现但其背后依赖的E2B服务端架构才是技术核心。我们可以根据其描述和常见云沙盒技术推断并构建一个可行的实现方案。3.1 系统架构总览一个完整的、类似E2B的AI代码执行环境其架构通常分为以下几层[用户/Agent] - [API Gateway 调度层] - [沙盒管理集群] - [独立沙盒实例] | | | 发送HTTP请求 认证、路由、限流 创建、销毁、监控容器/VM | | | 接收JSON响应 日志收集、计费 资源隔离CPU、内存、磁盘、网络客户端/插件层即本项目一个实现了ChatGPT插件规范的Node.js服务器。它接收ChatGPT的请求将其转化为对E2B后端API的调用并返回结果。API网关与调度层负责用户认证、速率限制、请求路由。当收到创建沙盒或执行命令的请求时它需要决定在哪个物理节点上启动或找到对应的沙盒实例。沙盒管理集群核心基础设施层。管理着一批宿主机每台宿主机上可以运行多个隔离的沙盒实例。它需要处理资源的调度CPU、内存、镜像的拉取、生命周期的管理创建、暂停、恢复、销毁。沙盒实例层每个独立的、安全的执行环境。这是AI代码实际运行的地方。3.2 沙盒隔离技术选型实现安全隔离是重中之重。主要有以下几种技术路径各有优劣技术方案原理简述启动速度隔离强度资源开销适用场景Docker 容器利用Linux Namespace和Cgroups进行进程、网络、文件系统隔离。快 (秒级)中等低通用软件环境需要快速启动和销毁。gVisor在用户空间实现一个“沙盒内核”拦截并处理系统调用。中等高中对安全要求极高运行不可信代码。Firecracker (MicroVM)基于KVM的极轻量级虚拟机专为多租户容器场景设计。较快 (100ms)非常高硬件级低但高于容器公有云多租户场景强安全隔离。系统容器 (LXC/LXD)提供更接近虚拟机的容器体验有独立的init进程和更完整的系统视图。快中高低需要完整系统环境又希望保持容器的高效。对于E2B这类面向任意代码执行的AI代理平台Firecracker或gVisor是更可能的选择因为它们提供了更强的安全边界能更好地抵御容器逃逸攻击。Firecracker由AWS推出在Lambda和Fargate中广泛应用在安全与性能间取得了很好的平衡。3.3 核心工作流程拆解让我们模拟一个AI代理通过本插件完成“分析网站数据”任务的全流程来透视系统内部如何协作会话初始化用户向ChatGPT发出指令“帮我用Python爬取知乎热榜并分析标题的情感倾向。”ChatGPT插件本项目收到请求首先检查是否存在该用户/会话的活跃沙盒。如果没有则调用E2B后端APICreateSandbox。后端调度器选择一个宿主机通过Firecracker启动一个预置好的Linux镜像MicroVM并返回沙盒的唯一ID和连接信息如内部网络地址。命令执行与流式响应ChatGPT决定第一步是安装Python库requests和beautifulsoup4。它构造请求调用插件的RunCommand。插件将命令pip3 install requests beautifulsoup4转发给对应沙盒ID的后端服务。后端服务在指定的MicroVM内创建一个隔离的进程来执行该命令。这里的关键是处理长时间运行或有大输出的命令。优秀的实现会使用流式传输Streaming将标准输出stdout和标准错误stderr实时传回而不是等命令结束。这避免了超时也让AI能实时看到pip install的进度。安装成功后AI接着发送命令执行Python爬虫脚本。脚本可能先被WriteFile写入沙盒文件系统再通过RunCommand执行。文件操作与数据交换爬虫脚本将结果保存为data.json。AI通过ReadFile读取这个文件的内容。接着AI可能需要将数据可视化。它可以通过RunCommand安装matplotlib然后执行另一个Python脚本生成图表并保存为plot.png。如何将plot.png返回给用户这是原项目提到的“Hack”点。沙盒内的文件无法直接通过ChatGPT界面下载。方案是AI通过RunCommand调用沙盒内预装的curl将图片上传到一个临时的、可公开访问的对象存储如S3、Transfer.sh然后将这个临时URL返回给用户。反之用户上传文件也是通过提供公开URL让AI用curl或wget下载到沙盒内。会话清理任务完成后或者会话超时插件或后端会调用TerminateSandboxAPI彻底销毁该MicroVM释放所有资源。这确保了无状态性和安全性避免了信息泄露到下一个会话。3.4 安全与资源管控的实战考量在自建类似环境时以下安全措施是必须考虑的网络层防火墙沙盒应有出站网络权限用于安装包、访问API但入站连接应被严格限制。可以配置网络策略只允许访问必要的域名和端口如pypi.org,npmjs.com。命令与文件系统黑名单虽然目标是“运行任何代码”但一些危险操作必须禁止。例如禁止调用rm -rf /或dd等可能破坏系统或占用大量资源的命令。通过Seccomp或AppArmor配置限制某些系统调用如mount,swapon,clonewith certain flags。将根文件系统设置为只读工作目录挂载为可写的volume。资源配额Cgroups严格限制每个沙盒的CPU时间、内存用量、磁盘空间、进程数和网络带宽。防止一个恶意或错误的脚本耗尽主机资源影响其他用户。超时控制对RunCommand设置执行超时如30秒对沙盒整体设置空闲超时和最大生存时间如30分钟自动回收资源。审计与日志记录所有API调用、执行的命令用于调试和事后审查以及网络访问日志。这些日志应集中收集并脱敏后存储。4. 从零构建一个简易版AI代码执行沙盒理解了原理后我们可以尝试用更易得的技术栈构建一个功能简化但核心思想一致的版本。这里我们选择Docker作为沙盒技术因为它普及度高、易于上手。我们将构建一个包含API服务器和沙盒管理功能的系统。4.1 技术栈与项目初始化我们将使用Node.js (Express) 作为后端API使用Docker的Node SDK (dockerode) 来动态管理容器。# 1. 初始化项目 mkdir ai-code-sandbox cd ai-code-sandbox npm init -y # 2. 安装核心依赖 npm install express dockerode cors dotenv npm install -D typescript types/node types/express types/cors ts-node nodemon # 3. 初始化TypeScript配置 npx tsc --init # 在生成的tsconfig.json中确保设置 outDir: ./dist4.2 核心API服务器实现我们创建src/index.ts作为入口文件实现三个核心端点。// src/index.ts import express from express; import cors from cors; import Docker from dockerode; import { v4 as uuidv4 } from uuid; import path from path; import fs from fs/promises; const app express(); app.use(cors()); app.use(express.json()); // 初始化Docker客户端 const docker new Docker(); // 内存中存储活跃的沙盒会话 (生产环境需用Redis等持久化存储) const activeSessions: Mapstring, { containerId: string; workDir: string } new Map(); // 1. 创建沙盒端点 app.post(/sandbox, async (req, res) { const sessionId uuidv4(); const workDir /tmp/sandbox_${sessionId}; try { // 拉取一个干净的Linux镜像例如 alpine轻量或 ubuntu通用 // 这里为了演示假设已经拉取了 python:3.11-slim 镜像它包含基础工具 const container await docker.createContainer({ Image: python:3.11-slim, name: sandbox_${sessionId}, Cmd: [tail, -f, /dev/null], // 保持容器运行的空命令 WorkingDir: /workspace, HostConfig: { // 资源限制 Memory: 256 * 1024 * 1024, // 256MB MemorySwap: 512 * 1024 * 1024, // 512MB Swap CpuShares: 512, // CPU权重 // 将宿主机的一个临时目录挂载为工作空间 Binds: [${workDir}:/workspace], // 网络配置允许出站禁止入站 NetworkMode: none, // 最简单是禁用网络若要网络可改为 bridge 并配置防火墙 }, // 禁用网络若需网络可移除但务必配置防火墙规则 NetworkingConfig: { EndpointsConfig: { bridge: {} } }, }); await container.start(); // 在宿主机创建临时工作目录 await fs.mkdir(workDir, { recursive: true }); activeSessions.set(sessionId, { containerId: container.id, workDir }); res.json({ sessionId, message: Sandbox created successfully. }); } catch (error) { console.error(Failed to create sandbox:, error); res.status(500).json({ error: Failed to create sandbox environment. }); } }); // 2. 执行命令端点 app.post(/sandbox/:sessionId/exec, async (req, res) { const { sessionId } req.params; const { command } req.body; if (!command || typeof command ! string) { return res.status(400).json({ error: Command is required and must be a string. }); } const session activeSessions.get(sessionId); if (!session) { return res.status(404).json({ error: Session not found or expired. }); } try { const container docker.getContainer(session.containerId); // 创建执行配置 const exec await container.exec({ Cmd: [sh, -c, command], // 通过shell执行命令 AttachStdout: true, AttachStderr: true, WorkingDir: /workspace, }); // 启动执行并获取流 const stream await exec.start({ hijack: true, stdin: false }); let stdout ; let stderr ; // 处理输出流 container.modem.demuxStream(stream, { write: (chunk) { stdout chunk.toString(); }, }, { write: (chunk) { stderr chunk.toString(); }, }); // 等待执行结束 await new Promise((resolve, reject) { stream.on(end, resolve); stream.on(error, reject); }); // 获取退出代码 const inspect await exec.inspect(); const exitCode inspect.ExitCode; res.json({ stdout, stderr, exitCode, }); } catch (error) { console.error(Execution error for session ${sessionId}:, error); res.status(500).json({ error: Command execution failed. }); } }); // 3. 读取文件端点 app.get(/sandbox/:sessionId/file, async (req, res) { const { sessionId } req.params; const { path: filePath } req.query; // 从查询参数获取路径 if (typeof filePath ! string) { return res.status(400).json({ error: File path is required as a query parameter. }); } const session activeSessions.get(sessionId); if (!session) { return res.status(404).json({ error: Session not found or expired. }); } // 注意这里直接读取宿主机挂载的目录简化操作。 // 更安全的方式是通过容器内执行 cat 命令来读取。 const hostFilePath path.join(session.workDir, filePath); try { const content await fs.readFile(hostFilePath, utf-8); res.json({ content }); } catch (error: any) { if (error.code ENOENT) { res.status(404).json({ error: File not found. }); } else { res.status(500).json({ error: Failed to read file. }); } } }); // 4. 写入文件端点 app.post(/sandbox/:sessionId/file, async (req, res) { const { sessionId } req.params; const { path: filePath, content } req.body; if (typeof filePath ! string || typeof content ! string) { return res.status(400).json({ error: File path and content are required strings. }); } const session activeSessions.get(sessionId); if (!session) { return res.status(404).json({ error: Session not found or expired. }); } const hostFilePath path.join(session.workDir, filePath); try { // 确保目录存在 await fs.mkdir(path.dirname(hostFilePath), { recursive: true }); await fs.writeFile(hostFilePath, content, utf-8); res.json({ message: File written successfully. }); } catch (error) { console.error(Write file error for session ${sessionId}:, error); res.status(500).json({ error: Failed to write file. }); } }); // 5. 销毁沙盒端点 app.delete(/sandbox/:sessionId, async (req, res) { const { sessionId } req.params; const session activeSessions.get(sessionId); if (!session) { return res.status(404).json({ error: Session not found or expired. }); } try { const container docker.getContainer(session.containerId); await container.stop(); await container.remove(); // 清理宿主机目录 await fs.rm(session.workDir, { recursive: true, force: true }); activeSessions.delete(sessionId); res.json({ message: Sandbox destroyed successfully. }); } catch (error) { console.error(Failed to destroy sandbox ${sessionId}:, error); res.status(500).json({ error: Failed to destroy sandbox. }); } }); const PORT process.env.PORT || 3000; app.listen(PORT, () { console.log(AI Code Sandbox API server running on port ${PORT}); });4.3 配套Docker镜像与部署说明为了让沙盒环境更实用我们需要准备一个功能更丰富的基础Docker镜像而不是仅包含Python。# Dockerfile.sandbox FROM ubuntu:22.04 # 避免安装过程中的交互提示 ENV DEBIAN_FRONTENDnoninteractive # 安装基础工具和常用语言运行时 RUN apt-get update apt-get install -y \ curl \ wget \ git \ vim \ python3 \ python3-pip \ nodejs \ npm \ default-jdk \ golang \ rustc \ cargo \ php-cli \ perl \ rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /workspace # 保持容器运行 CMD [tail, -f, /dev/null]构建并推送镜像到你的仓库docker build -f Dockerfile.sandbox -t your-registry/ai-sandbox-base:latest . docker push your-registry/ai-sandbox-base:latest然后在API服务器的创建沙盒端点里将Image字段改为your-registry/ai-sandbox-base:latest。实操心得在生产环境中镜像的构建和管理是一门学问。你可以为不同的任务预置不同的镜像如数据科学镜像、Web开发镜像并在创建沙盒时通过请求参数指定。这能大幅减少每次安装依赖的等待时间。同时务必定期扫描和更新基础镜像修补安全漏洞。4.4 与ChatGPT插件集成现在我们需要一个类似原项目的“插件适配层”让ChatGPT能通过其插件协议与我们的后端对话。这需要实现一个符合OpenAPI规范的服务器并提供一个ai-plugin.json清单文件。创建插件服务器(plugin-server/index.js)const express require(express); const axios require(axios); const app express(); app.use(express.json()); const SANDBOX_API_BASE process.env.SANDBOX_API_BASE || http://localhost:3000; const sessionStore {}; // 简单内存存储 sessionId // ChatGPT插件要求的根端点 app.get(/.well-known/ai-plugin.json, (req, res) { res.json({ schema_version: v1, name_for_human: AI Code Sandbox, name_for_model: code_sandbox, description_for_human: A full-featured code execution sandbox for AI agents., description_for_model: Plugin for executing code in a secure sandbox. Use it to run shell commands, read and write files. Always create a sandbox session first., auth: { type: none }, api: { type: openapi, url: http://localhost:5000/openapi.yaml }, logo_url: http://localhost:5000/logo.png, contact_email: supportexample.com, legal_info_url: http://example.com/legal }); }); // 为每个ChatGPT对话创建一个沙盒会话 app.post(/session, async (req, res) { try { const sandboxRes await axios.post(${SANDBOX_API_BASE}/sandbox); const sessionId sandboxRes.data.sessionId; sessionStore[req.headers[openai-conversation-id]] sessionId; // 关联对话ID res.json({ sessionId, message: Session ready. }); } catch (error) { res.status(500).json({ error: Failed to create session. }); } }); // 代理命令执行请求到后端沙盒API app.post(/run, async (req, res) { const conversationId req.headers[openai-conversation-id]; const sessionId sessionStore[conversationId]; if (!sessionId) { return res.status(400).json({ error: No active session. Please create one first. }); } const { command } req.body; try { const execRes await axios.post(${SANDBOX_API_BASE}/sandbox/${sessionId}/exec, { command }); res.json(execRes.data); } catch (error) { res.status(500).json({ error: Command execution failed. }); } }); // 类似地实现 /read 和 /write 端点作为代理... app.listen(5000, () console.log(Plugin server running on port 5000));定义OpenAPI规范(plugin-server/openapi.yaml)这个文件告诉ChatGPT你的插件有哪些功能、如何调用。你需要根据上面的服务器端点来定义paths和schemas。完成这些后你就可以在ChatGPT插件开发模式中输入localhost:5000来安装并测试你的自定义“超级代码解释器”了。5. 高级应用场景、挑战与优化方向5.1 超越代码执行的智能体工作流拥有了这样一个强大的沙盒环境AI代理的能力边界被极大地扩展了。以下是一些激动人心的应用场景构想自动化运维与部署AI可以接收自然语言指令如“将项目A部署到测试服务器”然后自动执行SSH连接到服务器、拉取最新代码、安装依赖、运行数据库迁移、重启服务。交互式数据分析与报告生成用户上传一个CSV文件链接要求“分析销售趋势并生成PPT”。AI可以下载文件用Pandas和Matplotlib分析然后利用pandoc或python-pptx库生成幻灯片最后将PPT上传到云存储返回链接。端到端网络爬虫与监控AI可以编写并运行一个复杂的爬虫定期抓取竞争对手的价格信息存入沙盒内的轻量级数据库如SQLite进行分析并在价格变化时通过调用外部Webhook API发送通知。代码库维护与重构AI可以克隆一个Git仓库运行静态分析工具如sonarqube根据建议自动重构代码运行测试套件并创建Pull Request。作为其他AI工具的“执行手臂”更高层的规划型AI如AutoGPT可以将复杂任务分解为多个步骤并调用本沙盒来具体执行每一个需要操作系统的子任务。5.2 面临的主要挑战与应对策略构建这样一个系统并非易事你会遇到诸多挑战安全性是重中之重挑战恶意用户可能试图执行rm -rf /*、发起DDoS攻击、挖掘加密货币或尝试容器逃逸。策略采用多层防御。使用强隔离技术如gVisor严格限制资源CPU、内存、进程数、磁盘IO实现命令白名单/黑名单网络层面进行出站过滤和速率限制所有用户代码在无特权的非root用户下运行定期进行安全审计和渗透测试。资源管理与成本控制挑战沙盒实例是重量级资源长时间闲置会造成巨大浪费。策略实现智能的生命周期管理。设置活跃度检测闲置一段时间如5分钟后自动暂停或销毁实例。采用弹性伸缩策略根据队列长度动态调整预热实例的数量。使用更轻量的快照技术来加速新实例的启动。状态持久化与数据管理挑战用户希望多次对话间能保留工作环境如安装的特定软件、生成的文件。策略提供“会话”概念并将用户的工作目录/workspace持久化到外部存储如云存储卷。当会话恢复时重新挂载该卷。但需注意存储成本和数据清理策略。LLM的“幻觉”与错误操作挑战LLM可能生成错误或危险的命令导致沙盒内状态混乱或任务失败。策略在API层面增加“护栏”Guardrails。例如在执行前对命令进行简单的模式匹配检查提供“确认”机制对于高风险操作如rm,format要求用户确认设计更精细的API将常见高危操作封装成更安全的原子操作。5.3 性能与体验优化实践为了让系统更可用、更高效可以考虑以下优化命令流式输出如前所述这是必须的。使用Server-Sent Events (SSE) 或WebSocket将命令的stdout/stderr实时推送给客户端让用户或AI能立即看到进度。预置镜像与分层缓存为不同的编程语言或任务类型数据科学、Web开发、系统管理预置不同的Docker镜像。利用Docker的分层缓存机制公共基础层只需下载一次加快实例启动速度。虚拟文件系统VFS对于大量小文件的读写操作可以考虑使用内存文件系统如tmpfs或更高效的虚拟文件系统来提升IO性能尤其是在执行npm install或pip install时。异步任务队列对于可能长时间运行的任务如训练一个机器学习模型不应阻塞HTTP请求。可以引入任务队列如Bull、RabbitMQ立即返回一个任务ID让客户端通过轮询或Webhook来获取结果。6. 总结与展望回顾e2b-dev/llm-code-interpreter这个项目的思路其最大的贡献在于清晰地描绘了“AI代理操作系统”的雏形。它不再将LLM视为一个仅仅回答问题或生成文本的模型而是将其视为一个能够调度和使用复杂工具系统的“智能体大脑”。这个沙盒环境就是为这个大脑准备的“身体”和“工具箱”。从简单的代码执行到完整的云环境访问这中间是一次能力的跃迁。对于我们开发者而言理解并实践这种架构意味着我们能够构建出真正具有行动力的AI应用。无论是自动化工作流、智能助手还是自主代理其核心都离不开一个安全、可靠、强大的执行层。在具体实施上我个人的经验是从小处着手从安全着眼。可以先从单用户、有限命令的Docker沙盒开始验证工作流。然后逐步引入更强的隔离、资源管理、状态持久化和流式输出。同时要时刻思考API的设计如何能让LLM更好地理解和使用这是区别于传统运维工具的关键。这个领域正在快速发展未来我们可能会看到更多标准化的“AI代理运行时”出现它们会像今天的Kubernetes管理容器一样去管理这些为AI准备的沙盒环境。而我们现在所做的探索正是在为那个未来添砖加瓦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2568432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…