查看原文
其他

大模型时代程序员应有的正确姿势

CSDN 2024-03-08

过去的一年中,最炙手可热的是以扩散模型和大语言模型为代表的 AIGC 技术的普及,在可预见的未来,这种热度仍将持续下去。无论主观上是否愿意,AIGC已经在重构我们的工作流程,重构人与人、人与机器、机器与机器的关系,上一次类似的技术变革还是上个世纪 90 年代末,互联网走向普通大众的时代。那也是一个软件英雄辈出的时代,求伯君、丁磊、王江民、梁肇新、洪以容、张小龙皆以一己之力做出了风靡全国的产品。后面由于软件架构的日益复杂,特别是 B/S 以及移动端开发的日益复杂,2010年后小团队创业成功的案例已经很少了。

正如互联网时代,网络增进了人与人之间的联系,"网聚人的力量"释放出了巨大的生产力。在 AIGC 的时代,计算机的能力得到了极大的增强,人与机器、机器与机器之间的协作构成了新的工具杠杆,加之开源软件的广泛应用使得个体、小团队重新获得了竞争优势,在 AIGC 的时代又出现了小团队拥有巨量用户的示例。

如果说二十五年前的互联网革命个体进入门槛是编程的能力,AIGC时代则在编程能力之外还增加了对熟练开发或应用 AI 的能力。

提起程序员转型到 AI ,很多人的直觉是:搞AI啊,那数学得好吧,从高等数学、集合论、概率论、测度论、线性代数、泛函分析、凸优化整起。对于非数学专业和多数工科背景的人这个要求足以劝退。

但是在实践中,除了做 AI 编译器、优化器搞模型训练,绝大多数工作并不需要这些数学知识,以 Resnet 为例,设计这一网络架构只需要信息论的相关的知识就足够了,正如我们开汽车并不需要了解如何最优化发动机、电动机的工况。

我在二十年前开始学习统计自然语言处理时,也面临今天想转型到 AI 的同学一样的情况。当时全文检索系统风头正劲,准确的中文切分器能够让检索系统在构建索引的速度、索引大小与检索质量上获得一个较好的平衡。当时的主流是隐式马尔科夫的切分方案,基于 CRF 的字标注方法刚刚提出,CRF 方法的优化器采用拟牛顿法需要计算 Hessian 矩阵的近似,这个近似会占用大量内存我从工程上优化了其物理内存占用,但是完成这个工作并不需要了解拟牛顿法的数学细节,而提升 CRF 方法分词器的效果需要引入更多、更全面的特征,这一工作也不需要特别高深的数学知识。需要额外补充,由于 CRF 方法需要序列标注(预测)点之后的数据,因此不适用于文本生成的用途,在当时文本生成仍然需要 n-gram LM。

定量的理性认知固然很好,但是很多场景下,宏观的感性认知已经足以指导我们日常的决策。


从分词算法的研究我们可以发现,引入当前数据集无关的外部领域知识可以提升系统的综合性能(f-score) ,但是如何更好的构造关联到字的特征向量成为新的问题。基于神经网络的语言模型可以将稀疏高维的特性向量压缩到稠密低维的特征向量(A Neural Probabilistic Language Model,Yoshua Bengio 2003),并进而 Word2vec (Efficient Estimation of Word Representations in Vector Space, Tomas Mikolov, 2013)发现可以对计算出的词向量执行语义计算,而 GPT、BERT 等预训练大语言模型更是把英文单词都切分成了多个 token,交由神经网络本身在前8层 Transformer Block 进行还原。要完成这些工作,仍然不需要特别高深的数学知识,依赖的是巧妙的任务设计和对概率论的初步了解。



顺便提一句,在 BERT 时代,基于知识库的问答,BERT 已经显著优于 关键词和向量召回。

由于预训练语言模型非常消耗算力,以微软 UniLM 为例,24 层的模型在2019年已经需要 8卡 V100 并行计算 近一个月。因此,在 2019年 Google 提出了 T5 模型(Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer,Colin Raffel, 2019), 虽然较现在的 LLM 能力稍弱,但是提出了可以基于前缀文本区分任务,进而在统一的框架内对语言模型进行预训练,例如当进行翻译任务时在需要处理的文本前面附加 translate English to German: ,当需要进行文本情感分析时附加sentiment: 。类似的思路表现为现在的大语言模型普遍都有 SFT 或 指令对齐阶段。OpenAI 发现可以借助 Prefix 或者这里我们称它为 Prompt , 可以激发模型未被设计、训练的新的能力。

到 ChatGPT 为代表的大语言模型出现,传统意义上 NLP 的所有问题都得到解决,日常大量的文本处理类的工作可以无脑的使用大语言模型。但是,拥有了堪称强大的自然语言处理工具的现下,我们要解决的现实问题远没有得到解决,这甚至不是结束的开始,充其量只是开始的结束。

以最新的论文 《Top in Chinese Data Processing: English Code Models(arxiv_2401.10286)》为例,其提出对于特定的中文应用(eg. RAG,检索增强生成)语言模型中受限的中文知识反而有助于降低幻觉。这种现象的真实原因仍有待进一步研究,但是现有的部分中文大语言模型其 Tokenizer 部分是存在缺陷的,简单讲,中文历史上存在单字成词的传统,理论上在 Tokenizer 中除了单字和成语,不应该出现常见字的两字组合(鸳鸯、麒麟、凤凰等是特例),更进一步的,如果字出现的频率不高,单字也可以不出现(回退到 OpenAI 的方案)。

考虑到现实的算力限制,并不是每个程序员都有机会从头训练大语言模型,但是我们仍然需要对大语言模型的工作原理以及其工作方式的可能解释进行研究,因为 创新往往需要通过观察事物并深入了解其原理后才能产生。

例如,在过去的一年多,多方Prompt 进行了广泛的研究,提出了 CoT, ToT 等一系列 Prompt 方法,从大语言模型的原理出发,应该怎样科学的研究 Prompt 的制作才不至于沦为“玄学"、“咒语”?

又如,大语言模型内置了大量的知识,这使得用户经常混淆其能力的来源,是来自预置知识、类比还是真实推理,以及更一般的这些知识如何增删改(CRUD)。

再如,大语言模型能够借助其参数量模拟多种不同的人格,并预测对应人格在不同环境下可能的反馈,这有助于我们在不违反医学伦理的情况进一步的探索人类的认知。

在程序员的视角看,大语言模型的出现给程序开发带来了下面若干新问题。

  • 应用是否应该引入大语言模型,是采用 API 接入还是本地推理?

  • 大语言模型的局限在哪里?

  • 某类任务是否适用于大语言模型?有哪些设计模式?

  • 如何筛选当前任务合适的大语言模型?

  • 如何设计合适的测试、验证任务?特别在大语言模型可能已经"偷看"过公开测试集的情况

  • 如何设计对大语言模型有效的验证方法?

  • 如何设计、优化指示大语言模型工作的 Prompt ?

  • 实际部署、运维大语言模型,有哪些额外的注意事项?

大语言模型的出现,固然带来了前所未有的挑战,但也为我们提供了一个深入了解我们自己、了解认知过程的机会。正如很多恐惧的根源是来自人类面对未知事物的本能,通过对大模型的探索,有助于我们发现并克服其局限,进而设计出更加智能、高效的应用。

如果你对大语言模型感兴趣,但还不知道如上手,不妨看看 Boolan 首席咨询师李沫南推出的《基于大语言模型应用开发的高级培训课程》,从入门到逐步深入了解大语言模型原理和应用,理论与实践相结合,让你一步一步成为大语言模型领域的专家。

课程简介

本课程深入浅出讲解GPT大语言模型核心原理,以及其在软件开发全生命周期(包括在软件需求分析、领域建模、架构与设计、数据库设计、程序开发、代码重构、开发者测试、缺陷修复等方面)的实践方法,同时深入讲解GPT在开发过程中的各种最佳实践,包括:提示工程 Prompt Engineer-ing、精调Fine Tuning以及安全方面的最佳实践等,帮助软件开发团队全方位提升在GPT大模型时代的开发效能。
  • 总课时 20 课时(每课时 50 分钟)
  • 周末班:3月2日开课,共10天,每天2课时,每周六、日晚20:00-21:40

培训讲师


李沫南,资深软件专家,对自然语言处理、全文检索系统、数据库引擎、编程语言理论 和 Rust 编程语言有深入研究,Coreseek 和 LogInsight 的创始人 / 联合创始人,曾任 PingCap 技术顾问。CoreSeek 检索系统曾广泛用于中文互联网BBS社区。

课程大纲

大语言模型对软件开发的影响

  • 大语言预训练模型简介

  • 常见的GPT族的大语言预训练模型

  • 大语言预训练不同训练阶段的能力表现大语言模型与现有代码工具的集成大语言模型与传统编程语言的交互

  • 大语言模型与多模态

大语言模型的工作原理

  • 从 Word2Vec 到 Bert,介绍何为统计语言模型

  • 神经网络的训练原理,反向传播、损失函数与正规化项

  • 从特征工程到嵌入向量(Embedding),介绍为什么会存在预训练大语言模型

  • 从 Seq2Seg 到图灵机,介绍大语言模型工作原理的理论解释与猜想

  • 大语言模型训练阶段的超参数(n_vocab,n_ctx,n_embd,n head,n layer 等)

使用大语言模型,通过可编程的方式

  • 事实标准OpenAI API

  • 调用不同模型需要的指令差异

  • 构造 Embedding 进行向量检索

  • 大语言模型的本地推理

  • 大语言模型推理阶段的超参数(temperature,top_p 等)

  • 常用的推理加速工具包

使用大语言模型,借助提示词(Prompt)

  • 从一词多意,词嵌入向量到提示词,介绍提示词工程存在的原理

  • 提示词常见设计模式(take a deep breath,scratchpad,flattering 等)

  • 大语言模型的上下文内学习(In context learming)现象,包括 Zero-Shot, One-Shot, Few-Shot 等

  • 大语言模型的任务分解与工具集成,如何利用 Chain-of-Thought(CoT) 分析问题,如何调用外部工具提升模型输出的准确率

  • 案例解析:借助 文学化编程(Literate programming)进行问题分析的 Prompt示例

大语言模型的检索增强

  • 借助上下文内学习(ICL)的能力引入新事实

  • 召回事实的并排序以匹配检索意图

  • BM25

  • 向量检索

  • 多路混合召回

  • 常见的开源向量表示

  • 向量检索算法初步

  • 文本(事实)的预处理

Prompt Engineering 提示词工程

  • Transformer 架构(LLM)的能力限制与缓解手段

  • Prompt 模板的使用

  • 不建议使用的 Prompt 模式及跟因分析

  • 多次调用LLM的框架,LangChain,Semantic Kernel 等

  • Prompt 效果的评价标准与评估方法

  • 常用的 Prompt 开发工具介绍 PromptSource & PromptlDE 等

  • 大语言模型的人格化:世界模型与Agents

大语言模型开发框架 LangChain

  • LangChain 的基本概念,组件和链

  • Prompt 的构造,借助 PromptTemplate

  • LangChain 预置的链

  • LangChain Expression Language/ICEL

  • 带回环的 Chain, LangGraph

  • 文档的解析与知识抽取

  • 使用 LangServe 部署

大语言模型开发框架 Semantic Kernel

  • SK 的构成与基本概念

  • Prompt 的构造

  • 制作语义函数

  • 构造 Al Agent

  • 基于 SK 构造客服机器人

大语言模型辅助软件工程

  • 结合深度学习中的正规化项,分析软件开发过程中的正规化方法,包

  • 从需求到 OPM,Object-Process language (OPL) is a subset of English

  • 综述大语言模型与测试驱动开发的关系

  • Behavior-driven development (行为驱动开发),使用 Gherkin 描述软件规格

案例研究 GPT-Pilot

  • GPT-Pilot 的代码框架与工作原理

  • 分析拆解 GPT-Pilot 涉及的主要 Prompts

大语言模型的 Finetune

  • 训练数据的格式与准备

  • 训练数据的生成

  • 训练过程中常见的显存优化方法

大语言模型的监控与运维

  • 多 API 推理后端整合

  • QLora 模型的推理部署

  • 推理状态感知与风险控制

课程收获

  • 大语言模型工作原理

  • 大语言模型辅助开发

  • 掌握如何编写代码

  • 理解大语言模型的局限

↓↓ 点击「阅读原文」了解课程更多信息!

继续滑动看下一个

大模型时代程序员应有的正确姿势

向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存