输入“/”快速插入内容

代码解释器

2024年7月25日修改
2023年11月7日创建
本文讨论了如何使用ChatGLM3-6B实现代码解释器功能,涵盖代码解释器介绍、构造执行内核、执行代码及总流程等内容。关键要点包括:
1.
代码解释器简介:Code Interpreter最早出现于ChatGPT插件,可让普通用户用自然语言完成复杂工作,ChatGLM3-6B现已支持此功能,降低使用成本,模型能执行复杂任务并自动连续执行代码块。
2.
构造代码执行内核:使用特定提示词激发ChatGLM3-6B代码能力,在demo_cli.py中实现CodeKernel类,该类用于管理和与Jupyter内核交互,定义了启动、管理、执行代码等多个方法。
3.
执行代码解释器:定义execute函数,接收代码和CodeKernel对象,执行代码并处理不同类型输出,能处理文本和图像数据,返回结果类型和结果本身。
4.
总流程:使用Streamlit创建用户界面,处理与用户对话,保存对话历史,通过循环调用client.generate_stream方法生成响应文本,根据特殊令牌执行不同动作,使用execute函数运行代码并处理输出。
5.
体验代码解释器:可前往综合demo直接体验,输入“画一个爱心”可看到相关日志和可视化效果。
本章节将带领开发者学习如何使用ChatGLM3-6B来实现代码解释器的功能
请配合以下代码库中微调部分代码进行上手练习
什么是代码解释器
Code Interpreter最早出现于ChatGPT的插件中,用于数据分析,图像转换,编辑代码等。可以让普通用户(非程序员)用自然语言完成以前需要写代码来完成的复杂工作。
现在,ChatGLM3-6B已经支持了代码解释器的功能。这将大大降低用户使用代码解释器的使用成本。
由于拥有代码执行环境,ChatGLM3模型能够执行更为复杂的任务,例如绘制图表、执行符号运算等等。模型会根据对任务完成情况的理解自动地连续执行多个代码块,直到任务完成。因此,在这一模式下,你只需要指明希望模型执行的任务即可。
学习如何使用代码解释器
构造代码执行内核
在ChatGLM3-6B中,为了更好的激发大模型书写代码的能力,我们使用以下提示词来激发他的代码能力
SYSTEM_PROMPT = '你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。'
为了实现代码运行,中断等功能,我们在demo_cli.py中完成了对应的基础功能
首先,我们实现了CodeKernel
这是一个用于管理和与Jupyter内核进行交互的工具。Jupyter内核是一种允许你执行代码的计算引擎。这个类定义了如何启动、管理和与这个内核进行交互。
以下是该类每个方法的作用:
init(self, ...): 这是类的构造器方法,当你创建一个新的 CodeKernel 对象时,这个方法会被调用。它初始化内核管理器和客户端,并设置环境变量,如果提供了 python_pathipython_path
def __init__(self,
kernel_name='kernel',
kernel_id=None,
kernel_config_path="",
python_path=None,
ipython_path=None,
init_file_path="./startup.py",
verbose=1):
self.kernel_name = kernel_name
self.kernel_id = kernel_id
self.kernel_config_path = kernel_config_path
self.python_path = python_path
self.ipython_path = ipython_path
self.init_file_path = init_file_path
self.verbose = verbose
if python_path is None and ipython_path is None:
env = None
else:
env = {"PATH": self.python_path + ":$PATH", "PYTHONPATH": self.python_path}
# Initialize the backend kernel
self.kernel_manager = jupyter_client.KernelManager(kernel_name=IPYKERNEL,
connection_file=self.kernel_config_path,
exec_files=[self.init_file_path],
env=env)
if self.kernel_config_path:
self.kernel_manager.load_connection_file()
self.kernel_manager.start_kernel(stdout=PIPE, stderr=PIPE)
print("Backend kernel started with the configuration: {}".format(
self.kernel_config_path))
else:
self.kernel_manager.start_kernel(stdout=PIPE, stderr=PIPE)
print("Backend kernel started with the configuration: {}".format(
self.kernel_manager.connection_file))
if verbose:
pprint(self.kernel_manager.get_connection_info())
# Initialize the code kernel
self.kernel = self.kernel_manager.blocking_client()
# self.kernel.load_connection_file()
self.kernel.start_channels()
print("Code kernel started.")