如何让开源大模型支持ChatGPT的Code Interpreter能力:基于LangChain的开源项目Code Interpreter API

标签:#ChatGPT##CodeInterpreter# 时间:2023/07/18 00:32:47 作者:小木

ChatGPT的Code Interpreter插件让ChatGPT突破了大语言模型本身只能做文本处理的限制,使其可以通过生成并执行Python代码来实现强大的数据分析、图片生成、视频数据处理等操作,大大拓展了ChatGPT的实用范围和价值。在此前的文章中,我们已经分析了Code Interpreter插件的官方实现(参考:ChatGPT官方代码解释器插件Code-Interpreter大揭秘:Code-Interpreter背后都有什么(执行环境、硬件资源、包含的Python库等)? )。而今天,LangChain的官方博客也推出了一种类似的开源方案,让开源模型也可以实现ChatGPT的Code Interperter插件。我们简要描述一下这个方案。


[TOC]

Code Interpreter API简介

Code Interpreter API是由shroominic实现的一个类似ChatGPT Code Interpreter插件的开源项目。该项目基于LangChain实现。它使用CodeBoxes作为后端进行沙盒化的Python代码执行。

相比较原始的Code Interpreter插件,这个开源项目的最大特点是支持网络访问。这在分析一些最新数据或者实时数据中非常有用。例如,假设你想让大模型画出2023年XX股票的走势图。在ChatGPT的官方插件下,你只能先上传数据然后让Code Interpreter进行分析。而在这个开源项目下,你可以直接对大模型提问:画出XX在2023年的走势图,那么它会让模型先去网络搜索数据,然后画出这个图,是不是更加方便?

简单总结一下这个项目的特点:

  • 功能丰富:项目支持数据集分析,股票图表绘制,图像操作等功能。并且支持互联网访问和自动Python包安装。

  • 交互性强:可以接收文本和文件作为输入,然后返回文本和文件。同时,它具有会话记忆功能,可以根据之前的输入进行响应。

  • 本地运行:除了OpenAI API(或者可能很快的OpenOrca或其他),所有的东西都可以在本地运行。

  • 易于扩展:项目计划使用CodeBox API进行生产环境的易扩展性(即将推出)。

  • 开源协议友好:这个项目使用MIT许可证,没有商用限制。

Code Interpreter API的技术实现

Code Interperter API项目底层利用了LangChain的Agent工具,帮助大模型使用Code Interpreter。这里面的核心部分有2个:LangChain的最新的OpenAIFunctionsAgent和Python代码执行器。

OpenAIFunctionsAgent是由LangChain提供的可以让大模型调用函数和工具的代理类。

作者对这个类做了一点改造使其可以支持代码的执行工具。作者同时提供了一个名为CodeBoxAPI的类来代替LangChain自带的Python REPL。原因是LangChain自带的Python REPL是无法做文件的读写并且每次执行之后都会丢失定义的变量

当启动一个代码解释器会话时,Code Interpreter会在你的设备上创建一个小型的Jupyter内核,类似于Jupyter笔记本的工作方式。CodeBox就是代理可以运行代码并接收其输出的底层Python执行环境。代理可以访问并使用它来满足用户的请求。

Code Interpreter API代码实例和演示结果

作者举了两个例子,一个是提问画出2023年的bitcoin图:

from codeinterpreterapi import CodeInterpreterSession


async def main():
    # create a session
    session = CodeInterpreterSession()
    await session.astart()

    # generate a response based on user input
    output = await session.generate_response(
        "Plot the bitcoin chart of 2023 YTD"
    )

    # ouput the response (text + image)
    print("AI: ", response.content)
    for file in response.files:
        file.show_image()

    # terminate the session
    await session.astop()


if __name__ == "__main__":
    import asyncio
    # run the async function
    asyncio.run(main())

结果回答很准确:


第二个是对Iris数据集分析。

from codeinterpreterapi import CodeInterpreterSession, File


async def main():
    # context manager for auto start/stop of the session
    async with CodeInterpreterSession() as session:
        # define the user request
        user_request = "Analyze this dataset and plot something interesting about it."
        files = [
            File.from_path("examples/assets/iris.csv"),
        ]

        # generate the response
        response = await session.generate_response(
            user_request, files=files
        )

        # output to the user
        print("AI: ", response.content)
        for file in response.files:
            file.show_image()


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

结果如下:


Code Interpreter API的总结(现有问题和未来规划)

目前Code Interpreter API项目只支持使用OpenAI的ChatGPT接口实现,这是目前最大的限制,但也是很多人梦寐以求的功能。没有API接口的人觉得这是个限制,有API接口的人认为终于可以通过接口调用Code Intepreter插件了。Code Interpreter API相比较目前其它的开源大模型Code实现,最大的特点有如下几个:

  • 互联网访问权限:与OpenAI的现有代码解释器相比,这个开源版本具有互联网访问权限。例如,当询问“绘制2023年的比特币图表”时,代理会使用雅虎财经下载实时数据,然后将其以图像形式展示给用户。

  • 可以自己的硬件:如果你想做一些需要运行多模态数据处理的事情(如stable diffusion),你需要有一个可以运行模型的专用GPU。在OpenAI的云环境中,这是不可能的。但是,基于这个项目可以结合OpenAI的ChatGPT和本地的模型一起处理。

  • 聊天记忆功能:很多开源实现对于记忆处理不是很好,包括LangChain的官方Python REPL在每次运行后都会丢失变量。

  • 自动Python包安装:如果缺少某个包,代理会尝试再次安装,这个是官方插件做不到的。

从目前的描述看,这是一个非常值得关注的项目,它不仅可以完成Code Interpreter插件的本地化,在未来显然也可以接入其它模型。目前,作者透露的未来规划如下:

  1. 使CodeBox适用于生产环境:目前,每个用户都需要一个小型的沙盒执行环境,这使得使用这个API在生产环境中部署变得具有挑战性,未来会继续发展CodeBox,让它可以更加容易使用。
  2. 使用其他LLMs(如ClaudeV2或Open Orca)使其可用:作者已经确定未来会集成其它模型,最终可以让大家在本地运行!

Code Interpreter API项目地址:https://github.com/shroominic/codeinterpreter-api

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送