如果你最近在尝试让大语言模型LLM帮你写代码、分析数据或处理复杂任务大概率遇到过这种情况模型给出的代码片段跑不通因为它“忘记”了之前几步的上下文或者当你要求它基于一个复杂项目进行迭代时它的输出开始变得混乱、前后矛盾。这不仅仅是“上下文窗口不够长”的问题。更深层的原因在于当前主流的LLM交互范式——将整个对话历史作为连续的文本流喂给模型——在处理需要多步骤、有状态、且中间产物如文件、变量、执行结果至关重要的任务时存在根本性的结构缺陷。“Scratch Workspace”暂存工作区正是为解决这一核心痛点而生的新兴范式。它不是一个具体的工具而是一种设计理念和架构思路为LLM Agent提供一个独立的、可持久化的、结构化的“草稿纸”空间让模型能够像人类开发者一样在思考过程中写下中间步骤、保存临时文件、记录执行状态从而实现更可靠、更复杂的多步推理与任务执行。本文将深入探讨为什么LLM亟需“Scratch Workspace”它的核心原理是什么以及我们如何在实际项目中从简单的脚本到复杂的多智能体系统应用这一理念。你会发现这不仅仅是优化提示词而是对LLM工作方式的底层重构。1. 这篇文章真正要解决的问题为什么你的LLM Agent总是“健忘”和“混乱”很多开发者将LLM应用中的问题归咎于模型能力或提示工程。但当我们构建需要执行代码、操作文件系统、调用API的智能体Agent时一个更根本的瓶颈浮现出来缺乏工作记忆和状态管理。想象一下你作为程序员的工作流程你接到需求先创建一个项目文件夹。你可能会写一个草稿文档plan.md列出思路。你创建第一个脚本main.py写一些代码运行它。运行报错你查看错误日志error.log修改代码。过程中你可能会创建临时测试文件test_data.csv或者保存一些中间结果。最终你将可用的代码整理到正式文件中。整个过程中你的“工作区”项目文件夹保存了所有中间状态。你可以随时回溯、修改、基于之前的成果继续。然而传统的LLM对话模式是怎样的呢状态丢失模型每轮生成都基于当前输入的提示词和有限的对话历史。上一步代码的执行结果如果只是以文本形式放在历史里很容易在后续生成时被忽略或误解。文件系统抽象缺失模型“知道”文件的概念但在对话中它无法真正“创建”、“读取”、“写入”一个文件。它只能“描述”文件内容。这导致它无法进行真正的文件操作迭代。混乱的上下文当对话历史很长混杂着用户指令、模型思考、代码片段、执行结果、错误信息时模型的注意力很容易被分散生成质量下降。“Scratch Workspace”要解决的就是为LLM提供一个专属的、结构化的、可操作的文件系统环境让它能够持久化存储将代码、数据、配置文件等保存下来供后续步骤使用。状态隔离每个任务或会话拥有独立的工作区避免状态污染。结构化交互通过明确的API如write_file,read_file,execute_code与工作区交互而不是在自然语言中描述一切。这不仅仅是方便而是解锁复杂、多步骤LLM应用的必要条件。接下来我们深入其核心原理。2. Scratch Workspace 核心原理从“聊天”到“工程”Scratch Workspace 的核心思想是为LLM智能体引入一个类似于现代IDE或命令行环境的“第一公民”实体。其原理可以分解为以下几个层面2.1 状态外置与持久化传统对话中模型的状态记忆隐含在对话历史的文本中。Scratch Workspace 则将关键状态外置到一个独立的、持久化的存储中如磁盘目录、数据库、内存文件系统。模型通过工具调用来读写这个存储。这样状态不再受限于模型的上下文长度并且可以跨会话持久存在。2.2 工具增强的交互范式模型与工作区的交互从自然语言描述转变为工具调用。这类似于给模型配备了“手”和“眼睛”。核心工具通常包括文件操作create_file,read_file,write_file,list_files,delete_file代码执行execute_python,execute_shell,execute_sql在安全沙箱中环境管理set_environment_variable,get_environment_variable进程控制start_process,stop_process,check_process_status这些工具定义了模型能做什么也清晰地划定了其操作边界。2.3 工作区即上下文工作区本身成为了对话最重要的上下文。模型的提示词Prompt可以设计为“你当前的工作区路径是/scratch/session_123。请根据工作区中已有的文件来完成以下任务...” 这样模型无需在脑海中“记住”所有文件内容而是学会去“查看”工作区。2.4 与多智能体Multi-Agent的天然契合当任务复杂到需要多个智能体协作时例如一个负责规划一个负责编码一个负责测试Scratch Workspace 的价值更加凸显。它可以作为共享的、唯一的事实来源。规划者Planner在工作区创建task_breakdown.md。编码者Coder读取该文件并在工作区创建impl.py。执行者Executor运行impl.py将输出和日志写入execution.log。测试者Tester读取代码和日志生成test_report.md。所有智能体都在同一个物理或虚拟的文件系统中操作通过文件进行异步、可靠的通信避免了在自然语言中传递复杂、易失的信息。网络热词关联你提到的chimera_ latency- and performance-aware multi-agent serving for heterogeneous llms正反映了这一趋势的前沿。Chimera这类系统关注异构LLM的多智能体服务其核心挑战之一就是智能体间的状态同步与协作效率。一个设计良好的 Scratch Workspace 架构正是降低这种协作延迟、提升整体性能的关键基础设施。它为不同能力的智能体如大模型负责创意小模型负责工具调用提供了标准化的“协作白板”。理解了原理我们来看如何从零开始为一个LLM智能体构建一个最简单的 Scratch Workspace。3. 环境准备与前置条件我们将使用 Python 来演示构建一个基础的 Scratch Workspace 管理器。这个例子将非常直观你可以在此基础上扩展出更复杂的功能。环境要求操作系统Linux/macOS/Windows (WSL2推荐)Python 版本 3.8核心库openai或litellm用于调用LLM API本文以OpenAI API为例docker可选用于安全的代码执行沙箱。如果不用Docker可以使用subprocess但需极度注意安全。项目初始化创建一个新的项目目录并初始化虚拟环境。# 创建项目目录 mkdir llm-scratch-workspace-demo cd llm-scratch-workspace-demo # 创建虚拟环境推荐 python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安装基础依赖 pip install openai python-dotenv安全警告允许LLM执行任意代码是极度危险的操作。绝对不要在生产环境或能访问敏感数据的机器上直接运行未经严格限制的subprocess或exec。本文的示例仅用于演示原理在实际应用中你必须使用沙箱技术如Docker容器、gVisor、Firecracker进行隔离并严格限制网络、文件系统和系统调用。4. 核心组件拆解构建一个最小可行工作区管理器一个最基础的 Scratch Workspace 管理器需要包含以下核心组件工作区目录管理创建、销毁、定位独立的工作区。文件系统工具封装底层的文件操作供LLM调用。代码执行引擎在安全环境中运行代码并捕获结果。LLM 智能体集成将上述工具暴露给LLM并设计合理的提示词。我们将逐步实现它们。4.1 工作区目录管理我们设计一个WorkspaceManager类负责为每个会话session创建独立的物理目录。# file: workspace_manager.py import os import shutil import uuid from pathlib import Path from typing import Optional class WorkspaceManager: 管理LLM智能体的暂存工作区。 def __init__(self, base_path: str ./workspaces): 初始化工作区管理器。 Args: base_path: 所有工作区存放的根目录。 self.base_path Path(base_path).resolve() self.base_path.mkdir(parentsTrue, exist_okTrue) print(f[WorkspaceManager] 基础路径已设置: {self.base_path}) def create_workspace(self, session_id: Optional[str] None) - Path: 为一个新会话创建工作区目录。 Args: session_id: 可选的会话ID。若未提供则生成一个UUID。 Returns: 创建的工作区目录的Path对象。 if session_id is None: session_id str(uuid.uuid4())[:8] # 取前8位便于识别 workspace_path self.base_path / fsession_{session_id} workspace_path.mkdir(parentsTrue, exist_okTrue) print(f[WorkspaceManager] 创建工作区: {workspace_path}) return workspace_path def get_workspace(self, session_id: str) - Path: 获取指定会话的工作区路径。 workspace_path self.base_path / fsession_{session_id} if not workspace_path.exists(): raise FileNotFoundError(f工作区 {workspace_path} 不存在。) return workspace_path def cleanup_workspace(self, session_id: str): 清理删除指定会话的工作区。 workspace_path self.get_workspace(session_id) shutil.rmtree(workspace_path) print(f[WorkspaceManager] 已清理工作区: {workspace_path}) # 简单测试 if __name__ __main__: manager WorkspaceManager() ws_path manager.create_workspace(test_123) (ws_path / hello.txt).write_text(这是一个测试文件。) print(f文件内容: {(ws_path / hello.txt).read_text()}) # manager.cleanup_workspace(test_123) # 取消注释以清理这个管理器提供了工作区的生命周期管理。每个智能体会话都将绑定到一个独立的目录。4.2 文件系统工具封装接下来我们创建一组工具函数它们将被暴露给LLM。这些函数是智能体与工作区交互的API。# file: workspace_tools.py import subprocess import sys from pathlib import Path from typing import Dict, Any, Tuple import json class WorkspaceTools: 提供给LLM智能体调用的工作区工具集。 def __init__(self, workspace_path: Path): self.workspace_path workspace_path def write_file(self, file_path: str, content: str) - Dict[str, Any]: 在工作区内创建或覆盖一个文件。 full_path self.workspace_path / file_path # 防止路径遍历攻击确保路径在工作区内 try: full_path.resolve().relative_to(self.workspace_path.resolve()) except ValueError: return {success: False, error: f路径不安全或越界: {file_path}} full_path.parent.mkdir(parentsTrue, exist_okTrue) full_path.write_text(content, encodingutf-8) return { success: True, message: f文件已写入: {file_path}, absolute_path: str(full_path) } def read_file(self, file_path: str) - Dict[str, Any]: 读取工作区内的一个文件。 full_path self.workspace_path / file_path try: full_path.resolve().relative_to(self.workspace_path.resolve()) content full_path.read_text(encodingutf-8) return {success: True, content: content} except (ValueError, FileNotFoundError) as e: return {success: False, error: f无法读取文件: {e}} def list_files(self, directory: str .) - Dict[str, Any]: 列出工作区内指定目录下的文件和子目录。 target_path self.workspace_path / directory try: target_path.resolve().relative_to(self.workspace_path.resolve()) items [] for item in target_path.iterdir(): items.append({ name: item.name, type: directory if item.is_dir() else file, size: item.stat().st_size if item.is_file() else 0 }) return {success: True, items: items} except ValueError: return {success: False, error: 目录路径不安全或越界。} def execute_python_code(self, code: str, timeout: int 10) - Dict[str, Any]: 在工作区上下文下执行一段Python代码。 **警告这是一个极简示例生产环境必须使用沙箱** # 将代码写入临时文件在工作区目录中执行 temp_file self.workspace_path / _temp_execution.py temp_file.write_text(code, encodingutf-8) try: # 使用subprocess执行捕获输出和错误 result subprocess.run( [sys.executable, str(temp_file)], cwdself.workspace_path, capture_outputTrue, textTrue, timeouttimeout ) # 清理临时文件 temp_file.unlink(missing_okTrue) return { success: result.returncode 0, returncode: result.returncode, stdout: result.stdout, stderr: result.stderr } except subprocess.TimeoutExpired: return {success: False, error: f代码执行超时 ({timeout}秒)} except Exception as e: return {success: False, error: f执行过程异常: {e}} def get_tools_description(self) - str: 生成供LLM识别的工具描述文本。 tools_desc 你可以使用以下工具与你的暂存工作区交互 1. write_file(file_path: str, content: str): 创建或覆盖文件。 2. read_file(file_path: str): 读取文件内容。 3. list_files(directory: str .): 列出目录内容。 4. execute_python_code(code: str, timeout: int 10): 执行Python代码并返回结果。 你的工作区根目录是{workspace_path} 请根据任务需要合理使用这些工具。例如你可以先写一个脚本然后执行它来验证结果。 .format(workspace_pathself.workspace_path) return tools_desc这个工具类封装了核心操作。请注意execute_python_code函数它仅用于演示在生产中必须被更安全的沙箱执行器替代。5. 集成LLM智能体让模型学会使用工作区现在我们将工作区工具与一个LLM智能体这里使用OpenAI GPT-4连接起来。关键在于设计提示词让模型理解它拥有一个工作区并学会按步骤使用工具。5.1 智能体主循环与提示词设计我们创建一个简单的智能体类它接收用户请求调用LLM解析模型对工具的调用执行工具并将结果反馈给模型形成循环。# file: scratch_agent.py import os import json import re from openai import OpenAI from dotenv import load_dotenv from workspace_manager import WorkspaceManager from workspace_tools import WorkspaceTools # 加载环境变量假设你的OPENAI_API_KEY在.env文件中 load_dotenv() class ScratchAgent: 一个能够使用暂存工作区的LLM智能体。 def __init__(self, model: str gpt-4-turbo-preview): self.client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.model model self.workspace_manager WorkspaceManager() self.session_id None self.workspace_tools None self.conversation_history [] def start_session(self, session_id: str None): 启动一个新的智能体会话并创建对应的工作区。 self.session_id session_id workspace_path self.workspace_manager.create_workspace(self.session_id) self.workspace_tools WorkspaceTools(workspace_path) self.conversation_history [ {role: system, content: self._get_system_prompt()} ] print(f[ScratchAgent] 会话 {self.session_id} 已启动工作区位于: {workspace_path}) def _get_system_prompt(self) - str: 构建系统提示词定义智能体的角色和能力。 base_prompt 你是一个强大的编程助手拥有一个专属的“暂存工作区”Scratch Workspace。 在这个工作区里你可以创建、读取、写入文件并执行Python代码来验证你的想法或完成任务。 工作区是你的私人沙盒所有中间步骤和结果都应该保存在这里。 if self.workspace_tools: base_prompt self.workspace_tools.get_tools_description() base_prompt 当你需要执行操作时请严格按照以下JSON格式响应且只返回这个JSON对象 { thought: 你的思考过程解释下一步要做什么以及为什么。, action: { name: 工具名例如 write_file, read_file, list_files, execute_python_code, args: { /* 工具对应的参数字典 */ } } } 我会执行你指定的动作并将执行结果以相同格式返回给你。然后你可以继续下一步。 如果任务已经完成或者你不需要再使用工具请在action中返回 null并在thought中总结结果。 现在开始处理用户的任务吧。 return base_prompt def _parse_model_response(self, response_text: str) - dict: 尝试从模型回复中解析出JSON格式的动作指令。 # 尝试找到JSON块 json_match re.search(r\{.*\}, response_text, re.DOTALL) if json_match: try: return json.loads(json_match.group()) except json.JSONDecodeError: pass # 如果解析失败返回一个要求模型重试的指令 return { thought: 我未能理解你的回复格式。请严格按照指定的JSON格式回应。, action: None } def process_user_request(self, user_input: str) - str: 处理用户的一次输入可能包含多轮工具调用。 self.conversation_history.append({role: user, content: user_input}) final_result None # 限制最大交互轮次防止无限循环 max_turns 10 for turn in range(max_turns): print(f\n--- 第 {turn 1} 轮交互 ---) # 调用LLM response self.client.chat.completions.create( modelself.model, messagesself.conversation_history, temperature0.2, # 低温度使输出更确定 max_tokens1500 ) model_message response.choices[0].message.content print(f[AI 回复]:\n{model_message}) # 解析模型回复 parsed self._parse_model_response(model_message) thought parsed.get(thought, ) action_spec parsed.get(action) # 将模型的“思考”加入历史帮助其保持连贯 self.conversation_history.append({role: assistant, content: model_message}) # 如果模型没有指定动作或动作为null认为任务完成 if not action_spec: final_result thought break # 执行工具调用 action_name action_spec.get(name) action_args action_spec.get(args, {}) tool_result self._execute_tool(action_name, action_args) # 将工具执行结果格式化后反馈给模型 result_message { thought: thought, action_result: tool_result } result_str json.dumps(result_message, ensure_asciiFalse, indent2) print(f[工具执行结果]:\n{result_str}) # 将结果作为新一轮的“用户”输入继续循环 self.conversation_history.append({role: user, content: f工具执行结果{result_str}}) if final_result is None: final_result f达到最大交互轮次({max_turns})任务可能未完成。 return final_result def _execute_tool(self, tool_name: str, args: dict) - dict: 根据工具名和参数调用具体的工具函数。 if not self.workspace_tools: return {success: False, error: 工作区未初始化。} tool_map { write_file: self.workspace_tools.write_file, read_file: self.workspace_tools.read_file, list_files: self.workspace_tools.list_files, execute_python_code: self.workspace_tools.execute_python_code, } if tool_name not in tool_map: return {success: False, error: f未知的工具: {tool_name}} try: # 调用工具函数 return tool_map[tool_name](**args) except Exception as e: return {success: False, error: f工具调用异常: {e}} def end_session(self): 结束会话可选清理工作区。 if self.session_id: # 这里可以选择清理或保留工作区 # self.workspace_manager.cleanup_workspace(self.session_id) print(f[ScratchAgent] 会话 {self.session_id} 结束。工作区保留在: {self.workspace_manager.get_workspace(self.session_id)})这个ScratchAgent类实现了核心的交互循环。系统提示词是关键它明确告知模型工作区的存在、可用的工具以及严格的JSON响应格式。这种结构化输出而非自由文本是构建可靠智能体的常见模式。6. 完整示例让智能体完成一个数据分析任务现在让我们运行一个完整的示例。假设我们想让智能体分析一个CSV文件计算平均年龄并绘制图表。我们将模拟这个过程。第一步准备环境并启动智能体创建一个主程序文件main.py# file: main.py from scratch_agent import ScratchAgent def main(): # 1. 初始化智能体 agent ScratchAgent(modelgpt-4-turbo-preview) # 或使用 gpt-3.5-turbo # 2. 启动一个会话 session_id demo_data_analysis agent.start_session(session_id) # 3. 给智能体一个任务 user_task 请完成以下数据分析任务 1. 在工作区中创建一个名为 data.csv 的文件内容如下 name,age,city Alice,28,New York Bob,34,San Francisco Charlie,23,Chicago Diana,31,Seattle Eve,29,Boston 2. 编写一个Python脚本 analyze.py该脚本需要 a. 读取 data.csv 文件。 b. 计算所有人的平均年龄。 c. 将结果打印到控制台并同时写入一个名为 result.txt 的文件。 3. 执行你编写的 analyze.py 脚本并确保它成功运行。 请一步一步来使用我提供的工具。完成后告诉我平均年龄是多少。 print( * 50) print(用户任务:) print(user_task) print( * 50) # 4. 处理任务 final_result agent.process_user_request(user_task) print(\n * 50) print(任务最终结果:) print(final_result) print( * 50) # 5. 结束会话保留工作区供检查 agent.end_session() # 6. 我们可以手动检查工作区内容 import os workspace_dir f./workspaces/session_{session_id} print(f\n工作区内容位于: {os.path.abspath(workspace_dir)}) print(目录列表:) for root, dirs, files in os.walk(workspace_dir): level root.replace(workspace_dir, ).count(os.sep) indent * 2 * level print(f{indent}{os.path.basename(root)}/) subindent * 2 * (level 1) for file in files: print(f{subindent}{file}) if __name__ __main__: main()第二步运行程序并观察在终端运行export OPENAI_API_KEY你的API密钥 # 或在.env文件中设置 python main.py预期交互过程模拟智能体会按照以下逻辑执行实际输出取决于模型第一轮模型思考后使用write_file工具创建data.csv。第二轮收到创建成功的反馈后模型使用write_file工具创建analyze.py并写入读取CSV和计算平均年龄的代码。第三轮收到代码创建成功的反馈后模型使用execute_python_code工具运行analyze.py。第四轮收到执行成功的反馈包含标准输出模型判断任务完成返回最终结果。第三步检查工作区程序运行后查看./workspaces/session_demo_data_analysis/目录你应该能看到data.csv原始数据文件。analyze.py智能体生成的Python脚本。result.txt脚本运行后生成的结果文件如果脚本按任务要求写了。_temp_execution.py可能已被删除的临时执行文件。这个示例展示了Scratch Workspace如何将一项复杂的多步骤任务创建文件、写代码、执行代码分解为一系列原子化的、可追溯的工具调用并由LLM协调完成。7. 进阶从单智能体到多智能体与Chimera架构单一智能体配合工作区已经能解决很多问题。但对于更复杂的任务如开发一个完整的小型应用可能需要分工协作。这就是多智能体系统和类似Chimera架构的用武之地。我们可以扩展上面的框架实现一个简单的多智能体系统# file: multi_agent_system.py (概念示例) class MultiAgentSystem: def __init__(self): self.workspace_manager WorkspaceManager(base_path./shared_workspace) self.shared_workspace_path self.workspace_manager.create_workspace(project_x) self.agents {} def register_agent(self, name: str, role: str, system_prompt: str): 注册一个具有特定角色的智能体。 # 每个智能体共享同一个工作区但可能有不同的系统提示词角色 tools WorkspaceTools(self.shared_workspace_path) # ... 初始化该智能体的LLM客户端和对话历史 self.agents[name] { role: role, system_prompt: system_prompt tools.get_tools_description(), tools: tools, history: [] } def orchestrate(self, task: str): 协调多个智能体完成任务。 # 1. 规划者分解任务 planner self.agents[planner] subtasks self._ask_agent(planner, f请将以下任务分解为具体的子任务并说明每个子任务的输出产物是什么。任务{task}) # 2. 将子任务分发给执行者如编码者、测试者 # 例如编码者读取规划者生成的 spec.md开始编写代码。 # 所有智能体通过读写共享工作区中的文件来协作。 coder self.agents[coder] for subtask in subtasks: if subtask[assignee] coder: self._ask_agent(coder, f请根据工作区中的文档 {subtask[spec_file]} 完成编码子任务{subtask[description]}) # 3. 测试者验证结果 tester self.agents[tester] self._ask_agent(tester, 请检查工作区中 src/ 目录下的代码并运行测试。) def _ask_agent(self, agent_config, query: str): # 类似单智能体的 process_user_request 逻辑但使用特定agent的配置 pass在这个架构中共享工作区是协作的基石所有中间产物需求文档、代码、测试报告都存放在这里。智能体角色化每个智能体有明确的职责如规划、编码、测试通过系统提示词限定。异步协作智能体不需要实时对话它们可以依次或并行地处理工作区中的文件。Chimera等系统关注的延迟和性能感知在此体现为工作区状态缓存智能体无需重复读取未变化的文件。工具调用优化批量处理文件操作减少与LLM的交互轮次。异构模型路由将文件读写等简单任务路由给更快、更便宜的小模型将复杂设计任务交给大模型。8. 常见问题与排查思路在实际实现和使用 Scratch Workspace 模式时你会遇到一些典型问题。问题现象可能原因排查方式解决方案LLM 不按JSON格式响应系统提示词不够清晰模型温度temperature过高。检查系统提示词中关于响应格式的指令是否明确、突出。查看LLM调用参数。1. 强化提示词使用“你必须”、“严格”等词。2. 在提示词中提供更清晰的JSON示例。3. 将temperature调低如0.1-0.3。工具调用参数错误模型生成的JSON中args的键值与工具函数参数不匹配。打印出模型生成的完整JSON和工具函数的预期参数。1. 在提示词中精确描述每个工具所需的参数名和类型。2. 在_execute_tool函数中添加参数验证和转换逻辑。代码执行超时或卡死智能体生成了死循环代码沙箱资源不足。检查execute_python_code返回的错误信息监控系统资源。1.必须设置执行超时如timeout30。2. 使用资源限制更严格的沙箱如Docker的CPU/内存限制。3. 在工具层拦截危险的系统调用。工作区文件混乱多个会话或智能体意外写入了相同路径智能体生成的文件名冲突。检查工作区目录结构确认文件命名。1. 为每个会话使用唯一ID。2. 在工具函数中可以要求智能体为生成的文件使用更具描述性的名称如包含时间戳或任务ID。3. 实现文件版本管理或快照。LLM 陷入循环智能体不断重复相同的工具调用无法推进任务。观察对话历史看是否陷入“失败-重试”或“生成-检查-再生成”的死循环。1. 在process_user_request中设置最大交互轮次。2. 在系统提示词中强调“如果工具执行失败请分析错误原因并尝试新方法不要简单重试”。3. 引入一个“监督者”智能体来中断循环。安全风险智能体执行了rm -rf /或访问了敏感数据。这是最严重的问题。审查所有工具函数特别是执行代码和文件操作的函数。1.绝对禁止在生产环境使用subprocess执行未经验证的代码。2. 必须使用隔离的Docker容器或专用沙箱。3. 在文件路径解析中严格检查路径遍历攻击Path Traversal。4. 限制网络访问。9. 最佳实践与工程建议将 Scratch Workspace 模式应用到生产级项目需要遵循以下最佳实践9.1 安全第一沙箱隔离使用 Docker、gVisor 或 Firecracker 等容器/微虚拟机技术来隔离代码执行环境。一个简单的Docker执行器示例# 概念代码非完整实现 def execute_code_in_docker(code: str, image: str python:3.9-slim): # 1. 将代码写入宿主机临时文件 # 2. 启动一个带有CPU、内存、网络限制的Docker容器 # 3. 将临时文件挂载到容器内 # 4. 在容器内执行代码 # 5. 捕获输出然后销毁容器 pass权限最小化工作区目录的权限应严格限制。执行沙箱应以非root用户运行。输入验证与过滤对所有来自LLM的输入文件路径、命令参数进行严格的验证和过滤。9.2 状态管理与持久化工作区生命周期明确工作区的创建、使用、归档和销毁策略。对于重要任务可以考虑定期备份工作区快照。超越文件系统对于更复杂的状态如数据库记录、API调用历史可以将工作区抽象为一个键值存储或数据库而不仅仅是文件系统。会话恢复实现会话状态的保存与加载允许智能体任务被中断后恢复。9.3 提示词工程结构化输出是必须的强制LLM以JSON、XML或YAML等结构化格式响应这是实现可靠工具调用的基础。可以考虑使用OpenAI的function calling或JSON mode特性来获得更好的支持。提供工作区上下文在每轮提示中可以简要总结工作区的当前状态如“工作区中已有以下文件...”帮助模型保持上下文。定义清晰的完成条件在系统提示词中明确告知智能体“任务完成”的标准例如“当你生成了最终报告文件report.pdf并验证无误后就可以停止。”9.4 性能与可观测性工具调用开销每次LLM调用和工具执行都有延迟。对于长任务考虑将多个小操作合并为一个“复合工具”调用如write_and_execute。日志与追踪详细记录每一轮对话、每一个工具调用的输入输出。这对于调试复杂任务和优化提示词至关重要。异构模型调度正如Chimera所关注的并非所有步骤都需要最强模型。可以用大模型如GPT-4做规划和复杂推理用小模型如GPT-3.5-Turbo、Claude Haiku或专用模型处理简单的文件操作和格式化任务。9.5 设计模式管理者-工作者模式一个中心“管理者”智能体负责分解任务和协调多个“工作者”智能体负责执行具体子任务所有通信通过共享工作区进行。流水线模式任务像流水线一样经过多个智能体处理每个智能体完成特定阶段如数据清洗、特征工程、模型训练、结果可视化并将产出物放入工作区供下一阶段使用。黑板模式共享工作区作为“黑板”多个智能体可以随时读取黑板上的信息并贡献自己的结果适用于更动态、探索性的任务。Scratch Workspace 不是一个银弹但它为解决LLM在复杂、多步骤任务中的“健忘症”和状态管理混乱问题提供了一个强大而直观的范式。它将LLM从“聊天机器人”推向“数字工作者”使其能够在一个持久化、结构化的环境中像人类一样使用工具、创建工件、并基于中间结果进行迭代。对于开发者而言这意味着你可以开始构建更可靠、更复杂的LLM应用。无论是自动化数据流水线、生成式代码开发、还是复杂的多智能体系统一个设计良好的暂存工作区都将成为你架构中不可或缺的核心组件。建议从本文的简单示例开始亲手实现一个你会对LLM智能体的能力边界和工程挑战有全新的认识。