代码生成大模型
原理
任务:
- 生成代码
- 代码自动补齐
- 代码翻译与重构
要求:
- 语法严格
- 语义精确
代码大模型:在海量开源代码库(Github等)进行预训练或微调的大型语言模型(Codex和AlphaCode)
发展历史:
- 预设规则
- 补全功能
- 编写转向描述
评估体系:
- HumanEval
- pass@k
挑战:
- 正确性
- 语法错误
- 逻辑错误
- 可靠性
- 输出不稳定
- 逻辑不一致
- 性能波动
- 安全性
- 生成漏洞代码
- 泄露敏感信息
- 泛化能力
代码
导包
1 | import ast, builtins, math, re, traceback |
模型选择
bigcode/tiny_starcoder_py
1 | AutoTokenizer |
数据集构造
- name:任务名字
- inst:任务说明
- tests:测试代码字符串,使用断言
prompt + 生成
1 | def build_prompt(inst,feedback=''): |
代码提取
1 | def extract_code(text): |
语法检查
1 | def syntax_ok(code): |
自动测试执行器
- 教学使用受限 builtins
- 生产使用 沙箱
1 | # 限制使用的内置函数,防止出现 os.sys 相关的 |
基线:一次生成(One-shot)
不进行任何错误修正,只让模型生成一次代码,直接测试,统计通过
等价于pass@1
1 | baseline=[] # 保存测试结果 |
反馈修复(self-refine)
1 | def solve_refine(task,max_round=3): # 最多尝试修正 3 轮 |
pass@k 估计(小样本)
生成 k 次,只要一次通过测试,就算成功
1 | def pass_at_k(task,k=5,temp=0.8): |