跳到主要内容

MLflow 中的 OpenAI

注意

openai flavor 正在积极开发中,并标记为实验性。公共 API 可能会更改,随着新功能添加到此 flavor 中,可能会增加新功能。

概述

MLflow 中集成 OpenAI 的高级语言模型,为创建和使用基于 NLP 的应用程序开辟了新领域。它使用户能够利用 GPT-4 等模型的尖端功能来完成各种任务,从会话式 AI 到复杂的文本分析和嵌入生成。这种集成是使高级 NLP 在 MLflow 这样的强大框架内变得可访问和可管理的重大飞跃。

超越简单部署:利用 OpenAI 和 MLflow 构建强大的 NLP 应用程序

虽然 MLflow 中的 openai flavor 简化了 OpenAI 模型的日志记录和部署,但其真正潜力在于释放 NLP 应用程序的全部力量。通过与 MLflow 的无缝集成,您可以:

定制特定任务的服务

直接访问大型语言模型并不能保证有价值的服务。虽然功能强大,但没有提示的模型可能过于笼统,导致意外的输出或与应用程序意图不符的响应。MLflow 使用户能够针对特定任务定制模型,实现所需的功能,同时确保上下文和控制。

这使得您可以:

  • 定义提示和参数:您可以定义特定的提示和参数来指导模型的响应,将模型的功能集中在所需任务上,而不是依赖开放式输入。
  • 保存和部署定制模型:保存的模型及其提示和参数可以轻松部署和共享,从而确保一致的行为和性能。
  • 执行冠军/挑战者评估:MLflow 允许用户轻松比较不同的提示、参数和部署配置,有助于选择最有效的模型来完成特定任务。

简化部署和比较

MLflow 简化了部署流程,使您能够:

  • 将模型打包并部署为应用程序:openai flavor 简化了模型打包过程,将提示、配置参数和推理参数打包成一个单一的可移植工件。
  • 比较不同的方法:通过一致的打包,您可以轻松比较不同的模型、提示、配置和部署选项,有助于做出明智的决策。
  • 利用 MLflow 的生态系统:MLflow 与各种工具和平台集成,允许用户在不同的环境中部署模型,从云平台到本地服务器。

利用 MLflow 和 OpenAI 进行高级提示工程和版本追踪:释放 LLM 的真正潜力

MLflow 和 OpenAI 的集成标志着大型语言模型 (LLM) 提示工程领域的范式转变。虽然基本提示可以实现基本功能,但这种强大的组合释放了 LLM 的全部潜力,使开发人员和数据科学家能够细致地构建和优化提示,开启了定向且有影响力的应用程序的新时代。

超越基础:拥抱迭代实验

忘记静态提示和有限的应用吧!MLflow 和 OpenAI 通过以下方式彻底改变了流程,促进了迭代实验:

  • 追踪与比较:MLflow 记录并细致地追踪每个提示迭代及其性能指标。这允许对不同版本进行精细比较,从而做出明智的决策并识别最有效的提示。
  • 可重现实验的版本控制:每个提示迭代都在 MLflow 中安全存储和版本控制。这允许轻松回滚和比较,促进实验和优化,同时确保可重现性,这是科学进步的关键方面。
  • 灵活参数化:MLflow 可以控制在推理时允许修改哪些参数,使您能够控制创造力(温度)和最大 token 长度(用于成本)。

优化最佳结果:A/B 测试和微调

MLflow 和 OpenAI 使您能够通过以下方式突破 LLM 性能的界限:

  • 通过 A/B 测试选择最优提示:对不同的提示变体和参数配置执行高效的 A/B 测试。这有助于识别针对特定任务和用户配置文件的最有效组合,从而显著提高性能。
  • 定制提示以实现预期结果:迭代和有组织的实验使您能够专注于对您的应用程序最有意义的内容。无论您优先考虑事实准确性、创造性表达还是对话流畅性,MLflow 和 OpenAI 都使您能够调整提示以优化特定的性能指标。这确保您的 LLM 应用程序一次又一次地提供所需的结果。

协作与分享:推动创新和进步

MLflow 和 OpenAI 的力量超越了个人项目。通过促进协作和分享,它们加速了 LLM 应用程序的进步

  • 可共享工件促进协作创新:MLflow 将提示、参数、模型版本和性能指标打包成可共享的工件。这使得研究人员和开发人员能够无缝协作,利用彼此的见解和优化提示来加速进展。

利用 MLflow 优化提示工程

  • 迭代改进:MLflow 的追踪系统支持提示工程的迭代方法。通过记录每次实验,用户可以逐步优化其提示,以实现最有效的模型交互。
  • 协作实验:MLflow 的协作功能使团队能够分享和讨论提示版本和实验结果,促进了提示开发的协作环境。

现实世界影响

在现实世界的应用中,使用 MLflow 和 OpenAI 追踪和优化提示可以实现更准确、可靠和高效的语言模型实现。无论是在客户服务聊天机器人、内容生成还是复杂决策支持系统中,对提示和模型版本的细致管理都直接转化为增强的性能和用户体验。

这种集成不仅简化了使用高级 LLM 的复杂性,还为 NLP 应用的创新开辟了新途径,确保每次提示驱动的交互都尽可能有效和有影响力。

直接使用 OpenAI 服务

通过 MLflow 直接使用 OpenAI 服务,可以与最新的 GPT 模型进行无缝交互,完成各种 NLP 任务。

import logging
import os

import openai
import pandas as pd

import mlflow
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import ColSpec, ParamSchema, ParamSpec, Schema

logging.getLogger("mlflow").setLevel(logging.ERROR)

# Uncomment the following lines to run this script without using a real OpenAI API key.
# os.environ["MLFLOW_TESTING"] = "true"
# os.environ["OPENAI_API_KEY"] = "test"

assert (
"OPENAI_API_KEY" in os.environ
), "Please set the OPENAI_API_KEY environment variable."


print(
"""
# ******************************************************************************
# Single variable
# ******************************************************************************
"""
)
with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="gpt-4o-mini",
task=openai.chat.completions,
artifact_path="model",
messages=[{"role": "user", "content": "Tell me a joke about {animal}."}],
)


model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"animal": [
"cats",
"dogs",
]
}
)
print(model.predict(df))

list_of_dicts = [
{"animal": "cats"},
{"animal": "dogs"},
]
print(model.predict(list_of_dicts))

list_of_strings = [
"cats",
"dogs",
]
print(model.predict(list_of_strings))
print(
"""
# ******************************************************************************
# Multiple variables
# ******************************************************************************
"""
)
with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="gpt-4o-mini",
task=openai.chat.completions,
artifact_path="model",
messages=[
{"role": "user", "content": "Tell me a {adjective} joke about {animal}."}
],
)


model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"adjective": ["funny", "scary"],
"animal": ["cats", "dogs"],
}
)
print(model.predict(df))


list_of_dicts = [
{"adjective": "funny", "animal": "cats"},
{"adjective": "scary", "animal": "dogs"},
]
print(model.predict(list_of_dicts))

print(
"""
# ******************************************************************************
# Multiple prompts
# ******************************************************************************
"""
)
with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="gpt-4o-mini",
task=openai.chat.completions,
artifact_path="model",
messages=[
{"role": "system", "content": "You are {person}"},
{"role": "user", "content": "Let me hear your thoughts on {topic}"},
],
)


model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"person": ["Elon Musk", "Jeff Bezos"],
"topic": ["AI", "ML"],
}
)
print(model.predict(df))

list_of_dicts = [
{"person": "Elon Musk", "topic": "AI"},
{"person": "Jeff Bezos", "topic": "ML"},
]
print(model.predict(list_of_dicts))


print(
"""
# ******************************************************************************
# No input variables
# ******************************************************************************
"""
)
with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="gpt-4o-mini",
task=openai.chat.completions,
artifact_path="model",
messages=[{"role": "system", "content": "You are Elon Musk"}],
)

model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"question": [
"Let me hear your thoughts on AI",
"Let me hear your thoughts on ML",
],
}
)
print(model.predict(df))

list_of_dicts = [
{"question": "Let me hear your thoughts on AI"},
{"question": "Let me hear your thoughts on ML"},
]
model = mlflow.pyfunc.load_model(model_info.model_uri)
print(model.predict(list_of_dicts))

list_of_strings = [
"Let me hear your thoughts on AI",
"Let me hear your thoughts on ML",
]
model = mlflow.pyfunc.load_model(model_info.model_uri)
print(model.predict(list_of_strings))


print(
"""
# ******************************************************************************
# Inference parameters with chat completions
# ******************************************************************************
"""
)
with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="gpt-4o-mini",
task=openai.chat.completions,
artifact_path="model",
messages=[{"role": "user", "content": "Tell me a joke about {animal}."}],
signature=ModelSignature(
inputs=Schema([ColSpec(type="string", name=None)]),
outputs=Schema([ColSpec(type="string", name=None)]),
params=ParamSchema(
[
ParamSpec(name="temperature", default=0, dtype="float"),
]
),
),
)


model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"animal": [
"cats",
"dogs",
]
}
)
print(model.predict(df, params={"temperature": 1}))

Azure OpenAI 服务集成

openai flavor 支持记录使用Azure OpenAI 服务的模型。在记录以 Azure 端点为目标模型时,需要考虑 Azure OpenAI 服务与 OpenAI 服务之间的一些显著差异。

Azure 集成环境配置

要成功记录以 Azure OpenAI 服务为目标的模型,特定的环境变量对于身份验证和功能至关重要。

注意

以下环境变量包含高度敏感的访问密钥。请确保不要将这些值提交到源代码控制或在交互式环境中声明它们。环境变量应通过终端中的export命令、用户配置文件配置(即 .bashrc 或 .zshrc)或通过 IDE 的环境变量配置来设置。请不要泄露您的凭据。

  • OPENAI_API_KEY:Azure OpenAI 服务的 API 密钥。可以在 Azure 门户的“密钥和终结点”选项卡中的“密钥和终结点”部分找到此密钥。您可以使用KEY1KEY2
  • OPENAI_API_BASE:您的 Azure OpenAI 资源的基准终结点(例如,https://<您的服务名称>.openai.azure.com/)。在 Azure OpenAI 文档和指南中,此密钥被称为AZURE_OPENAI_ENDPOINT或简称ENDPOINT
  • OPENAI_API_VERSION:用于 Azure OpenAI 服务的 API 版本。有关更多信息,包括支持版本的最新列表,请参阅Azure OpenAI 文档
  • OPENAI_API_TYPE:如果使用 Azure OpenAI 终结点,则此值应设置为"azure"
  • OPENAI_DEPLOYMENT_NAME:您在 Azure 中部署模型时选择的部署名称。要了解更多信息,请访问Azure OpenAI 部署文档

MLflow 中的 Azure OpenAI 服务

在 MLflow 中集成 Azure OpenAI 模型的过程与直接使用 OpenAI 服务类似,但需要额外的 Azure 特有配置。

import openai
import pandas as pd

import mlflow

"""
Set environment variables for Azure OpenAI service
export OPENAI_API_KEY="<AZURE OPENAI KEY>"
# OPENAI_API_BASE should be the endpoint of your Azure OpenAI resource
# e.g. https://<service-name>.openai.azure.com/
export OPENAI_API_BASE="<AZURE OPENAI BASE>"
# OPENAI_API_VERSION e.g. 2023-05-15
export OPENAI_API_VERSION="<AZURE OPENAI API VERSION>"
export OPENAI_API_TYPE="azure"
export OPENAI_DEPLOYMENT_NAME="<AZURE OPENAI DEPLOYMENT ID OR NAME>"
"""

with mlflow.start_run():
model_info = mlflow.openai.log_model(
# Your Azure OpenAI model e.g. gpt-4o-mini
model="<YOUR AZURE OPENAI MODEL>",
task=openai.chat.completions,
artifact_path="model",
messages=[{"role": "user", "content": "Tell me a joke about {animal}."}],
)

# Load native OpenAI model
native_model = mlflow.openai.load_model(model_info.model_uri)
completion = openai.chat.completions.create(
deployment_id=native_model["deployment_id"],
messages=native_model["messages"],
)
print(completion["choices"][0]["message"]["content"])


# Load as Pyfunc model
model = mlflow.pyfunc.load_model(model_info.model_uri)
df = pd.DataFrame(
{
"animal": [
"cats",
"dogs",
]
}
)
print(model.predict(df))

list_of_dicts = [
{"animal": "cats"},
{"animal": "dogs"},
]
print(model.predict(list_of_dicts))

list_of_strings = [
"cats",
"dogs",
]
print(model.predict(list_of_strings))

list_of_strings = [
"Let me hear your thoughts on AI",
"Let me hear your thoughts on ML",
]
model = mlflow.pyfunc.load_model(model_info.model_uri)
print(model.predict(list_of_strings))

OpenAI 自动日志记录

注意

自动日志记录仅支持 OpenAI >= 1.17 版本。

要了解有关 OpenAI flavor 的自动日志记录支持的更多信息,请参阅自动日志记录指南

有关更多示例,请单击此处

您的 NLP 之旅的下一步

我们邀请您利用 MLflow 和 OpenAI 的强大组合来开发创新的 NLP 应用程序。无论是创建交互式 AI 驱动平台,通过深度 NLP 洞察增强数据分析,还是探索 AI 的新前沿,这种集成都将作为您探索的坚实基础。

补充学习

如果您对 OpenAI 的 GPT 模型与其他语言模型有何不同感到好奇,我们在下面简要概述了它们的训练过程(经过了大量简化)。这只是它们如此优秀并能以如此像人类的方式响应的一个小方面,但它提供了一个有趣的视角,说明这些模型的微调过程与更传统的监督机器学习过程有何不同。

GPT 模型中的 RLHF

OpenAI 的 GPT 模型的一个显著特征是它们的训练过程,特别是使用人类反馈强化学习(RLHF)。这种方法在几个方面使 GPT 模型与其他传统语言模型不同(尽管它们不是唯一使用此策略的组织,但它是显著增强其服务质量的关键流程组成部分)。

RLHF 流程

  1. 监督微调 (SFT):最初,GPT 模型使用大量文本数据集进行监督微调。此过程赋予模型对语言和上下文的基本理解。
  2. 奖励建模 (RM):人类训练师审查模型的输出并根据相关性、准确性和安全性等标准对其进行评分。此反馈用于创建“奖励模型”——一个评估模型响应质量的系统。
  3. 近端策略优化 (PPO):在此阶段,使用强化学习技术训练模型,并由奖励模型进行指导。模型学习生成与人类训练师判断的值和偏好更一致的响应。
  4. 迭代改进:模型通过人类反馈进行持续优化,确保其发展和适应,以产生与人类审阅者提供的反馈偏好相一致的响应。

为什么 RLHF 很重要

  • 类人响应:RLHF 使 GPT 模型能够生成与人类思维过程非常相似的响应,从而使其在实际应用中更具相关性和有效性。
  • 安全性和相关性:通过人类反馈,GPT 模型学习避免生成有害或不相关的内容,从而提高了其可靠性和适用性。
  • 成本效益高:与通过大量整理训练数据集来确保只生成所需输出相比,RLHF 允许进行更高效且更具成本效益的训练。

A primer on RLHF for sophisticated LLM training

RLHF 简化概述