أدوات الذكاء الاصطناعي 101
تتبع نماذج اللغة الكبيرة مع MLflow: دليل كامل

随着大型语言模型(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密钥管理。
测试端点
创建端点后,我们可以测试它:
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=(
"根据答案的正式和专业程度进行评分(0-4):\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():











