如何高度优化适用于企业的AI (四) 如何减少AI幻觉

发布时间 2023-06-28 09:43:01作者: KhalidDu

1.Temperature设置

我们有了微调模型的机器人, 也已经能够成功工作, 但实际上, 它给我们回复了毫无意义的胡言乱语
所以, 现在让我们来检查下我们的设置
image.png
存在惩罚和频率惩罚, 似乎并没做太多的事情, 这个是默认的状态, 所以, 我们暂时不管他们
所以当OpenAI完成的对话有点奇怪的时候, 我们所想到的第一个问题, 可能是 Temperature的设置
image.png
Temperature 控制着随机性, 也就是, 模型的大胆程度
这是多么有创意的一件事情
但现在, 我们不想要创意, 只想要事实
所以我们把这个参数的值设置为0, 然后试一下
image.png
可以很明显的看到, 回复的结果有所改善, 但是实际还是没有达到我们想要的结果
但降低Temperature 确实是有效的

2.交互文本格式

让我们回忆一下, 我们之前将CSV数据处理成Jsonl格式的时候, 都做了什么

我们在prompts后面添加了 ->字符, 在comletions前面添加了 , 后面添加了换行符
我们检查了一下 Playground页面内的请求
image.png
这个请求中prompt并没有加上生成的训练数据中的 ->符号 那我们尝试手动加上, 给propmt`一个固定的结束标识, 让AI不再胡乱猜测补充
image.png
实际的反馈告诉我们, 这确实是有一点作用的, 现在我们离我们的目标更近了一步

3.停止序列 Stop Sequence

那到底什么是Stop Sequence呢?
Stop Sequence是一种阻止模型生成令牌的方法
那它是如何工作的呢?

原文: It's an optional setting that tells the API tostop generating tokens at a given point.
翻译: 这是一个可选设置,它告诉API在给定点停止生成令牌。

原文: The completion will not contain the stopsequence.
翻译: 完成将不包含停止序列。

原文: The stop sequence is an array.
翻译: 停止序列是一个数组

停止序列是一个数组这是很好理解的, 因为我们可能有多个终止符
回顾我们整个操作

我们其实在处理数据的时候, 已经为每段的completion的结尾添加了\n来作为结束标识
根据上面的定义, 我们直接用上手
image.png

PS: 这里说明一下, GPT-4是不需要使用Stop属性的, 因为GPT-4已经有了特定的语法, 具有角色和内容属性的对象
而davinci和其他的模型是没有这个的, 所以我们可以设置停止符, 来阻止AI继续对话

所以总结一下, Stop Sequence到底是干什么的呢
是让模型真正的清楚, 当它读取对话字符串时, 它已经结束了
但这真的已经结束了么?
不不不, 当我们继续问AI一个, 关于我们训练数据之外的问题的时候, AI幻觉仍然存在
image.png
就如这个例子中的, AI为我虚构了一个CEO
从这个角度看, 现在作为一个产品仍然是不合格的

4.纪元 n_epoches

n代表了次数
这个又是意味着什么呢?
image.png
在我们构建模型时, 可能有些人已经注意到了, 随着模型的微调, 它完成了不同的纪元
那么纪元到底是什么?

epoches - The number of data cycles

原文: It controls the number of times OpenAl willcycle through the training data set.
翻译: 它控制OpenAl在训练数据集中循环的次数

It defaults to 4
翻译: 默认为4。

Higher numbers = higher costs.
翻译: 数字越高,成本越高。

PS: 对应的, 数字越高, 不仅仅是成本越高, 训练所需要耗费的时间也是越多的

但我们无法在应用程序中设置它
我们能做的, 只是回到我们的CLI, 在微调命令后添加 --n_epochs 16, 这里16只是个例子, 你可以填写你想要的次数

openai api fine_tunes.create -t XXXX_prepared.jsonl -m davinci --n_epochs 16

这里附上最终执行的命令
当然, 训练的数据中, 尽可能的多的包含一些"对不起, XXXXXXX" 的Complete, 这样有助于教会AI说不知道, 能够大幅度减少AI幻觉的出现
当然. 更本质的是, 如果要投入到生产, 我们要尽可能多的提供训练数据, 以帮助AI更好的学习

结束语

davinci模型的训练实在是有点太贵了, 我上面测试的数据, 使用davinci模型, 训练数据600+, 默认4纪元
共花费$18+
后来我使用同样的数据量, 使用Ada模型进行了分别进行了4和16纪元的微调训练测试, 分别花费$0.25和$1.01
image.png
image.png
训练后的实际结果显示:
提高epochs的次数, 确实会使数据更精准
但相同epochs次数的情况下, davinci模型确实会比ada模型表现的更好一些
想尝试的小伙伴, 请做好钱包缩水的准备, 个人不建议自掏腰包进行大规模数据训练

关注一下, 分享精彩~
公众号