通过 Gemma 用口语指令执行任务

许多企业都需要能够以特定的口语语言使用人工智能 (AI) 技术,才能有效地使用该技术。Gemma 系列模型具有一些多语言功能,但使用英语以外的语言时,结果通常不太理想。

幸运的是,您不需要教 Gemma 全文掌握该语言的任务。此外,您可以调优 Gemma 模型,以便使用某种语言完成特定任务,所需的数据和精力比您想象的要少得多。通过提供大约 20 个目标语言的请求示例和预期回答,您可以让 Gemma 以最适合您和客户的语言帮助您解决各种不同的业务问题。

如需观看有关该项目及其扩展方式的视频简介(包括项目开发者的深入解析),请观看语音 AI 助理“Build with Google AI”视频。您还可以在 Gemma Cookbook 代码库中查看此项目的代码。否则,您可以开始按照以下说明扩展项目。

概览

本教程将指导您设置、运行和扩展使用 Gemma 和 Python 构建的语音任务应用。该应用提供了一个基本网页界面,您可以根据自己的需求对其进行修改。该应用旨在为一家虚构的韩国面包店生成对客户电子邮件的回复,并且所有语言输入和输出都完全以韩语处理。您可以将此应用模式与任何语言以及使用文本输入和文本输出的任何业务任务搭配使用。

K-Mail Web 应用界面的屏幕截图

图 1. 韩国面包店电子邮件咨询的项目界面

硬件要求

在具有图形处理单元 (GPU) 或张量处理单元 (TPU) 且内存足以存储现有模型以及调整数据的计算机上运行此调整流程。如需在此项目中运行调整配置,您需要大约 16GB 的 GPU 内存、大约相同数量的常规 RAM,以及至少 50GB 的磁盘空间。

您可以使用具有 T4 GPU 运行时的 Colab 环境运行本教程的 Gemma 模型调优部分。如果您要在 Google Cloud 虚拟机实例上构建此项目,请按照以下要求配置实例:

  • GPU 硬件:必须使用 NVIDIA T4 才能运行此项目,建议使用 NVIDIA L4 或更高版本。
  • 操作系统:选择 Deep Learning on Linux 选项,具体而言,选择预安装了 GPU 软件驱动程序的 Deep Learning VM with CUDA 12.3 M124
  • 启动磁盘大小:为数据、模型和支持软件预配至少 50GB 的磁盘空间。

项目设置

以下说明将逐步引导您准备好此项目以进行开发和测试。常规设置步骤包括安装必备软件、从代码库克隆项目、设置一些环境变量、安装 Python 库,以及测试 Web 应用。

安装和配置

此项目使用 Python 3 和虚拟环境 (venv) 来管理软件包和运行应用。以下安装说明适用于 Linux 主机。

如需安装所需的软件,请执行以下操作:

  • 安装 Python 3 版和适用于 Python 的 venv 虚拟环境软件包。

    sudo apt update
    sudo apt install git pip python3-venv
    

克隆项目

将项目代码下载到开发计算机。您需要 git 源代码控制软件才能检索项目源代码。

如需下载项目代码,请执行以下操作:

  1. 使用以下命令克隆 Git 代码库。

    git clone https://github.com/google-gemini/gemma-cookbook.git
    
  2. 您可以选择将本地 Git 代码库配置为使用稀疏检出,以便只获取项目的文件。

    cd gemma-cookbook/
    git sparse-checkout set Gemma/spoken-language-tasks/
    git sparse-checkout init --cone
    

安装 Python 库

激活 venv Python 虚拟环境以管理 Python 软件包和依赖项,然后安装 Python 库。请务必先激活 Python 虚拟环境,然后使用 pip 安装程序安装 Python 库。如需详细了解如何使用 Python 虚拟环境,请参阅 Python venv 文档。

如需安装 Python 库,请执行以下操作:

  1. 在终端窗口中,导航到 spoken-language-tasks 目录:

    cd Gemma/spoken-language-tasks/
    
  2. 为此项目配置并激活 Python 虚拟环境 (venv):

    python3 -m venv venv
    source venv/bin/activate
    
  3. 使用 setup_python 脚本安装此项目所需的 Python 库。

    ./setup_python.sh
    

设置环境变量

设置运行此代码项目所需的几个环境变量,包括 Kaggle 用户名和 Kaggle 令牌密钥。您必须拥有 Kaggle 账号并请求访问 Gemma 模型,才能下载这些模型。对于此项目,您需要将自己的 Kaggle 用户名和 Kaggle 令牌密钥添加到两个 .env 文件中,这两个文件分别由 Web 应用和调优程序读取。

如需设置环境变量,请执行以下操作:

  1. 按照 Kaggle 文档中的说明获取您的 Kaggle 用户名和令牌密钥。
  2. 请按照 Gemma 设置页面中的获取 Gemma 访问权限说明操作,获取 Gemma 模型的访问权限。
  3. 通过在项目的每个位置创建一个 .env 文本文件,为项目创建环境变量文件:
    k-mail-replier/k_mail_replier/.env
    k-gemma-it/.env
    
  4. 创建 .env 文本文件后,将以下设置添加到这两个文件中:

    KAGGLE_USERNAME=<YOUR_KAGGLE_USERNAME_HERE>
    KAGGLE_KEY=<YOUR_KAGGLE_KEY_HERE>
    

运行和测试应用

完成项目的安装和配置后,运行 Web 应用以确认您已正确配置该应用。在修改项目以供您自己使用之前,您应先执行此操作作为基准检查。

如需运行和测试项目,请执行以下操作:

  1. 在终端窗口中,导航到 /k_mail_replier/ 目录:

    cd spoken-language-tasks/k-mail-replier/
    
  2. 使用 run_flask_app.sh 脚本运行应用:

    ./run_flask_app.sh
    
  3. 启动 Web 应用后,程序代码会列出一个网址,您可以在此网址中浏览和测试。通常,此地址为:

    http://127.0.0.1:5000/
    
  4. 在网页界面中,按第一个输入字段下方的 답启发 启发 按钮,以根据模型生成回答。

在您运行应用后,模型的第一个响应需要更长时间,因为它必须在首次生成时完成初始化步骤。对已在运行的 Web 应用的后续提示请求和生成操作会在更短的时间内完成。

扩展应用

应用运行后,您可以通过修改界面和业务逻辑来扩展应用,使其适用于与您或您的业务相关的任务。您还可以使用应用代码修改 Gemma 模型的行为,只需更改应用向生成式 AI 模型发送提示的组成部分即可。

应用向模型提供指令以及来自用户的输入数据,构成模型的完整提示。您可以修改这些指令来更改模型的行为,例如指定模型应从请求中提取信息并将其置于结构化数据格式(例如 JSON)中。更改模型行为的一种更简单的方法是为模型的回答提供其他说明或指导,例如指定生成的回复应采用礼貌的措辞。

如需修改提示说明,请执行以下操作:

  1. 在 spoken-language-task 项目中,打开 k-mail-replier/k_mail_replier/app.py 代码文件。
  2. app.py 代码中,向 get_prompt(): 函数添加加法指令:

    def get_prompt():
        return "발신자에게 요청에 대한 감사를 전하고, 곧 자세한 내용을
            알려드리겠다고 정중하게 답장해 주세요. 정중하게 답변해 주세요!:\n"
    

此示例会将短语“请礼貌地回复!”添加到韩语说明中。

提供额外的提示说明可以显著影响生成的输出,并且实现起来所需的工作量要少得多。您应先尝试此方法,看看您能否从模型获得所需的行为。不过,使用提示说明修改 Gemma 模型的行为有其局限性。具体而言,模型的总体输入词元限制(对于 Gemma 2,为 8192 个词元)需要您在详细的提示说明与您提供的新数据大小之间取得平衡,以确保不超出该限制。

此外,如果您希望 Gemma 以英语以外的语言执行任务,仅仅提示基本模型可能无法生成有用的可靠结果。相反,您应使用目标语言的示例对模型进行调优,然后考虑修改提示说明,以对经过调优的模型的输出进行更细微的调整。

对模型进行调参

如需让 Gemma 模型以英语以外的口语语言有效地做出回答,建议对其进行微调。不过,您无需完全精通目标语言,模型便可使用该语言完成任务。您可以使用大约 20 个示例,以目标语言实现某项任务的基本功能。本教程的这一部分介绍了如何针对特定任务以特定语言设置和运行 Gemma 模型微调。

以下说明介绍了如何在虚拟机环境中执行微调操作,不过,您也可以使用此项目的关联 Colab 记事本执行此调优操作。

硬件要求

微调的计算要求与项目其余部分的硬件要求相同。如果将输入令牌限制为 256 个并将批次大小限制为 1,您可以在使用 T4 GPU 运行时的 Colab 环境中运行调整操作。

准备数据

在开始调优 Gemma 模型之前,您必须先准备好调优数据。针对特定任务和语言调优模型时,您需要一组使用该目标语言的请求和响应示例。这些示例应显示请求文本(不含任何说明)和预期响应文本。首先,您应该准备一个包含大约 20 个样本的数据集。这些示例应体现各种请求和理想响应。请确保请求和响应不重复,因为这可能会导致模型响应重复,并且无法根据请求的变化进行适当调整。下表显示了此代码示例数据集中的一些示例记录:

请求 响应
안녕하세요, 2주 뒤에 있을 아이 생일을 위해 3호 케이크 3개를 주문하고 싶은데 가능할까요? 고객님, 안녕하세요. 2 주 뒤 CharacterStyle 이 생무 감활 3 来提高 케이随机数 2details 감사敏感类别板네, 3호 케이크 2개 주문 가능합니다. 아이 생일 케이크인 만큼 더욱 신경 써서 정성껏 준비하겠습니다. 혹시 원하시는 디자인이나 특별한 요청 사항이 있으시면 편하게 말씀해주세요. 픽업 날짜와 시간을 알려주시면 더욱 자세한 안내를 도와드리겠습니다. 다시 한번 문의 감사드리며, 아이 생일 진심으로 축하합니다! [🇺?🇸? 이름] list 림
🇦?녕동동전 9 월 15 must 돌잔치 폌잔치 受众群体定位 科学我们会将 주您可以通过以下方式亦准并入。- 케이크 종류: 생크림 케이크 - 크기: 2호 - 디자인: 아기자기한 동물 디자인 - 문구: "첫 생일 축하해, 사랑하는 아들!" - 픽업 날짜 및 시간: 9월 14일 오후 3시 가격 및 주문 가능 여부를 알려주시면 감사하겠습니다. 감사합니다. 🇺?🇸? 🌼? 안녕하세요, 김민지 님, 9월 15일 아드님의 돌잔치를 위한 케이크 주문 문의 감사합니다. - 생크림 케이크 2호, 아기자기한 동물 디자인, "첫 생일 축하해, 사랑하는 아들!" 문구, 9월 14日 下午 3시 픽업 모두 가능합니다. - 가격은 5만원입니다. 주문을 원하시면 연락 주세요 감사합니다. [가게 이름] 드림

表 1. 韩国面包店电子邮件回复者微调数据集的部分列表。

数据格式和加载

您可以使用任何方便的格式(包括数据库记录、JSON 文件、CSV 文件或纯文本文件)存储调整数据,只要您有方法可以使用 Python 代码检索记录即可。为方便起见,示例调整程序会从在线代码库获取记录。在此示例转换程序中,使用 prepare_tuning_dataset() 函数在 k-gemma-it/main.py 模块中加载了调优数据集:

def prepare_tuning_dataset():
    tokenizer = keras_nlp.models.GemmaTokenizer.from_preset(model_id)

    # load data from repository (or local directory)
    from datasets import load_dataset
    ds = load_dataset(
        # Dataset : https://huggingface.co/datasets/bebechien/korean_cake_boss
        "bebechien/korean_cake_boss",
        split="train",
    )
    ...

如前所述,您可以以方便的格式存储数据集,只要您能检索包含关联响应的请求并将其组装成文本字符串,以用作调整记录即可。

汇总调优记录

对于实际的调整流程,每个请求和响应都会组装成一个字符串,其中包含提示说明和标记,以指明请求的内容和响应的内容。然后,此调优程序会对字符串进行分词,以供模型使用。您可以在 k-gemma-it/main.py 模块 prepare_tuning_dataset() 函数中查看用于组装调整记录的代码,如下所示:

def prepare_tuning_dataset():
    ...
    prompt_instruction = "다음에 대한 이메일 답장을 작성해줘."

    for x in data:
        item = f"<start_of_turn>user\n{prompt_instruction}\n\"{x['input']}\"<end_of_turn>\n<start_of_turn>model\n{x['output']}<end_of_turn>"
        length = len(tokenizer(item))
        # skip data if the token length is longer than our limit
        if length < token_limit:
            tuning_dataset.append(item)
            if(len(tuning_dataset)>=num_data_limit):
                break
    ...

此函数会读取数据并添加 start_of_turnend_of_turn 标记来设置格式,这是在提供数据来调整 Gemma 模型时所需的格式。此代码还会为每个请求插入 prompt_instruction,您应根据应用的需要对其进行相应修改。

生成模型权重

将调整数据放置到适当位置并加载后,您就可以运行调整程序了。此示例应用的调优过程使用 Keras NLP 库通过低秩自适应 (LoRA) 技术来调优模型,以生成新的模型权重。与全精度微调相比,使用 LoRA 的内存效率显著提高,因为它会近似地估算模型权重的变化。然后,您可以将这些近似权重叠加到现有模型权重上,以改变模型的行为。

如需执行调优运行并计算新的权重,请执行以下操作:

  1. 在终端窗口中,导航到 k-gemma-it/ 目录。

    cd spoken-language-tasks/k-gemma-it/
    
  2. 使用 tune_model 脚本运行调整流程:

    ./tune_model.sh
    

优化过程需要几分钟时间,具体取决于您可用的计算资源。成功完成后,优化程序会将新的 *.h5 权重文件写入 k-gemma-it/weights 目录,格式如下:

gemma2-2b_k-tuned_4_epoch##.lora.h5

问题排查

如果未能成功完成调整,可能有以下两个原因:

  1. 内存不足 / 资源已用尽:当调整进程请求的内存超出可用 GPU 内存或 CPU 内存时,就会发生这些错误。确保在优化流程运行时,您未运行 Web 应用。如果您是在具有 16GB GPU 内存的设备上进行调优,请确保将 token_limit 设为 256,并将 batch_size 设为 1
  2. 未安装 GPU 驱动程序或与 JAX 不兼容:旋转过程要求计算设备安装与 JAX 库版本兼容的硬件驱动程序。如需了解详情,请参阅 JAX 安装文档。

部署调优后的模型

调优过程会根据调优数据和调优应用中设置的总迭代次数生成多个权重。默认情况下,优化程序会生成 20 个模型权重文件,每个优化周期对应一个文件。每个后续的调优迭代都会生成权重,这些权重可以更准确地再现调优数据的结果。您可以在调优过程的终端输出中查看每个周期的准确率,如下所示:

...
Epoch 14/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 567ms/step - loss: 0.4026 - sparse_categorical_accuracy: 0.8235
Epoch 15/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 569ms/step - loss: 0.3659 - sparse_categorical_accuracy: 0.8382
Epoch 16/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 571ms/step - loss: 0.3314 - sparse_categorical_accuracy: 0.8538
Epoch 17/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 572ms/step - loss: 0.2996 - sparse_categorical_accuracy: 0.8686
Epoch 18/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 574ms/step - loss: 0.2710 - sparse_categorical_accuracy: 0.8801
Epoch 19/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 575ms/step - loss: 0.2451 - sparse_categorical_accuracy: 0.8903
Epoch 20/20
10/10 ━━━━━━━━━━━━━━━━━━━━ 6s 575ms/step - loss: 0.2212 - sparse_categorical_accuracy: 0.9021

虽然您希望准确率相对较高(约为 0.80 到 0.90),但不希望准确率过高或非常接近 1.00,因为这意味着权重已接近过拟合调整数据。在这种情况下,模型在处理与调整示例明显不同的请求时表现不佳。默认情况下,部署脚本会选择周期 17 的权重,其准确率通常约为 0.90。

如需将生成的权重部署到 Web 应用,请执行以下操作:

  1. 在终端窗口中,导航到 k-gemma-it/ 目录。

    cd spoken-language-tasks/k-gemma-it/
    
  2. 使用 deploy_weights 脚本运行调参过程:

    ./deploy_weights.sh
    

运行此脚本后,您应该会在 k-mail-replier/k_mail_replier/weights/ 目录中看到一个新的 *.h5 文件。

测试新模型

将新权重部署到应用后,就可以试用新调参的模型了。为此,您可以重新运行 Web 应用并生成响应。

如需运行并测试项目,请执行以下操作:

  1. 在终端窗口中,导航到 /k_mail_replier/ 目录。

    cd spoken-language-tasks/k-mail-replier/
    
  2. 使用 run_flask_app.sh 脚本运行应用:

    ./run_flask_app.sh
    
  3. 启动 Web 应用后,程序代码会列出一个网址,您可以在此网址中浏览和测试,通常此地址为:

    http://127.0.0.1:5000/
    
  4. 在 Web 界面中,按第一个输入字段下方的 답변 작성 按钮,以便模型生成回答。

现在,您已在应用中调优并部署了 Gemma 模型!对该应用进行实验,并尝试确定已调参模型针对任务生成能力的限制。如果您发现模型在某些场景下表现不佳,不妨考虑通过添加请求并提供理想的响应,将其中一些请求添加到调整示例数据列表中。然后,重新运行调整流程,重新部署新的权重,并测试输出。

其他资源

如需详细了解此项目,请参阅 Gemma 食谱代码库。如果您在构建应用时需要帮助,或者希望与其他开发者合作,请访问 Google 开发者社区 Discord 服务器。如需查看更多“利用 Google AI 构建”项目,请参阅视频播放列表