跳到主要内容

高级教程:在 MLflow 中使用 OpenAI 的嵌入支持

下载此笔记本

欢迎阅读这份关于在 MLflow 框架内实现 OpenAI 嵌入的高级指南。本教程深入探讨 OpenAI 强大嵌入的配置和使用,这是现代机器学习模型中的一个关键组成部分。

了解嵌入

嵌入是一种表示学习形式,其中单词、短语甚至整个文档都被转换为高维空间中的向量。这些向量捕获语义意义,使模型能够更有效地理解和处理语言。嵌入广泛用于自然语言处理 (NLP) 中,用于文本分类、情感分析和语言翻译等任务。

嵌入的工作原理

嵌入的工作原理是将文本数据映射到向量,使得向量之间的距离和方向表示单词或短语之间的关系。例如,在一个经过良好训练的嵌入空间中,同义词彼此靠近,而无关术语则相距较远。这种空间排列使算法能够识别上下文和语义,从而增强它们解释和响应自然语言的能力。

本教程内容

  • 嵌入端点配置:在 MLflow 中设置和使用 OpenAI 的嵌入端点。
  • 真实世界的应用:比较各种网页的文本内容,以确定其上下文特定内容的相似程度的实际示例。
  • 效率和精度增强:使用 OpenAI 嵌入来提高模型性能的技术。

在本教程结束时,你将全面了解如何在你的 MLflow 项目中集成和利用 OpenAI 嵌入,从而利用高级 NLP 技术的强大功能。你还将看到使用文档的文本嵌入来比较其相似性的实际应用。这种用例对于 Web 内容开发特别有用,作为执行搜索引擎优化 (SEO) 的一项关键任务,以确保站点页面内容彼此之间不会过于相似(这可能会导致页面排名下降)。

所需软件包

为了运行本教程,你将需要从 PyPI 安装 beautifulsoup4

让我们深入了解嵌入的世界,探索它们对机器学习模型的变革性影响!

import warnings

# Disable a few less-than-useful UserWarnings from setuptools and pydantic
warnings.filterwarnings("ignore", category=UserWarning)
import os

import numpy as np
import openai
import requests
from bs4 import BeautifulSoup
from sklearn.metrics.pairwise import cosine_similarity, euclidean_distances

import mlflow
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import ColSpec, ParamSchema, ParamSpec, Schema, TensorSpec

assert "OPENAI_API_KEY" in os.environ, " OPENAI_API_KEY environment variable must be set"

将 OpenAI 模型与 MLflow 集成以进行文档相似性分析

在本教程部分中,我们将演示在 MLflow 中设置和使用 OpenAI 嵌入模型以进行文档相似性任务的过程。

关键步骤

  1. 设置 MLflow 实验:我们首先在 MLflow 中设置实验上下文,专门用于文档相似性,使用 mlflow.set_experiment("Documentation Similarity")

  2. 在 MLflow 中记录模型:我们启动一个 MLflow 运行,并记录元数据和访问配置参数,以便与特定的 OpenAI 端点进行通信。我们此处选择的 OpenAI 端点指向模型 "text-embedding-ada-002",该模型因其强大的嵌入功能而被选中。在此步骤中,我们将详细介绍这些访问配置、嵌入任务、输入/输出模式以及批量大小等参数。

  3. 加载已记录的模型以供使用:记录 MLflow 模型后,我们继续使用 MLflow 的 pyfunc 模块加载它。 这是在 MLflow 生态系统内应用该模型执行文档相似性任务的关键步骤。

这些步骤对于将对 OpenAI 嵌入模型的访问集成到 MLflow 中至关重要,从而促进诸如文档相似性分析之类的高级 NLP 操作。

mlflow.set_experiment("Documenatation Similarity")

with mlflow.start_run():
model_info = mlflow.openai.log_model(
model="text-embedding-ada-002",
task=openai.embeddings,
name="model",
signature=ModelSignature(
inputs=Schema([ColSpec(type="string", name=None)]),
outputs=Schema([TensorSpec(type=np.dtype("float64"), shape=(-1,))]),
params=ParamSchema([ParamSpec(name="batch_size", dtype="long", default=1024)]),
),
)

# Load the model in pyfunc format
model = mlflow.pyfunc.load_model(model_info.model_uri)

用于嵌入分析的网页文本提取

本教程的这一部分介绍旨在从网页中提取和准备文本的函数,这是应用嵌入模型进行分析之前的关键步骤。

函数概述

  1. insert_space_after_tags:

    • 在 BeautifulSoup 对象中的特定 HTML 标记后添加空格,以提高文本可读性。
  2. extract_text_from_url:

    • 使用 URL 和目标 ID 从指定的网页部分提取文本。 过滤和组织来自 <h><li><p> 等标记的文本,排除某些不相关的部分。

这些函数是预处理 Web 内容不可或缺的一部分,确保输入到嵌入模型的文本是干净、相关且结构良好的。

def insert_space_after_tags(soup, tags):
"""
Insert a space after each tag specified in the provided BeautifulSoup object.

Args:
soup: BeautifulSoup object representing the parsed HTML.
tags: List of tag names (as strings) after which space should be inserted.
"""
for tag_name in tags:
for tag in soup.find_all(tag_name):
tag.insert_after(" ")


def extract_text_from_url(url, id):
"""
Extract and return text content from a specific section of a webpage.
"""
try:
response = requests.get(url)
response.raise_for_status() # Raises HTTPError for bad requests (4XX, 5XX)
except requests.exceptions.RequestException as e:
return f"Request failed: {e}"

soup = BeautifulSoup(response.text, "html.parser")
target_div = soup.find("div", {"class": "section", "id": id})
if not target_div:
return "Target element not found."

insert_space_after_tags(target_div, ["strong", "a"])

content_tags = target_div.find_all(["h1", "h2", "h3", "h4", "h5", "h6", "li", "p"])
filtered_tags = [
tag
for tag in content_tags
if not (
(tag.name == "li" and tag.find("p") and tag.find("a", class_="reference external"))
or (tag.name == "p" and tag.find_parent("ul"))
or (tag.get_text(strip=True).lower() == "note")
)
]

return "
".join(tag.get_text(separator=" ", strip=True) for tag in filtered_tags)

详细工作流程:

  • 函数 extract_text_from_url 首先使用 requests 库获取网页内容。
  • 然后,它使用 BeautifulSoup 解析 HTML 内容。
  • 特定 HTML 标记是文本提取的目标,确保内容相关且结构良好,以便进行嵌入分析。
  • extract_text_from_url 中调用 insert_space_after_tags 函数以提高提取后的文本可读性。

测量嵌入之间的相似度和距离

在本教程的下一部分中,我们将使用 sklearn 中的两个函数来测量文档嵌入之间的相似度和距离,这对于评估和比较基于文本的机器学习模型至关重要。

函数概述

  1. cosine_similarity:

    • 目的:计算两个嵌入向量之间的余弦相似度。
    • 工作原理:此函数通过查找两个向量之间夹角的余弦值来计算相似度,这是评估两个文档在内容方面有多相似的常用方法。
    • 相关性:在 NLP 中非常有用,特别是对于诸如文档检索和聚类之类的任务,其目标是找到具有相似内容的文档。
  2. euclidean_distances:

    • 目的:计算两个嵌入向量之间的欧几里得距离。
    • 功能:与 cosine_similarity 类似,此函数计算欧几里得距离,欧几里得距离是嵌入空间中两个点之间的“直线”距离。 此度量标准有助于了解两个文档之间的差异程度。
    • NLP 中的相关性:提供更直观的物理距离度量,适用于文档分类和异常检测等任务。

这些函数对于分析和比较嵌入模型的输出至关重要,从而深入了解不同文本数据之间在相似性和差异方面的关系。

使用嵌入比较网页

本教程的这一部分介绍了一个函数 compare_pages,该函数旨在通过使用嵌入模型比较两个网页的内容。 此函数是了解两个给定网页在文本内容方面有多相似或不同的关键。

函数概述

  • 函数名称compare_pages
  • 目的:比较两个网页并返回基于其内容的相似性评分。
  • 参数:
    • url1url2:要比较的网页的 URL。
    • id1id2:每个页面上主要文本内容 div 的目标 ID。

工作原理

  1. 文本提取:该函数首先使用 extract_text_from_url 函数从每个网页的指定部分提取文本。
  2. 嵌入预测:然后,它使用先前加载的 OpenAI 模型为提取的文本生成嵌入。
  3. 相似度和距离测量:该函数计算两个嵌入之间的余弦相似度和欧几里得距离。 这些指标提供了网页内容相似或相异程度的可量化衡量标准。
  4. 结果:返回一个包含余弦相似度分数和欧几里得距离的元组。 如果文本提取失败,它将返回一条错误消息。

实际应用

此函数在需要比较不同网页的内容的场景中特别有用,例如在内容整理、剽窃检测或用于 SEO 目的的相似性分析中。

通过利用嵌入和相似性度量的强大功能,compare_pages 提供了一种强大的方法来定量评估网页内容的相似性和差异性。

def compare_pages(url1, url2, id1, id2):
"""
Compare two webpages and return the similarity score.

Args:
url1: URL of the first webpage.
url2: URL of the second webpage.
id1: The target id for the div containing the main text content of the first page
id2: The target id for the div containing the main text content of the second page

Returns:
A tuple of floats representing the similarity score for cosine similarity and euclidean distance.
"""
text1 = extract_text_from_url(url1, id1)
text2 = extract_text_from_url(url2, id2)

if text1 and text2:
embedding1 = model.predict([text1])
embedding2 = model.predict([text2])

return (
cosine_similarity(embedding1, embedding2),
euclidean_distances(embedding1, embedding2),
)
else:
return "Failed to retrieve content."

MLflow 文档页面之间的相似性分析

在本教程部分中,我们将通过比较 MLflow 文档中的两个特定页面来演示 compare_pages 函数的实际应用。 我们的目标是评估主要的大型语言模型 (LLM) 页面与 MLflow 2.8.1 版本中的 LLM 评估页面之间的内容相似程度。

流程概述

  • 目标网页:
  • 内容 ID:我们对主要 LLM 页面使用“llms”,对 LLM 评估页面使用“mlflow-llm-evaluate”,以定位特定内容部分。
  • 比较执行:使用这些 URL 和内容 ID 调用 compare_pages 函数以执行分析。

结果

  • 余弦相似度和欧几里得距离:该函数返回两个关键指标
    • 余弦相似度:测量两个页面的嵌入向量之间夹角的余弦值。 值越高表示相似度越大。
    • 欧几里得距离:表示嵌入空间中两个点之间的“直线”距离,值越低表示相似度越高。

解读

结果显示出高度的余弦相似度 (0.8792),表明这两个页面的内容在所涵盖的上下文和主题方面非常相似。 0.4914 的欧几里得距离虽然相对较低,但提供了补充的视角,表明内容具有一定程度的独特性。

结论

此分析突出了使用嵌入和相似性度量来比较网页内容的有效性。 在实践中,它有助于了解文档中的重叠和差异,从而帮助内容优化、减少冗余并确保主题的全面覆盖。

# Get the similarity between the main LLMs page in the MLflow Docs and the LLM Evaluation page for the 2.8.1 release of MLflow

llm_cosine, llm_euclid = compare_pages(
url1="https://www.mlflow.org/docs/2.8.1/llms/index.html",
url2="https://www.mlflow.org/docs/2.8.1/llms/llm-evaluate/index.html",
id1="llms",
id2="mlflow-llm-evaluate",
)

print(
f"The cosine similarity between the LLMs page and the LLM Evaluation page is: {llm_cosine} and the euclidean distance is: {llm_euclid}"
)
The cosine similarity between the LLMs page and the LLM Evaluation page is: [[0.879243]] and the euclidean distance is: [[0.49144073]]

MLflow LLM 和插件页面之间相似性的简要概述

本节演示了 MLflow 大型语言模型 (LLM) 页面与 2.8.1 版本的插件页面之间的快速相似性分析。

分析执行

结果

  • 余弦相似度:0.6806,表明内容具有中等相似性。
  • 欧几里得距离:0.7992,表明两个页面涵盖的上下文和主题存在显着差异。

结果反映了 LLM 页面和插件页面之间的中等相似度,它们的内容具有显着程度的独特性。 此分析有助于了解 MLflow 文档的不同部分之间的关系和内容重叠。

# Get the similarity between the main LLMs page in the MLflow Docs and the Plugins page for the 2.8.1 release of MLflow

plugins_cosine, plugins_euclid = compare_pages(
url1="https://www.mlflow.org/docs/2.8.1/llms/index.html",
url2="https://www.mlflow.org/docs/2.8.1/plugins.html",
id1="llms",
id2="mflow-plugins",
)

print(
f"The cosine similarity between the LLMs page and the MLflow Projects page is: {plugins_cosine} and the euclidean distance is: {plugins_euclid}"
)
The cosine similarity between the LLMs page and the MLflow Projects page is: [[0.68062298]] and the euclidean distance is: [[0.79922088]]

教程回顾:在 MLflow 中利用 OpenAI 嵌入

当我们结束本教程时,让我们回顾一下我们已经探索的关于在 MLflow 框架内使用 OpenAI 嵌入的关键概念和技术。

主要收获

  1. 在 MLflow 中集成 OpenAI 模型:

    • 我们学习了如何在 MLflow 中记录和加载 OpenAI 的“text-embedding-ada-002”模型,这是在机器学习工作流程中使用这些嵌入的关键步骤。
  2. 文本提取和预处理:

    • 本教程介绍了从网页中提取和预处理文本的方法,确保数据干净且结构化,以便进行嵌入分析。
  3. 计算相似度和距离:

    • 我们深入研究了用于测量文档嵌入之间的余弦相似度和欧几里得距离的函数,这对于比较文本内容至关重要。
  4. 真实世界的应用:网页内容比较:

    • 通过比较不同的 MLflow 文档页面,演示了这些概念的实际应用。 我们使用 OpenAI 模型生成的嵌入分析了它们内容中的相似性和差异。
  5. 解读结果:

    • 本教程提供了对相似性和距离指标的结果进行解读的见解,强调了它们在理解内容关系中的相关性。

结论

本高级教程旨在提高你应用 MLflow 中的 OpenAI 嵌入的技能,重点关注诸如文档相似性分析之类的实际应用。 通过集成这些强大的 NLP 工具,我们展示了如何从文本数据中提取更多价值和见解,这是现代机器学习项目的关键方面。

我们希望本指南能够提供丰富的信息,并有助于你增进对 MLflow 框架内 OpenAI 嵌入的理解和应用。

下一步是什么?

要继续您的学习之旅,请参阅有关 MLflow 的 OpenAI 风味的更多高级教程