3.6 代码执行
讲解代码执行的核心优势、实现步骤、安全考量以及未来方向。
3.6 代码执行
代码执行(Code execution)是让大型语言模型(LLM)能够编写并运行代码,以解决用户提出的任务。
- 核心优势:
- 强大能力: LLM生成的代码方案常常出人意料地聪明和有效,能解决各种复杂任务。
- 灵活性: 相比于为每个功能手动创建独立工具,让模型自己写代码是一种更灵活、可扩展性更强的方法。例如,一个科学计算器有大量功能按钮,不可能为每个按钮都创建一个工具。
- 提升应用性能: 许多语言模型的训练者会专门优化模型,以确保其在应用中代码执行功能表现良好。
示例:简单计算器
传统方法:预定义工具集
- 场景:构建一个能输入数学文字题并解答的应用。
- 方法:创建一系列预定义工具(如
add,subtract,multiply,divide)。 - 流程:
- 用户输入:“Add 13.2 and 18.9”。
- LLM 识别需求,调用
add工具。 - 工具执行计算,返回结果
32.1。 - LLM 将结果格式化后返回给用户。
- 局限性:
- 面对新需求(如“2的平方根是多少?”),需要不断添加新工具(如
sqrt,exponentiation)。 - 现代科学计算器功能繁多,为每个按钮都创建独立工具不切实际。
- 面对新需求(如“2的平方根是多少?”),需要不断添加新工具(如
替代方案:让模型自己写代码
方法概述
- 核心理念:与其逐个实现功能,不如让系统自己编写并执行代码来解决问题。
- 优势:极大地扩展了模型的能力边界,使其能处理任何可以通过编程解决的问题。
实现步骤
-
设计系统提示词 (System Prompt):
- 指令模型:“编写代码来解决用户的问题”。
- 要求模型将答案以 Python 代码形式返回,并用
<execute_python>和</execute_python>标签包裹。
-
模型输出:
- 对于查询 “What's the square root of 2?”,模型可能输出:
<execute_python> import math print(math.sqrt(2)) </execute_python>
- 对于查询 “What's the square root of 2?”,模型可能输出:
-
提取与执行:
- 使用正则表达式等模式匹配技术,从模型输出中提取被标签包裹的代码。
- 在安全的沙盒环境中执行提取出的代码。
- 获取执行结果(例如
1.4142135623730951)。
-
反馈与格式化:
- 将数值结果传回给 LLM。
- LLM 根据原始问题,生成一个格式良好的最终答案(例如:“The square root of 2 is approximately 1.4142.”)。
执行代码的方式
- Python 的
exec()函数:这是一个内置函数,可以执行传入的任意字符串代码。虽然强大,但也带来了安全风险。 - 专用工具:存在一些专门用于安全执行代码的工具,可以在更安全的沙盒环境中运行。
进阶:带外部反馈的反思 (Reflection with External Feedback)
- 概念:当代码执行失败时,将错误信息(如
SyntaxError)反馈给模型。 - 流程:
- 模型生成第一版代码草稿。
- 执行代码,捕获错误。
- 将错误信息连同原始任务一起发送给模型。
- 模型反思错误,生成改进后的第二版代码。
- 效果:通过这种迭代过程,模型有时能修正错误,得到更精确的答案。
安全考量:安全的代码执行 (Secure Code Execution)
- 核心风险:在沙盒环境外运行由模型生成的任意代码是有风险的。
- 真实案例:
- 一位团队成员使用的高度智能体化代码执行器,曾错误地执行了
rm *.py命令,删除了项目目录中的所有 Python 文件。 - 幸运的是,该成员有备份习惯,未造成实质损失。
- 一位团队成员使用的高度智能体化代码执行器,曾错误地执行了
- 最佳实践:
- 必须使用沙盒环境:这是保护系统、防止数据丢失或敏感数据泄露的最佳做法。
- 轻量级沙盒:推荐使用像 Docker 或 E2B 这样的轻量级沙盒环境,它们能有效隔离代码,降低损坏系统或环境的风险。
- 现实情况:尽管有风险,许多开发者仍会直接执行模型生成的代码而不做过多检查。但为了安全,应坚持使用沙盒。
总结
- 重要性:代码执行是使智能体式应用变得极其强大的关键工具。
- 行业趋势:许多大型语言模型的训练者会专门优化模型,以确保其在应用中代码执行功能的良好表现。
- 未来方向:
- 开发者需要手动为智能体系统创建并添加工具。
- 一个新的标准——MCP (Model Context Protocol) 正在兴起,它旨在让开发者更容易地访问一套庞大的工具集,供大型语言模型使用,从而简化开发流程。