万字总结:现代 AIGC 全栈工程师的 10 个面试题

前几天经朋友内推,我参加了一场 AIGC 全栈工程师的面试,因为是远程面试,所以过程中我有做笔记。面试结束后经过简单整理,产出本文。内容涉及技术原理,涉及技术细节,也涉及具体的商业化落地。如果你对 AIGC 感兴趣,可以详细阅读本文,一定会有收获。

1. 你能描述一下大模型的发展历程、背景、和进展吗?

好的,我们这里谈到的大模型主要是指语言大模型,区分语言大模型主要是通过数据集的规模大小来区分的,通常我们会把训练数据集规模超过 10b(100 亿,billion 是单位,表示 10 亿)的模型称为大模型。

大模型一共有四个主要的发展阶段。

第一个阶段是 SLM,也就是统计语言模型。它是基于统计学的学习方法,通过建立单词预测模型来预测下一个单词。它存在数据稀疏性问题,对高阶语言模型的准确度很差。比较有代表的技术是文本分类、词性标注和句法分析等。

第二个阶段是 NLM,也就是神经语言模型。它是使用神经网络描述单词序列的概率。NLM 通过词的分布式表示概念,并通过学习单词和句子的特征来改进任务的性能。比较有代表性的技术是各种编码器和生成对抗神经网络等。

第三个阶段是 PLM,也就是预训练模型。这类模型在通过大规模无标签语料库的基础上进行预训练任务,学习通用的上下文感知的单词表示。虽然核心原理不变,但通过预训练和微调等方式,让 PLM 的性能有巨大的提升。比较有代表性的模型有 BERT 和 GPT 系列。

第四个阶段是 LLM,也就是大语言模型。在 PLM 的基础上,增加模型规模和数据规模来大幅提升性能。LLM 可以解决更加复杂的任务,并让我们看到了 AGI,也就是通用人工智能的可能性。比较有代表性的是 GPT-3 和 GPT-4 等。

我认为 LLM 的发展背景主要由两个因素推动的。第一是计算机硬件性能的提升,为 LLM 的训练提供了必备的基础能力。第二是互联网的蓬勃发展,为 LLM 提供了大量的语料数据。

目前大模型存在几点问题:

  1. 存在幻觉,有时候会给出看似合理实际上很荒谬的答案,无法保证生成内容的准确性和可信度。而且很多数据更新迭代速度很快,大模型无法及时更新自身知识。
  2. 存在数据安全隐患。企业内部的数据训练到公开的大模型中存在内部数据泄漏的风险。
  3. 缺乏细分领域的行业深度。大模型很难和企业内部的业务进行有效结合,很难达到很高的专业性。

2. 你能否解释一下注意力机制在模型中的作用?

好的。注意力机制(Attention)是深度学习中一种非常重要的核心技术。它的作用是实现了高效的信息处理资源分配。原理是先关注场景中最重要的点,暂时性忽略掉不重要的点。也就是以高权重聚焦最重要的信息,以低权重忽略不相关信息。在这个过程中还会不断调整权重,在不同的情况下也可以选取重要的信息。这样可以收缩关注的信息范围,达到压缩信息的目的。

目前注意力机制影响了深度学习的多个领域,包括图像处理、自然语言处理等。GPT 背后的 Transformer 模型,也是以注意力机制为基本单元设计的。

随着注意力机制的发展,现在很多注意力机制都更加接近自注意力机制(Self Attention),ChatGPT 就是使用自注意力机制。自注意力机制的注意力是原信息本身,比如我们让 AI 执行一个句子填空的任务,就非常适合自注意力机制,它可以对句子的各个 token 进行划分,给每组 token 设置权重,优先关注权重高的 token,这样还可以跨 token 计算,相比 RNN 性能更好。

3. 你如何理解Transformer,它在哪些应用场景中被使用?

刚才我介绍的注意力机制,是目前主流神经网络模型的基础机制,Transformer 是实现注意力机制的一种具体形式,我们也可以把它理解成一种模型结构组件。Transformer 的主要场景就是 LLM,比如 GPT 系列。

Transformer 有两部分组件组成,一部分是 Encoder(编码器),一部分是 Decoder(解码器)。编解码器又都是由 6 个 Block(块)组成。

Transformer 的工作流程是这样的:先从原始输入中拆分每个单词,并获取每个单词的表示向量。得到一个表示向量的矩阵,传入编码器,经过 6 个 Block 的处理后,得到一个维度相同的编码信息矩阵。然后再把编码信息矩阵传入解码器中,解码器会根据当前输入的矩阵进行处理,在处理过程中,会掩盖当前处理的 token 之后的 token。

其中编码器的每个 block 会包含一个多头注意力(Multi-Head Attention),解码器的每个 block 会包含两个多头注意力(Multi-Head Attention)。多头注意力机制就是在模型中做多次注意力机制,让模型关注到不同部分的信息。

而自注意力机制的输出是由三部分决定的,分别是 Q、K、V。Q 就是 Query,表示用户的输入,K 是 Key,表示模型数据中的标签,V 就是 Value,也就是上一个 Block 的输出。最后把 QKV 传入 softmax 公式中,得到最终输出 Z。多头注意力机制会包含多个注意力机制,也就是说有多个 Z,这时候会把多个 Z 进行拼接,传入 Linear 层进行变换,得到最终输出 Z。

除了多头注意力机制之外,block 结构中还有另外两部分,add & norm 和 feed forward。

add & norm 是由 add 和 norm 组成的,add 是残差链接,用来解决多层网络训练的问题,让网络只关注当前的差异部分。norm 是指 layer normalization,它可以把每层神经元的输入都转成一样的均值方差,可以加快收敛。

feed forward 层是两层的全连接层,它也有一个公式,最终 feed forward 会得到一个和输入矩阵纬度相同的输出矩阵。

4. 你能对比一下 GPT 和 BERT 模型吗?

好的,目前所有 LLM 都是在处理文字形式的内容,也就是自然语言处理。它们和我们人类一样,都属于一种智能体。但是在工作模式上有区别,人类处理自然语言,靠的是过往的经验、认知和自身的智慧,而 LLM 靠的是概率。在这一点上,GPT 和 BERT 的能力是相同的。

GTP 和 BERT 在技术架构上是非常相似的,比如都是建立在 Transformer 架构上,都使用了无监督学习,都支持微调等。

它们之间最大的区别在于结构的不同和工作模式的不同。GPT 是 OpenAI 研发的一个自回归的模型,它更考虑的是之前的上下文,BERT 是 Google 研发的一个双向模型,它同时考虑前面和后面的文本。BERT 使用了 Masking Input 的模式来进行的预训练,也就是通过填空题的方式,随机遮盖住句子的某一些词进行训练,所以 BERT 需要对数据集进行标注。GPT 的预训练方式主要是推测下一个可能出现的词,GPT 不需要对数据集进行标注。这也是两种模型的主要差别,在超大规模数据集的情况下,GPT 有很大的优势。

GPT 会通过评估前面的一个或几个词来生成下一个词,所以它的主要能力是生成,更适合生成流畅和连贯的句子。主要的场景有语言翻译、文章总结和文本完成等。但是 GPT 只能做单向编码。

BERT 会通过一个句子中的前后两个词来生成缺失的词 ,所以它的主要能力是理解,更适合理解句子的情感,主要的场景有搜索、问答、情感分析和补全缺失词等。BERT 拥有双向编码的能力,但失去了直接生成文本的能力。

5. 你怎么理解多模态计算?如何理解从 CLIP、BLIP 到DALL 的发展过程?

在过去,机器学习模型通常只能处理一种类型的数据,比如文本类型、图像类型或者音频类型。但是人类的大脑可以理解很多种类型的数据,比如文字、图像、音频和视频等。让 AI 更接近人类的大脑,是 AI 的一个研究方向,这种处理多种数据的能力就是多模态。

多模态模型一般有多项特征:

  1. 输入的数据和输出的数据不同。比如输入文本输出图像,输入图像输出文本。
  2. 同时处理多种类型的输入。比如同时输入文本和图像。
  3. 同时生成多种类型的输出。比如同时生成文本和图像。

CLIP 是 OpenAI 在 2021 年 1 月发布的论文中提到的概念,主要作用是通过训练来实现文本和图像的对应关系。CLIP 主要原理是通过超大规模模型预训练提取视觉特征,进行图片和文字之间的对比学习。预训练结束后不经过微调可以直接推理,也就是零样本学习,用见过的特征去判断没见过的特征类型。OpenAI 当时从互联网收集了 4 亿个文本图像对,也叫做 WIT(WebImageText)训练过后的 CLIP 在不经过任何一张图片训练的情况下,在 ImageNet 数据集上和有监督、训练好的 ResNet-50 在精度上持平,大概 76.2%。这在之前被认为是不可能的。CLIP 的训练过程是输入配对好的文字图片对,然后分别通过 Text Encoder 和 Image Encoder 输出对应的特征矩阵,然后在这些特征矩阵上进行对比学习。然后根据任务的分类标签来构建每个类别的描述文本,把这些文本送到 Text Encoder 里面得到对应的文本特征,文本特征的数量和类别数目的数量相等。最后把要预测的图像送到 Image Encoder 的到图像特征,和上一步得到的 N 个文本特征进行余弦相似度,把相似度最大的文本对应的类别作为图像分类预测结果。2021 年 10 月 发布的 Disco Diffusion,就是第一个结合了 CLIP 模型和 diffusion 模型的开源 AI 绘图工具。

CLIP 本质上就是拿图片特征和文本特征做余弦相似度对比,很简单粗暴。BLIP 是另一种不同的多模态模型,比 CLIP 复杂得多。BLIP 由 4 个部分组成。第一部分是视觉编码器(Image Encoder),它会把一张图片分割成很多块,并把它们编码成一个系列的 Image Embedding,这一步就是在提取图片特征。第二部分是文本编码器,它的作用是提取文本特征,其实就是 BERT 的架构,就不多赘述了。第三部分是视觉文本编码器,它是一种 BERT 的变种。在 block 的自注意层和前馈网络层中间中间插入了一个交叉注意层,引入了视觉特征,用来给图像和文本做而分类,作为图像文本的联合表征。第四部分是视觉文本解码器,它也是 BERT 的变种,它的作用是根据图片特征和文本特征做文本生成。

DALL 模型又分多个版本。目前有 DALL E、DALL E2 和 DALL E3。这部分我就不展开聊了。

6. 你如何理解和操作 stable diffusion?能否举例说明它的具体应用?

Stable Diffusion 是 Stability AI 公司开源的、基于扩散模型 Diffusion Model 算法模型。目前最流行的几个图像生成 AI,DALL E、Midjourney、Stable Diffusion 都是基于扩散模型研发的,所以我先介绍一下扩散模型。

图像生成领域有很多种生成式模式,像生成对抗模型 GAN、变分自动编码器 VAE、流模型 Flow based Model 等。它们都是基于深度学习的方式进行训练的模型,但是他们的工作原理是不同的。

这里我主要介绍稳定扩散模型的工作原理,它的训练过程分为正向扩散和逆向扩散。正向就是向训练图像不断添加噪声,直到让一张图片变成一张无意义的纯噪声图。逆向扩散就是逐步去除噪声,恢复到最初的样子。这个过程就有点像朝干净的水中不断滴墨水,直到水变得非常浑浊,再用蒸馏的方式把水变清澈。

扩散模型也分两种,一种是标准扩散模型,还有一种是潜在扩散模型 Latent Diffusion Model。标准扩散模型是在高维像素空间中进行的,比如一张 512*512 的 RGB 图片,对应的就是一个 76 万多个维度的空间,我们普通的民用级显卡根本无法完成这种级别的计算任务,需要多台专业级显卡一起运算。潜在扩散模型就是为了解决这个问题,它的过程就是把训练图像线索小 48 倍,再进行运算,运算结束后再恢复原始尺寸。这样可以降低硬件要求,同时提升了运算速度。在这个过程中,压缩后运行计算的空间也称作潜空间。在这样大幅减少运算量的情况下,普通的民用级显卡也可以轻松完成图像的生成任务。

准确的来说,Stable Diffusion 模型是一个由多个模型组成的运作系统,其中包含了文本编码器 CLIP、扩散模型 Diffusion 和图像解码器 VAE。CLIP 我之前介绍过了,这里就不再赘述了。扩散模型的部分还包含了 U-Net 和 Scheduler 采样算法两部分。U-Net 原来是用在生物医学图像分割的神经网络模型,工作结构像一个 U 型字母,所以也叫 U 型神经网络训练模型。U-Net 可以辅助提取并解构训练图像的特征,这样可以在只有很少的训练样本的情况下获得更加准确多样的数据信息,提升模型在出图上的精度。在训练扩散模型的过程中可以采用不同的算法来添加噪音,Scheduler 可以定义使用哪种算法来运行程序,它可以定义降噪的步骤、是否具备随机性、查找去噪后样本的算法等。所以它也叫采样算法。我们可以根据图像类型和使用的模型来选择不同的采样器,来达到最佳的出图效果。解码器 VAE 的作用就是把高维数据映射到低维空间,再把低维空间的计算结果解码到高位像素空间。所以它也是由编码器和解码器组成的。编码器的过程也就是我之前举例的高维像素空间映射到低维潜空间的过程。解码器就是将潜空间的计算结果转换为原始图像。SD 的推理过程只用到了 VAE 的解码器部分。

以上就是 SD 的原理部分,然后我再聊聊 SD 的具体应用。

SD 是开源的,所以任何人都可以把它下载到本地去使用,不过原始项目是使用 Python 写的,普通人上手使用比较困难。所以有一些程序员开发了一些开源的 GUI,其中最流行的就是越南超人 A41 开发的 WebUI,WebUI 把复杂的参数转化成了可视化的数值选项和操作按钮,非常易于使用。

由于 SD 是开源的,所以他有很多优势,是其他竞品(像 Midjourney 和 DALL E2)没有的。首先是扩展性极强,A41 的 WebUI 项目中,就介绍了一百多个扩展插件的功能,并且扩展插件的数量还在持续增加。这些插件的功能很多样化:有局部重绘、高清修复、姿态控制、线稿提取等等。第二点就是出图率高,SD 是部署在本地的,所以出图率是可控的,只要显卡算力够高,甚至能实现秒级出图。第三点是数据安全性高,SD 的绘图过程完全在本地,不会泄漏任何的数据信息。所以 SD 非常适合商业化的绘图团队。

7. 你有没有使用 LangChain,OpenAI 和 Hugging Face Spaces 开发过问答应用的经验?如果有,能否分享一些经验?

我用 LangChain 和 OpenAI 开发几个项目。其中有一个项目涉及的技术栈比较多,可以单独讲一下。这个项目是一个 React 智能辅助开发机器人项目。因为 GPT 训练的数据中,React 的版本比较老,所以直接使用 GPT-4 去解决一些 React 的问题,或者去执行一些开发任务,可能效果不是很好,比如它可能会使用比较古老的方式去解决问题,比如用 class 和 HOC,但实际上我们已经有了最新的一些 Hooks 和 API,可以更优雅的解决问题。这时候就需要我们为 GPT 提供更多上下文信息来实现任务的开发。

首先过程分几个步骤。

第一个大步骤是获取并处理数据,转换为向量,并存入到向量数据库。这一步又分几个小步骤。第一步是通过 LangChain 的 document loaders 模块中 cheerio 模块爬取 react.dev 网站上的所有内容。第二步是通过 LangChain 的 text splitter 模块对文档进行分割。第三步是通过 LangChain 的 embeddings 模块调用 OpenAI 的 embedding API,把分割后的文本转换为向量。再调用 LangChain 的 vectorstores 模块,把向量存储到向量数据库中,这个项目里我用到的是开源的 qdrant。

第二个大步骤是为前端提供问答接口,这一步也分几个小步骤。第一步是通过 LangChain 的 chat models 模块创建 GPT 的实例。第二步是通过 LangChain 的 retriever 模块,基于 qdrant 数据库和 GPT 来创建 retriever 实例。第三步就是通过 LangChain 的 chains 模块,基于 retriever 实例创建 qaChain 实例。第四步就是当用户请求进入时,将问题传入 qaChain,得到答案,并返回给前端。

以上基本就是通过 LangChain 和 OpenAI 来开发问答类应用的通用流程。其中会用到几个外部资源,比如数据源、embedding 接口、向量数据库等。它的原理就是将 LLM 不理解的上下文信息存储到向量数据库中,在进行问答时,先把原始问题转换为向量,然后去向量数据库中匹配相似度最高的上下文内容,填充到 question 中发送给 LLM,这样 LLM 就可以知晓它原本不知道的内容,从而给出更准确的答案。

8. 对于 LangChain,你能详细分析它的基础理论和架构设计吗?

LangChain 是一个由大语言模型驱动的应用开发框架。在 AIGC 应用开发领域的定位有点像前端里的 React 或者 Java 里的 Spring。它的设计原则有两个:

  1. data-aware:数据感知,可以将 LLM 模型和外部数据源进行连接。
  2. agentic:代理,可以让 LLM 模型和外部环境进行交互。

这两个原则也是它的核心能力,目前 LangChain 的所有功能模块都是围绕这两个点进行设计的。

LangChain 原来主要的模块有 6 个,分别是模型 Models、提示 Prompt、索引 Indexes、链 Chains、代理 Agents 和记忆 Memory。后来经过调整,目前主要的模块有 6 个,分别是模型 Model I/O(原来的 Prompts 被归类到了 Model I/O 中)、恢复 Retrieval(实际上就是原来的 Indexes 模块)、链 Chains、代理 Agents、记忆 Memory和新增加的回调 Callbacks。每个模块都有不同的作用,这里我简单介绍一下它们的作用。

Models 模块主要是对 LLM 层进行抽象。可以简化我们调用 LLM 接口的过程,这样我们可以很轻易的替换底层的 LLM。Models 目前分为两类,一类是普通 LLM,LLM 一般是输入文本字符串并返回文本字符串的模型,比如 text-davinci-003。一类是 Chat Model,这类模型通常支持传入消息列表作为输入并返回的模型,比如 GPT-3.5、GPT-4 和 Claude 等。

Prompts 模块主要是提供了一些工具,方便我们更容易构建需要的提示词。这部分提供的工具有 PromptTemplates、ChatPrompt Templates 和 Example Selectors。PromptTemplates 主要就是通过模板的方式让我们更好的复用提示词。我们给定一个模板字符串,再从用户输入中获取一组参数进行生成,得到最终的提示。主要包含语言模型的说明,也就是模型当前扮演的角色,一组少量的示例,可以帮助 LLM 完成零样本学习,更好的生成响应,最后就是具体的问题需求。ChatPrompt Templates 是针对聊天模型设计的,功能与 PromptTemplates 类似,不过可以接受消息列表作为输入,列表会包含一组消息,每个消息都会有一个角色。Example Selectors 是对示例的选择。我们可以定义很多示例,然后根据不同的规则去选择示例。比如根据输入长度选择示例,输入长时选择多一些示例,输入短时少选择一些示例。也可以根据相关性来选择和输入最相关的示例。

Indexes 模块主要作用就是和外部数据进行集成,根据外部数据来获取答案。索引主要包含 Document Loaders、Text Splitters、Vectorstores 和 Retrievers 几个模块。使用它们可以完成从外部获取数据的标准步骤。首先通过 Document Loaders 模块加载不同类型的数据源,比如网络的网页、本地的文档等。第二步是通过 Text Splitters 把第一步获取的文本进行分割,因为 LLM 都会限制上下文窗口大小,有 4k、16k、32k 等。把文本分割成制定大小的 chunk,可以更好的控制 token 大小。第三步就是通过 Vectorstores 模块把文本转换为向量,并存入向量数据库中。我们可以使用 OpenAI 的 Embedding API,也可以使用 HuggingFace 的 Embeddings 加载本地模型,可以节省调用费用,提高数据安全性。最后一步通过 Retriever 模块根据相关性从向量数据库中检索对应的文档。

Chains 模块通过 Chain 的概念,来将各个组件进行链接,来简化开发复杂应用的难度。Chain 有很多种类型,主要的有 LLM Chain、Sequential Chain 和 Router Chain。LLM Chain 是最常用的,由 PromptTemplate、LLM 和 OutputParser 组成。LLM 输出是文本,OutputParser 可以让 LLM 结构化输出并且进行结果解析,比如指定输出为 JSON 格式,这样方便后续的处理。Sequential Chain 是顺序链,可以完成多个步骤的任务,每个步骤都有一个或多个输入和输出,上一个步骤的输出就是下一个步骤的输入,有点像编程中管道的概念。比如我们可以先将文本进行翻译,再对翻译后的文本进行总结。Router Chain 更加复杂,它是根据输入来动态选择下一个 chain。它由两个组件组成,分别是路由器链本身,负责选择调用下一个链。路由器链又分两种,一种是 LLM Router Chain,由 LLM 做路由决策,一种是 Embeding Router Chain,通过向量搜索做路由决策。另一个组件是目标链列表,也就是路由器链可以路由到的子链。

Agent 模块也就是代理模块。在代理出现之前,我们使用 LLM 的方式通常是给定一个较为复杂的目标,LLM 无法一次性完成,然后我们还需要设计为了达成目标的每一个步骤的 Prompt。代理模式就是我们只需要给定一个目标,由 LLM 自己去思考每个步骤。代理模块主要由 4 个组件组成,分别是代理 Agent、工具 Tools、工具包 Toolkits 和代理执行器 Agent Executor。Agent 的作用是调用 LLM,获取下一步的 Action;Tools 是 Agent 可以调用的方法列表,LangChain 内部有很多工具,比如查询数据库、发送邮件、处理 JSON 等等,Tool 有一个 description 属性,LLM 会通过这个属性来决定是否使用这个工具;ToolKits 是一组工具集,为了实现某个特定目标而提供的工具集合;Agent Executor 负责迭代运行代理的每个 Action。从功能上看,Agent 模块和 Chains 模块的功能有些相似,不过 Chains 是由开发者预先定义好一系列 Action,再由 LLM 从其中选择最合适的 Action。Agent 是由 LLM 自己来定义并执行 Action。所以我们可以把 Agent 理解成自由度和随机性更高的 Chain。

Memory 模块也叫记忆模块或者存储模块,它的主要作用是用来存储之前交互的信息。无论是 Chain 还是 Agent,每次交互都是无状态的,我们无法在当前交互中得知之前历史交互的信息。Memory 就是一种可以跨多轮交互提供历史上下文的能力。Memory 支持在多种存储中存储历史数据,比如 MongoDB、SQLite 和 Redis 等。它还支持通过 Buffer Memory 直接在内存中存储信息。存储的形式主要有三种,第一种是 ConversationSummaryMemory,也就是用摘要的形式保存记录;第二种是 ConversationBufferWindowMemory,用原始形式保存最近的 N 条记录;第三种是 ConversationBufferMemory,用原始形式保存所有记录。

Callbacks 模块的主要作用就是在 LLM 执行的各个流程环节中插入回调函数,来获取整个 LLM 执行的所有参数,适合做监控、日志记录等工作。相比较其他模块,回调函数可以在任意的环节进行,比如产生新的 Token、链的开始和结束、代理 Action 的开始和结束、Tool 的开始和结束等。

9. 你如何针对 AIGC 项目进行规划?你是如何制定技术方案和架构设计的?

我认为 AIGC 项目需要从四个方面进行规划。

第一个方面是安全,安全对 AIGC 产品来说是至关重要的,如果没有做好安全,产品将面临约谈和关闭。安全的第一层就是内容安全,我们需要检测涉政、色情、暴恐、反人类等内容,我们可以在输入和输出两个层面进行过滤。必要的情况,可以对生产的内容进行标注和跟踪,比如在图片使用水印和在文字中按特定方式插入零宽字符进行追溯。或者对用户采取实名制措施。安全的第二个部分是虚假信息,也就是幻觉。在 GPT-4 之前出现幻觉的概率很高,GPT-4 可以很大程度降低幻觉出现的概率,一些关键逻辑可以使用 GPT-4。安全的第三部分是模型的安全,每个模型都有后门,通过一些特殊的输入就可以打破模型的限制,或者一些特殊的输入就可以让模型做一些奇怪的行为。模型攻击分好几类,比如威胁攻击、后门攻击、模型越狱等。我们需要了解模型的特点,在应用层面进行防护,防止被攻击。

第二个方面是吞吐量。我们需要衡量用户的体量、以及在高峰期用户的请求峰值。很多 LLM 都会有使用限制,我们需要在高并发情况下对用户请求进行排队,必要情况下,可以使用池技术来变相提升 LLM 的并发处理能力。

第三个方面是成本。不同的模型、使用频率、平均文本量等因素,成本是不同的。比如 GPT4 的平均每个 Token 是 0.06 美元,是 GPT3.5 的 30 倍。图像生成模型通常也是按照分辨率来计费的。比如 DALL-E 的价格是 1024*1024 的图片每张价格是 0.02 美元。而 Midjourney 则是按照每月来收取会员费。除了闭源模型之外,我们还可以选择开源模型,这样在成本上可以进一步节省。比如可以自己搭建 Llama 和 SD。这时候就需要设计流量的削峰填谷,加入排队机制,最大程度上合理化的使用服务器。

第四个方面是合规。目前 AI 生成的内容在版权上一直有争议。中国目前的《著作权法》无法认定 AI 作品的作者。所以目前所有 AIGC 商业化都可能会涉及到侵权问题。我们应该尽量做到数据脱敏和匿名化。必要的情况下,可以采取对内容做隐形水印、用户实名制等措施。

目前 AIGC 项目的技术方案比较单一,我会优先使用最成熟的 LangChain。模型方面没有特殊要求我会使用 GPT4。

正文结束。如果你细心的话,可能发现只有 9 道题,实际上第一道题是自我介绍,我从文章中删除掉了,所以是 9 道。

如果你对最新的技术感兴趣,特别是对 Web3、AI 相关的内容感兴趣,可以添加我的微信 LZQ20130415,拉你进群交流。

相关推荐
Anlici1 分钟前
如何优化十万数据的浏览体验?从性能、监控到布局全面拆解
前端·性能优化
utmhikari1 分钟前
【日常随笔】万字长文,如何用pyside6开发一个python桌面工具
前端·python·pyqt
墨风如雪7 分钟前
browser-use: 让你的代码像人一样“上网冲浪”——API驱动的浏览器自动化利器
aigc
JustHappy8 分钟前
「Versakit 0.3 重磅发布」 两个月开发成果全揭!
前端·javascript·vue.js
chenqi18 分钟前
WebGPU和WebLLM:在浏览器中解锁端侧大模型的未来
前端·人工智能
小码编匠19 分钟前
C# 实现西门子S7系列 PLC 数据管理工具
后端·c#·.net
Lingxing19 分钟前
Vue组件树:从设计到实现的全方位指南 🚀
前端·vue.js
玖玖passion20 分钟前
leader:请你用Protobuf进行数据交互🥲
前端
Postkarte不想说话22 分钟前
Ubuntu24.04搭建TrinityCore魔兽世界
后端
Weison23 分钟前
Apache Doris Trash与Recover机制
后端