AI 工具 101
使用 MLflow 跟踪大型语言模型(LLM):完整指南

随着大型语言模型(LLM)的复杂性和规模的增长,跟踪其性能、实验和部署变得越来越具有挑战性。这就是 MLflow 的用处——提供一个全面的平台来管理机器学习模型的整个生命周期,包括 LLM。
在这篇深入的指南中,我们将探讨如何利用 MLflow 来跟踪、评估和部署 LLM。我们将涵盖从设置环境到高级评估技术的所有内容,并在此过程中提供大量的代码示例和最佳实践。
MLflow 在大型语言模型(LLM)中的功能
MLflow 已成为机器学习和数据科学社区中的一个关键工具,尤其是在管理机器学习模型的生命周期方面。当谈到大型语言模型(LLM)时,MLflow 提供了一套强大的工具,可以大大简化开发、跟踪、评估和部署这些模型的过程。以下是 MLflow 在 LLM 领域中功能的概述以及它为工程师和数据科学家带来的好处。
跟踪和管理 LLM 交互
MLflow 的 LLM 跟踪系统是其现有跟踪功能的增强,专门针对 LLM 的独特需求。它允许对模型交互进行全面跟踪,包括以下关键方面:
- 参数: 记录输入参数的键值对,例如模型特定的参数,如
top_k和temperature。这为每次运行提供了上下文和配置,确保捕获模型配置的所有方面。 - 指标: 提供对 LLM 性能和准确性的洞察的量化措施。这些指标可以动态更新,因为运行正在进行,这样可以提供实时或后处理的洞察。
- 预测: 捕获发送到 LLM 的输入和相应的输出,这些输出以结构化格式存储为工件,以便于检索和分析。
- 工件: 除了预测之外,MLflow 还可以存储各种输出文件,例如可视化、序列化模型和结构化数据文件,从而可以对模型的性能进行详细的文档记录和分析。
这种结构化的方法确保所有与 LLM 的交互都被详细记录,提供了一个全面的大型语言模型的血统和质量跟踪。
LLM 的评估
评估 LLM 提出了独特的挑战,主要是由于其生成性质和缺乏单一的真实值。MLflow 通过为 LLM 设计的专用评估工具简化了这一过程。关键功能包括:
- 多功能模型评估: 支持评估各种类型的 LLM,例如 MLflow pyfunc 模型、指向注册的 MLflow 模型的 URI 或代表您的模型的任何 Python 可调用函数。
- 全面指标: 提供一系列针对 LLM 评估量身定制的指标,包括基于 SaaS 模型的指标(例如答案相关性)和基于函数的指标(例如 ROUGE、Flesch Kincaid)。
- 预定义的指标集合: 根据用例(例如问答或文本摘要),MLflow 提供预定义的指标来简化评估过程。
- 自定义指标创建: 允许用户定义和实现自定义指标以满足特定的评估需求,增强了模型评估的灵活性和深度。
- 使用静态数据集进行评估: 允许在不指定模型的情况下评估静态数据集,这对于不需要重新运行模型推理的快速评估很有用。
部署和集成
MLflow 还支持 LLM 的无缝部署和集成:
- MLflow 部署服务器: 作为与多个 LLM 提供者交互的统一接口。它简化了集成,安全地管理凭据,并提供了一致的 API 体验。该服务器支持来自流行的 SaaS 提供者和自托管模型的各种基础模型。
- 统一端点: 通过无需更改代码即可在提供者之间轻松切换,最大限度地减少停机时间并增强灵活性。
- 集成结果视图: 提供全面评估结果,可以直接在代码中访问或通过 MLflow UI 进行详细分析。
MLflow 的全面工具和集成使其成为与高级 NLP 模型合作的工程师和数据科学家的宝贵资产。
设置您的环境
在我们深入探讨使用 MLflow 跟踪 LLM 之前,让我们设置我们的开发环境。我们需要安装 MLflow 和几个其他关键库:
pip install mlflow>=2.8.1 pip install openai pip install chromadb==0.4.15 pip install langchain==0.0.348 pip install tiktoken pip install 'mlflow[genai]' pip install databricks-sdk --upgrade
安装完成后,重新启动 Python 环境是一个好习惯,以确保所有库都正确加载。在 Jupyter 笔记本中,您可以使用:
import mlflow
import chromadb
print(f"MLflow 版本:{mlflow.__version__}")
print(f"ChromaDB 版本:{chromadb.__version__}")
这将确认我们将要使用的关键库的版本。
了解 MLflow 的 LLM 跟踪功能
MLflow 的 LLM 跟踪系统建立在其现有的跟踪功能之上,添加了专门为 LLM 的独特方面而设计的功能。让我们分解关键组件:
运行和实验
在 MLflow 中,一个“运行”代表您模型代码的单次执行,而一个“实验”是相关运行的集合。对于 LLM,一个运行可能代表单个查询或一批由模型处理的提示。
关键跟踪组件
- 参数: 这些是您的 LLM 的输入配置,例如温度、top_k 或 max_tokens。您可以使用
mlflow.log_param()或mlflow.log_params()记录这些参数。 - 指标: 您的 LLM 性能的量化措施,例如准确率、延迟或自定义分数。使用
mlflow.log_metric()或mlflow.log_metrics()跟踪这些指标。 - 预测: 对于 LLM,记录输入提示和模型输出至关重要。MLflow 将这些输出存储为 CSV 格式的工件,使用
mlflow.log_table()。 - 工件: 与您的 LLM 运行相关的任何其他文件或数据,例如模型检查点、可视化或数据集样本。使用
mlflow.log_artifact()存储这些工件。
让我们看一个基本的 LLM 跟踪示例:
此示例演示了记录参数、指标和输入/输出作为表格工件。
import mlflow
import openai
def query_llm(prompt, max_tokens=100):
response = openai.Completion.create(
engine="text-davinci-002",
prompt=prompt,
max_tokens=max_tokens
)
return response.choices[0].text.strip()
with mlflow.start_run():
prompt = "用简单的语言解释机器学习的概念。"
# 记录参数
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)
# 查询 LLM 并记录结果
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))
# 记录提示和响应
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})
print(f"响应:{result}")
使用 MLflow 部署 LLM
MLflow 为 LLM 提供了强大的部署功能,使得在生产环境中部署模型变得更容易。让我们探索如何使用 MLflow 的部署功能部署 LLM。
创建端点
首先,我们将使用 MLflow 的部署客户端创建 LLM 的端点:
import mlflow
from mlflow.deployments import get_deploy_client
# 初始化部署客户端
client = get_deploy_client("databricks")
# 定义端点配置
endpoint_name = "llm-endpoint"
endpoint_config = {
"served_entities": [{
"name": "gpt-model",
"external_model": {
"name": "gpt-3.5-turbo",
"provider": "openai",
"task": "llm/v1/completions",
"openai_config": {
"openai_api_type": "azure",
"openai_api_key": "{{secrets/scope/openai_api_key}}",
"openai_api_base": "{{secrets/scope/openai_api_base}}",
"openai_deployment_name": "gpt-35-turbo",
"openai_api_version": "2023-05-15",
},
},
}],
}
# 创建端点
client.create_endpoint(name=endpoint_name, config=endpoint_config)
此代码使用 Azure OpenAI 设置 GPT-3.5-turbo 模型的端点。请注意使用 Databricks 秘密进行安全的 API 密钥管理。
测试端点
创建端点后,我们可以测试它:
<div class="relative flex flex-col rounded-lg">
response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "简要解释神经网络的概念。","max_tokens": 100,},)
print(response)
这将向我们的部署模型发送提示并返回生成的响应。
使用 MLflow 评估 LLM
评估对于理解 LLM 的性能和行为至关重要。MLflow 提供了全面的工具用于评估 LLM,包括内置和自定义指标。
准备您的 LLM 进行评估
要使用 mlflow.evaluate() 评估您的 LLM,您的模型需要以以下形式之一存在:
- 一个
mlflow.pyfunc.PyFuncModel实例或指向已记录的 MLflow 模型的 URI。 - 一个接受字符串输入并输出单个字符串的 Python 函数。
- 一个 MLflow Deployments 端点 URI。
- 设置
model=None并在评估数据中包含模型输出。
让我们看一个使用已记录的 MLflow 模型的示例:
import mlflow
import openai
with mlflow.start_run():
system_prompt = "简洁地回答以下问题。"
logged_model_info = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.chat.completions,
artifact_path="model",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{question}"},
],
)
# 准备评估数据
eval_data = pd.DataFrame({
"question": ["什么是机器学习?", "解释神经网络。"],
"ground_truth": [
"机器学习是人工智能的一个子集,能够让系统从经验中学习和改进,而无需显式编程。",
"神经网络是受生物神经网络启发的计算系统,由相互连接的节点组成,处理和传输信息。",
]
})
# 评估模型
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)
print(f"评估指标:{results.metrics}")
此示例记录一个 OpenAI 模型,准备评估数据,然后使用 MLflow 的内置指标评估模型,用于问答任务。
自定义评估指标
MLflow 允许您定义自定义指标来评估 LLM。以下是创建自定义指标的示例,以评估响应的专业性:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
professionalism = make_genai_metric(
name="professionalism",
definition="正式和适当的沟通风格的衡量标准。",
grading_prompt=(
"根据以下标准对答案的专业性进行评分:\n"
"0:极其随意或不适当\n"
"1:随意但尊重\n"
"2:中度正式\n"
"3:专业和适当\n"
"4:高度正式和精心制作"
),
examples=[
EvaluationExample(
input="什么是 MLflow?",
output="MLflow 就像您友好的邻居工具包,用于管理 ML 项目。它非常酷!",
score=1,
justification="答案很随意,使用非正式的语言。",
),
EvaluationExample(
input="什么是 MLflow?",
output="MLflow 是一个开源平台,用于机器学习的整个生命周期,包括实验、可复现性和部署。",
score=4,
justification="答案正式、简洁、专业。",
)
],
model="openai:/gpt-3.5-turbo-16k",
parameters={"temperature": 0.0},
aggregations=["mean", "variance"],
greater_is_better=True,
)
# 在评估中使用自定义指标
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)
print(f"专业性评分:{results.metrics['professionalism_mean']}")
此自定义指标使用 GPT-3.5-turbo 来评估响应的专业性,展示了如何利用 LLM 自身进行评估。
高级 LLM 评估技术
随着 LLM 变得更加复杂,评估它们的技术也变得更加先进。让我们探索一些使用 MLflow 的高级评估方法。
检索增强生成(RAG)评估
RAG 系统将检索和生成模型的力量相结合。评估 RAG 系统需要评估检索和生成组件。以下是如何设置 RAG 系统并使用 MLflow 进行评估:
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 加载和预处理文档
loader = WebBaseLoader([“https://mlflow.org/docs/latest/index.html”])
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
# 创建 RAG 链
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type=”stuff”,
retriever=vectorstore.as_retriever(),
return_source_documents=True
)
# 评估函数
def evaluate_rag(question):
result = qa_chain({“query”: question})
return result[“result”], [doc.page_content for doc in result[“source_documents”]]
# 准备评估数据
eval_questions = [
“什么是 MLflow?”,
“MLflow 如何处理实验跟踪?”,
“MLflow 的主要组件是什么?”,
]
# 使用 MLflow 进行评估
with mlflow.start_run():

