ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PandasAI 如何用 Docker 沙箱隔离执行 LLM 生成的代码

PandasAI 如何用 Docker 沙箱隔离执行 LLM 生成的代码 PandasAI 如何用 Docker 沙箱隔离执行 LLM 生成的代码【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-aiPandasAI 在执行分析任务时会先让 LLM 生成 Python 代码再运行这段代码来完成取数和绘图。文档明确指出在面向外部用户的应用中恶意用户可能试图通过提示注入让 LLM 生成有害代码这就是安全风险的主要来源。为了隔离这类执行PandasAI 提供了pandasai-docker扩展它把 LLM 生成的代码放进一个独立的 Docker 容器中执行。本文的目标是让你在自己的应用里启用这个沙箱并确认代码确实是在容器内跑完、结果正常返回。前提条件只有一个系统上安装了 Docker 并且正在运行文档中的 Note 明确要求 Make sure you have Docker running on your system before using the sandbox environment。沙箱隔离了什么根据 Privacy Security 文档沙箱环境提供四类隔离Isolated Execution代码运行在完全隔离的 Docker 容器中Offline Operation沙箱完全离线运行阻止任何对外部网络发起请求Resource Limitations对系统资源使用有严格限制File System Isolation对文件系统提供受保护访问。从实现代码 docker_sandbox.py 可以看到这些隔离的具体落点DockerSandbox默认使用镜像名pandasai-sandbox。初始化时如果本地不存在该镜像会先用随包附带的 Dockerfile 执行docker build构建。该 Dockerfile 基于python:3.9仅安装pandas、numpy、matplotlib三个包工作目录为/appsandbox.start()通过containers.run(..., network_disabledTrue, ...)启动容器命令是sleep infinity即容器本身不联网、不跑业务进程只等待宿主机通过exec_run注入代码执行每次执行时代码会先在宿主机侧通过compile()做语法编译再经python -c ...提交给容器exec_run返回的退出码非 0 时会抛出RuntimeError(fError executing code: {stderr})代码中生成的图表路径会被改写到容器内固定路径/tmp/temp_chart.png执行完成后由序列化器把结果含图表传回宿主机的result对象。另外注意一个数据流向如果 LLM 生成的代码里包含 SQL 查询_exec_code会在宿主机侧调用环境里的execute_sql_query拿到 DataFrame再转成 CSV 通过put_archive写入容器/tmp目录供容器内读取。也就是说数据库连接本身不在沙箱容器里。准备条件安装 Docker 并确认 Docker 进程正在运行这是文档标注的前置要求。安装沙箱扩展包pip install pandasai-docker扩展仓库的 README 也给出了 poetry 方式poetry add pandasai-docker两种安装途径对应同一包pandasai-docker。配置 LLM。沙箱本身不提供模型你需要像普通使用 PandasAI 一样先接入一个 LLM官方示例使用 LiteLLM 扩展import pandasai as pai from pandasai_litellm.litellm import LiteLLM # 文档示例使用 gpt-4.1-miniYOUR_OPENAI_API_KEY 需替换为你自己的密钥 llm LiteLLM(modelgpt-4.1-mini, api_keyYOUR_OPENAI_API_KEY) pai.config.set({ llm: llm })主路径让 pai.chat 在沙箱中执行代码以下是 Privacy Security 文档 给出的完整用法./data/heart.csv需替换为你工作目录下的实际 CSV 文件路径import pandasai as pai from pandasai_docker import DockerSandbox from pandasai_litellm.litellm import LiteLLM # 初始化并配置 LLM同上 llm LiteLLM(modelgpt-4.1-mini, api_keyYOUR_OPENAI_API_KEY) pai.config.set({ llm: llm }) # 初始化沙箱并启动首次运行会先构建 pandasai-sandbox 镜像 sandbox DockerSandbox() sandbox.start() # 读取 CSV df pai.read_csv(./data/heart.csv) # 传入 sandbox 参数LLM 生成的代码将在容器内执行 result pai.chat(plot total heart patients by gender, df, sandboxsandbox) # 展示结果文档示例中为图表 result.show() # 用完必须停止stop() 会停止并移除该 Docker 容器 sandbox.stop()几个需要留意的点关键动作只有一个把sandbox对象作为参数传给pai.chat(..., sandboxsandbox)。沙箱内部在首次execute时若未启动会自动调用start()但文档示例统一采用显式start()/stop()的写法建议照做因为stop()会同时stop()并remove()容器不显式停止就不会清理。sandbox.start()的副作用是真实的它会检查/构建一个名为pandasai-sandbox的镜像并在宿主机上运行一个长驻容器sleep infinity。构建失败时源码 会记录Failed to build Docker image pandasai-sandbox with error: ...并向上抛出异常此时应检查 Docker 是否运行、构建权限是否正常。可选路径与 Agent 多轮会话配合如果你的场景是多轮对话而不是单次pai.chatAgent 文档 和 官方示例 Notebook 展示了把沙箱挂到Agent上的方式data.csv替换为你的数据文件from pandasai import Agent from pandasai_docker import DockerSandbox # 初始化并启动沙箱 sandbox DockerSandbox() sandbox.start() df pai.read_csv(data.csv) agent Agent([df], sandboxsandbox) # 之后的 chat 调用代码都会运行在沙箱里 response agent.chat(Calculate the average sales) # 结束对话后停止沙箱 sandbox.stop()Notebook 中还演示了一个带记忆配置的变体Agent([df], memory_size10, sandboxsandbox)用于多轮追问场景属于可选参数。使用自定义镜像名或 Dockerfile文档agent.mdx 的 Customizing the Sandbox 一节与 docker_sandbox.ipynb说明DockerSandbox接受两个位置参数镜像名和自定义 Dockerfile 路径# 第一个参数是镜像名第二个参数是你的 Dockerfile 路径 sandbox DockerSandbox( custom-sandbox-name, /path/to/custom/Dockerfile )/path/to/custom/Dockerfile必须替换为你自己的 Dockerfile 实际路径。不传第二个参数时默认使用扩展包内的 Dockerfile。结果验证与适用边界文档给出的完成判断标准执行路径成功时result对象可以正常拿到并在result.show()中展示示例为按性别统计心脏病患者的图表执行失败时不会静默代码语法错误会在宿主机侧编译阶段抛出SyntaxError容器内运行错误exec_run退出码非 0会抛出RuntimeError(Error executing code: ...)错误信息附带容器 stderr收尾验证是sandbox.stop()执行后不再报错对应容器已被停止并移除。什么时候必须用沙箱——文档列出的场景面向公众开放的应用、处理不可信的用户输入、生产环境部署、处理敏感数据、多租户环境。如果你的 PandasAI 应用允许用户输入任意问题就属于这一类。边界说明更高级的沙箱能力自定义安全策略、高级资源管理、增强监控、额外隔离层属于 Enterprise 授权范围文档指向 Enterprise Features。沙箱的离线特性意味着容器内的代码无法发起任何网络请求代码里如果依赖在线资源例如下载数据将无法在沙箱内完成。【免费下载链接】pandas-aiChat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pandas-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表