使用 Gemma 打造企业电子邮件 AI 助理

处理客户咨询(包括电子邮件)是许多企业运营的必要环节,但很快就会让人应接不暇。不过,借助 Gemma 等人工智能 (AI) 模型,您可以更轻松地完成这项工作。

每家企业处理电子邮件等咨询的方式略有不同,因此,能够根据业务需求调整生成式 AI 等技术非常重要。此项目旨在解决以下具体问题:将发送给面包店的电子邮件中的订单信息提取为结构化数据,以便快速添加到订单处理系统中。通过使用 10 到 20 个咨询示例和所需输出,您可以调整 Gemma 模型来处理客户的电子邮件,帮助您快速回复,并与您现有的业务系统集成。此项目构建为一种 AI 应用模式,您可以对其进行扩展和调整,以便从 Gemma 模型中获得业务价值。

如需观看项目概览视频,了解如何扩展项目(包括项目构建者的真知灼见),请观看 Business Email AI Assistant Build with Google AI 视频。您还可以在 Gemma Cookbook 代码库中查看此项目的代码。 否则,您可以按照以下说明开始扩展项目。

概览

本教程将引导您完成以下操作:设置、运行和扩展使用 Gemma、Python 和 Flask 构建的商务电子邮件助理应用。该项目提供了一个基本的 Web 用户界面,您可以根据需要对其进行修改。该应用旨在从客户电子邮件中提取数据,并将其整理成虚构面包店的结构化数据。您可以将此应用模式用于任何使用文本输入和文本输出的业务任务。

Web 应用界面的屏幕截图

图 1. 用于处理烘焙店电子邮件咨询的项目界面

硬件要求

在具有图形处理单元 (GPU) 或张量处理单元 (TPU) 的计算机上运行此调优流程,并确保 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
  • 启动磁盘大小:为数据、模型和支持软件预配至少 50 GB 的磁盘空间。

项目设置

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

安装和配置

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

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

  • 安装 Python 3 和 venv Python 虚拟环境软件包:

    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 Demos/business-email-assistant/
    git sparse-checkout init --cone
    

安装 Python 库

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

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

  1. 在终端窗口中,导航到 business-email-assistant 目录:

    cd Demos/business-email-assistant/
    
  2. 为此项目配置并激活 Python 虚拟环境 (venv):

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

    ./setup_python.sh
    

设置环境变量

此项目需要一些环境变量才能运行,包括 Kaggle 用户名和 Kaggle API 令牌。您必须拥有 Kaggle 账号并申请 Gemma 模型访问权限,才能下载这些模型。对于此项目,您需要将 Kaggle 用户名和 Kaggle API 令牌添加到两个 .env 文件中,这两个文件分别由 Web 应用和调优程序读取。

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

  1. 按照 Kaggle 文档中的说明获取您的 Kaggle 用户名和令牌密钥。
  2. 按照 Gemma 设置页面中的获取 Gemma 访问权限说明操作,获取对 Gemma 模型的访问权限。
  3. 通过在项目克隆的每个位置创建 .env 文本文件,为项目创建环境变量文件:
    email-processing-webapp/.env
    model-tuning/.env
    
  4. 创建 .env 文本文件后,请向这两个文件添加以下设置:

    KAGGLE_USERNAME=<YOUR_KAGGLE_USERNAME_HERE>
    KAGGLE_KEY=<YOUR_KAGGLE_KEY_HERE>
    

运行并测试应用

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

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

  1. 在终端窗口中,导航到 email-processing-webapp 目录:

    cd business-email-assistant/email-processing-webapp/
    
  2. 使用 run_app 脚本运行应用:

    ./run_app.sh
    
  3. 启动 Web 应用后,程序代码会列出您可用于浏览和测试的网址。此地址通常为:

    http://127.0.0.1:5000/
    
  4. 在 Web 界面中,按第一个输入字段下方的获取数据按钮,以生成模型回答。

由于模型必须在首次生成运行时完成初始化步骤,因此在您运行应用后,模型返回的第一个回答需要更长时间。在已运行的 Web 应用上完成后续提示请求和生成所需的时间更短。

扩展应用

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

应用会向模型提供指令以及来自用户的输入数据,从而构成完整的模型提示。您可以修改这些指令来更改模型的行为,例如指定要生成的 JSON 的参数名称和结构。一种更简单的方法是,为模型的回答提供额外的指令或指导,例如指定生成的回答不应包含任何 Markdown 格式。

如需修改提示指令,请执行以下操作:

  1. 在开发项目中,打开 business-email-assistant/email-processing-webapp/app.py 代码文件。
  2. app.py 代码中,向 get_prompt(): 函数添加其他指令:

    def get_prompt():
      return """
        Extract the relevant details of this request and return them in
        JSON code, with no additional markdown formatting:\n"""
    

此示例在说明中添加了“没有额外的 Markdown 格式”这一短语。

提供额外的提示说明可以对生成的输出产生很大影响,而且实现起来也容易得多。您应先尝试此方法,看看能否从模型中获得所需的行为。 不过,使用提示指令修改 Gemma 模型的行为存在一定的局限性。具体而言,模型的总体输入令牌限制(对于 Gemma 2 为 8,192 个令牌)要求您在详细的提示指令与您提供的新数据的大小之间取得平衡,以确保不超过该限制。

对模型进行调参

建议对 Gemma 模型进行微调,使其能够更可靠地响应特定任务。特别是,如果您希望模型生成具有特定结构的 JSON(包括具有特定名称的参数),则应考虑针对该行为调整模型。根据您希望模型完成的任务,您可以使用 10 到 20 个示例实现基本功能。本教程的这一部分将介绍如何设置和运行 Gemma 模型的微调,以完成特定任务。

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

硬件要求

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

准备数据

在开始调优 Gemma 模型之前,您必须先准备好用于调优的数据。在针对特定任务调整模型时,您需要一组请求和响应示例。这些示例应显示请求文本(不含任何指令)和预期响应文本。首先,您应准备一个包含大约 10 个示例的数据集。这些示例应涵盖各种请求和理想的回答。确保请求和回答不重复,因为这可能会导致模型回答重复,并且无法根据请求的变化进行适当调整。如果您正在调整模型以生成结构化数据格式,请确保提供的所有回答都严格符合您所需的数据输出格式。下表显示了相应代码示例的数据集中的一些示例记录:

请求 响应
Indian Bakery Central,您好!\n 请问您手头有 10 个 pendas 和 30 个 bundi ladoos 吗?另外,你们是否出售香草糖霜和巧克力口味的蛋糕?我想要 6 英寸的 { "type": "inquiry", "items": [ { "name": "pendas", "quantity": 10 }, { "name": "bundi ladoos", "quantity": 30 }, { "name": "cake", "filling": null, "frosting": "vanilla", "flavor": "chocolate", "size": "6 in" } ] }
我在 Google 地图上看到了您的商家。你们销售 jellabi 和 gulab jamun 吗? { "type": "inquiry", "items": [ { "name": "jellabi", "quantity": null }, { "name": "gulab jamun", "quantity": null } ] }

表 1. 烘焙店电子邮件数据提取器的调优数据集的部分列表。

数据格式和加载

您可以采用任何方便的格式(包括数据库记录、JSON 文件、CSV 或纯文本文件)存储调优数据,只要您能够通过 Python 代码检索记录即可。此项目将 data 目录中的 JSON 文件读取到字典对象数组中。在此示例调优程序中,使用 prepare_tuning_dataset() 函数在 model-tuning/main.py 模块中加载调优数据集:

def prepare_tuning_dataset():
    # collect data from JSON files
    prompt_data = read_json_files_to_dicts("./data")
    ...

如前所述,您可以采用任何方便的格式存储数据集,只要能够检索到请求和关联的响应,并将它们组装成一个文本字符串(用作调优记录)即可。

组装调参记录

在实际的调优过程中,程序会将每个请求和响应组装成一个字符串,其中包含提示指令和响应内容。然后,调谐程序会对字符串进行分词,以供模型使用。您可以在 model-tuning/main.py 模块的 prepare_tuning_dataset() 函数中看到用于组装调谐记录的代码,如下所示:

def prepare_tuning_dataset():
    ...
    # prepare data for tuning
    tuning_dataset = []
    template = "{instruction}\n{response}"

    for prompt in prompt_data:
        tuning_dataset.append(template.format(instruction=prompt["prompt"],
                                              response=prompt["response"]))

    return tuning_dataset

此函数将数据作为输入,并在指令和回答之间添加换行符来设置数据格式。

生成模型权重

在您准备好并加载了调谐数据后,即可运行调谐程序。此示例应用的调优过程使用 Keras NLP 库通过低秩自适应 (LoRA) 技术来调优模型,以生成新的模型权重。与全精度调优相比,使用 LoRA 可显著节省内存,因为它会近似计算模型权重的变化。然后,您可以将这些近似权重叠加到现有模型权重上,以更改模型的行为。

执行调优运行并计算新的权重:

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

    cd business-email-assistant/model-tuning/
    
  2. 使用 tune_model 脚本运行调优流程:

    ./tune_model.sh
    

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

gemma2-2b_inquiry_tuned_4_epoch##.lora.h5

问题排查

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

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

部署调优的模型

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

...
8/8 ━━━━━━━━━━━━━━━━━━━━ 121s 195ms/step - loss: 0.5432 - sparse_categorical_accuracy: 0.5982
Epoch 2/3
8/8 ━━━━━━━━━━━━━━━━━━━━ 2s 194ms/step - loss: 0.3320 - sparse_categorical_accuracy: 0.6966
Epoch 3/3
8/8 ━━━━━━━━━━━━━━━━━━━━ 2s 192ms/step - loss: 0.2135 - sparse_categorical_accuracy: 0.7848

虽然您希望准确率相对较高(约为 0.80),但也不希望准确率过高或非常接近 1.00,因为这意味着权重已接近于对调优数据过拟合。在这种情况下,对于与调整示例显著不同的请求,模型的效果不佳。默认情况下,部署脚本会选择 epoch 3 权重,该权重通常具有大约 0.80 的准确率。

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

  1. 在终端窗口中,导航到 model-tuning 目录:

    cd business-email-assistant/model-tuning/
    
  2. 使用 deploy_weights 脚本运行调优流程:

    ./deploy_weights.sh
    

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

测试新模型

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

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

  1. 在终端窗口中,导航到 email-processing-webapp 目录:

    cd business-email-assistant/email-processing-webapp/
    
  2. 使用 run_app 脚本运行应用:

    ./run_app.sh
    
  3. 启动 Web 应用后,程序代码会列出可供您浏览和测试的网址,通常是以下地址:

    http://127.0.0.1:5000/
    
  4. 在 Web 界面中,按第一个输入字段下方的获取数据按钮,以生成模型回答。

您现在已在应用中调优并部署了 Gemma 模型!试用该应用,并尝试确定调优后的模型在执行您的任务时所能达到的生成能力上限。如果您发现模型在某些场景中表现不佳,可以考虑将其中一些请求添加到微调示例数据列表中,方法是添加请求并提供理想的回答。然后重新运行调优流程,重新部署新权重,并测试输出。

其他资源

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