跳至主要内容

代码验证

为什么我们需要代码验证?

智能体开发者在运行生成的代码前可能希望先进行验证。 如下图所示案例中,生成的代码为

import os

file = open("abc.py", "r")
code = file.read()
exec(code)

Code verification workflow

在这种情况下,生成的代码会读取文件内容并执行,这存在潜在危险。 为防止这种情况,我们可以使用代码验证机制,在运行前检查生成的代码。 如果代码未通过验证,错误将被报告给CodeGenerator以重新生成代码。

如何使用代码验证功能?

要使用代码验证功能,您可以在项目配置文件taskweaver_config.json中添加配置"code_interpreter.code_verification_on": true。 这样,生成的代码在运行前会先进行验证。

启用代码验证后,您还可以在项目配置文件中指定代码验证规则。

参数描述默认值
code_interpreter.allowed_modules代码生成中允许导入的模块列表。["pandas", "matplotlib", "numpy", "sklearn", "scipy", "seaborn", "datetime", "typing"], 如果列表为空,则不允许导入任何模块
code_interpreter.blocked_functions代码生成中需要阻止的函数列表。["__import__","eval", "exec", "execfile", "compile", "open", "input", "raw_input", "reload"]

我们目前支持检查允许的模块和被阻止的函数。 如果一个模块在allowed_modules列表中,它可以在生成的代码中被导入。 如果一个函数在blocked_functions列表中,它不能在生成的代码中使用。

代码验证是如何实现的?

代码验证分为两部分实现。 首先,我们在CodeGenerator的提示中添加指令,使其生成的代码遵循所需规则。 例如,如果我们不希望生成的代码导入os模块, 我们就会在提示中添加指令,告诉CodeGenerator不要导入os模块。

其次,我们对生成的代码进行静态分析,检查其是否符合所需规则。 代码被解析为AST(抽象语法树),我们检查该AST
仅导入允许的模块,且未使用被禁止的函数。 静态分析的实现可在taskweaver/code_interpreter/code_verification.py中找到。