LLM Sandbox可视化提取:自动捕获Matplotlib和ggplot2图表的完整指南 🎨
LLM Sandbox是一个轻量级、可移植的LLM沙盒运行时库,专门设计用于安全执行AI生成的代码。它的可视化提取功能能够自动捕获和提取Matplotlib、Seaborn、Plotly以及R的ggplot2等库生成的图表,为数据科学家和开发者提供了一个强大的工具来安全运行和可视化代码输出。
为什么需要LLM Sandbox可视化提取? 🤔
在AI时代,我们经常需要运行LLM生成的代码,这些代码可能包含复杂的可视化操作。传统方法中,捕获这些可视化输出需要手动保存文件或截图,既繁琐又容易出错。LLM Sandbox的可视化提取功能解决了这个问题,它能够:
- 自动捕获图表:无需修改代码即可提取所有生成的图表
- 支持多种库:覆盖Python和R的主流可视化库
- 安全隔离执行:代码在容器中运行,不会影响主机系统
- 跨后端兼容:支持Docker、Kubernetes和Podman
LLM Sandbox可视化提取的核心功能 🔧
ArtifactSandboxSession:可视化提取的核心
ArtifactSandboxSession是LLM Sandbox专门为可视化提取设计的会话类。它继承了基础会话的所有功能,并添加了自动图表捕获能力。
from llm_sandbox import ArtifactSandboxSession, SandboxBackend
from pathlib import Path
import base64
with ArtifactSandboxSession(
lang="python",
verbose=True,
backend=SandboxBackend.DOCKER
) as session:
result = session.run("""
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title('Sine Wave')
plt.show()
""")
print(f"捕获了 {len(result.plots)} 个图表")
支持的可视化库 📊
LLM Sandbox的可视化提取功能支持广泛的图表库:
Python库支持
- Matplotlib:所有
plt.show()调用的图表 - Seaborn:基于Matplotlib的高级统计图表
- Plotly:交互式图表和3D可视化
- Pandas:内置的绘图功能
R语言支持
- ggplot2:优雅的语法化图表
- Base R:传统的R绘图系统
- GridExtra:多图布局
- 其他CRAN包:扩展的可视化功能
快速开始:5分钟掌握可视化提取 🚀
1. 安装LLM Sandbox
首先安装LLM Sandbox及其依赖:
# 基本安装
pip install llm-sandbox
# 包含Docker支持
pip install 'llm-sandbox[docker]'
2. 运行你的第一个可视化代码
创建一个简单的Python脚本来测试可视化提取:
from llm_sandbox import ArtifactSandboxSession
# 创建可视化提取会话
with ArtifactSandboxSession(lang="python") as session:
# 运行包含Matplotlib图表的代码
code = """
import matplotlib.pyplot as plt
import numpy as np
# 创建多个图表
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 第一个图表
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(x, y1, 'b-', linewidth=2)
plt.title('正弦波')
plt.grid(True)
# 第二个图表
plt.subplot(1, 2, 2)
plt.plot(x, y2, 'r--', linewidth=2)
plt.title('余弦波')
plt.grid(True)
plt.tight_layout()
plt.show()
"""
result = session.run(code)
print(f"成功捕获 {len(result.plots)} 个图表!")
3. 保存提取的图表
将捕获的图表保存到本地文件:
from pathlib import Path
import base64
# 创建图表目录
Path("plots").mkdir(exist_ok=True)
# 保存所有捕获的图表
for i, plot in enumerate(result.plots):
plot_path = Path("plots") / f"plot_{i+1:03d}.{plot.format.value}"
with plot_path.open("wb") as f:
f.write(base64.b64decode(plot.content_base64))
print(f"保存图表: {plot_path}")
高级可视化提取技巧 🎯
处理多个图表库
LLM Sandbox可以同时处理多个图表库的混合代码:
advanced_code = """
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import pandas as pd
import numpy as np
# Matplotlib图表
plt.figure(figsize=(8, 6))
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro-')
plt.title('Matplotlib图表')
plt.show()
# Seaborn图表
data = pd.DataFrame({
'x': np.random.randn(100),
'y': np.random.randn(100),
'category': np.random.choice(['A', 'B', 'C'], 100)
})
sns.scatterplot(data=data, x='x', y='y', hue='category')
plt.title('Seaborn散点图')
plt.show()
# Plotly图表
fig = px.scatter(data, x='x', y='y', color='category', title='Plotly交互式图表')
fig.show()
"""
R语言可视化提取
LLM Sandbox同样支持R语言的ggplot2图表提取:
r_code = """
library(ggplot2)
library(dplyr)
# 创建数据集
data <- data.frame(
x = rnorm(100),
y = rnorm(100),
group = sample(c('A', 'B', 'C'), 100, replace = TRUE)
)
# ggplot2图表
p <- ggplot(data, aes(x = x, y = y, color = group)) +
geom_point(size = 3, alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE) +
theme_minimal() +
labs(title = "ggplot2散点图")
print(p)
# 基础R图表
plot(data$x, data$y, col = as.factor(data$group),
pch = 19, main = "基础R散点图")
"""
配置可视化提取选项
ArtifactSandboxSession提供多种配置选项:
with ArtifactSandboxSession(
lang="python",
backend=SandboxBackend.DOCKER,
enable_plotting=True, # 启用图表提取
image="ghcr.io/vndee/sandbox-python-311-bullseye", # 自定义镜像
verbose=True, # 详细日志
security_policy=security_policy # 安全策略
) as session:
# 你的代码...
实战案例:数据分析可视化提取 📈
案例1:金融数据可视化
financial_code = """
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from datetime import datetime, timedelta
# 生成模拟金融数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=252, freq='B')
stock_prices = 100 + np.cumsum(np.random.randn(252) * 0.5)
# 创建DataFrame
df = pd.DataFrame({
'Date': dates,
'Price': stock_prices,
'Volume': np.random.randint(1000, 10000, 252)
})
# 价格走势图
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(df['Date'], df['Price'], 'b-', linewidth=2)
plt.title('股票价格走势')
plt.ylabel('价格')
plt.grid(True, alpha=0.3)
# 成交量图
plt.subplot(2, 1, 2)
plt.bar(df['Date'], df['Volume'], alpha=0.7, color='green')
plt.title('成交量')
plt.ylabel('成交量')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 相关性热力图
corr_matrix = df[['Price', 'Volume']].corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('相关性热力图')
plt.show()
"""
案例2:机器学习模型可视化
ml_code = """
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, roc_curve, auc
import seaborn as sns
# 生成分类数据
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=15, n_redundant=5,
random_state=42)
# 训练模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X, y)
# 特征重要性图
importances = clf.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10, 6))
plt.title('随机森林特征重要性')
plt.bar(range(20), importances[indices])
plt.xticks(range(20), indices)
plt.xlabel('特征索引')
plt.ylabel('重要性')
plt.show()
# 混淆矩阵
y_pred = clf.predict(X)
cm = confusion_matrix(y, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('混淆矩阵')
plt.ylabel('真实标签')
plt.xlabel('预测标签')
plt.show()
"""
容器后端选择与性能优化 ⚡
Docker后端(推荐)
from llm_sandbox import ArtifactSandboxSession, SandboxBackend
# Docker后端 - 最常用
with ArtifactSandboxSession(
lang="python",
backend=SandboxBackend.DOCKER,
image="ghcr.io/vndee/sandbox-python-311-bullseye"
) as session:
# 你的代码...
Kubernetes后端(生产环境)
# Kubernetes后端 - 适合生产环境
with ArtifactSandboxSession(
lang="python",
backend=SandboxBackend.KUBERNETES,
image="ghcr.io/vndee/sandbox-python-311-bullseye"
) as session:
# 你的代码...
Podman后端(安全优先)
from podman import PodmanClient
podman_client = PodmanClient.from_env()
with ArtifactSandboxSession(
lang="python",
backend=SandboxBackend.PODMAN,
client=podman_client
) as session:
# 你的代码...
容器池化优化
对于高频使用场景,可以使用容器池化提升性能:
from llm_sandbox.pool import create_pool_manager, PoolConfig
# 创建容器池
pool = create_pool_manager(
backend=SandboxBackend.DOCKER,
config=PoolConfig(max_pool_size=10, min_pool_size=3),
lang="python"
)
# 使用池化会话
with ArtifactSandboxSession(pool=pool, lang="python") as session:
result = session.run("""
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x))
plt.show()
""")
print(f"捕获图表: {len(result.plots)}个")
常见问题与解决方案 🔧
问题1:图表未正确捕获
症状:代码运行了,但result.plots为空。
解决方案:
- 确保使用了
plt.show()或fig.show() - 检查是否启用了
enable_plotting=True - 验证图表库是否正确安装
# 正确的用法
with ArtifactSandboxSession(
lang="python",
enable_plotting=True # 确保启用图表提取
) as session:
result = session.run("""
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show() # 必须有show()调用
""")
问题2:大型图表内存问题
症状:内存占用过高或容器崩溃。
解决方案:
- 设置资源限制
- 使用较小的图表尺寸
- 分批处理数据
with ArtifactSandboxSession(
lang="python",
runtime_configs={
"memory": "512m", # 限制内存
"cpus": "0.5" # 限制CPU
}
) as session:
# 处理大型图表...
问题3:依赖库安装失败
症状:图表库无法导入。
解决方案:
- 预安装常用库
- 使用自定义镜像
- 指定库版本
# 方法1:运行时安装
result = session.run(code, libraries=["matplotlib", "seaborn", "plotly"])
# 方法2:使用预装库的自定义镜像
with ArtifactSandboxSession(
lang="python",
image="your-custom-image:latest" # 包含所有所需库
) as session:
# 直接使用,无需安装
最佳实践与性能建议 🏆
1. 使用合适的容器镜像
选择包含常用可视化库的基础镜像:
# 官方预构建镜像
image = "ghcr.io/vndee/sandbox-python-311-bullseye"
# 或创建自定义镜像
# Dockerfile:
# FROM python:3.11-slim
# RUN pip install matplotlib seaborn plotly pandas numpy
2. 批量处理图表生成
# 高效方式:一次运行生成多个图表
batch_code = """
import matplotlib.pyplot as plt
import numpy as np
# 批量生成图表
for i in range(5):
plt.figure()
x = np.linspace(0, 10, 100)
y = np.sin(x + i * 0.5)
plt.plot(x, y)
plt.title(f'Chart {i+1}')
plt.show()
"""
# 低效方式:多次运行
# 避免:for chart in charts: session.run(chart_code)
3. 监控和日志
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
with ArtifactSandboxSession(
lang="python",
verbose=True, # 启用详细日志
runtime_configs={
"log_level": "INFO"
}
) as session:
result = session.run(code)
logger.info(f"执行完成: {result.exit_code}")
logger.info(f"捕获图表: {len(result.plots)}")
if result.stderr:
logger.warning(f"警告信息: {result.stderr}")
4. 安全考虑
from llm_sandbox.security import SecurityPolicy
# 创建安全策略
security_policy = SecurityPolicy(
allow_network=False, # 禁止网络访问
max_execution_time=30, # 30秒超时
max_memory_mb=512, # 512MB内存限制
allowed_libraries=["matplotlib", "numpy", "pandas"] # 允许的库
)
with ArtifactSandboxSession(
lang="python",
security_policy=security_policy,
enable_plotting=True
) as session:
# 安全地运行代码...
集成到现有工作流 🔗
与Jupyter Notebook集成
# notebook_integration.py
from llm_sandbox import ArtifactSandboxSession
import base64
from IPython.display import Image, display
import io
def run_with_visualization(code):
"""在沙盒中运行代码并显示图表"""
with ArtifactSandboxSession(lang="python") as session:
result = session.run(code)
# 显示输出
print(result.stdout)
if result.stderr:
print(f"错误: {result.stderr}")
# 显示图表
for i, plot in enumerate(result.plots):
print(f"\n图表 {i+1}:")
image_data = base64.b64decode(plot.content_base64)
display(Image(data=image_data))
return result
与Web应用集成
# web_integration.py
from fastapi import FastAPI
from pydantic import BaseModel
from llm_sandbox import ArtifactSandboxSession
import base64
app = FastAPI()
class CodeRequest(BaseModel):
code: str
language: str = "python"
@app.post("/execute")
async def execute_code(request: CodeRequest):
"""执行代码并返回结果"""
with ArtifactSandboxSession(lang=request.language) as session:
result = session.run(request.code)
return {
"stdout": result.stdout,
"stderr": result.stderr,
"exit_code": result.exit_code,
"plots": [
{
"format": plot.format.value,
"content_base64": plot.content_base64,
"size": len(plot.content_base64)
}
for plot in result.plots
]
}
总结与展望 🌟
LLM Sandbox的可视化提取功能为AI生成的代码执行提供了强大的可视化支持。通过自动捕获Matplotlib、Seaborn、Plotly和ggplot2等库生成的图表,它使得数据分析和机器学习工作流更加流畅和安全。
关键优势:
- 零配置图表捕获:无需修改现有代码
- 多语言支持:Python和R的完整可视化生态系统
- 企业级安全:容器隔离和安全策略
- 高性能:容器池化和资源优化
- 易于集成:与现有工作流无缝对接
适用场景:
- AI助手代码执行:让AI生成的代码直接输出可视化结果
- 数据科学教育:安全地运行学生代码并自动评分
- 自动化报告生成:批量处理数据并生成图表
- API服务:为Web应用提供安全的代码执行环境
无论你是数据科学家、机器学习工程师,还是正在构建AI应用的开发者,LLM Sandbox的可视化提取功能都能帮助你更高效、更安全地处理可视化代码。
开始使用LLM Sandbox,让你的AI生成的代码不仅能够安全运行,还能自动输出精美的可视化结果! 🚀
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




