使用调优和评估提高 LLM 性能
本文档介绍了如何创建引用 Vertex AI text-bison
基础模型的 BigQuery ML 远程模型。然后,本文档还会介绍如何使用监督式调优来借助新的训练数据对模型进行调优,随后是使用 ML.EVALUATE
函数 评估函数。
这可以帮助您应对需要自定义托管 Vertex AI 模型的场景,例如模型的预期行为难以在提示中简洁定义,或者提示无法产生一致性足够好的预期结果。监督式调优还会通过以下方式影响模型:
- 引导模型返回特定的响应样式,例如更简洁或更详细。
- 训练模型的新行为,例如以特定角色来响应提示。
- 使模型使用新信息自行更新。
所需权限
如需创建连接,您需要以下 Identity and Access Management (IAM) 角色:
roles/bigquery.connectionAdmin
如需向连接的服务账号授予权限,您需要以下权限:
resourcemanager.projects.setIamPolicy
如需使用 BigQuery ML 创建模型,您需要以下 IAM 权限:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
如需运行推断,您需要以下权限:
- 表的
bigquery.tables.getData
权限 - 模型的
bigquery.models.getData
权限 bigquery.jobs.create
- 表的
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, Vertex AI, and Compute Engine APIs.
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- BigQuery: You incur costs for the queries that you run in BigQuery.
- BigQuery ML: You incur costs for the model that you create and the processing that you perform in BigQuery ML.
- Vertex AI: You incur costs for calls to and
supervised tuning of the
text-bison
model.
您可使用价格计算器根据您的预计使用情况来估算费用。
如需了解详情,请参阅以下资源:
创建数据集
创建 BigQuery 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
公共数据集存储在
US
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
创建连接
创建 Cloud 资源连接并获取连接的服务账号。在上一步中创建的数据集所在的位置创建连接。
从下列选项中选择一项:
控制台
转到 BigQuery 页面。
如需创建连接,请点击
添加,然后点击与外部数据源的连接。在连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)。
在连接 ID 字段中,输入连接的名称。
点击创建连接。
点击转到连接。
在连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。
bq
在命令行环境中,创建连接:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
参数会替换默认项目。替换以下内容:
REGION
:您的连接区域PROJECT_ID
:您的 Google Cloud 项目 IDCONNECTION_ID
:您的连接的 ID
当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。
问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
检索并复制服务账号 ID 以在后续步骤中使用:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
输出类似于以下内容:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
将以下部分附加到 main.tf
文件中。
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }替换以下内容:
CONNECTION_ID
:您的连接的 IDPROJECT_ID
:您的 Google Cloud 项目 IDREGION
:您的连接区域
向服务账号授予访问权限
向您的服务账号授予 Vertex AI Service Agent 角色,以便服务账号可以访问 Vertex AI。未能授予此角色会导致错误。从下列选项中选择一项:
控制台
前往 IAM 和管理页面。
点击
授予访问权限。系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
点击选择角色
在过滤条件中,输入
Vertex AI Service Agent
,然后选择该角色。点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.serviceAgent' --condition=None
请替换以下内容:
PROJECT_NUMBER
:您的项目编号MEMBER
:您之前复制的服务账号 ID
与您的连接关联的服务账号是 BigQuery 连接委托服务代理的实例,因此允许为其分配服务代理角色。
向 Compute Engine 默认服务账号授予访问权限
启用 Compute Engine API 后,Compute Engine 默认服务账号会自动被授予项目的 Editor 角色,除非您已对项目停用此行为。如果是这种情况,您必须重新向 Compute Engine 默认服务账号授予 Editor 角色,使其拥有足够权限来创建和调优远程模型。
控制台
前往 IAM 和管理页面。
点击
授予访问权限。在新的主账号中,输入服务账号 ID,即
PROJECT_NUMBER-compute@developer.gserviceaccount.com
。点击选择角色
在请选择一个角色中,选择基本,然后选择 Editor。
点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/editor' --condition=None
替换以下内容:
PROJECT_NUMBER
:您的项目编号。MEMBER
:服务账号 ID,即PROJECT_NUMBER-compute@developer.gserviceaccount.com
。
创建调优服务代理
如需创建 AI Platform 微调服务代理的实例,请执行以下操作:
使用
gcloud beta services identity create
命令创建调优服务代理:gcloud beta services identity create --service=aiplatform.googleapis.com --project=PROJECT_NUMBER
将
PROJECT_NUMBER
替换为您的项目编号。使用
gcloud projects add-iam-policy-binding
命令向调优服务代理授予 Vertex AI Service Agent (roles/aiplatform.serviceAgent
) 角色:gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:service-PROJECT_NUMBER@gcp-sa-aiplatform-ft.iam.gserviceaccount.com' --role='roles/aiplatform.serviceAgent'
将
PROJECT_NUMBER
替换为您的项目编号。
创建测试表
根据转写医疗报告的公共 MTSamples 数据集创建训练和评估数据表。此数据集具有一个 input_text
列(其中包含医学转写文稿),以及一个 output_text
列(其中包含最能描述转写文稿类别的标签),例如 Allergy/Immunology
、Dentistry
或 Cardiovascular/Pulmonary
。此外,请创建一个表,其中包含医疗转写文稿分类的提示数据。
您可以从公共 Cloud Storage 存储桶导入医疗转写数据。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句以创建评估数据表:
LOAD DATA INTO `bqml_tutorial.medical_transcript_eval` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_eval_sample.jsonl']);
在查询编辑器中,运行以下语句以创建训练数据表:
LOAD DATA INTO `bqml_tutorial.medical_transcript_train` FROM FILES(format='NEWLINE_DELIMITED_JSON', uris = ['gs://cloud-samples-data/vertex-ai/model-evaluation/peft_train_sample.jsonl']);
在查询编辑器中,运行以下语句以创建提示表:
CREATE OR REPLACE TABLE `bqml_tutorial.transcript_classification` AS (SELECT 'Please assign a label for the given medical transcript from among these labels [Allergy / Immunology, Autopsy, Bariatrics, Cardiovascular / Pulmonary, Chiropractic, Consult - History and Phy., Cosmetic / Plastic Surgery, Dentistry, Dermatology, Diets and Nutritions, Discharge Summary, ENT - Otolaryngology, Emergency Room Reports, Endocrinology, Gastroenterology, General Medicine, Hematology - Oncology, Hospice - Palliative Care, IME-QME-Work Comp etc., Lab Medicine - Pathology, Letters, Nephrology, Neurology, Neurosurgery, Obstetrics / Gynecology, Office Notes, Ophthalmology, Orthopedic, Pain Management, Pediatrics - Neonatal, Physical Medicine - Rehab, Podiatry, Psychiatry / Psychology, Radiology, Rheumatology, SOAP / Chart / Progress Notes, Sleep Medicine, Speech - Language, Surgery, Urology].' AS prompt);
创建基准模型
基于 Vertex AI text-bison
模型创建远程模型,以用于对医学转写内容进行分类。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句以创建远程模型:
CREATE OR REPLACE MODEL `bqml_tutorial.text_bison_001` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT ='text-bison@001');
替换以下内容:
LOCATION
:连接位置。CONNECTION_ID
:BigQuery 连接的 ID。当您在 Google Cloud 控制台中查看连接详情时,
CONNECTION_ID
是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如projects/myproject/locations/connection_location/connections/myconnection
。
查询需要几秒钟才能完成,之后
text_bison_001
模型会显示在探索器窗格的bqml_tutorial
数据集中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
检查基准模型性能
使用远程模型运行 ML.GENERATE_TEXT
函数,以查看其在不进行任何调优的情况下处理评估数据的表现。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_bison_001`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
如果您检查输出数据并比较
ml_generate_text_llm_result
和label
值,则会发现虽然基准模型正确预测了许多转写内容分类,但有些转写文稿的分类并不正确。以下是错误输出的代表性示例。在本示例中,正确的分类是Cardiovascular / Pulmonary
,而不是Radiology
。+-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | Radiology | {"blocked":false,"categories": | | Please assign a label for the given medical | Cardiovascular / Pulmonary | | | ["Derogatory","Health", | | transcript from among these labels [Allergy / | | | | "Insult","Public Safety",... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | INDICATIONS FOR PROCEDURE:, The patient has | | | | | | presented with atypical type right arm | | | | | | discomfort and neck discomfort. She had | | | | | | noninvasive vascular imaging demonstrating | | | | | | suspected right subclavian stenosis. Of note, | | | | | | there was bidirectional flow in the right | | | | | | vertebral artery, as well as 250 cm... | | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+
评估基准模型
如需对模型性能执行更详细的评估,请使用 ML.EVALUATE
函数。此函数会计算模型指标,例如精确率、召回率和 F1 得分,以查看模型的响应与理想响应的对比情况。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.text_bison_001`, ( SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS input_text, output_text FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
输出类似于以下内容:
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 1.0 | 0.66666666666666663 | 0.8 | Allergy / Immunology | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 1.0 | 1.0 | 1.0 | Autopsy | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 1.0 | 0.66666666666666663 | 0.8 | Bariatrics | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
如果您查看 f1_score
列中的结果,则会发现模型性能因转写文稿类别而异。F1 得分值越高表示性能越好。对于大多数类别,基准模型的性能都很好,但在其他类别(例如 Cardiovascular / Pulmonary
类和 Chiropractic
类)中性能不佳。基于这一点,您可以看出有必要执行监督式调优,以了解是否可提升此应用场景的模型性能。
创建已调参模型
创建一个与创建模型中所创建远程模型非常相似的远程模型,但这次指定 AS SELECT
子句,提供训练数据以对模型进行调优。此查询可能需要几个小时才能完成。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句以创建远程模型:
CREATE OR REPLACE MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS ( endpoint = 'text-bison@001', max_iterations = 300, data_split_method = 'no_split') AS SELECT CONCAT( (SELECT prompt FROM `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_train`;
替换以下内容:
LOCATION
:连接位置。CONNECTION_ID
:BigQuery 连接的 ID。当您在 Google Cloud 控制台中查看连接详情时,
CONNECTION_ID
是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如projects/myproject/locations/connection_location/connections/myconnection
。
查询可能需要几个小时才能完成,之后
text_bison_001_medical_transcript_tuned
模型会显示在探索器窗格的bqml_tutorial
数据集中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
检查调优后的模型性能
运行 ML.GENERATE_TEXT
函数以查看调优后模型在评估数据上的表现。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT(TRUE AS flatten_json_output)) ORDER BY ml_generate_text_llm_result;
如果您检查输出数据,则会发现调优后的模型对更多转写内容进行了正确分类。您之前查看的示例现已正确分类为
Cardiovascular/ Pulmonary
。+-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | label | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+ | Cardiovascular/Pulmonary | {"blocked":false,"categories": | | Please assign a label for the given medical | Cardiovascular / Pulmonary | | | ["Derogatory","Health", | | transcript from among these labels [Allergy / | | | | "Insult","Public Safety",... | | Immunology, Autopsy, Bariatrics, | | | | | | Cardiovascular / Pulmonary, Chiropractic, | | | | | | Consult - History and Phy., Cosmetic / | | | | | | Plastic Surgery, Dentistry, Dermatology, | | | | | | Diets and Nutritions, Discharge Summary, ENT | | | | | | - Otolaryngology, Emergency Room Reports, | | | | | | Endocrinology, Gastroenterology, General | | | | | | Medicine, Hematology - Oncology, Hospice - | | | | | | Palliative Care, IME-QME-Work Comp etc., | | | | | | Lab Medicine - Pathology, Letters, | | | | | | Nephrology, Neurology, Neurosurgery, | | | | | | Obstetrics / Gynecology, Office Notes, | | | | | | Ophthalmology, Orthopedic, Pain Management, | | | | | | Pediatrics - Neonatal, Physical Medicine - | | | | | | Rehab, Podiatry, Psychiatry / Psychology, | | | | | | Radiology, Rheumatology, SOAP / Chart / | | | | | | Progress Notes, Sleep Medicine, Speech - | | | | | | Language, Surgery, Urology]. | | | | | | TRANSCRIPT: | | | | | | INDICATIONS FOR PROCEDURE:, The patient has | | | | | | presented with atypical type right arm | | | | | | discomfort and neck discomfort. She had | | | | | | noninvasive vascular imaging demonstrating | | | | | | suspected right subclavian stenosis. Of note, | | | | | | there was bidirectional flow in the right | | | | | | vertebral artery, as well as 250 cm... | | +-----------------------------+---------------------------------+-------------------------------------------------------------------------+----------------------------+
评估调优后的模型
使用 ML.EVALUATE
函数查看经过调优的模型的响应与理想响应的对比情况。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.text_bison_001_medical_transcript_tuned`, ( SELECT CONCAT( (SELECT prompt from `bqml_tutorial.transcript_classification`), ' ', input_text) AS prompt, output_text AS label FROM `bqml_tutorial.medical_transcript_eval` ), STRUCT('classification' AS task_type)) ORDER BY label;
输出类似于以下内容:
+------------------------------+----------------------------------+-------------------------------------------------------------------------+ | precision | recall | f1_score | label | evaluation_status | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+ | 0.8571428571428571 | 0.66666666666666663 | 0.75 | Dermatology | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+ --------------------+----------------------------+--------------------------------------------+ | 0.54545454545454541 | 0.4 | 0.46153846153846156 | Discharge Summary | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+--------------- -----+----------------------------+--------------------------------------------+ | 1.0 | 1.0 | 1.0 | Diets and Nutritions | { | | | | | | "num_successful_rows": 164, | | | | | | "num_total_rows": 164 | | | | | | } | +---------------------+---------------------+---------------------+----------------------------+--------------------------------------------+
您可以看到,虽然训练数据集仅使用 519 个样本,但是性能显著提高。基准模型表现不佳的标签的 F1 得分有所提高,所有标签的 F1 得分平均值从 0.54 增加到 0.63。
清理
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.