生成式 AI 和 LLM 的工作原理

生成式 AI 是一种人工智能,能够创建原始内容,例如自然语言、图像、音频和代码。 生成式 AI 的输出基于用户提供的输入。 用户与生成式 AI 交互的一种常见方法是通过使用自然语言作为输入的聊天应用程序。 OpenAI 开发的 ChatGPT 就是一个常见的示例。 使用自然语言作为输入的生成 AI 应用程序由大型语言模型 (LLM) 提供支持,以执行自然语言处理 (NLP)。

生成式 AI 的工作原理

所有生成式 AI 都基于模型构建的。 这些模型以内容形式(如自然语言、图像、音频和代码)使用大量数据集进行训练。 生成式 AI 模型使用训练数据中标识的模式来生成新的类似于统计的内容。

用户提供的输入由 AI 模型用于生成输出。 输入首先分析为模型可以理解的数据形式。 然后,模型使用该数据从训练中识别匹配模式,并将其组合在一起以生成最终输出。 生成式 AI 模型旨在生成独特的内容,因此它们不会为相同的输入生成相同的输出。

支持自然语言作为输入或输出的生成式 AI 应用程序利用 LLM 来执行此操作。 LLM 用于执行 NLP,该 NLP 对输入文本进行分类并确定其情绪。 生成式 AI 模型使用该分类和情绪分析来识别模式并生成输出。 如果输出为文本,则可以单独使用 LLM 来生成它。 如果输出是音频或图像,则可以使用其他模型来提供数据和模式,以生成该格式的输出。

生成式 AI 的常见用途

生成式 AI 应用程序支持各种潜在的用例和潜在输出,以下部分将探讨这些用例和输出。

自然语言生成

某些生成式 AI 应用程序可以生成自然语言输出,例如:

  • LinkedIn 配置文件的专业措辞摘要
  • 在线商店商品的丰富说明
  • 健康膳食建议

例如,如果用户输入“请提供三个包含甜椒的健康早餐建议”,生成式 AI 应用程序可能会生成以下输出

好的,下面是三种含辣椒的健康早餐:

  1. 甜椒炒鸡蛋:甜椒切丁,放入锅中煎至稍微变软。 然后加入打散的鸡蛋液,将所有食材混合在一起翻炒。 再搭配全麦吐司,一道美味的营养早餐即成。

  2. 甜椒牛油果吐司:烤一片全麦面包,上面铺上甜椒片、牛油果泥,撒上盐和胡椒粉。 这是从牛油果中获取健康脂肪以及从辣椒中获取维生素 C 的好方法。

  3. 甜椒早餐卷饼:将甜椒丁、洋葱碎和炒鸡蛋一起放在平底锅里煎炒。 然后,将炒好的混合物舀到全麦玉米饼上,并在上面涂上一些莎莎酱或辣椒酱。 卷起来即可享用一顿满意又营养的早餐。

图像生成

某些生成式 AI 应用程序可从自然语言输入生成图像输出。 根据应用程序及其模型,用户能够指定:

  • 要显示图像的人员或内容
  • 用于创建图像的艺术风格
  • 生成类似图像的参考

图像生成可以为在线帐户创建虚拟头像、为企业设计徽标或为创建者提供艺术灵感。 例如,用户可能会输入请求“创建大象吃汉堡的图像”。 生成式 AI 应用程序可能会生成以下输出:

示例 AI 生成了大象吃汉堡的图像。

音频生成

某些生成式 AI 应用程序可从自然语言输入生成音频输出。 根据应用程序及其模型,用户可以执行以下操作:

  • 从输入文本合成自然声音
  • 以特定的风格创作音乐或采用某些乐器
  • 根据自然语言提供的设定条件修改输入音频文件

音频生成可提供来自数字语音助理的语音答复、为音乐制作的歌曲添加伴奏乐器,或重现参考录音中用户的原始语音。

代码生成

某些生成式 AI 应用程序可从自然语言输入生成代码。 根据应用程序及其模型,用户能够生成以下代码:

  • 采用他们选定的语言
  • 接受特定的输入和输出结构
  • 根据其参考文档使用特定技术

代码生成可提供常见操作的快速实现,例如排序或筛选数据、加快将代码从一种语言转换为另一种语言,或根据指定的参考文档回答有关技术的问题。 例如,假设输入“显示如何使用 C# 编写 tic-tac-toe 游戏”,生成式 AI 应用程序可能会生成以下输出:

下面是一个简单的示例,介绍如何使用 C# 编写 tic-tac-toe 游戏代码:

using System;

namespace TicTacToe
{
    class Program
    {
        static char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static int player = 1; // Player 1 will start
        static int choice; // The number the player chooses
        static int flag = 0; // Set the flag value to 0

        // Check if the position is already marked or not
        private static int CheckPosition(char mark)
        {
            for (int i = 0; i < 9; i++)
            {
                if (board[i] == mark)
                {
                    return 1;
                }
            }
            return 0;
        }

        // The rest of the generated code has been omitted for brevity
        // ...
    }
}

此代码使用 C# 创建一个简单的基于控制台的 tic-tac-toe 游戏。 它使用单维数组来表示棋盘,并在每次移动后检查胜利或平局。

LLM 的工作原理

训练 LLM 时,训练文本首先分解为标记。 每个标记标识唯一的文本值。 标记可以是不同的单词、部分单词或单词和标点符号的组合。 为每个标记分配一个 ID,使文本可以表示为一系列标记 ID。

将文本分解为标记后,会将上下文矢量(称为嵌入)分配给每个标记。 这些嵌入矢量是多值数值数据,其中标记矢量的每个元素都表示标记的语义属性。 标记矢量的元素是根据标记一起使用或在类似上下文中使用的常见程度来确定的。

目标是根据前面的标记来预测序列中的下一个标记。 将权重分配给现有序列中的每个标记,以表示其对下一个标记的相对影响。 然后执行一个计算,该计算使用前面标记的权重和嵌入来预测下一个矢量值。 然后,模型选择最可能的标记,以根据预测的矢量继续运行序列。

此过程继续对序列中的每个标记进行迭代,输出序列以递归方式用作下一次迭代的输入。 输出一次生成一个标记。 此策略类似于自动完成的工作原理,其中建议基于到目前为止键入的内容,并随每次新输入而更新。

在训练期间,完整的标记序列是已知的,但当前考虑的标记之后的所有标记都将被忽略。 将下一个标记矢量的预测值与实际值进行比较,并计算损失。 然后以增量方式调整权重,以减少损失并改进模型。