跳到主要内容

MLflow 中的 OpenAI

注意

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

概述

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

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

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

打造特定任务服务

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

这使您能够

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

简化部署和比较

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

  • 将模型打包并部署为应用程序:openai 风格简化了模型打包,将提示、配置参数和推理参数打包到一个可移植的工件中。
  • 比较不同方法:通过一致的打包,您可以轻松比较不同的模型、提示、配置和部署选项,从而促进明智的决策。
  • 利用 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,
name="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,
name="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,
name="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,
name="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,
name="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 风格支持记录使用 Azure OpenAI 服务的模型。Azure OpenAI 服务与 OpenAI 服务之间存在一些显著差异,在记录针对 Azure 端点的模型时需要考虑这些差异。

Azure 集成的环境配置

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

注意

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

  • OPENAI_API_KEY:Azure OpenAI 服务的 API 密钥。这可以在 Azure 门户的“密钥和终结点”选项卡下的“密钥和终结点”部分找到。您可以使用 KEY1KEY2
  • OPENAI_API_BASE:您的 Azure OpenAI 资源的基准终结点(例如,https://<your-service-name>.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,
name="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 风格的自动日志记录支持的更多信息,请参阅自动日志记录指南

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

您的 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 简化概述