- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 。
介绍两种方案SELF Instruct和Automatic Prompt Engineer,前者是基于多样的种子指令,利用大模型的上下文和指令理解能力,以及生成的多样性来Bootstrap生成更多样的指令样本,后者是prompt逆向工程,基于输入和输出,使用LLM来生成和挑选最优的prompt指令.
于是我把这两个方法强行组了CP,用APE把原始任务转化成种子指令,再用SELF去扩充,在医学和金融NLP任务上进行了尝试。也在huggingface上用gradio做成了可视化的应用, 有API Key的盆友可以自己尝试下效果: https://huggingface.co/spaces/xl2533/MakeInstruction ,记得fork到自己的space再尝试哟~ 。
- paper: 2023.3, LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS
- github: https://github.com/keirp/automatic_prompt_engineer
- 一语道破天机: prompt逆向工程,根据输入和输出让模型生成并寻找更优的prompt
这里作者基于原始的输入+输出,部分样本只有输出,例如自由生成类的任务,来让大模型预测,原始指令是什么。作者把指令生成的模板分成了3类,不过个人感觉其实只要一类即可,就是few-shot样本在前,待生成的指令在最后的向前生成类型,如下图 。
原始论文使用的是text-davinci-002来完成这个指令生成的任务,每个样本使用5条few-shot样例作为上下文,让模型输出可能的指令。这里我把生成指令的模型改成了ChatGPT(只是因为便宜),prompt模板也根据ChatGPT的特点做了调整。核心是ChatGPT作为对话模型比davinci-002,003废话要多。如果还按上面的指令来写,你可能会得到ChatGPT的回答是:我认为这个朋友收到的指令时blablabla..... 。
在实际测试中我还发现了几个有意思的点 。
例如相似新闻标题生成任务:我输入了2条样本作为few-shot如下,模型预测:"将输入中的公司或组织名称规范化为全称" 。
我又采样了两条样本如下,模型预测:"将公司公告或新闻标题简化成简短的标题,包括公司名称和主要内容" 。
哈哈预测的指令确实都没毛病,只不过都是相似新闻标题生成的子集,所以你需要根据任务输入输出的多样性程度来调整你的few-shot样本数,多样性越高你需要的few-shot样例越多 。
例如我把以上的相似标题生成任务,简化成了判断两个标题是否描述同一事件的分类任务。最初我的输入如下。看起来也没毛病是不是?然模型的预测是:"我无法确定这个任务指令的具体内容,但它可能与文本分类或者自然语言处理相关。给出输入文本,需要判断该文本是否符合某种特定的模式或标准,从而得出输出结果" 。
但是当我把样本中的输出改成符合任务语意的相同/不相同时,模型预测是:"判断两个新闻标题是否相同,如果相同输出"相同",否则输出"不相同" 。
当然考虑生成模型解码的随机性,我在第一类样本构建上多次采样也得到了类似相似度判断的指令,但整体效果都差于下面的构建方式,所以和MRC构建很相似,一切以符合语意为第一标准 。
最初我对这种机器生成指令的方式是不太感冒的,但是在医学术语标准化这个任务上,我对比了APE得到的最优指令,和我人工写的指令,在单测时确实是模型指令,得到正确答案的概率更高。所以我大胆猜测,因为模型之间的一致性,所以 合理 使用模型生成的指令,能提供更精准的上下文任务描述,且理论上都应该不差于人类指令.
这里作者使用了两种打分方式,来评估多组样本生成的多个候选指令的优劣 。
如何调openai接口获取输入的logprobs: 把echo=True,logprobs=1, 就能返回所有采样token的logprobs,logprobs取值对应TopN的返回,openai最多只给你返回Top5 token,包括实际被采样的token。max_tokens=0, 不让模型生成新的文本,就可以让模型原样返回我们喂进去的输入,以及对应的模型计算的每个token的条件概率啦 。
同时作者加入了随机搜索,既对模型生成的指令,过滤低分的部分,对于高分的指令集,让模型基于以下指令模板,为高分指令生成相似的指令,和原始生成的指令一起排序选出最优指令.
这块实现时,我把相似指令的部分拿掉了,改成人工加入,针对得到的高分指令,补充上自己认为缺少核心的信息后使用log prob的打分方式来评估是否有提升。所以应用里,我把Generated Prompt的窗口改成了可交互的,可以直接对生成的指令做修改,再Eval效果即可.
例如在医疗搜索意图的任务上,很明显模型无法理解"多问"标签是啥意思,所以最初多组样本得到的最优指令是下图的第二个,而我人工加入"多问"的指令后,得到了效果更好的第一个指令 。
这里作者使用了REF[1]里面使用的24个指令任务,每类任务挑选5对样本,使用以上的方案得到最优的指令,再在剩余样本上,和人工指令以及REF[1]论文中使用的方案(没有搜索和打分排序的APE)以下称为greedy,进行效果对比。APE的效果在24个任务上基本可以打平人工模板甚至在部分任务上还要超越人工指令。在BigBench这类难度更高的样本上,APE在17(共21)个任务上也超越了人工指令的效果.
我在4个医学数据集上APE+人工优化得到的最优指令如下 。
任务 | 指令 |
---|---|
搜索意图 | 生成医学相关问题的答案。给定一个输入问题,需要根据问题生成相应的输出答案。答案包括临床表现、病因、治疗方法、作用、定义等等,如果有多个问题,返回多问 |
医疗术语标准化 | 将医学手术名称的术语表述标准化。输入是医学手术的名称,输出是对该手术的名称进行修正、标准化,以供医学专业人员更好地理解 |
医疗药物功能实体抽取 | 给定药品信息和用途说明,根据用途说明提取出药品的主治功能。 |
医疗文献QA生成 | 训练一个问答系统,给定一些医学文本,能够回答用户提问关于该文本内容的问题。每个输入-输出对是一组文本和对应的问题及答案。输出的形式是以下Json格式{"问题": \(问题, "回答":\) 回答} |
以医学术语标准化为例我简化了APE提供的gradio应用,效果如下 。
- paper: 2022.12, SELF-INSTRUCT: Aligning Language Model
with Self Generated Instructions- https://github.com/yizhongw/self-instruct
- https://github.com/tatsu-lab/stanford_alpaca#data-generation-process
- 一语道破天机:类似非线性插值,通过LLM的生成多样性做Bootstrap对种子指令集进行不定向扩充
上一步我们依赖APE得到了种子指令集,但是丰富度和多样性是远远不够的。这里SELF提出了一种Bootstrap方案来让LLM基于种子指令生成新的指令的指令扩充方案。这个方案也后续被用于Alpaca项目中生成微调指令集,主要包括以下3个步骤 。
首先作者人工构建了175个种子指令,这些种子指令由1条指令和1个样本构成。每个Step作者会从中采样8个指令,其中6个来自以上种子,2个来自LLM生成的指令,当然step1全部都是种子指令。然后基于如下的prompt模板构建模型输入 。
"""
Come up with a series of tasks:
Task 1: {instruction for existing task 1}
Task 2: {instruction for existing task 2}
Task 3: {instruction for existing task 3}
Task 4: {instruction for existing task 4}
Task 5: {instruction for existing task 5}
Task 6: {instruction for existing task 6}
Task 7: {instruction for existing task 7}
Task 8: {instruction for existing task 8}
Task 9:
"""
如果你看着这个模板,感觉和ChatGPT的模板格格不入,那就对了。因为作者是基于GPT3实现的,就是那个天真的续写模型.
而Alpaca项目在使用SELF构建指令样本时升级到了davinci-003模型,因为模型可以更好的理解指令,因此以上纯few-shot的prompt模板也改成了如下(用ChatGPT翻成了中文),同时输入的few-shot数量缩减到了3个 。
"""
你需要想出20个不同的任务指令。这些任务指令将输入GPT模型,我们将评估GPT模型完成指令的情况。
以下是要求:
1. 尽量不要在每个指令中重复使用动词,以最大化多样性
2. 指令的表达形式需要多样化。例如你可以把问题和祈使句结合起来
3. 指令的类型应该多样化,包括但不限于开放式生成、分类、抽取、问答、文本编辑等等
4. 指令应该是GPT模型可以完成的任务。例如,指令不能是输出图像或者视频,另一个例子,不要让助手在下午5点叫醒你或设置提醒,因为GPT不能执行任何动作
5. 指令必须是中文
6. 指令应该是1到2句话,可以是祈使句或问句。
20个任务的列表:
"""
我第一遍读完SELF是一脑门子问号 。
后来我(似乎&努力)说服了自己,就是LLM做了类似非线性差值的工作,因为每个Step都会采样不同的指令作为上下文,而模型也会根据随机采样得到的不同的上下文融合出新的指令.
只有指令还不够,还需要生成指令对应的输入和输出。在SELF原论文中,作者多加了一步分类任务,也就是让LLM先判断指令本身是否为分类任务,如果是则先生成输出,再生成输入。如果否则先生成输入再生成输出。原因是作者发现,对于分类任务模型倾向于只生成其中一个标签的输入.
但在Alpaca项目中,因为模型升级到Davinci-003,以上问题也似乎不再显著。并且随着模型输入长度变长,Alpaca直接把生成样本和生成指令的步骤合在了一起,一步到位。于是以上指令生成的模板被扩充成了以下 。
"""
7. 你应该为指令生成一个合适的输入。输入字段应该包含为指令提供的一个具体示例。它应该涉及真实的数据,而不应该包含简单的占位符。输入应该提供足够的内容,使指令具有挑战性,但理想情况下不应超过100个单词。
8. 不是所有的指令都需要输入。例如,当一个指令询问一些一般信息时,“世界上最高的山峰是什么”,就不需要提供具体的上下文。在这种情况下,我们只需在输入字段中放置“<无输入>”。
9. 输出应该是对指令和输入的合适回应。确保输出少于100个单词。
20个任务的列表:
"""
于是每一步其实是直接生成指令,以及指令对应的输入和输出样本。对于自由生成类的任务,也支持没有输入只有输出.
针对以上生成的指令和样本还需要进行一些系列的后处理,主要包括模型预测解析,不合理指令的过滤,以及相似指令的过滤,解析的部分建议直接看代码 。
为了保证指令集的多样性,每轮都会计算新生成指令和已有指令的Rouge-L相似度,也就是摘要任务评估中用最长公共子串的长度计算的F值。只保留F值小于0.7的新的指令。同时也可以根据最近几轮生成指令的整体相似度,来判断是否要停止生成.
我用上面APE生成的4个医学NLP任务作为种子指令集,每轮采样2个人工,1个机器指令作为few-shot,生成2个新的指令任务。我对以上指令做了些调整,限制只生成医学领域的任务,得到了如下的结果。哈哈我决定去给账户充钱了。。.
大致就是这么多,感兴趣的盆友们一起玩起来(造数据的痛苦见者有份)~ 。
更多Prompt相关论文·教程,开源数据·模型,以及AIGC相关玩法戳这里 DecryptPrompt 。
Reference 。
最后此篇关于解密prompt系列5.APE+SELF=自动化指令集构建代码实现的文章就讲到这里了,如果你想了解更多关于解密prompt系列5.APE+SELF=自动化指令集构建代码实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
背景: 我最近一直在使用 JPA,我为相当大的关系数据库项目生成持久层的轻松程度给我留下了深刻的印象。 我们公司使用大量非 SQL 数据库,特别是面向列的数据库。我对可能对这些数据库使用 JPA 有一
我已经在我的 maven pom 中添加了这些构建配置,因为我希望将 Apache Solr 依赖项与 Jar 捆绑在一起。否则我得到了 SolarServerException: ClassNotF
interface ITurtle { void Fight(); void EatPizza(); } interface ILeonardo : ITurtle {
我希望可用于 Java 的对象/关系映射 (ORM) 工具之一能够满足这些要求: 使用 JPA 或 native SQL 查询获取大量行并将其作为实体对象返回。 允许在行(实体)中进行迭代,并在对当前
好像没有,因为我有实现From for 的代码, 我可以转换 A到 B与 .into() , 但同样的事情不适用于 Vec .into()一个Vec . 要么我搞砸了阻止实现派生的事情,要么这不应该发
在 C# 中,如果 A 实现 IX 并且 B 继承自 A ,是否必然遵循 B 实现 IX?如果是,是因为 LSP 吗?之间有什么区别吗: 1. Interface IX; Class A : IX;
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在阅读标准haskell库的(^)的实现代码: (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 a -> b ->a expo x0
我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。 这是一个好的方法吗? struct TreeElement{ SomeMoveType
我正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和用户想要的新用户名,然后检查用户名是否已被占用。如果采用该方法,则该方法应该返回带有数据库中未采用的数字的用户名。 例子: “贾
我正在尝试实现 Breadth-first search algorithm , 为了找到两个顶点之间的最短距离。我开发了一个 Queue 对象来保存和检索对象,并且我有一个二维数组来保存两个给定顶点
我目前正在 ika 中开发我的 Python 游戏,它使用 python 2.5 我决定为 AI 使用 A* 寻路。然而,我发现它对我的需要来说太慢了(3-4 个敌人可能会落后于游戏,但我想供应 4-
我正在寻找 Kademlia 的开源实现C/C++ 中的分布式哈希表。它必须是轻量级和跨平台的(win/linux/mac)。 它必须能够将信息发布到 DHT 并检索它。 最佳答案 OpenDHT是
我在一本书中读到这一行:-“当我们要求 C++ 实现运行程序时,它会通过调用此函数来实现。” 而且我想知道“C++ 实现”是什么意思或具体是什么。帮忙!? 最佳答案 “C++ 实现”是指编译器加上链接
我正在尝试使用分支定界的 C++ 实现这个背包问题。此网站上有一个 Java 版本:Implementing branch and bound for knapsack 我试图让我的 C++ 版本打印
在很多情况下,我需要在 C# 中访问合适的哈希算法,从重写 GetHashCode 到对数据执行快速比较/查找。 我发现 FNV 哈希是一种非常简单/好/快速的哈希算法。但是,我从未见过 C# 实现的
目录 LRU缓存替换策略 核心思想 不适用场景 算法基本实现 算法优化
1. 绪论 在前面文章中提到 空间直角坐标系相互转换 ,测绘坐标转换时,一般涉及到的情况是:两个直角坐标系的小角度转换。这个就是我们经常在测绘数据处理中,WGS-84坐标系、54北京坐标系
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .
二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
我是一名优秀的程序员,十分优秀!