MLflow 中的 OpenAI
openai
类型正在积极开发中,并标记为实验性。公共 API 可能会更改,并且随着更多功能添加到该类型中,新功能可能会被添加。
概述
将 OpenAI 的高级语言模型集成到 MLflow 中,为创建和使用基于 NLP 的应用程序开辟了新领域。它使用户能够利用 GPT-4 等模型的尖端功能来执行各种任务,从对话式 AI 到复杂的文本分析和嵌入生成。这种集成是使高级 NLP 在 MLflow 等强大框架中易于访问和管理的一大进步。
超越简单部署:使用 OpenAI 和 MLflow 构建强大的 NLP 应用程序
MLflow 中的 openai 类型简化了 OpenAI 模型的日志记录和部署,但其真正潜力在于释放 NLP 应用程序的全部功能。通过与 MLflow 无缝集成,您可以
打造任务特定服务
直接访问大型语言模型并不能保证有价值的服务。虽然功能强大,但未经提示的模型可能过于通用,导致输出不当或与应用程序意图不符的响应。MLflow 使用户能够针对特定任务定制模型,实现所需功能,同时确保上下文和控制。
这使您可以
- 定义提示和参数:您可以定义特定的提示和参数,而不是依赖开放式输入来引导模型的响应,从而将其功能集中在所需任务上。
- 保存和部署自定义模型:保存的模型及其提示和参数可以轻松部署和共享,确保一致的行为和性能。
- 执行冠军/挑战者评估:MLflow 允许用户轻松比较不同的提示、参数和部署配置,从而有助于为特定任务选择最有效的模型。
简化部署和比较
MLflow 简化了部署过程,使您能够
- 将模型打包并部署为应用程序:openai 类型简化了模型打包,将提示、配置参数和推理参数打包成一个单一的便携式工件。
- 比较不同方法:通过一致的打包,您可以轻松比较不同的模型、提示、配置和部署选项,从而促进明智的决策。
- 利用 MLflow 的生态系统:MLflow 与各种工具和平台集成,允许用户在不同的环境中部署模型,从云平台到本地服务器。
使用 MLflow 和 OpenAI 进行高级提示工程和版本跟踪:释放 LLM 的真正潜力
MLflow 和 OpenAI 的集成标志着大型语言模型 (LLM) 提示工程领域的范式转变。虽然基本提示可以实现基本功能,但这种强大的组合释放了 LLM 的全部潜力,使开发人员和数据科学家能够精心制作和完善提示,开创了一个有针对性和有影响力的应用程序新时代。
超越基础:拥抱迭代实验
忘记静态提示和有限的应用程序!MLflow 和 OpenAI 通过促进迭代实验来彻底改变流程,具体如下:
- 跟踪和比较:MLflow 记录并仔细跟踪提示的每次迭代及其性能指标。这允许对不同版本进行精细比较,从而实现明智的决策并识别最有效的提示。
- 可重现实验的版本控制:每个提示迭代都安全地存储在 MLflow 中并进行版本控制。这允许轻松回滚和比较,促进实验和完善,同时确保可重现性,这是科学进步的关键方面。
- 灵活的参数化:MLflow 允许控制在推理时允许修改哪些参数,使您能够控制创造力(温度)和最大令牌长度(用于成本)。
优化结果: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 门户的“密钥和终结点”选项卡的“密钥和终结点”部分找到。您可以使用
KEY1
或KEY2
。 - 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,
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 过程
- 监督微调 (SFT):最初,GPT 模型使用大量文本数据集进行监督微调。此过程赋予了对语言和上下文的基本理解。
- 奖励建模 (RM):人类训练员审查模型的输出并根据相关性、准确性和安全性等标准对其进行评分。此反馈用于创建“奖励模型”——一个评估模型响应质量的系统。
- 近端策略优化 (PPO):在此阶段,模型使用强化学习技术进行训练,并由奖励模型引导。模型学习生成与人类训练员判断的价值观和偏好更一致的响应。
- 迭代改进:模型通过人工反馈进行持续完善,确保其发展和适应以产生与人工审阅者提供的反馈偏好一致的响应。
为什么 RLHF 很重要
- 类人响应:RLHF 使 GPT 模型能够生成与人类思维过程密切相似的响应,使其在实际应用中更具相关性和有效性。
- 安全性和相关性:通过人工反馈,GPT 模型学习避免生成有害或不相关的内容,从而提高其可靠性和适用性。
- 经济高效的训练:与广泛整理训练数据集以确保仅生成所需输出相比,RLHF 允许更高效和经济高效的训练。