GPT-3.5-turbo 简易调参初体验, with ZelinAI

1,189 阅读5分钟

前段时间听说chatGPT封号问题严重,于是我好一段时间没敢上号。在这段期间体验到了1个国内的商业产品:ZelinAI,一个不会写代码的小白也能上手构建属于自己的AI助手应用。主要是还算稳定不需要用魔法,于是最近都在用它体验AI的魅力。

我对AI没啥研究,所以这里只是做些把玩过程的体验分享。

目前产品只能创建基于GPT-3.5-turbo的模型应用。比起官方的纯聊天页面应用ChatGPT,它暴露出了更多的可配置项。

image.png

初看一堆参数设置让人发懵,好在参数边上有简单的说明提示,使得初次捣鼓也不算费劲。但我想更多了解这些参数的含义,于是直接向TA发出了提问。

参数上我就设置了Role,并将Top_p从1改为了0。

image.png

初看TA的回答,条理清晰,资料源都来自OpenAI自己的技术文档。前几个提供的链接锚点都能指向对应的参数说明,但看到最下面几个发现就不对咧 ,例如Role、Output format、Keep context。打开后根本没对应的属性说明……我怀疑TA是根据上面参数的链接格式再推断生成出了后面的地址……

我主观理解,ZelinAI因为后续还会接入其他模型,所以它提供的参数项可能不完全与openAI的参数都一一对应,下面几个可能是通用性/兼容性的参数设置,ZelinAI读入后可能会额外再加工处理。像是Role、Output format这种参数,我觉得也算是prompt里的一部分了。


prompt编写技巧-CRISPE模板

编写prompt提示的一个技巧是可以参考使用人家总结的CRISPE模板格式

  • Capacity and Role: 让GPT扮演一个角色。对应参数Role;
  • Insight: 提供问题的背景信息/上下文
  • Statement: 让GPT做的事情
  • Personality: 要用哪种方式或者模仿谁的语气来回答答案,或者告诉TA不要做什么。我觉得就是对应参数Output_format;
  • Experiment: 让GPT说出多个例子;

5个部分不是都必须要有,编写prompt时可以按需填充。

那有哪些能参考的例子呢?我找到了英文的例子合集中文例子合集(中文版的有夹带私货。人家这仓库去年12月就建了……emmm)。


既然认为ZelinAI上的参数不都是对应GPT的,那我就再换个问法,prompt里 不再强调GPT了,参数Top_p还是0。

image.png

然后TA给出了好几个重复链接,其实就俩,都来自抱抱脸(AI开源社区)……

第一个链接是讲什么 如何基于Transformers用不同解码方式生成文本……没仔细看(OS:看不懂)。文章结论先是说,Top-p、Top-K采样在开放式语言生成中能产生更流畅的文本,然后又说在某些情况下beam search比Top-p的更流畅。最终结论是没有哪个方法能一招吃遍天下……

第二个链接直接给了我Transformers的预训练配置的参数文档。

……行吧。感觉输出的completion和预期的效果还是有点差异,从2个链接里都没找全所有参数的详细来源,也可能还是prompt给的不好吧……

所以最终参数我还是没吃透,即使在后面尝试建“回怼”小助手的时候,控制变量法改了很多参数,最终效果还是有点玄学。例如temperature和top_p都是控制文本丰富度,但官方文档说不要同时修改temperature和top_p参数的默认值,那同时改了会怎样…emmm…好奇又茫然,我觉得调这个真的好玄学。

我就其中几个比较简单的参数做个相对粗浅的介绍:

AI模型中字符的最小单位。使用gpt api时会按照token数收费,问、答都会消耗token数。不同模型能支持的最大token数不同,gpt-3.5系列的都为4096个tokens,gpt-4系列的有8192、32768两种。训练的数据都是截止到2021年9月。

image.png

中英文和token的映射不是一一对应的,一个中文字可能对应1~3个token。用这个在线工具能查看gpt-3模型中字符和token的转换关系。

image.png

中文的逗号居然得占仨……

如何计算字符对应的token数,不同的模型使用的编码库不同:

| Encoding name           | OpenAI models                                       |
|-------------------------|-----------------------------------------------------|
| `cl100k_base`           | `gpt-4`, `gpt-3.5-turbo`, `text-embedding-ada-002`  |
| `p50k_base`             | Codex models, `text-davinci-002`, `text-davinci-003`|
| `r50k_base` (or `gpt2`) | GPT-3 models like `davinci`                         |

我尝试着让TA解释下gpt-3使用的编码是如何做token转换的,以及要求TA做一个转换示例, image.png

结果询问了多次后,它愣是没给出正确的token id数组,难道又是我prompt技巧不对?对于r50k_base的介绍还算是靠谱。

GPT-3-Encoder库中的encoder.json映射关系文件里,能查到shadowMike对应的token ids为[19106, 16073]。

……

[WIP]

……

如果想更多了解ZelinAI这款商业产品,可以看这篇