管理复杂的GenAI管道,尤其是在处理多个模型和数据源时,可能是一项艰巨的任务。本文展示了如何通过将LlamaIndex与Qdrant和MLflow集成来简化GenAI应用的管理与部署。您将探索MLflow的功能,如追踪、模型打包和评估,如何使LlamaIndex引擎的处理更加无缝。通过逐步实施过程,您将学习如何轻松简化检索增强生成(RAG)工作流程,确保性能的一致性,并更好地优化索引系统以提高效率。
M K Pavan Kumar所著
架构:该架构集成了多个关键组件,构建了一个高效且可扩展的检索增强生成(RAG)系统。核心是利用LlamaIndex进行索引和检索,使用Qdrant进行向量存储和搜索,并采用MLflow进行模型注册、服务和跟踪所有组件的生命周期。此设计旨在管理大量来自不同来源的数据,同时确保快速检索和准确推断,以满足用户需求。
管道从获取文档开始,这些文档来自各种来源(如网页文档、内部文档和数据库记录)。这些文档由变更数据捕获(CDC)系统处理,该系统跟踪数据的变化,确保新文档和更新后的文档始终反映到索引过程中。数据工程师负责系统这一部分,管理数据管道,将传入的文档输入到由LlamaIndex驱动的索引器。LlamaIndex 和 Qdrant 索引器为这些文档创建语义索引,并将向量存储在Qdrant数据库中,该数据库充当向量存储和检索引擎的作用。LlamaIndex和Qdrant之间的集成实现了高效且高性能的索引和检索功能。
一旦索引后,系统会利用MLflow保存模型,MLflow在整个LlamaIndex模型生命周期中扮演着至关重要的角色。MLflow能够追踪所有必要的元数据,包括模型的版本控制、模型跟踪和服务模型,确保在模型的开发、测试和部署各阶段的一致性和透明度。
在检索环节中,RAG-Bot 利用相同的 LlamaIndex 和 Qdrant 来设置,与用户的查询进行交互。RAG-Bot 处理传入的请求,并将这些请求发送至 LlamaIndex 检索器(来自 MLflow)。该检索器查询 Qdrant 存储以获取最相关的索引文档,这些文档与查询嵌入相对应。该检索器被设计为高速运行,从而能够快速响应用户。检索到的数据随后在推理过程中返回给用户。
MLflow 安装与配置:首先,你需要安装 MLflow。
pip install mlflow
使用pip安装mlflow
要开始使用MLflow,首先需要安装它。MLflow是一个开源工具,用于管理机器学习实验,追踪指标,打包代码并部署模型。执行pip install mlflow
命令将安装所有必要的依赖项,使MLflow可以在您的环境中运行。
3. 第三步:启动MLflow服务:
mlflow 服务器 # 这将在默认端口5000上运行服务器
mlflow 服务器 --host 127.0.0.1 --port 3001 # 在指定端口上运行服务器
mlflow UI 在端口 3001 上运行
2. 第二步:用MLflow编写代码来记录您的实验
import mlflow
import mlflow.sklearn
from sklearn.datasets import load_diabetes
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 加载糖尿病数据集
data = load_diabetes()
X = data.data
y = data.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 设置模型参数
alpha = 0.5
l1_ratio = 0.5
# 设置mlflow追踪uri
mlflow.set_tracking_uri('http://127.0.0.1:3001/')
# 启动一个MLflow运行
with mlflow.start_run():
# 对测试集进行预测
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
model.fit(X_train, y_train)
# 对测试集进行预测
predictions = model.predict(X_test)
# 计算评价指标
mse = mean_squared_error(y_test, predictions)
r2 = r2_score(y_test, predictions)
# 记录参数和指标至MLflow
mlflow.log_param("alpha", alpha)
mlflow.log_param("l1_ratio", l1_ratio)
mlflow.log_metric("mse", mse)
mlflow.log_metric("r2", r2)
# 保存模型到MLflow
mlflow.sklearn.log_model(model, "model")
# 生成残差图
plt.scatter(y_test, predictions)
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.savefig("residuals_plot.png")
# 将图保存为附件
mlflow.log_artifact("residuals_plot.png")
print("MLflow运行已完成")
我们编写了一个名为train.py
的Python脚本,用来跟踪机器学习模型的训练和评估过程。我们首先导入必要的库,如MLflow、scikit-learn等。我们将糖尿病数据集拆分为训练集和测试集,并定义模型的参数。通过调用mlflow.start_run()
,我们开始了一次实验运行,训练一个ElasticNet回归模型,并进行预测。我们计算评估指标(均方误差(MSE)和R2分数),并使用MLflow的日志功能记录模型参数、评估指标和已训练的模型。这使我们能够轻松地跟踪实验,比较不同运行,并保存模型以便以后使用。运行下面的代码后,您可以在MLflow UI中看到这些跟踪记录。
实验介绍
在 Mlflow 中跟踪的不仅仅是模型文件,还包括可视化结果。
如果你想永久保存实验结果并追溯历史记录,可以按照以下方式运行mlflow服务器:
# 下面的命令将mlflow与postgresql集成,并将所有相关信息记录到postgresql数据库中。
mlflow server --backend-store-uri postgresql://root:root@localhost:5432/mlflow --default-artifact-root ./mlruns --host 127.0.0.1 --port 3001
开始设置Qdrant:
去 qdrant.tech
,接着点击右上角的登录。
在登录页面选择合适的方式进入托管在云端的Qdrant平台。登录后,你应该会看到如下的环境。
如果你有集群,你可以重启它,或者免费创建一个永久的。
开始设置 Ollama:第一步:如果你用的是 Mac,请在下面输入命令,否则,请访问 https://ollama.com/download
选择适合的平台。
https://ollama.com/download/Ollama-darwin.zip 请下载(如果你用的是 Mac)
步骤二:检查安装情况。
安装完成后,可以通过运行命令来检查Ollama是否已成功安装。
运行以下命令来查看 ollama 的版本信息:
ollama --version
此命令会显示已安装的版本,前提是所有设置都正确。
步骤三:建立模型
# 大语言模型
请执行以下命令来拉取模型:
ollama pull llama3.2:latest
# 嵌入模型
请执行以下命令来拉取模型:
ollama pull nomic-embed-text:latest
步骤 4:检查所有的模型是否都已经安装在你的系统中
ollama 列表.
集成 MLflow + LlamaIndex + Qdrant 的示例代码:
现在我们已经启动了MLflow服务器、Qdrant和Ollama,我们可以用LlamaIndex来简单地整合这些工具,来检查这些工具是否协同工作。项目框架如下。
.
├── .env
├── data
│ └── vllm.pdf
├── model_indexing.py
├── model_logging.py
└── requirements.txt
这是一个文件目录结构示例:其中,.env
文件用于存储环境变量,data
文件夹包含 vllm.pdf
数据文件,model_indexing.py
和 model_logging.py
文件可能涉及模型索引和日志记录,requirements.txt
文件列出了项目的依赖包。
我们来写一下.env
文件吧
OLLAMA_URL='http://localhost:11434'
EMBED_MODEL='nomic-embed-text:latest'
LANGUAGE_MODEL='llama3.2:latest'
QDRANT_URL='https://5496bdf1-fe1b-4e36-8715-aa5319aa1bf7.us-east4-0.gcp.cloud.qdrant.io:6333'
QDRANT_API_KEY='YbKL_l28******************************************'
COLLECTION_NAME='mlflow_collection'
COMMENT='这些变量用于配置Ollama服务的URL、嵌入模型、语言模型、Qdrant服务的URL、Qdrant的API密钥以及集合名称。'
让我们看一下如下所示的 requirements.txt
。
mlflow==2.17.1 # 用于模型跟踪和部署的机器学习流水线工具
psycopg2-binary==2.9.10 # 预编译的 PostgreSQL 数据库适配器
psycopg2==2.9.10 # PostgreSQL 数据库适配器
llama-index==0.11.20 # 知识库索引和检索的工具
llama-index-llms-ollama==0.3.4 # 与 Ollama 集成的 LLM 索引工具
llama-index-embeddings-ollama==0.3.1 # 与 Ollama 集成的嵌入索引工具
llama-index-vector-stores-qdrant==0.3.2 # 与 Qdrant 向量存储集成的索引工具
qdrant-client==1.12.0 # Qdrant 向量搜索引擎的客户端库
python-dotenv==1.0.1 # 读取 .env 文件并将其内容添加到环境变量中的工具
我们来写 model_indexing.py
从 llama_index.core 导入 Settings, SimpleDirectoryReader, StorageContext, VectorStoreIndex # 导入设置和其他必要的类
从 llama_index.embeddings.ollama 导入 OllamaEmbedding # 导入嵌入模型
从 llama_index.llms.ollama 导入 Ollama # 导入语言模型
从 llama_index.vector_stores.qdrant 导入 QdrantVectorStore # 导入向量存储类
从 dotenv 导入 load_dotenv, find_dotenv # 导入环境变量加载函数
导入 os # 导入操作系统相关的模块
load_dotenv(find_dotenv())
Settings.llm = Ollama(model=os.environ.get('LANGUAGE_MODEL'), base_url=os.environ.get('OLLAMA_URL')) # 设置语言模型
Settings.embed_model = Ollama(model_name=os.environ.get('EMBED_MODEL'), base_url=os.environ.get('OLLAMA_URL')) # 设置嵌入模型
documents = SimpleDirectoryReader(input_dir='data', required_exts=['.pdf']).load_data(show_progress=True) # 读取文档
client = qdrant_client.QdrantClient(url=os.environ.get('QDRANT_URL'), api_key=os.environ.get('QDRANT_API_KEY')) # 设置Qdrant客户端
vector_store = QdrantVectorStore(client=client, collection_name=os.environ.get('COLLECTION_NAME')) # 设置向量存储
storage_context = StorageContext.from_defaults(vector_store=vector_store) # 设置存储上下文
index = VectorStoreIndex.from_documents(documents=documents, storage_context=storage_context, show_progress=True) # 创建索引
mlflow.models.set_model(index) # 设置模型
我们写一下 model_logging.py
from llama_index.core import VectorStoreIndex
import mlflow
mlflow.set_tracking_uri('http://127.0.0.1:3000')
mlflow.set_experiment(experiment_name='llamaindex-qdrant-rag-1')
mlflow.llama_index.autolog()
with mlflow.start_run():
model_info = mlflow.llama_index.log_model(
"model_indexing.py",
artifact_path="index",
engine_type="chat", # 聊天、查询和检索
)
print(model_info.model_uri)
index: VectorStoreIndex = mlflow.llama_index.load_model(model_info.model_uri)
print(index)
我们的MLflow服务器应该在运行model_logging.py
之前就已经启动了。
运行model_logging.py
后,输出应该如下所示。
关于 out llamaindex + qdrant 的实验已经被记录下来。
任何RAG操作都会留下痕迹。
最后:总之,本系列的第一部分专注于为我们的生成式人工智能管道奠定坚实的基础,确保所有关键组件已经正确安装并运行良好。我们成功地安装并验证了Ollama、MLflow和Qdrant,确保它们为下一阶段做好准备。这初步工作让我们对系统的可靠性充满信心,可以着手处理更复杂的系统部分。通过创建一个小的测试应用,我们验证了这些集成组件能够有效交流,为构建一个功能完整的检索增强生成(RAG)系统打下了基础。
在第二部分中,我们将通过开发一个完整的应用程序来扩展这一设置,从变更数据捕获(CDC)机制开始,直到使用MLflow来提供模型服务。这将使我们更接近一个可扩展且高效的解决方案,以管理复杂的GenAI的工作流程,确保数据一致性并优化模型的部署。
栈学 🎓感谢您读完整篇文章。在您离开前:
- 请考虑拍手并关注作者的动态!👏
- 点击关注我们 X | 领英 | YouTube | Discord | 电子报 | 播客节目
- 免费在Differ上创建一个AI驱动的博客。
- 更多精彩内容请访问 Stackademic.com