你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
微调可自定义预先训练的 AI 模型,并针对特定任务或数据集进行其他训练,以提高性能、添加新技能或增强准确性。 结果是基于提供的示例的全新优化 GenAI 模型。 本文将带你了解微调的用例,以及它如何在你的 GenAI 之旅中为你提供帮助。
考虑对 GenAI 模型进行微调以:
- 缩放并适应特定的企业需求
- 减少误报,因为自定义的模型不太可能产生不准确或不相关的响应
- 提高模型针对特定领域任务的准确性
- 通过更快、更精确的结果节省时间和资源
- 由于模型针对特定用例进行了微调,可获得更相关且具有上下文感知的结果
Azure AI Foundry 提供了来自多个模型提供商的若干模型,使你能够获取市场上更新、更强大的模型。 查看此列表以获取更多详细信息。
微调入门
在开启生成式 AI 之旅时,我们建议你从提示工程和 RAG 入手,以便熟悉基础模型及其功能。
- 提示工程是一种涉及使用语气和风格详细信息、示例响应以及意图映射来为自然语言处理模型设计提示的技术。 此过程可提高响应的准确度和相关性,从而优化模型的性能。
- 检索增强生成 (RAG) 通过检索外部源中的数据并将其整合为提示,来提升 LLM 的性能。 RAG 可帮助企业实现自定义解决方案,同时保持数据相关性并优化成本。
当你逐渐上手并开始构建解决方案时,了解提示工程的不足之处以及何时应该尝试微调很重要。
- 基础模型是否无法处理边缘案例或出现异常?
- 基础模型是否未能始终如一地以正确格式提供输出?
- 是否很难在上下文窗口中放入足够多的示例来引导模型?
- 是否存在高延迟?
基础模型和提示工程失败的示例可以帮助你确定为微调而收集的数据,并建立一个性能基线,以便你能够对照该基线评估和比较微调后的模型。 获得在没有微调的情况下的性能基线是了解微调是否能够带来更强的模型性能的关键。
下面是一个示例:
客户希望使用 GPT-4o-Mini 将自然语言问题转换为特定非标准查询语言的查询。 该客户在提示中提供指导(“始终返回 GQL”)并使用 RAG 检索数据库架构。 但是,语法有时会出现错误,并且在处理边缘案例时经常失败。 该客户收集了数千个自然语言问题和数据库的等效查询示例,包括之前模型失败的案例。 然后,该客户使用该数据来微调模型。 将经过微调的新模型与经过工程提示和检索的模型结合,让模型输出的准确度提升到了可接受的使用标准。
用例
基础模型已经通过大量数据进行了预训练。 大多数情况下,您可以向提示添加说明和示例,以获得所需的高质量响应 - 此过程称为“少量样本学习”。微调使您能够用更多示例来训练模型,这些示例可以根据特定用例进行定制,从而优化少量样本学习的效果。 微调可以减少提示中的令牌数,从而导致潜在的成本节省,并使请求具有较低的延迟。
将自然语言转换为查询语言只是一个用例,你可以通过演示而不是告诉的方式来展现模型的行为方式。 下面是一些其他用例:
- 提高模型对检索到的数据的处理能力
- 引导模型以特定的风格、语气或格式输出内容
- 提高查找信息时的准确性
- 缩短提示的长度
- 教授新技能(即自然语言到代码的转换)
如果发现你的主要动因是代价,则请三思而后行。 微调可能通过缩短提示或让你使用更小的模型来降低某些用例的成本。 但是,训练的前期成本可能更高,你必须支付托管自己的自定义模型的费用。
微调模型的步骤
大致来说,微调要求你:
- 准备和上传训练数据,
- 训练一个经过微调的新模型。
- 对新训练的模型进行评估
- 部署用于推理的模型,以及
- 在应用程序中使用微调的模型
需要特别指出的是,微调在很大程度上取决于你所能提供的数据质量。 最佳做法是提供数百甚至数千个训练示例以获得成功并得到期望的结果。
数据准备工作
要使用哪些数据来进行微调?
微调过程首先选择预先训练的模型并准备针对目标任务定制的相关数据集。 此数据集应反映模型将在部署中看到的输入类型。
按照此链接查看和下载 示例数据集 ,尝试微调。
例如,如果目标是微调情绪分析模型,则数据集将包括按情绪分类的标记文本示例(正面、负面、中性)。 然后,在此数据集上重新训练模型,调整其参数以更好地与新任务保持一致。 与从头开始训练模型相比,这种重新训练过程通常需要更少的计算资源,因为它基于现有功能。
即使拥有好的用例,微调的质量仅与能够提供的数据质量一样好。 不同的模型需要不同的数据卷,但通常需要以正确的格式提供相当大量的高质量特选数据。 可以使用此示例存储库了解格式设置条件和数据准备。
若要微调用于聊天或问答的模型,训练数据集应反映模型将处理的交互类型。 下面是数据集需包含的一些关键元素:
- 提示和响应:每个条目都应包含提示(例如用户问题)和相应的响应(例如模型的答复)。
- 上下文信息:对于多轮次对话,包括以前的交流,以帮助模型了解上下文并保持一致性。
- 各种示例:涵盖一系列主题和方案,以提高通用化和稳定性。
- 人为生成的响应:使用人类编写的响应来教模型如何生成自然和准确的答复。
- 格式设置:使用清晰的结构分隔提示和响应。 例如,
\n\n###\n\n
并确保分隔符不会显示在内容中。
数据准备的最佳做法
训练示例越多越好。 如果没有至少 10 个训练示例,微调作业将无法继续,但如此少的数量不足以显著影响模型响应。 最佳做法是提供数百个(如果不是数千个)训练示例来获得成功。 100 个优质示例优于 1000 个差示例。
通常,将数据集大小加倍会促使模型质量呈线性增长。 但请记住,低质量的示例可能会对性能产生负面影响。 如果你根据大量内部数据来训练模型,而不是先修剪数据集以便获得最高质量的示例,则最终可能会得到一个性能比预期差得多的模型。
数据标签的最佳做法
准确且一致的标签对于训练模型至关重要。 遵循以下最佳做法:
- 确保数据多样性:包括所有典型的变体,例如文档格式(数字与扫描)、布局差异、不同的表大小和可选字段。
- 明确定义字段:使用有语义意义的字段名称(例如,effective_date),尤其是在自定义模型中,并遵循例如 PascalCase 或 camelCase 的一致命名约定。
- 保持标签一致性:确保跨文档进行统一标签,尤其是针对重复值。
- 拆分数据:分隔训练集和验证集,以评估未见数据的模型,并避免过度拟合。
- 大规模标记:如适用,确保每个类至少有 50 个带标签的文档。
- 结合自动化和评审:使用 AI 生成的标签加速流程,将手动精力集中在复杂或关键字段上。
模型选择
选择正确的模型进行微调是影响性能、效率和成本的关键决策。 在做出选择之前,必须明确定义任务并建立所需的性能指标。 定义完善的任务可确保所选模型符合特定要求,优化工作量和资源。
模型选择的最佳做法
- 根据域特定性和用例选择模型:首先评估一般功能的行业标准模型,然后评估针对特定用例微调的模型。 如果你的任务需要深厚的领域专业知识,请选择专为行业定制的模型可以提高准确性和效率,同时减少对广泛微调的需求。
- 评估排行榜上的模型性能:查看基准排行榜以评估预先训练的模型对相关任务的表现。 专注于关键指标,例如准确性、一致性、延迟和特定于域的基准,以确定微调的坚实基础。
- 试验模型场:利用交互式测试环境来评估基础模型在实际用例上的性能。 通过调整提示、温度和其他参数,可以在投资微调之前识别性能差距。
- 权衡模型大小、复杂性、成本和性能之间的权衡:较大的模型可以提供更高的准确度,但具有更高的计算成本和延迟。 根据部署需求考虑效率和精度之间的平衡。
训练和评估
微调不仅仅是重新训练新数据集的问题;它还涉及仔细考虑各种超参数和技术,以平衡准确性和通用化。 关键风险在于过度拟合,模型过于狭隘地适应训练数据,从而减少了对看不见的输入的有效性。 为了缓解过度拟合和优化性能,微调要求调整参数,例如学习率、正则化、批大小、训练轮数和种子设置。
在微调中使用评估
你应为微调的成功明确设定目标。 理想情况下,这些应该超越定性度量值,并包括定量指标,例如使用维持验证集、执行用户验收测试或 A/B 测试,将微调模型与基本模型进行比较。
模型训练可以由指标指导。 例如,BLEU-4 用于在微调模型以生成胸部 X 射线报告时评估训练,如本文所示。 此外,还可以在训练时监视指标。 如果损失曲线未按预期收敛,可以暂停作业、分析和恢复。
使用中间检查点进行更好的模型选择。 定期保存检查点(例如每隔几个周期),并评估其性能。 在某些情况下,中间检查点可能优于最终模型,使你能够选择最佳版本,而不是只依赖于最后一次训练的迭代。
部署和监视
- 选择适当的部署基础结构,例如基于云的平台或本地服务器。
- 持续监视模型的性能,并进行必要的调整,以确保最佳性能。
- 考虑满足企业 SLA 的区域部署需求和延迟要求。 实现安全防护措施(如专用链接、加密和访问控制),以保护敏感数据并保持符合组织策略。
支持微调的模型
现在,你已了解何时为用例使用微调,接下来可以前往 Azure AI Foundry 查找可用于微调的模型。 对于模型目录中的某些模型,可以使用标准部署或托管计算(预览版)或两者进行微调。
对于通过标准部署部署部署的某些模型,可在特定的 Azure 区域中进行微调。 要对这类模型进行微调,用户必须在模型可供微调的区域拥有一个中心/项目。 有关详细信息 ,请参阅标准部署中的模型的区域可用性 。
有关使用托管计算进行微调的详细信息(预览版),请参阅使用托管计算(预览版)微调模型。
有关可用于微调的 Azure AI Foundry 模型中的 Azure OpenAI 的详细信息,请参阅本指南后面的 Foundry 模型文档中的 Azure OpenAI 文档 或 Azure OpenAI 模型表 。
对于可以微调的 Azure OpenAI 模型,支持的微调区域包括美国中北部、瑞典中部等。
微调 Azure OpenAI 模型
注释
gpt-35-turbo
- 此模型的微调仅限于一小部分区域,并且基础模型在可用的每个区域中都不可用。
如果在 Azure AI Foundry 项目内部(而不是在某个项目外部)使用 Azure OpenAI 模型,则支持进行微调的区域可能会有所不同。
模型 ID | 标准培训区域 | 全球培训(预览版) | 最大请求(标记) | 训练数据(上限) | 形式 |
---|---|---|---|---|---|
gpt-35-turbo (1106) |
美国东部 2 美国中北部 瑞典中部 瑞士西部 |
- | 输入:16,385 输出:4,096 |
2021 年 9 月 | 文本转文本 |
gpt-35-turbo (0125) |
美国东部 2 美国中北部 瑞典中部 瑞士西部 |
- | 16,385 | 2021 年 9 月 | 文本转文本 |
gpt-4o-mini (2024-07-18) |
美国中北部 瑞典中部 |
- | 输入:128,000 输出:16,384 训练示例上下文长度:65,536 |
2023 年 10 月 | 文本转文本 |
gpt-4o (2024-08-06) |
美国东部 2 美国中北部 瑞典中部 |
- | 输入:128,000 输出:16,384 训练示例上下文长度:65,536 |
2023 年 10 月 | 文本和视觉转文本 |
gpt-4.1 (2025-04-14) |
美国中北部 瑞典中部 |
✅ | 输入:128,000 输出:16,384 训练示例上下文长度:65,536 |
2024 年 5 月 | 文本和视觉转文本 |
gpt-4.1-mini (2025-04-14) |
美国中北部 瑞典中部 |
✅ | 输入:128,000 输出:16,384 训练示例上下文长度:65,536 |
2024 年 5 月 | 文本转文本 |
gpt-4.1-nano (2025-04-14) |
美国中北部 瑞典中部 |
- | 输入:128,000 输出:16,384 训练示例上下文长度:32,768 |
2024 年 5 月 | 文本转文本 |
o4-mini (2025-04-16) |
美国东部 2 瑞典中部 |
- | 输入:128,000 输出:16,384 训练示例上下文长度:65,536 |
2024 年 5 月 | 文本转文本 |
注释
全局训练(公共预览版)为每个令牌提供更实惠的训练,但不提供数据驻留。 它目前可用于以下区域中的 Azure OpenAI 资源,即将推出更多区域:
- 澳大利亚东部
- 巴西南部
- EastUS2
- 法国中部
- 德国中西部
- 意大利北部
- 日本东部 (无视力支持)
- 韩国中部
- 美国中北部
- 挪威东部
- 波兰中部
- 东南亚
- 南非北部
- 西班牙中部
- 瑞典中部
- 瑞士西部
微调的最佳做法
下面是一些最佳做法,可帮助提高用于微调各种应用程序中 LLM 的效率和效能。
- 从较小的模型开始:一个常见的错误是假设应用程序需要最新的、最大、最昂贵的模型。 尤其是对于更简单的任务,请从较小的模型开始,并且仅在需要时尝试更大的模型。
- 根据域需求选择模型:从行业标准模型开始,然后再考虑针对特定用例的微调版本。 使用基准排行榜评估性能并在模型操场中测试真实场景。 平衡准确性、成本和效率,确保最适合部署。
- 收集大型高质量数据集:LLM 对数据有强烈需求,可以从拥有更多样化且更具代表性的数据中获益,从而进行微调。 但是,收集和批注大型数据集的成本高昂且耗时。 因此,还可以使用综合数据生成技术来增加数据集的大小和多样性。 但是,还应确保综合数据与任务和域相关且一致。 此外,请确保它不会向模型引入干扰或偏差。
- 首先尝试微调子集:若要评估获取更多数据的价值,可以在当前数据集的子集上微调模型,以了解性能如何随数据集大小缩放。 这种微调可以帮助你估计模型的学习曲线,并确定添加更多数据是否值得付出的努力和成本。 还可以将模型的性能与预先训练的模型或基线进行比较。 此比较显示了通过微调可以实现的改进程度。
- 试验超参数:以迭代方式调整超参数以优化模型性能。 超参数(如学习速率、批大小和纪元数)可能会对模型的性能产生显著影响。 因此,应尝试使用不同的值和超参数组合来查找任务和数据集的最佳值和组合。
- 尝试不同的数据格式:根据任务,不同的数据格式可能会对模型的性能产生不同的影响。 例如,对于分类任务,可以使用将提示和完成与特殊标记分开的格式,例如 {“prompt”: “Paris##\n”, “completion”: “ city\n###\n”}。 请务必使用适合应用程序的格式。