OpenAI 在 MLflow 中

注意

openai 风格正在积极开发中,并被标记为实验性。公共API可能会发生变化,随着更多功能的引入,可能会添加新功能。

概述

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

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

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

打造特定任务的服务

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

这使您能够:

  • 定义提示和参数:与其依赖开放式输入,不如定义特定的提示和参数来引导模型的响应,使其能力集中在所需的任务上。

  • 保存并部署自定义模型:保存的模型及其提示和参数可以轻松部署和共享,确保行为和性能的一致性。

  • 执行冠军/挑战者评估:MLflow 允许用户轻松比较不同的提示、参数和部署配置,从而促进为特定任务选择最有效的模型。

简化部署与比较

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

  • 将模型打包并部署为应用程序:openai 风格简化了模型打包,包括提示、配置参数和推理参数,将其整合为一个便携的工件。

  • 比较不同方法:通过一致的打包,您可以轻松比较不同的模型、提示、配置和部署选项,从而促进明智的决策。

  • 利用 MLflow 的生态系统:MLflow 与各种工具和平台集成,允许用户在从云平台到本地服务器的多样化环境中部署模型。

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

MLflow 与 OpenAI 的整合标志着大型语言模型(LLMs)提示工程领域的一个范式转变。虽然基本提示可以实现基本功能,但这种强大的组合解锁了LLMs的全部潜力,使开发人员和数据科学家能够精心设计和优化提示,迎来了一个新的时代,即目标明确且影响深远的应用。

超越基础:拥抱迭代实验

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

  • 跟踪与比较:MLflow 记录并细致地跟踪每个提示的每一次迭代及其性能指标。这使得可以对不同版本进行细致的比较,从而做出明智的决策并识别出最有效的提示。

  • 可重复实验的版本控制:每个提示迭代都在 MLflow 中安全存储并进行版本控制。这使得回滚和比较变得容易,促进了实验和改进,同时确保了可重复性,这是科学进步的关键方面。

  • 灵活的参数化:MLflow 允许控制哪些参数在推理时可以被修改,使您能够控制创造力(温度)和最大令牌长度(用于成本)。

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

MLflow 和 OpenAI 通过以下方式帮助你突破大语言模型性能的界限:

  • 最佳提示选择的A/B测试: 执行不同提示变体和参数配置的高效A/B测试。这使得能够识别特定任务和用户配置文件的最有效组合,从而带来显著的性能提升。

  • 定制提示以实现预期结果:迭代和有组织的实验使您能够专注于对您的应用最有意义的内容。无论是优先考虑事实准确性、创意表达还是对话流畅性,MLflow 和 OpenAI 都使您能够定制提示以优化特定的性能指标。这确保了您的 LLM 应用一次又一次地交付预期结果。

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

MLflow 和 OpenAI 的力量不仅限于单个项目。通过促进协作和分享,它们加速了 LLM 应用的发展:

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

利用 MLflow 进行优化的提示工程

  • 迭代改进:MLflow 的跟踪系统支持提示工程的迭代方法。通过记录每个实验,用户可以逐步优化他们的提示,推动实现最有效的模型交互。

  • 协作实验:MLflow 的协作功能使团队能够共享和讨论提示版本和实验结果,为提示开发营造一个协作环境。

现实世界的影响

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

这种集成不仅简化了与高级大型语言模型(LLMs)工作的复杂性,还为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 风格支持记录使用 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://<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,
        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 自动日志记录

注意

Autologging 仅支持 OpenAI >= 1.17。

要了解更多关于 OpenAI 风格的 autologging 支持,请 查看 autologging 指南

更多示例,请点击 这里

你在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 允许更高效和成本效益的培训。

关于RLHF在复杂LLM训练中的入门

RLHF 的简化概述