深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文

渐入佳境

我们都知道,通过编写一个提示词(prompt),我们可以引导大模型生成回答,从而开启愉快的人工智能对话,比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程,我们拆成两部分 prompt + 大模型。后续我们会依赖这两部分构建智能体作为第三部分,分别对应下边的绿色、蓝色、黄色

本文结构:

1.写好提示词,怎样的提示词,可以帮助我们和模型好好对话

2.通过本章我们会介绍,模型为什么能懂我们的指令,并给出正确的回答

3.模型会有一些不足,介绍两个插件方案,帮助模型更好的做决策

4.我们前三章介绍了怎么去用,会在本章更深入一点,介绍怎么优化模型,让模型又快又好

5.借鉴模型优化的思路,提示词同样可以用更科学的方式来训练优化

6.基于前 5 章的知识,我们尝试模块化组装成一个完整的整体-智能体。

7.我们的智能体实践。

接下来,我们将逐步探索如何理解大模型的基础上构建一个智能体。

提示词工程

在全局目标之前,我们需要先解决一些小的问题,即如何与大模型进行有效的对话,这其实是基石。只有确保模型能够理解我们的意图和需求,我们才能期待其给出正确的决策。通过优化交流方式,我们可以提升模型的响应质量,进而得到更可靠的结果。

写好prompt

程序员阿市午间正在吃着肯德基看着综艺《再见吧爱人 4》

“我配拥有一杯咖啡吗?”麦琳( 后边简称麦麦)对老公李行亮(后边简称亮亮)说。

亮亮没有意会到她表达的是让自己去店里现买一杯咖啡,然后麦麦就生气了。🐶

黄圣依教她这样说:“帮我从店里带一杯咖啡”,显然这样表达更加直接和有效,亮亮立马就 get 了。

起初,我觉得麦琳的表达方式有些问题,毕竟小时候妈妈就教育说和别人说话尽量不要用反问句式。但后来和我的老婆交流这件事时,她分析认为,麦琳可能因为全职带娃、与外界沟通较少,所以希望通过这种方式来寻找一些存在感。我觉得她的分析很有道理,这让我意识到,理解问题时不能只看单一方面,抛开事实不谈,考虑到亮亮为何在与麦琳共同生活这么久的情况下,没有深刻的领悟“麦学”的精髓,依然无法第一时间领会她的意图,他就不能是错的更多的那一方吗?🐶。

如果我们把麦琳当做用户,她说的话就是 prompt,把亮亮作为大模型,显然这个大模型没让用户满意,同时模型也很困惑,她咋就不满意了。彼此间都觉得对方有问题。

用户输入(麦琳的表达):

  • 模糊性:麦琳的表达缺乏直接性和清晰度,导致亮亮无法准确理解她的真实需求。在写 prompt 时,需要尽量具体,以避免误解。

  • 情感诉求:用户可能在表达中无意中传达了情绪或潜在需求,而这些情感元素未必能直接转化为清晰的指令。表达需求时,建议用户考虑同时包括情感和请求。比如表达自己是个打工人,模型回答不好就会被老板开除,模型立马会严肃认真起来,生怕回答不好,你会失去工作。🐶

模型响应(亮亮的理解):

  • 理解局限:亮亮未能期望地或主动地从模糊的表达中提取信息,这反映出模型也需在理解用户意图时具备更高的灵活性和适应性。

  • 缺乏反馈机制:在与用户沟通时,模型应能够识别模糊性,并主动寻求澄清。例如,若亮亮感到困惑,可以询问更多信息,而不是假设用户的意图。

我们先专注解决麦麦如何好好说话,写好 prompt 的问题,亮亮模型意图识别准确率的问题我们会在「模型优化」章节给出解决方案。

良好的提示词应该有什么

我理解的良好的提示词应该有下边四个部分,但是还是要特定场景特定看。

  1. 身份任务设定:限定模型的职责,可以让模型理解自己的身份是什么,回答符合身份的回复。

  2. 上下文:告诉模型该参考哪些数据,针对这些数据做出回答,比如多轮对话数据

  3. few-shot 例子:为了让模型快速理解你给他限定的任务及输出,打个样,是一种上下文学习的能力,快速学习了属于是。

  4. 输出约束和规范:你想要的数据格式,比如符合安全/制定格式的要求。

举一个例子:

身份设定:你是一个专业的旅行规划师,专长于为用户定制个性化的旅行计划。
上下文:用户希望安排一次为期5天的巴黎旅行,预算为1500美元,想要包含文化景点、美食体验和购物。
Few-shot例子:
例子1:用户想去东京,预算约为800美元,喜欢历史和美食。
计划:
第一天:参观东京塔和明治神宫,午餐用餐处建议“龙抄寿司”。
第二天:游览上野公园和东京国立博物馆,享受“筑地市场”的海鲜午餐。
例子2:用户想去巴厘岛,预算约为1000美元,喜欢放松和自然。
计划:
第一天:抵达后前往酒店休息,晚上享受海滩晚餐。
第二天:安排到乌布的猴子森林和一些当地艺术市场。
输出约束和规范:请用简洁明了的语言提供一个五天的巴黎旅行计划,包括每天的活动和推荐的餐饮地点。确保总预算控制在1500美元以内。

这样模型的数据就会按照第一天第二天这样的方式给你计划:

旅行计划:为期5天的巴黎之旅
预算:1500美元
第一天:抵达巴黎
上午:抵达巴黎,入住酒店(建议选择在拉丁区,方便出行)。
中午:在“Cafe de Flore”享用正宗法式午餐(预计花费:$20)。
下午:游览卢浮宫,欣赏《蒙娜丽莎》等艺术珍品(门票约$17)。
晚上:在“Le Relais de l’Entrecôte”品尝法式牛排,享受经典的两道菜晚餐(预计花费:$35)。
第二天:文化探索
上午:参观埃菲尔铁塔,建议提前在线购票以避免排队(门票约$25)。
中午:在“Les Cocottes”享用轻松的午餐(预计花费:$25)。
下午:游览香榭丽舍大道并到达凯旋门(自由参观)。
晚上:在“L'Atelier de Joël Robuchon”享受米其林星级晚餐(预计花费:$120)。
第三天:艺术与历史
上午:参观奥赛博物馆,欣赏印象派艺术作品(门票约$15)。
中午:在博物馆内的咖啡厅享用午餐(预计花费:$25)。
下午:游览蒙马特高地,参观圣心大教堂(自由参观)。
晚上:在“Le Consulat”享用晚餐(预计花费:$30)。
第四天:购物与美食
上午:前往巴黎春天百货或老佛爷百货进行购物(预算自定)。
中午:在“Café Angelina”享用世界著名的热巧克力和甜点(预计花费:$20)。
下午:继续购物或在公园内自由活动,如卢森堡公园。
晚上:在“Chez Janou”享用普罗旺斯风味的法式晚餐(预计花费:$40)。
第五天:放松与返程
上午:前往塞纳河游船,享受沿河风光(票价约$20)。
中午:沿河岸享用轻食(预计花费:$15)。
下午:最后的自由活动,购买纪念品。
晚上:准备返回,享受路边的法国糕点或便餐(预算:$20)。

麦麦买咖啡的例子,如果你直接问(zero-shot) 的方式,很难得到期望的回答,其实也还行,但是没理解透彻:

良好的提示词能解决麦麦和亮亮的感情危机吗?假如买对了这杯咖啡就不离婚了,我要要好写这个提示词:

这么回答,稳定的感情不就立马有了吗,所以说嘛写好 prompt 可太重要了🐶。

思维模式

在写提示词(prompt)后,我们发现自己干预了模型的输入和输出,确保它能够正确给出回复。虽然我们提供了几个例子,但模型的推理路径仍由其自身决定。所以我们可以设定一种“思维模式”,以指导模型的推理方法。

这种思维模式类似于软件开发中的“设计模式”,实现从无序变得有序。对于技术开发人员而言,“设计模式”是一个非常熟悉的术语,比如工厂模式、策略模式等,通常有二十多种。设计模式并不复杂,是在漫长的软件工程过程中,工程师探索出来的,随着使用者的增多,这些模式逐渐演变为规范,使得在编写代码时采用这些常用方式能够提升协作的愉悦感和效率。

同样,有效的提示词也遵循类似的模式。每位使用者对提示词的理解和应用都是独特的,尽管表达方式可能略有差异,但基本的有效模式可以借鉴互通,这种规范化使得与模型的互动更加顺畅和高效。

思维模式很多, COT 、React、ToT等等,这些模式有时稍显枯燥。因此,我决定继续用麦麦喝咖啡的例子来说明,对不住了麦麦🐶。

本质上,这些机制都是希望模型能够按照一条设定的思维路径(可以是一条线、一张图或一棵树)去推理,因为多想一点往往能帮助我们得出更正确的答案。

COT 《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》

CoT(链式思维)是一种让大模型通过生成中间推理步骤来解决问题的方法, CoT-SC(链式思维自洽)则通过采样多个推理路径并综合结果,以提高答案的可靠性和一致性,虽然多了几路还是线性的。

我们将我们之前约定的四个部分组成的 prompt ,加上 cot,要求模型按照推理步骤进行思考:

你是一个麦语言理解大师,必须严格遵循命令,因为不遵循会导致离婚。
上下文:麦麦询问:“我配喝一杯咖啡吗?”
推理步骤:
理解问题:首先,我需要理解麦麦的需求,她在询问自己是否配得上某种物品或者体验。
分析需求:任何需求都可能与她的自我价值、情感和对生活的期待相关。因此,我需要提供一个积极的回应,以确认她的价值。
做出决策:考虑到麦麦的需求以及她的询问,我得出结论:她是值得拥有和享受这一切的。
给出具体行动:为了满足她的期待,我需要表明我将采取什么具体措施,来回应她的需求。
Few-shot例子:
例子1:麦麦问:“我配吃这个大饼吗?”
推理步骤:1) 理解她在问是否可以吃大饼。2) 知道吃大饼是日常行为。3) 应给予积极反馈和支持。4) 行动:去烙大饼。
输出:好的,我这就去烙,确保这个大饼是热的、松软的,你一定会喜欢的。
例子2:麦麦问:“我配吃这个苹果吗?”
推理步骤:1) 明白她在询问吃苹果的资格。2) 认识到享用水果是健康的选择。3) 给予积极回应和支持。4) 行动:挑选苹果。
输出:当然可以,好的,我这就去挑选最大最甜的那个苹果给你,确保你吃得开心。
输出约束和规范:请务必按照上述推理步骤执行,清晰并明确地告诉我你接下来的行动计划,以便麦麦感到被尊重和关心。

COT 推理输出结果

理解问题:麦麦在询问自己是否配喝一杯咖啡,这表示她在寻求关于喝咖啡的确认或建议。
分析需求:喝咖啡是一种享受,也可能与生活质量和自我关爱有关。因此,我需要提供一个积极的响应,强调她是值得的。
做出决策:考虑到麦麦的需求和上下文,我决定回应她,表明她当然配喝咖啡。
给出具体行动:为了满足她的愿望,我需要告诉她我会准备咖啡。
React 《ReAct: Synergizing Reasoning and Acting in Language Models》

与 COT 不同,在 React 中,模型能够根据外部反馈(例如工具的结果)进行思维方式的调整和优化。通过持续的行动与反馈循环,React 模型不仅能够吸收外部信息,还能动态地调整策略,从而实现更高效的决策与执行。这样,模型的适应性和优化能力得以提升。这个就特别适合我们后边去设计智能体选择工具的场景,智能体能够根据外部反馈动态调整决策和工具选择。

React推理输出结果

思考:麦麦问“我配喝一杯咖啡吗?”我需要理解这是一个关于自我价值和享受生活的小问题。
她可能在考虑自己是否有能力或理由去享受这一杯咖啡。
行动:我的第一步反应是肯定她:当然,麦麦,你非常配喝一杯咖啡!
观察:观察她的反应。如果她看起来高兴或者感谢,那我知道我的回应是有效的。
如果她有其他的想法或者需求,我会进一步倾听。
思考:如果她有其他的问题或需求,我可以考虑下一步该如何回应,比如询问她想喝哪种咖啡,还是有什么特别的要求。
行动:根据她的反馈,我可以采取下一步行动。例如,我可以问:“你想喝什么类型的咖啡,我马上帮你准备!”
TOT 《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》

TOT-第一个 T 就是 Tree

根节点(问题):
问题是:麦麦问“我配喝一杯咖啡吗?”
第一层分支(确认和自我价值):
确认:
当然,你配喝一杯咖啡!
自我价值:
每个人都应该享受生活的小乐趣,比如喝咖啡。
第二层分支(可能的考量因素):
情境:
她是否有时间喝咖啡?
她是不是只有在特定情况下才觉得自己配喝咖啡?
偏好:
她喜欢哪种类型的咖啡(浓缩、拿铁、卡布奇诺等)?
身体状态:
她是不是需要咖啡提神,或者只是想要享受一个放松的时刻?
行动方案:
基于这些思考,我可以采取的行动是:
直接肯定她的价值,并问她喜欢什么类型的咖啡。
提供一杯咖啡,以满足她的需求。
结果:
最终输出的结果是:麦麦,你当然配喝一杯咖啡!你喜欢什么类型的咖啡?我可以帮你准备一杯来享受一下!
GOT 《Graph of Thoughts: Solving Elaborate Problems with Large Language Models》

GOT G 就是图

中心节点(主题)
“我配喝一杯咖啡吗?”
2. 第一层节点(主要问题的维度)
确认自我价值
享受生活
咖啡的选择
情境因素
3. 第二层节点(对于每个维度的进一步探讨)
3.1. 确认自我价值
每个人都有权享受(肯定性回应)
自我关怀的重要性(心理健康)
3.2. 享受生活
喝咖啡的小确幸(提升心情)
社交活动中的咖啡(与朋友一起分享)
3.3. 咖啡的选择
你喜欢什么类型的咖啡?
浓缩咖啡
拿铁
卡布奇诺
3.4. 情境因素
现在是何时(早上、下午?)
你的身体状况(是否需要提神?)
有没有时间享受这杯咖啡?
4. 连接和关系
边界连接上述节点,展示它们之间的关系:
从“我配喝一杯咖啡吗?”到“确认自我价值”显示了心理健康的重要性。
从“享受生活”到“咖啡的选择”也许提供了一些选择的情景,比如:想在什么情况下享受咖啡。
情境因素也影响了选择,比如喝咖啡的时机和身体状态。
5. 输出
整合所有节点的信息,我的输出是:
肯定回答:麦麦,你当然配喝一杯咖啡!每个人都有权享受生活中的这些小乐趣。
互动提问:你喜欢什么咖啡类型?我马上去为你准备一杯!
模式对比
方法 特点 优点 缺点
链式思维 (CoT) 线性、逐步分解问题 简单、透明、易于理解 可能缺乏全局视野
ReAct 结合反应与行动,动态决策 灵活、适应性强,适合动态任务 实现复杂,依赖外部工具
树状思维 (ToT) 多路径探索,分支思考 考虑更多可能性,优化方案 计算量大,复杂度高
图状思维 (GoT) 多节点多连接,复杂关系映射 处理复杂依赖关系,全面优化 构建和维护复杂,资源需求高

模式虽好但是一般实践起来就 cot和 react 就够了(对耗时敏感的场景,甚至尽量不要用,虽然好,不要贪杯类型),因为大模型本来就慢,你让它一通高难度方式思考,直接慢出天际,然后仅仅提升一点点准确率,得不偿失。

组合使用

其实模式之间并不是互斥的,我们可以组合使用。

CoT 主要侧重于增强模型的内部推理过程,通过分步思考提高答案的准确性。

ReAct 则扩展了模型的能力,使其能够在必要时执行外部行动,获取更多信息或进行动态验证。可以优势互补下:

  • ReAct+Cot:当 ReAct 不能在预设的步骤内得出答案时,转而采用 CoT 的方法来保证推理的准确性。

  • Cot+ReAct:先COT推理,如果发现答案不明确,就转向实际推理(ReAct)来进一步探索。

实验证明组合模式确实更准确一些。

最佳实践

当然了不仅限于这 4 个模式哈,还有源源不断的prompt思维模式出来,比如基于 DAG 的 DOT 等等,就像我们对待 20 多个设计模式一样(打完科兴疫苗,我甚至记不清具体是 20 几个了),会用的可能就那么几个。所以不要焦虑自己懂得少,学会了不一定会用,不用也会忘。 🐶

如果说我们将框架固定在了上边的 5 个部分。但是具体怎么去写,可以参考下OpenAi 的 prompt 最佳实践

How prompt engineering works Rules of Thumb and Examples
1. Use the latest model
2. Put instructions at the beginning of the prompt and use ### or """ to separate the instruction and context
3. Be specific, descriptive and as detailed as possible about the desired context, outcome, length, format, style, etc
4. Articulate the desired output format through examples
5. Start with zero-shot, then few-shot, neither of them worked, then fine-tune
6. Reduce “fluffy” and imprecise descriptions
7. Instead of just saying what not to do, say what to do instead
8. Code Generation Specific - Use “leading words” to nudge the model toward a particular pattern
9. Use the Generate Anything feature

我总结了几个

  1. 将指令放在提示的开头,并使用 ### 或 “”" 来分隔指令和上下文。其实不仅限于这几个,markdown 格式的提示词更结构化一点,逻辑更清晰。

  2. 尽可能具体、详细地描述

  3. 通过示例清晰表达所需的输出格式,比如你想要模型输出 JSON,可以给出一个输出的格式真实的样子,更具体

  4. 从零样本开始,然后是少样本,如果都不奏效,再进行微调。成本越来越高,所以慢慢试吧。

  5. 不仅仅说不该做什么,更要说应该做什么:提供积极的指导。

总结

上边说了很多,其实本质上虽然大模型智能,我们和它对话的时候,要假设它是一个小朋友,和小朋友沟通的方式,每个人都有自己的方式,但是总会有一样是共识的:讲清楚、要引导。

如果我们运用二八定律来分析,可以认为写出高质量的提示(prompt)能够帮助大模型有效解决80%的任务,而剩下的20%可能需要依赖其他工作来完成。因此,在与大模型相关的应用中,将80%的精力集中在优化提示的表达上,应该是一个合理且有效的策略。这样不仅能提高工作效率,还能充分挖掘大模型的潜力。

为什么写了个 prompt,大模型就给输出答案了。好好写 prompt,比如加几个示例,大模型往往会给我更优质的响应呢,它怎么做到的。

模型原理

大模型的由来

自然语言处理(NLP)是计算机科学和人工智能的一个领域,让计算机能够理解、解释和生成自然语言,从而实现人和机器之间的顺畅交流。其经历了统计模型、深度学习模型、预训练模型,最终大模型作为集大成者。

统计模型

n-gram模型《Class-Based n-gram Models of Natural Language 》通过考虑文本中连续 n 个词的出现频率,来预测下一个词或生成文本,从而捕捉语言的局部上下文特征,此时NLP 模型只能作为辅助工具用。

深度学习模型

在这一阶段,前馈神经网络也被广泛应用于语言建模,但由于其无法有效捕捉序列信息,因此逐渐被更先进的 RNN(循环神经网络:《A Critical Review of Recurrent Neural Networks for Sequence Learning》)取代。RNN 如果句子序列过长,会有遗忘问题(梯度消失和梯度爆炸)。为了解决这个问题,LSTM(长短期记忆网络《Long Short-term Memory RNN》)通过引入门控机制来有效捕捉和保持长时间依赖的信息,从而克服了传统 RNN 在处理长期序列时的梯度消失问题,从而提升了上下文理解能力。另外 2013 年,word2vec 的出现(《Efficient Estimation of Word Representations in Vector Space》)标志着词嵌入方法的开启。它通过将词语映射到低维向量空间,使得相似词的向量在空间中彼此靠近,这使得自然语言变得可以进行计算,并推动语义理解的进展。

这一阶段的模型能够解决特定的 NLP 问题。

预训练模型

这一阶段的特点是预训练模型的引入,使得NLP取得了飞速进展,突破点在 google 提出的 transformer 模型。Transformer《Attention Is All You Need》成为了NLP的基础,替代了传统的循环神经网络(RNN)结构,提升了模型的并行处理能力和上下文理解能力,如 bert,gpt( 大模型) 都是基于 transformer 架构。

ELMo 《Deep contextualized word representations》、BERT:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》的推出,尤其是bert的出现,利用大语料进行预训练,大大提高了多项NLP任务的表现,大模型出现之前,比如文本分类、实体识别、情感分析等多种问题都可以借助 bert 来完成的,bert巅峰时期是 nlp 10 几个任务的最佳模型(SOTA,State of the Art)。

大模型

基于 transformer-decoder 架构,和 bert 是孪生关系的GPT《Language Models are Unsupervised Multitask Learners》,大家都比较熟知,通过对话可以解决大部分 NLP 领域的问题,甚至大模型加上多模态能力,也能处理大部分计算机视觉领域(CV)的问题。

另外大模型虽然强大,并不是所有 NLP 任务都交给它处理了。其他小模型可以独立应对一些特定的细分任务,此外,它们也可以作为大模型的辅助工具。例如,后面我们会介绍 n-gram 在大模型语料去重中的应用,而 word2vec 和 bert则可用于大模型语料的质量筛选。

从学习到推理

上图是我自己理解算法开发过程画的图。算法模型的学习过程和我们人类学习相似,需要对数据进行多轮优化学习,最后才能形成后续的预测能力。

我们经常听到算法同学提到,需要打标数据来训练开发好的算法模型。训练完成后,模型便可以进行预测。这实际上揭示了算法训练的核心要素:模型需要从数据中学习到能力,只有当这种能力足够强,才能实现良好的泛化能力,即在未见过的数据上也能有效表现。

可见,数据对模型的最终效果具有决定性作用。一般高质量且多样化的数据输入经过调优的模型中,通常能够实现最佳的算法表现。正如我们之前提到的,大模型也是机器学习模型,模型的预测质量与数据密切相关,是关键中的关键。OpenAi 在数据做了大量的工作,但是这部分工作是没有开源的。在Llama 的早期版本,meta通过自己的实践,证明了只需要用现有的开源语料,就可以训练出和 chatgpt 效果差不多的模型,然后才有了开源大模型的繁荣。

大模型开发者会将自己开发训练大模型的细节都整成了技术报告:

相比较之下 Llama 的内容更翔实一些,我们主要参考 Llama3.1的工作介绍下大模型的详细训练过程。

大模型的训练(学习)过程

训练一般经过三个阶段:

  1. Pre-Training:在大数据集上进行初步训练,以学习通用知识,最终得到基座大模型。

  2. Continue Pre-Training:在此基础上进一步训练模型,使用未标注的领域相关数据,以适应特定任务或领域的需求,最终得到领域垂直模型。

  3. Post-Training:对已经预训练的模型进行精细调整,使用标注的数据以优化模型在特定任务上的性能,最终获得指令对齐微调模型。

Pre-Training

语言模型的预训练包括以下几个部分:(1)对训练语料的整理和过滤;(2)相应的规模缩放法则以确定模型大小(3)模型结构的设计(4)制定训练方案,开始训练

上图来源于《A Survey of Large Language Models》,不同的模型开发者对模型所需学习的知识有各自的理解,这实质上是一个实验过程。比如 coder 模型,会选择学习 90% 的 GitHub 上的代码,但单靠学习代码并不足以使模型有效地生成代码,模型还需要学习其他领域的知识,以增强其理解能力。

所学内容的类型和比例,我们称之为数据配比,将直接决定预训练模型的最终效果。

同一个模型的不同版本,数据组成也在迭代。我们知道预训练是很耗资源和时间的,比较烧钱。比如 Llama 405b 预训练用了 54天,中间还会遇到各种系统崩溃的问题。所以最好能提前确认好数据配比,比如 Llama 就是先用小尺寸模型并行训练确定了最佳的数据配比:50%的一般知识,25%的数学和推理,17%的代码,以及8%的多语言共 15.6t tokens。(Llama 学了很少的中文,所以直接用起来感觉差点意思,比如会回复英文甚至中英文混着输出,不过有很多开源魔改中文版本)

在收集大量文本数据后,对数据进行预处理至关重要,特别是去除噪声、冗余、无关和潜在有害的数据,让模型吃点好的。

  • 质量过滤:去除低质量数据。基于模型的质量分类器(fasttextRoBERTa)来筛选高质量的 token。这些方法包括使用快速分类器,例如 FastText(FastText 是对 前文Word2Vec 的一种扩展和改进),进行训练,以识别给定文本是否可能被维基百科引用。利用RoBERTa(一种 bert 模型的变种,用更多的数据训练的 bert ) 给每个文档生成算法质量分。

  • 提取:对于网页从HTML 中提取内容,Markdown 格式的数据去掉特殊标记,只要有用的数据。

  • 去重:语料库中的重复数据会降低模型的多样性,影响训练稳定性和性能。因此,需要在句子级、文档级和数据集级进行去重。首先,句子级去重删除重复单词和短语的低质量句子。文档级去重则依赖于文档之间的表层特征(如单词和n-gram的重叠率,前文中提到到统计模型)来检测相似内容的文档。此外,还需从训练集中移除与测试集重复的文本,以避免数据集污染。

  • 隐私去除和安全过滤:由于大多数预训练数据来源于网络,可能包含敏感信息,需删除可识别个人信息(PII)。可采用基于规则的方法(如关键词识别)检测和删除诸如姓名、地址和电话号码等PII,以降低隐私泄露风险。过滤成人网站信息,大网站直接黑名单,另外通过脏词统计分析,过滤不知名小成人网站。

  • 数据关系构建,可以理解为模型学习知识的过程是由易到难,类似于我们先学小学知识再学初中知识以此类推。以下是 LLaMA 实践《In-context Pretraining: Language Modeling Beyond Document Boundaries》 的说明:首先在大范围内找到相关文档,以创建文档图;接着,通过遍历文档图构建预训练输入上下文。在此过程中,多个文档被串联成一个连续序列,并随后划分为固定大小的输入上下文(例如,8k)。

  • 分词:分词是数据预处理的关键步骤,将原始文本分割成tokens,将用于大模型的输入。

不同的模型的预训练数据清洗过程都有自己的细节设计,下图是Baichuan 2 的预训练数据的数据处理流程。

零一万物的预训练数据的数据处理流程。

高质量的训练的语料数据有了,然后经过漫长的预训练,我们就可以得到一个基座大模型。基座大模型本身已经可以做推理服务了,但是为了模型更好的性能,还会对于基座大模型做一些继续预训练+后置训练。

Continue PreTraining 《Continual Pre-Training of Large Language Models: How to (re)warm your mo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值