各个国家的google网站,专业建设目标如何表述,网站开发开发语言,网络推广公司经营范围第二章 语言模型#xff0c;提问范式与 Token
在本章中#xff0c;我们将和您分享大型语言模型#xff08;LLM#xff09;的工作原理、训练方式以及分词器#xff08;tokenizer#xff09;等细节对 LLM 输出的影响。我们还将介绍 LLM 的提问范式#xff08;chat format…第二章 语言模型提问范式与 Token
在本章中我们将和您分享大型语言模型LLM的工作原理、训练方式以及分词器tokenizer等细节对 LLM 输出的影响。我们还将介绍 LLM 的提问范式chat format这是一种指定系统消息system message和用户消息user message的方式让您了解如何利用这种能力。
一环境配置
Helper function 辅助函数。 如果之前曾参加过《ChatGPT Prompt Engineering for Developers》课程那么对此就相对较为熟悉。 调用该函数输入 Prompt 其将会给出对应的 Completion 。
public String getCompletion(String prompt) {ChatCompletionRequest chatCompletionRequest new ChatCompletionRequest();chatCompletionRequest.setModel(gpt-3.5-turbo);chatCompletionRequest.setTemperature(0d);ChatMessage chatMessage new ChatMessage();chatMessage.setRole(user);chatMessage.setContent(prompt);chatCompletionRequest.setMessages(Arrays.asList(chatMessage));ChatCompletionResult result openAiService.createChatCompletion(chatCompletionRequest);ChatMessage chatMessage1 result.getChoices().get(0).getMessage();return chatMessage1.getContent();}二尝试向模型提问并得到结果
LLM 可以通过使用监督学习来构建通过不断预测下一个词来学习。 并且给定一个大的训练集有数百亿甚至更多的词你可以创建一个大规模的训练集你可以从一 句话或一段文本的一部分开始反复要求语言模型学习预测下一个词是什么
LLM 主要分为两种类型基础语言模型Base LLM和越来越受欢迎的指令微调语言模型Instruction Tuned LLM。基础语言模型通过反复预测下一个词来训练因此如果我们给它一个 Prompt比如“从前有一只独角兽”它可能通过逐词预测来完成一个关于独角兽在魔法森林中与其他独角兽朋友们生活的故事。
然而这种方法的缺点是如果您给它一个 Prompt比如“中国的首都是哪里”很可能它数据中有一段互联网上关于中国的测验问题列表。这时它可能会用“中国最大的城市是什么中国的人口是多少”等等来回答这个问题。但实际上您只是想知道中国的首都是什么而不是列举所有这些问题。然而指令微调语言模型会尝试遵循 Prompt并给出“中国的首都是北京”的回答。
那么如何将基础语言模型转变为指令微调语言模型呢这就是训练一个指令微调语言模型例如ChatGPT的过程。首先您需要在大量数据上训练基础语言模型因此需要数千亿个单词甚至更多。这个过程在大型超级计算系统上可能需要数月时间。训练完基础语言模型后您会通过在一小部分示例上进行进一步的训练使模型的输出符合输入的指令。例如您可以请承包商帮助您编写许多指令示例并对这些指令的正确回答进行训练。这样就创建了一个用于微调的训练集让模型学会在遵循指令的情况下预测下一个词是什么。
之后为了提高语言模型输出的质量常见的方法是让人类对许多不同输出进行评级例如是否有用、是否真实、是否无害等。然后您可以进一步调整语言模型增加生成高评级输出的概率。这通常使用强化学习中的人类反馈RLHF技术来实现。相较于训练基础语言模型可能需要数月的时间从基础语言模型到指令微调语言模型的转变过程可能只需要数天时间使用较小规模的数据集和计算资源。
String prompt 中国的首都是哪里;String message this.getCompletion(prompt);log.info(iterative1:\n{}, message);
中国的首都是北京。三Tokens
到目前为止对 LLM 的描述中我们将其描述为一次预测一个单词但实际上还有一个更重要的技术细节。即 LLM 实际上并不是重复预测下一个单词而是重复预测下一个 token 。当 LLM 接收到输入时它将将其转换为一系列 token其中每个 token 都代表常见的字符序列。 例如对于 “Learning new things is fun!” 这句话每个单词都被转换为一个 token 而对于较少使用的单词如 “Prompting as powerful developer tool”单词 “prompting” 会被拆分为三个 token即prom、“pt和ing”。 当您要求 ChatGPT 颠倒 “lollipop” 的字母时由于分词器tokenizer 将 “lollipop” 分解为三个 token即 “l”、“oll”、“ipop”因此 ChatGPT 难以正确输出字母的顺序。您可以通过在字母之间添加连字符或空格的方式使分词器将每个字母分解为单独的 token从而帮助 ChatGPT 更好地认识单词中的每个字母并正确输出它们。 String prompt Take the letters in lollipop \n and reverse them;String message this.getCompletion(prompt);//The reversed letters of lollipop are pillipol.//实际上 lollipop 的 翻转是 popillollog.info(test2:\n{}, message);String prompt1 Take the letters in\n l-o-l-l-i-p-o-p and reverse them;String message1 this.getCompletion(prompt1);//p-o-p-i-l-l-o-l//这次正确了log.info(test2:\n{}, message1);
对于英文输入一个 token 一般对应 4 个字符或者四分之三个单词对于中文输入一个 token 一般对应一个或半个词。 不同模型有不同的 token 限制需要注意的是这里的 token 限制是输入的 Prompt 和输出的 completion 的 token 数之和因此输入的 Prompt 越长能输出的 completion 的上限就越低。 ChatGPT3.5-turbo 的 token 上限是 4096。
四Helper function 辅助函数 (提问范式)
下图是 OpenAI 提供的一种提问范式接下来吴恩达老师就是在演示如何利用这种范式进行更好的提问 System 信息用于指定模型的规则例如设定、回答准则等而 assistant 信息就是让模型完成的具体指令
ChatCompletionRequest chatCompletionRequest new ChatCompletionRequest();//调用的模型默认为 gpt-3.5-turbo(ChatGPT)有内测资格的用户可以选择 gpt-4\chatCompletionRequest.setModel(gpt-3.5-turbo);//决定模型输出的随机程度默认为0表示输出将非常确定。增加温度会使输出更随机。chatCompletionRequest.setTemperature(temperature);//这决定模型输出的最大的 token 数。chatCompletionRequest.setMaxTokens(500);//是一个消息列表每个消息都是一个字典包含 role(角色和 content(内容)。角色可以是system、user 或 assistant’内容是角色的消息。chatCompletionRequest.setMessages(chatMessages);ChatCompletionResult result openAiService.createChatCompletion(chatCompletionRequest);ChatMessage chatMessage1 result.getChoices().get(0).getMessage();return chatMessage1.getContent();
ListChatMessage chatMessages new ArrayList();ChatMessage chatMessage new ChatMessage();chatMessage.setRole(system);chatMessage.setContent(你是一个助理 并以 Seuss 苏斯博士的风格作出回答。);chatMessages.add(chatMessage);ChatMessage chatMessage2 new ChatMessage();chatMessage2.setRole(user);chatMessage2.setContent(就快乐的小鲸鱼为主题给我写一首短诗);chatMessages.add(chatMessage2);String message1 this.getCompletionFromMessage(chatMessages, 1);log.info(test3:\n{}, message1);
test3:
在大海深处有一只小鲸鱼
游来游去像个顽皮的小露珠。
它喜欢跳跃在波浪中
展现出它的自由和活力。它的背上有绚丽的颜色
像艳阳般明亮充满温暖的力量。
在阳光下闪烁的小鱼鳍
给人们带来无尽的欢乐和惊喜。它和鱼群一起游弋在大海里
快乐洋溢在每一刻
它们跳跃、转圈、翻滚
把欢乐传递给每个人。小鲸鱼是快乐的使者
散发着温暖和爱的气息。
让我们跟随它的脚步
一起享受快乐的时光的魔力。快乐的小鲸鱼如此独特
带给我们世界的色彩和美丽。
让我们永远怀抱快乐和希望
像小鲸鱼一样自由地飞扬起舞。ListChatMessage chatMessages new ArrayList();ChatMessage chatMessage new ChatMessage();chatMessage.setRole(system);//长度控制chatMessage.setContent(你的所有答复只能是一句话);chatMessages.add(chatMessage);ChatMessage chatMessage2 new ChatMessage();chatMessage2.setRole(user);chatMessage2.setContent(写一个关于快乐的小鲸鱼的故事);chatMessages.add(chatMessage2);String message1 this.getCompletionFromMessage(chatMessages, 1);log.info(test4:\n{}, message1);小鲸鱼在海洋里游来游去快乐地和海洋里的朋友们玩耍感受着无尽的快乐和自由。把以上的要求用一句话结合起来 ListChatMessage chatMessages new ArrayList();ChatMessage chatMessage new ChatMessage();chatMessage.setRole(system);//结合chatMessage.setContent(你是一个助理 并以 Seuss 苏斯博士的风格作出回答只回答一句话);chatMessages.add(chatMessage);ChatMessage chatMessage2 new ChatMessage();chatMessage2.setRole(user);chatMessage2.setContent(写一个关于快乐的小鲸鱼的故事);chatMessages.add(chatMessage2);String message1 this.getCompletionFromMessage(chatMessages, 1);log.info(test5:\n{}, message1);在蓝色的海洋里快乐的小鲸鱼欢快地跳跃它的笑声如波浪般荡漾带来了幸福的感觉。最后我们认为 Prompt 对 AI 应用开发的革命性影响仍未得到充分重视低。在传统的监督机器学习工作流中如果想要构建一个可以将餐厅评论分类为正面或负面的分类器首先需要获取一大批带有标签的数据可能需要几百个这个过程可能需要几周甚至一个月的时间。接着您需要在这些数据上训练一个模型找到一个合适的开源模型并进行模型的调整和评估这个阶段可能需要几天、几周甚至几个月的时间。最后您可能需要使用云服务来部署模型将模型上传到云端并让它运行起来才能最终调用您的模型。整个过程通常需要一个团队数月时间才能完成。 相比之下使用基于 Prompt 的机器学习方法当您有一个文本应用时只需提供一个简单的 Prompt 就可以了。这个过程可能只需要几分钟如果需要多次迭代来得到有效的 Prompt 的话最多几个小时即可完成。在几天内尽管实际情况通常是几个小时您就可以通过 API 调用来运行模型并开始使用。一旦您达到了这个步骤只需几分钟或几个小时就可以开始调用模型进行推理。 因此以前可能需要花费六个月甚至一年时间才能构建的应用现在只需要几分钟或几个小时最多是几天的时间就可以使用 Prompt 构建起来。这种方法正在极大地改变 AI 应用的快速构建方式。
需要注意的是这种方法适用于许多非结构化数据应用特别是文本应用以及越来越多的视觉应用尽管目前的视觉技术仍在发展中。但它并不适用于结构化数据应用也就是那些处理 Excel 电子表格中大量数值的机器学习应用。然而对于适用于这种方法的应用AI 组件可以被快速构建并且正在改变整个系统的构建工作流。构建整个系统可能仍然需要几天、几周或更长时间但至少这部分可以更快地完成。 Java快速转换到大模型开发 配套课程的所有代码已经发布在https://github.com/Starcloud-Cloud/java-langchain 课程合作请留言