smolagents学习笔记系列(六)Secure code execution
这篇文章锁定官网教程 Secure code execution
章节的内容,主要介绍了smolagents是如何安全地执行LLM的输出结果。
- 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/tutorials/secure_code_execution
为了不浪费你的时间,下面这条提示务必阅读:
【注意】:这篇文章主要介绍的是 e2b
这个云端python解释器沙盒,但实际上存在一些编码与不兼容问题,官方在文章最末尾处承认了这一点并表示会在未来持续改进,我在运行后容易出现下面这种情况:
尽管如此我还是建议跟着这篇笔记过一遍,特别是文字部分内容,这样可以帮助你更好的理解 smolagents 这个框架的设计依据。
Code agents
根据官网上描述我们可以认为:LLM直接生成代码要比通过格式化内容解析得到的效果好很多,因为代码是一种计算机语言,如果LLM可以直接生成计算机语言,那么效果要高于通过文本描述再转译。
例如:你让LLM生成一段python代码用于计算斐波那契数列的指定n项,LLM直接给你返回一段代码的效果 > 将这段代码以文本的形式用json包裹,然后再解析出来。
他们的理由如下:
- Composability 可组合性:python代码可以将多个函数或类进行组合到一个文件中,但json文本想要实现这种组合非常困难;
- Object management 对象管理:json文本无法表述一个类或者对象;
- Generality 一般性:代码的目的是为了让你能够快速看明白功能,而json文本需要多层解析;
- Representation in LLM training corpus 语言模型的资源库:因为LLM在训练的时候已经包含了大量的代码语料,比起json而言对模型更友好;
综上所述,smolagents框架主推的就是 codeAgent 即使用代码执行器来完成你想要的功能。
既然codeAgent是smolagents框架主推的对象,那么如何保证python解释器安全运行就是需要讨论的话题。
Local python interpreter
smolagents框架提供了一个python解释器用来将代码执行与本地解释器进行隔离,并通过以下三种方式确保代码执行安全:
- 将
import
库动作严格限制在用户明确传递的列表中,不会自行导入指定外的库; - 限制执行此处避免死循环与资源膨胀;
- 不会执行任何事先未定义的操作;
尽管如此也不是万无一失的,官网提到了一种情况可能会突破上面的限制损坏你本地电脑的文件系统:如果一个LLM模型被恶意fine-tune成使用Pillow循环生成10万张大小为100MB的图片,那么你的硬盘会在运行后立马爆盘。
为了应对上述类似的情况,官网介绍了一种更加严格的代码执行机制 E2B。
E2B code executor
E2B(Environment to Build AI Applications)实际上就是一个云端沙盒功能,既然是云端服务那自然少不了和之前一样的注册、申请API这套流程,官网没有对其进行介绍,我这里补充一下;
- 安装 smolagents 的 e2b 依赖:
$ pip install "smolagents[e2b]"
- 登录
e2b
官网: https://e2b.dev; - 绑定/注册账号;
这个 e2b 只要绑定后就会自动分配一个 API Key,在你的主页上显示出来,但我发现这个API是无法直接使用的,建议在 Keys
界面自己新建一个,点击 Add API Key
按钮后根据提示就可以生成一个新的Key,旧的Key直接删掉即可:
【注意】:E2B 的API Key也是不能后期查看的,生成后一定要找个地方把这个码记下来;
然后设置环境变量:
$ export E2B_API_KEY="你的e2b API Key"
这次官网的示例竟然可以直接运行,不容易啊。
from smolagents import CodeAgent, VisitWebpageTool, HfApiModel
agent = CodeAgent(
tools = [VisitWebpageTool()],
model=HfApiModel(),
additional_authorized_imports=["requests", "markdownify"],
use_e2b_executor=True
)
agent.run("What was Abraham Lincoln's preferred pet?")
运行后会显示如下:
你可能会注意到有一段 404 Client Error: Not Found for url: https://www.history.com/topics/american-history/abraham-lincoln-fun-facts
错误,这个并不代表LLM或者Agent出错,而是这个网页已经不能访问了,后面你感兴趣的话可以给他一些其他链接,比如我询问Agent “苹果公司最新的产品有哪些?”,那么对应的代码就需要修改成下面的内容:
from smolagents import CodeAgent, VisitWebpageTool, HfApiModel
agent = CodeAgent(
tools = [VisitWebpageTool()],
model=HfApiModel(),
additional_authorized_imports=["requests", "markdownify"],
use_e2b_executor=True
)
agent.run("What are the latest products from Apple Inc?") # 自己感兴趣的问题
这样执行的话就可以得到稍微能看的内容了: