如果您曾经面临将代码库迁移到新框架或语言的痛苦,这个项目就是为您准备的。
迁移是一个昂贵、繁琐且非常棘手的问题。请不要盲目信任当前版本,并负责任地使用。同时请注意,由于GPT-Migrate旨在编写(可能还会重写)整个代码库,成本可能会迅速增加。
然而,凭借开源社区的集体智慧和当前大型语言模型的发展状况,这也是一个非常可解决的问题。
⚡️ 使用方法
- 安装Docker并确保它正在运行。同时建议您至少使用GPT-4,最好是GPT-4-32k。
📦 使用Poetry安装
-
按照Poetry官方网站的说明安装Poetry。
-
安装Poetry后,进入项目目录并使用以下命令安装项目依赖:
poetry install
这将创建一个虚拟环境并在该环境中安装所有必要的依赖。
- 设置您的OpenRouter API密钥(默认)和/或您的OpenAI API密钥(直接使用OpenAI API...在这种情况下,将--model设置为
gpt-4-32k
或您所需的模型),并安装Python依赖:
export OPENROUTER_API_KEY=<您的密钥>
export OPENAI_API_KEY=<您的密钥>
pip install -r requirements.txt
- 运行主脚本,指定您想要迁移到的目标语言:
python main.py --targetlang nodejs
- (可选)如果您希望GPT-Migrate在使用它们测试迁移后的应用程序之前,先对您的应用程序验证它创建的单元测试,请确保您现有的应用程序已暴露,并使用
--sourceport
标志。要对基准进行测试,请打开一个单独的终端,导航到benchmarks/language-pair/source
目录,并在安装依赖后运行python app.py
。它将在端口5000上暴露。使用--sourceport
标志。
默认情况下,此脚本将执行flask-nodejs基准测试。您可以使用下面的选项指南指定语言、源目录和许多其他内容。
💡 选项
您可以通过向main.py
脚本传递以下选项来自定义GPT-Migrate的行为:
-
--model
:要使用的大型语言模型。默认为"gpt-4-32k"
。 -
--temperature
:AI模型的温度设置。默认为0
。 -
--sourcedir
:包含要迁移的代码的源目录。默认为"../benchmarks/flask-nodejs/source"
。 -
--sourcelang
:要迁移的代码的源语言或框架。没有默认值。 -
--sourceentry
:相对于源目录的入口点文件名。例如,对于Python,这可能是app.py
或main.py
文件。默认为"app.py"
。 -
--targetdir
:迁移后的代码将存放的目录。默认为"../benchmarks/flask-nodejs/target"
。 -
--targetlang
:迁移的目标语言或框架。默认为"nodejs"
。 -
--operating_system
:Dockerfile的操作系统。常见选项是'linux'
或'windows'
。默认为'linux'
。 -
--testfiles
:包含要测试的函数的文件的逗号分隔列表。例如,对于Python应用程序,这可能是包含REST端点的app.py
或main.py
文件。包括完整的相对路径。默认为"app.py"
。 -
--sourceport
:(可选)用于对原始应用程序测试单元测试文件的端口。没有默认值。如果不包括,GPT-Migrate将不会尝试对您的原始应用程序测试单元测试。 -
--targetport
:用于对迁移后的应用程序测试单元测试文件的端口。默认为8080
。 -
--guidelines
:您希望在迁移过程中遵循的风格或小功能指南。例如,"使用制表符,而不是空格"。默认为空字符串。 -
--step
:要运行的步骤。选项包括'setup'
、'migrate'
、'test'
、'all'
。默认为'all'
。
例如,要将Python代码库迁移到Node.js,您可以运行:
python main.py --sourcedir /path/to/my-python-app --sourceentry app.py --targetdir /path/to/my-nodejs-app --targetlang nodejs
这将把./my-python-app
中的Python代码迁移到Node.js,并将结果代码写入./my-nodejs-app
。
GPT辅助调试
🤖 工作原理
对于从--sourcelang
迁移到--targetlang
的存储库...
-
GPT-Migrate首先为
--targetlang
创建一个Docker环境,这个目标语言要么是通过参数传入,要么由GPT-Migrate自动评估。 -
它递归地评估你现有的代码,以识别
--sourcelang
的第三方依赖,并选择相应的--targetlang
依赖。 -
从指定的
--sourceentry
文件开始,它递归地从你现有的代码重建新的--targetlang
代码。这一步可以通过--step migrate
选项来启动。 -
它使用新的代码库启动Docker环境,将其暴露在
--targetport
上,并根据需要进行迭代调试。 -
它使用Python的unittest框架开发单元测试,如果你现有的应用程序正在运行并暴露在
--sourceport
上,还可以选择对其进行测试,并根据需要进行迭代调试。这一步可以通过--step test
选项来启动。 -
它在
--targetport
上对新代码运行这些单元测试。 -
它会根据日志、错误信息、相关文件和目录结构为你迭代调试代码。它通过选择一个或多个操作(移动、创建或编辑文件)然后执行它们来实现这一点。如果它想执行任何类型的shell脚本(如移动文件),它会首先请求许可。最后,如果在任何时候它遇到困难或用户结束调试循环,它将输出用户需要遵循的指示以进入迁移的下一步。
-
新的代码库完成并存在于
--targetdir
中。
📝 提示设计
子提示按以下方式组织:
HIERARCHY
:这定义了偏好的概念。有4个偏好级别,每个级别的优先级都高于前一个级别。p1
:偏好级别1。这些是最一般的提示,包含广泛的指导原则。p2
:偏好级别2。这些是更具体的提示,包含某些类型操作的指导原则(例如,编写代码的最佳实践和理念)。p3
:偏好级别3。这些是更加具体的提示,包含特定操作的指示(例如,创建某个文件、调试、编写测试)。p4
:偏好级别4。这些是最具体的提示,包含输出的格式。
提示是子提示的组合。这种标记和可组合性的概念也可以扩展到其他属性,使提示更加健壮。这是我们非常感兴趣并积极探索的领域。
在这个仓库中,prompt_constructor()
函数接受一个或多个子提示,并生成一个可能用变量格式化的字符串,例如GUIDELINES
是p1
,WRITE_CODE
是p2
等:
prompt = prompt_constructor(HIERARCHY, GUIDELINES, WRITE_CODE, DEBUG_TESTFILE, SINGLEFILE).format(targetlang=targetlang,buggyfile=buggyfile)
📈 性能
GPT-Migrate目前处于开发alpha阶段,尚未准备好用于生产环境。例如,在相对简单的基准测试中,它能够在约50%的情况下顺利处理"简单"语言如Python或JavaScript,但在处理更复杂的语言如C++或Rust时,如果没有一些人工协助,它无法完成任务。
✅ 基准测试
我们正在积极建立一个健壮的基准测试仓库。如果你有想贡献的代码库,请提交PR!当前的基准测试是从头开始构建的:具有几个端点和依赖文件的REST API应用程序。
🧗 路线图
以下是待改进的事项。如果你想解决其中任何一个或其他问题,请提交PR :)
高优先级
- 根据窗口大小添加模型输入大小限制的逻辑。参见问题#2。
中等优先级
- 为整个项目添加单元测试,以提高可靠性和CI/CD
- 添加更多基准示例,特别是更大的仓库
- 添加功能,让LLM在调试时请求访问其他文件中的依赖函数
- 添加对其他LLM的支持
低优先级
- 在模型调试时启用互联网搜索请求
- 识别并编译特定语言的问题并解决它们
📣 行动号召
我们正在寻找有才华的贡献者。无论你对特定语言或框架有特别的热情,想要帮助创建更健壮的测试套件,还是对如何使这个项目变得更好有有趣的想法,我们都非常欢迎你的加入!
🛠 专家辅助迁移
由于请求的涌入,我们决定创建一个标准化的流程来帮助人们进行迁移。如果你是需要帮助进行大规模迁移的公司,或者是愿意帮助进行迁移的专家,请访问以下网站:https://gpt-migrate.com/