分享
(3)ChatBot是怎么炼成的?
输入“/”快速插入内容
(3)ChatBot是怎么炼成的?
作者:小A,aaronxic
,
知乎个人主页
发表时间:2023年7月8日
原文地址:
https://zhuanlan.zhihu.com/p/642282717
50%
50%
开篇
大家好,我是小A。上一篇我们介绍了
LLM基座模型的3种不同transformer架构
,今天给大家带来本系列的第三篇内容,主要介绍LLM基座
大模型
最火下游应用ChatBot是怎么炼成的?
从
LLM
辅助编程说起
罗马不是一日建成的,对于AGI新秀的
ChatGPT
而言,也是同样经历了长期的探索和发展,相信大家对下面这张
GPT
发展路线图还有印象。可以看出在跨时代的
text-davinci-002
出现之前,
OpenAI
团队其实做了很多辅助编程的探索,我觉得意义主要有两方面
•
增强了
LLM
模型在逻辑推理方面的能力
•
验证了SFT技术对辅助编程这个
LLM
下游应用是有效的,为后来
RLHF
等更复杂技术在ChatBot的出现打下了坚实的基础
GPT
发展路线图
因此在深入介绍需要更多复杂技术才能训work的ChatBot应用前,我们先看看辅助编程应用都需要哪些数据和训练方法。下面会用较长的篇幅详细介绍辅助编程中两个奠基性工作,Codex和AlphaCode。
它们使用了两种不同的transformer架构,分别是decoder-only和encoder-decoder。
Codex
Codex作为
OpenAI
的又一力作,出生的时候就有很强的产品化倾向,VSCode里面Copilot插件用的就是Codex的产品化特供版。我认为Codex的主要贡献点如下
提出了HumanEval的编程数据集,并提出 pass@
k
指标衡量辅助编程模型的效果
提出了2阶段训练方式,1阶段基于
github
海量
源码
做无监督预训练pre-train,2阶段基于带docstring和对应函数代码的额外数据做带监督微调SFT
值得注意的是Codex主要聚焦的是Python语言,这跟后面的AlphaCode有很大不同。
下面就5方面展开介绍Codex
•
辅助编程问题定义
•
pass@
k
指标定义
•
采样算法介绍
•
4种优化方法和实验结果
•
Codex局限性
辅助编程问题定义
我们首先感受一下我们要解决的编程问题是什么,如下所示,每条数据record包含了
•
函数名称和参数
•
一对三引号括起来的docstring来文字描述函数功能,以及若干
Input
/
Output
示例
•
函数逻辑主体本身
代码块
Python
def
incr_list
(l:
list
):
"""
Return list with elements incremented by 1.
>>> incr_list([1, 2, 3]) [2, 3, 4]
>>> incr_list([5, 3, 5, 2, 3, 3, 9, 0, 123]) [6, 4, 6, 3, 4, 4, 10, 1, 124]
"""
return [(e +
1
) for e in l]
作者搜集了164道这样的题目,难度中等偏下水平,整体占字符长度也比较短。每道题还有若干测例test cases来验证函数正确性,通过所有测试即判定为正确,数据集详情可
参见这里
我们希望辅助编程应用看到了前两部分,输出最后一部分,完成代码补全功能
pass@k指标
在刷榜前,最重要的是厘清指标的计算过程。
按字面理解,就是采样
个样本全部都提交,只要有任意1个能通过所有 test cases 检查,就判定这一次采样是正确的。
不难发现这样计算的
,容易在
比较小的时候会不稳定,因此作者尝试扩大采样量,拆分成2阶段:
1. 阶段一,先 sample 生成足够多的
个样本;
2. 阶段二,从
个样本里面用采样策略(例如随机方式)挑选出其中
个作为最终提交。