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

随着大型语言模型(LLM)的复杂性和规模的增长,跟踪其性能、实验和部署变得越来越具有挑战性。这就是 MLflow 的用途——提供一个全面的平台来管理整个机器学习模型的生命周期,包括 LLM。
在这篇深入的指南中,我们将探讨如何利用 MLflow 来跟踪、评估和部署 LLM。我们将涵盖从设置环境到高级评估技术的所有内容,并提供大量的代码示例和最佳实践。
设置您的环境
在我们深入探讨使用 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
<p>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()。 - 工件:与运行相关的任何其他文件或数据,例如模型检查点、可视化或数据集样本。使用
mlflow.log_artifact()来存储这些工件。
让我们看一个基本的示例,记录一个 LLM 运行:
此示例演示了记录参数、指标和输入/输出作为表格工件。
import mlflow
import openai
<p>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()</p>
<p>with mlflow.start_run():
prompt = "用简单的术语解释机器学习的概念。"</p>
<p># 记录参数
mlflow.log_param("model", "text-davinci-002")
mlflow.log_param("max_tokens", 100)</p>
<p># 查询 LLM 并记录结果
result = query_llm(prompt)
mlflow.log_metric("response_length", len(result))</p>
<p># 记录提示和响应
mlflow.log_table("prompt_responses", {"prompt": [prompt], "response": [result]})</p>
<p>print(f"响应:{result}")
使用 MLflow 部署 LLM
MLflow 提供了强大的功能来部署 LLM,使得在生产环境中提供您的模型变得更加容易。让我们探索如何使用 MLflow 的部署功能来部署一个 LLM。
创建端点
首先,我们将使用 MLflow 的部署客户端创建一个 LLM 的端点:
import mlflow
from mlflow.deployments import get_deploy_client
<p># 初始化部署客户端
client = get_deploy_client("databricks")</p>
<p># 定义端点配置
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",
},
},
}],
}</p>
<p># 创建端点
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">
<p>response = client.predict(
endpoint=endpoint_name,
inputs={"prompt": "简要解释神经网络的概念。", "max_tokens": 100,},
)</p>
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
<p>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}"},
],
)</p>
<p># 准备评估数据
eval_data = pd.DataFrame({
"question": ["什么是机器学习?", "解释神经网络。"],
"ground_truth": [
"机器学习是人工智能的一个子集,能够让系统从经验中学习和改进,而无需显式编程。",
"神经网络是受生物神经网络启发的计算系统,由处理和传输信息的相互连接的节点组成。",
]
})</p>
<p># 评估模型
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
)</p>
<p>print(f"评估指标:{results.metrics}")
此示例记录一个 OpenAI 模型,准备评估数据,然后使用 MLflow 的内置指标评估模型,用于问答任务。
自定义评估指标
MLflow 允许您定义自定义指标来评估 LLM。以下是创建一个自定义指标的示例,用于评估响应的专业性:
from mlflow.metrics.genai import EvaluationExample, make_genai_metric
<p>professionalism = make_genai_metric(
name="professionalism",
definition="正式和适当的沟通风格的衡量标准。",
grading_prompt=(
"根据回答的正式和专业程度对其进行评分(0-4 分)。\n"
"0:非常随意或不恰当\n"
"1:随意但尊重\n"
"2:中度正式\n"
"3:专业和适当\n"
"4:非常正式和精心制作"
),
examples=[
EvaluationExample(
input="什么是 MLflow?",
output="MLflow 是一个用于管理机器学习项目的工具包。它非常酷!",
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,
)</p>
<p># 在评估中使用自定义指标
results = mlflow.evaluate(
logged_model_info.model_uri,
eval_data,
targets="ground_truth",
model_type="question-answering",
extra_metrics=[professionalism]
)</p>
<p>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
<p># 加载和预处理文档
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)</p>
<p># 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)</p>
<p># 创建 RAG 链
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)</p>
<p># 评估函数
def evaluate_rag(question):
result = qa_chain({"query": question})
return result["result"], [doc.page_content for doc in result["source_documents"]]</p>
<p># 准备评估数据
eval_questions = [
"什么是 MLflow?",
"MLflow 如何处理实验跟踪?",
"MLflow 的主要组件是什么?"
]</p>
<p># 使用 MLflow 进行评估
with mlflow.start_run():
for question in eval_questions:
answer, sources = evaluate_rag(question)</p>
<p>mlflow.log_param(f"question", question)
mlflow.log_metric("num_sources", len(sources))
mlflow.log_text(answer, f"answer_{question}.txt")</p>
<p>for i, source in enumerate(sources):
mlflow.log_text(source, f"source_{question}_{i}.txt")</p>
<p># 记录自定义指标
mlflow.log_metric("avg_sources_per_question", sum(len(evaluate_rag(q)[1]) for q in eval_questions) / len(eval_questions))
此示例设置了一个 RAG 系统,使用 LangChain 和 Chroma,然后使用 MLflow 进行评估,记录问题、答案、检索的源文件和自定义指标。
分块策略评估
文档的分块方式会显著影响 RAG 的性能。MLflow 可以帮助您评估不同的分块策略:
import mlflow
from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter
<p>def evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class):
splitter = splitter_class(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
chunks = splitter.split_documents(documents)</p>
<p>with mlflow.start_run():
mlflow.log_param("chunk_size", chunk_size)
mlflow.log_param("chunk_overlap", chunk_overlap)
mlflow.log_param("splitter_class", splitter_class.__name__)</p>
<p>mlflow.log_metric("num_chunks", len(chunks))
mlflow.log_metric("avg_chunk_length", sum(len(chunk.page_content) for chunk in chunks) / len(chunks))</p>
<p># 评估检索性能(简化)
correct_retrievals = sum(1 for _ in range(100) if simulate_retrieval(chunks))
mlflow.log_metric("retrieval_accuracy", correct_retrievals / 100)</p>
<p># 评估不同的策略
for chunk_size in [500, 1000, 1500]:
for chunk_overlap in [0, 50, 100]:
for splitter_class in [CharacterTextSplitter, TokenTextSplitter]:
evaluate_chunking_strategy(documents, chunk_size, chunk_overlap, splitter_class)</p>
<p># 比较结果
best_run = mlflow.search_runs(order_by=["metrics.retrieval_accuracy DESC"]).iloc[0]
print(f"最佳分块策略:{best_run['params.splitter_class']},大小 {best_run['params.chunk_size']},重叠 {best_run['params.chunk_overlap']}")
此脚本评估不同的分块大小、重叠和分割方法的组合,并将结果记录到 MLflow 中以便于比较。
可视化 LLM 评估结果
MLflow 提供了多种方法来可视化您的 LLM 评估结果。以下是一些技术:
使用 MLflow UI
运行评估后,您可以使用 MLflow UI 来可视化结果:
- 启动 MLflow UI:
mlflow ui - 在 Web 浏览器中打开
http://localhost:5000 - 选择您的实验和运行以查看指标、参数和工件
自定义可视化
您可以使用 Matplotlib 或 Plotly 等库创建评估结果的自定义可视化,然后将其记录为工件:
import matplotlib.pyplot as plt
import mlflow
<p>def plot_metric_comparison(metric_name, run_ids):
plt.figure(figsize=(10, 6))
for run_id in run_ids:
run = mlflow.get_run(run_id)
metric_values = mlflow.get_metric_history(run_id, metric_name)
plt.plot([m.step for m in metric_values], [m.value for m in metric_values], label=run.data.tags.get("mlflow.runName", run_id))</p>
<p>plt.title(f"{metric_name} 比较")
plt.xlabel("步骤")
plt.ylabel(metric_name)
plt.legend()</p>
<p># 保存和记录图表
plt.savefig(f"{metric_name}_comparison.png")
mlflow.log_artifact(f"{metric_name}_comparison.png")</p>
<p># 使用
with mlflow.start_run():
plot_metric_comparison("answer_relevance", ["run_id_1", "run_id_2", "run_id_3"])
此函数创建一个比较特定指标在多个运行中的线图,并将其记录为工件。
开源 MLflow 的替代方案
有许多替代开源 MLflow 的选项来管理机器学习工作流,包括:
托管 MLflow
托管 MLflow 由 Databricks 提供,提供了开源 MLflow 的核心功能,并具有额外的好处,例如与 Databricks 生态系统的无缝集成、先进的安全功能和托管基础设施。这使其成为需要强大安全性和可扩展性的组织的绝佳选择。
Azure 机器学习
Azure 机器学习 提供了 Microsoft Azure 云平台上的端到端机器学习解决方案。它提供了与 MLflow 组件(如模型注册表和实验跟踪器)兼容的功能,尽管它不是基于 MLflow。
专用 ML 平台
几家公司提供具有多种功能的托管 ML 产品:
- neptune.ai:专注于实验跟踪和模型管理。
- Weights & Biases:提供广泛的实验跟踪、数据集版本控制和协作工具。
- Comet ML:提供实验跟踪、模型生产监控和数据记录。
- Valohai:专门从事机器学习管道和编排。
Metaflow
Metaflow 由 Netflix 开发,是一个开源框架,旨在编排数据工作流和 ML 管道。虽然它在大规模部署方面表现出色,但与 MLflow 相比,它缺乏全面实验跟踪和模型管理功能。
Amazon SageMaker 和 Google 的 Vertex AI
Amazon SageMaker 和 Google 的 Vertex AI 都提供了各自云平台上的端到端 MLOps 解决方案。这些服务提供了用于在大规模构建、训练和部署机器学习模型的强大工具。
详细比较
托管 MLflow 与开源 MLflow
托管 MLflow 由 Databricks 提供,相比开源版本具有多个优势,包括:
- 设置和部署:与 Databricks 的集成减少了设置时间和工作量。
- 可扩展性:能够轻松处理大规模的机器学习工作负载。
- 安全和管理:具有内置的安全功能,例如基于角色的访问控制(RBAC)和数据加密。
- 集成:与 Databricks 服务的深度集成,增强了互操作性和功能。
- 数据存储和备份:自动备份策略确保数据安全和可靠性。
- 成本:用户为平台、存储和计算资源付费。
- 支持和维护:Databricks 提供专用支持和维护。
结论
使用 MLflow 跟踪大型语言模型提供了一个强大的框架来管理 LLM 开发、评估和部署的复杂性。通过遵循本指南中概述的最佳实践和高级功能,您可以创建更有组织、更可复现和更有见地的 LLM 实验。
请记住,LLM 的领域正在迅速发展,新的评估和跟踪技术不断涌现。请随时关注最新的 MLflow 版本和 LLM 研究,以不断完善您的跟踪和评估流程。
随着您在项目中应用这些技术,您将对 LLM 的行为和性能有更深入的了解,从而带来更有效、更可靠的语言模型。














