使用 OpenAI SDK 和 Docker 构建具备代码执行能力的 LLM 智能体
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
大语言模型(LLM)的进化已经从简单的对话交互迅速转向具备物理和数字世界交互能力的复杂智能体(Agents)。智能体最强大的能力之一就是编写并执行代码。这使得 LLM 从一个文本生成器转变为一个能够进行数据分析、数学计算和自动化系统管理的逻辑处理引擎。在本指南中,我们将探讨如何使用 OpenAI Agents SDK 和 Docker 安全沙箱构建一个强大的代码执行智能体。
构建一个可靠的智能体,首先需要一个高性能的后端支持。诸如 n1n.ai 之类的服务提供了低延迟、高可靠的 API 接入,确保智能体的“思考过程”不会因为服务商的宕机或限流而中断。
代码执行智能体的架构设计
代码执行智能体运行在一个通常被称为“感知-决策-行动-观察”(Plan-Act-Observe)的闭环中。与仅检索文本的标准 RAG(检索增强生成)系统不同,代码智能体遵循以下步骤:
- 推理阶段:LLM 分析用户提示,并确定需要代码来解决问题(例如:“计算 10,000 美元在 5 年内的复利”)。
- 生成阶段:LLM 编写一段 Python 脚本来执行计算。
- 执行阶段:系统将此脚本发送到安全的隔离环境(Docker)。
- 观察阶段:脚本的输出(或错误信息)被反馈给 LLM。
- 自我修复:如果代码运行失败,LLM 会利用错误日志修复脚本并重新尝试。
为什么 Docker 对代码执行至关重要?
允许 LLM 在你的宿主机上运行任意代码是一个巨大的安全风险。智能体可能会无意中(或受误导)删除文件、访问环境变量或发起网络攻击。Docker 提供了一个轻量级的隔离容器作为“沙箱”。如果智能体运行了 rm -rf /,它只会摧毁临时的容器,而不会影响你的宿主系统。此外,Docker 还可以限制 CPU 和内存的使用,防止恶意代码耗尽系统资源。
第一步:环境准备
首先,确保你已经安装了 Docker 和 OpenAI Agents SDK。你还需要一个稳定的 API 密钥。我们推荐使用 n1n.ai 来访问最新的 GPT-4o 或 o1 模型,这些模型在代码生成和逻辑推理方面表现尤为出色。
# 安装必要的库
# pip install openai docker
import docker
import openai
import os
import json
# 通过 n1n.ai 配置你的客户端
client = openai.OpenAI(
api_key="YOUR_N1N_API_KEY",
base_url="https://api.n1n.ai/v1"
)
第二步:实现 Docker 沙箱函数
我们需要编写一个函数,接收 Python 代码字符串,在 Docker 容器中运行它,并返回结果。使用 python:3.9-slim 镜像可以确保较小的体积和快速的启动速度。
def execute_python_code(code_string):
docker_client = docker.from_env()
try:
# 启动容器并运行代码
container = docker_client.containers.run(
image="python:3.9-slim",
command=f"python3 -c \"{code_string}\"",
detach=True,
network_disabled=True, # 安全:禁止沙箱访问互联网
mem_limit="128m" # 资源限制:128MB 内存
)
# 等待执行完成并获取日志
result = container.wait(timeout=10) # 设置 10 秒超时
logs = container.logs().decode("utf-8")
container.remove()
if result["StatusCode"] == 0:
return logs
else:
return f"Execution Error: {logs}"
except Exception as e:
return f"Sandbox Error: {str(e)}"
第三步:定义智能体工具(Tools)
使用 OpenAI SDK 的 Tool Calling 功能,我们将 execute_python_code 函数定义为模型可以调用的工具。这是 LLM 推理与 Docker 执行之间的“桥梁”。
tools = [
{
"type": "function",
"function": {
"name": "execute_python_code",
"description": "在沙箱中执行 Python 代码并返回输出结果。",
"parameters": {
"type": "object",
"properties": {
"code_string": {
"type": "string",
"description": "要执行的 Python 代码字符串。"
}
},
"required": ["code_string"]
}
}
}
]
第四步:构建智能体循环
现在我们创建一个循环,让智能体能够思考并行动。当 LLM 决定使用工具时,我们拦截该调用,在 Docker 中运行,并将结果反馈到对话历史中。这种“多轮对话”模式是智能体能够自我纠错的关键。
def run_agent(prompt):
messages = [
{"role": "system", "content": "你是一个高级编程助手。你可以通过编写 Python 代码来解决复杂问题。"},
{"role": "user", "content": prompt}
]
# 第一轮:模型决定是否需要代码
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto"
)
response_message = response.choices[0].message
tool_calls = response_message.tool_calls
if tool_calls:
messages.append(response_message)
for tool_call in tool_calls:
function_args = json.loads(tool_call.function.arguments)
print(f"正在执行代码: {function_args['code_string']}")
execution_result = execute_python_code(function_args['code_string'])
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": "execute_python_code",
"content": execution_result,
})
# 第二轮:模型根据代码执行结果给出最终回答
final_response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return final_response.choices[0].message.content
return response_message.content
进阶优化:处理复杂的依赖关系
如果你的智能体需要使用 pandas、numpy 或 matplotlib 等特定库,你应该预先构建一个自定义 Docker 镜像。这样可以避免智能体每次运行时都执行 pip install,这不仅缓慢,而且在禁用网络的环境下无法工作。通过 n1n.ai 接入的模型可以非常聪明地利用这些预装库进行复杂的科学计算。
性能与延迟的平衡
在生产环境中部署此类智能体时,延迟是最大的挑战。智能体循环中的每一个“回合”都会增加用户的等待时间。这就是为什么选择像 n1n.ai 这样的服务商至关重要的原因。通过优化全球路由并提供极速的 API 响应,n1n.ai 能够显著减少 API 调用的开销,使智能体能够近乎实时地完成“思考-执行-反馈”的循环。
总结
构建一个具备代码执行能力的智能体是迈向真正 AI 自主化的重要一步。通过将 GPT-4o 等模型的强大推理能力与 Docker 容器的安全性相结合,你可以创建出不仅能“说”会“道”,而且能实操解决问题的工具。无论你是构建自动化运维助手,还是复杂的金融分析系统,安全沙箱与高速 API 接入的结合都是成功的基石。
立即在 n1n.ai 获取免费 API 密钥。