在说LLM之前,我们先来了解下AI到底是什么,先从AIGC开始说起。
当AIGC这个词在国内火爆的同时,海外更流行的是另外一个词:Generative AI,即生成式AI。 从字面上来看,生成式AI和AIGC之间关系是:生成式AI所生成的内容就是AIGC。
AIGC 又称生成式 AI (Generative AI),是继专业生产内容(PGC, Professional-generated Content)、用户生产内容(UGC, User-generated Content)之后的新型内容创作方式,可以在对话、故事、图像、视频和音乐制作等方面,打造新的数字内容生成与交互形式。
ChatGPT、GitHub Copilot、Midjourney等都属于生成式AI。
并行和并发其实是不同的概念,官方有专门的介绍视频,大家有兴趣可以去看看。我个人是这么理解:
我们以 Node.js 为例来理解并发和并行的概念。
在开发中,同步和异步是两种常见的方法调用方式,它们在处理任务时有着不同的执行方式和特点。
在各种流传甚广的C语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:
int * func(void) { int num = 1234; /* ... */ return # }
当函数返回后,函数的栈帧(stack frame)即被销毁,引用了被销毁位置的内存轻则数据错乱,重则 segmentation fault。
经过了八十一难,终于成为了 C 语言绝世高手,还是逃不过复杂的堆上对象引用关系导致的 dangling pointer:
内存模型描述了程序执行的规范。在golang中,这些规范由 goroutine 执行组成,而 goroutine 的执行又由一系列内存操作构成。golang的内存模型规定了多个goroutine读取变量时候,变量的可见性情况。
内存操作可以从以下四个方面进行详细描述:
为了确保多核、多线程环境下的正确性和一致性,内存模型确保了以下几点:
比较有意思的是,Golang Memory Model 文章作者并不希望读者通过 Memory Model 来理解自己程序的运行方式,如果必须要这样做的话,很可能是程序的编写方式有问题,很可能意味着高昂的维护成本)
在Go语言中,数组是一种固定长度的数据结构,一旦创建,长度就不能改变。这在某些情况下可能会限制它的使用。为了提供更灵活的数据结构,Go引入了切片(slice),它基于数组实现,但具有动态调整大小的能力。
切片的内部结构在src/runtime/slice.go中定义,如下图,它包含三个主要部分: