Leetcode-Hard 训练环境
用于评估代码生成智能体的LeetCode提交服务器的强化学习环境接口。基于OpenAI的gym构建。
支持的语言:
c
c#
java
python
javascript
ruby
swift
go
scala
kotlin
rust
php
typescript
racket
erlang
elixir
dart
mysql
Leetcode Hard(Python)排行榜:首次通过率
- OpenAI的GPT-4:
10.7
(来源) - OpenAI的Codex:
3.6
(来源) - OpenAI的GPT-3.5:
0.0
(来源) - Reflexion + GPT-4:
15.0
(来源)
设置:
- 克隆仓库:
git clone https://github.com/GammaTauAI/leetcode-hard-gym.git && cd leetcode-hard-gym
- 创建虚拟环境并安装
leetcode_env
模块及其依赖:
python -m venv venv
source venv/bin/activate
python -m pip install -e .
- 设置环境变量
LEETCODE_SESSION
为已登录Leetcode会话的LEETCODE_SESSION
cookie,设置LEETCODE_CSRF_TOKEN
为csrftoken
cookie。这些cookie可以通过浏览器开发者工具或浏览器扩展如EditThisCookie获取。
export LEETCODE_SESSION=...
export LEETCODE_CSRF_TOKEN=...
使用示例:
首先编写一些代码:
code = """
class Solution:
def twoSum(self, nums, target):
l = len(nums)
for i in range(l - 1):
for j in range(i + 1, l):
if nums[i] + nums[j] == target:
return [i, j]
"""
然后我们可以创建一个提交...
from leetcode_env.types import LeetCodeSubmission, ProgrammingLanguage
sub = LeetCodeSubmission(code=code,
lang=ProgrammingLanguage.PYTHON3,
question_slug='two-sum',
timeout=5)
...并实例化一个提交环境...
from leetcode_env.environment import LeetCodeEnv
env = LeetCodeEnv()
最后,我们可以通过环境执行提交:
status, reward, done, submission_result = env.step(sub)
print(status, reward, done, submission_result)
# 输出结果(部分内容已省略):
# Wrong Answer
# False
# False
# {'status_code': 11, 'lang': 'python3', 'run_success': True, 'status_runtime': 'N/A', 'memory': 14160000, 'question_id': '4', 'elapsed_time': 105, 'compare_result': '00010000000...00000000001000', 'code_output': '1.00000', 'std_output': '', 'last_testcase': '[1,3]\n[2]', 'expected_output': '2.00000', 'task_finish_time': 1680132323596, 'total_correct': 6, 'total_testcases': 2094, 'runtime_percentile': None, 'status_memory': 'N/A', 'memory_percentile': None, 'pretty_lang': 'Python3', 'submission_id': '924506780', 'input_formatted': '[1,3], [2]', 'input': '[1,3]\n[2]', 'status_msg': 'Wrong Answer', 'state': 'SUCCESS'}
注意:此处的比较结果已被缩短,它包含一个布尔值序列,表示每个测试是否通过
LeetcodeHardGym 数据集
提供了一个脚本来构建一组未被污染的免费Leetcode Hard问题,格式类似于HumanEval。它获取数据集,过滤掉依赖类、无返回值和类实现问题,并为指定的编程语言格式化问题。可选地,它可以使用GPT从问题描述中的示例提取测试用例,或从生成的文档字符串中删除这些示例。
使用方法
要构建数据集,必须在当前环境中安装leetcode_env
。然后,我们可以从该仓库的leetcode_dataset/
目录运行以下命令:
python build.py --langs python3 rust --log_level INFO --output_dir ./build
参数
--langs
:语言列表。当前选项包括:rust、python3。--log_level
:日志级别。选项:DEBUG、INFO、WARNING、ERROR、CRITICAL。默认为INFO。--output_dir
:保存构建数据集的目录。默认为./build。--extract_test_cases
:如果设置,将使用GPT从问题描述中提取测试用例。--remove_examples
:如果设置,将删除示例。不能与--extract_test_cases同时使用。
环境变量
LEETCODE_SESSION
:必须设置此环境变量才能运行脚本。请参阅设置部分以了解如何获取会话cookie。LEETCODE_CSRF_TOKEN
:必须设置此环境变量才能运行脚本。请参阅设置部分以了解如何获取csrf令牌。OPENAI_API_KEY
:如果使用--extract_test_cases
选项,则需要此环境变量。请参阅OpenAI API文档以了解如何获取API密钥。
依赖
如果使用--extract_test_cases
选项,则需要openai
和langchain
库。可以通过以下命令安装:
pip3 install openai langchain termcolor
输出
脚本将在输出目录中为每种指定的语言输出一个.jsonl文件。文件名格式为leetcode-hard-uncontaminated-{lang}.jsonl
。
引用
这个基准测试在以下论文中被引入:
@misc{shinn2023reflexion,
title={Reflexion: Language Agents with Verbal Reinforcement Learning},
author={Noah Shinn and Federico Cassano and Edward Berman and Ashwin Gopinath and Karthik Narasimhan and Shunyu Yao},
year={2023},
eprint={2303.11366},
archivePrefix={arXiv},
primaryClass={cs.AI}
}