1. 代码执行工具的核心设计
代码执行工具的开发远不止是调用Python内置的exec()那么简单。作为一个长期从事自动化工具开发的工程师,我深刻理解一个健壮的代码执行环境需要解决的三大核心问题。
1.1 环境隔离机制
环境隔离是代码执行工具的首要任务。我们绝对不能允许用户提交的代码影响宿主系统的稳定性。在我的实践中,主要采用以下几种隔离策略:
- 命名空间隔离:通过限制
globals和locals字典,确保执行环境与主程序隔离 - 模块白名单:只允许导入预定义的safe_imports列表中的模块
- 资源限制:使用Python的resource模块限制CPU和内存使用
python复制import resource
def set_memory_limit(mb):
"""设置内存限制(MB)"""
bytes_limit = mb * 1024 * 1024
resource.setrlimit(resource.RLIMIT_AS, (bytes_limit, bytes_limit))
1.2 依赖管理的艺术
动态处理import语句是代码执行工具的另一个挑战。我们的解决方案是:
- 静态分析代码中的import语句
- 检查模块是否在白名单内
- 对于未安装但允许的依赖,提供安全安装机制
python复制def check_imports(code: str) -> bool:
"""检查代码中的import语句"""
import ast
try:
tree = ast.parse(code)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
if alias.name not in self.safe_imports:
return False
elif isinstance(node, ast.ImportFrom):
if node.module not in self.safe_imports:
return False
return True
except SyntaxError:
return False
1.3 安全沙箱的实现
安全沙箱需要防范的危险操作包括但不限于:
- 文件系统操作(rm, chmod等)
- 网络访问
- 系统调用
- 无限循环
我们采用多层防护策略:
- 代码静态分析
- 运行时监控
- 资源限制
python复制DANGEROUS_PATTERNS = [
'os.system',
'subprocess.call',
'open(',
'__import__(',
'eval(',
'exec('
]
def is_dangerous(code: str) -> bool:
"""检查代码是否包含危险模式"""
code = code.lower()
return any(pattern in code for pattern in DANGEROUS_PATTERNS)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 计算Agent的架构设计
2.1 生成-执行-解释模式
一个完整的计算Agent应该实现完整的"生成-执行-解释"工作流。这种模式的核心优势在于:
- 可解释性:用户不仅能得到结果,还能理解计算过程
- 可调试性:当结果不符合预期时,可以检查生成的代码
- 可扩展性:每个环节都可以独立优化
python复制class CalcAgent:
def __init__(self):
self.executor = CodeExecutor()
self.memory = ConversationMemory()
def solve(self, query: str):
# 1. 问题分类
problem_type = self.classify_problem(query)
# 2. 代码生成
code = self.generate_code(query, problem_type)
# 3. 安全执行
result = self.executor.execute_python(code)
# 4. 结果解释
explanation = self.explain_result(result, problem_type)
return {
'code': code,
'result': result,
'explanation': explanation
}
2.2 上下文记忆的实现
优秀的计算Agent需要具备上下文记忆能力。我们使用简单的对话历史记录来实现:
python复制class ConversationMemory:
def __init__(self, max_length=10):
self.history = []
self.max_length = max_length
def add(self, role: str, content: str):
"""添加对话记录"""
self.history.append({'role': role, 'content': content})
if len(self.history) > self.max_length:
se
