GenAI管道构建指南:利用LlamaIndex、Qdrant和MLflow进行高级索引

2024年11月04日 由 alex 发表 69 0

管理复杂的通用人工智能(GenAI)管道,特别是涉及多个模型和数据源时,可能是一项艰巨的任务。本文展示了如何将LlamaIndex与Qdrant和MLflow集成,以简化GenAI应用的管理和部署。你将了解MLflow的功能(如跟踪、模型打包和评估)如何实现对LlamaIndex引擎的无缝处理。通过逐步实施,学习如何简化检索增强生成(RAG)工作流程,确保性能一致性,并优化你的索引系统以提高可扩展性和效率。


3


架构:

该架构整合了多个关键组件,以构建一个高效且可扩展的检索增强生成(RAG)系统。其核心是利用LlamaIndex进行索引和检索,Qdrant用于向量存储和搜索,以及MLflow用于模型注册、服务和跟踪整个生命周期中的所有组件。此设计旨在管理来自各种源的庞大数据量,同时确保为最终用户提供快速检索和准确推理。


管道从从多种来源(如网页文档、内部文档和数据库记录)摄取文档开始。这些文档由变更数据捕获(CDC)机制处理,该机制跟踪数据变化,确保新文档和更新后的文档始终反映在索引过程中。数据工程师负责系统的这一部分,管理数据管道以将传入的文档馈送到由LlamaIndex驱动的索引器中。LlamaIndex和Qdrant索引器为这些文档创建一个语义索引,并将向量存储在Qdrant数据库中,该数据库充当向量存储和检索引擎。LlamaIndex和Qdrant之间的集成实现了高效且高性能的索引和检索。


一旦完成索引,系统会使用MLflow保存模型,MLflow在LlamaIndex模型的生命周期管理中起着关键作用。MLflow允许跟踪所有必要的元数据,包括模型版本控制、模型跟踪和模型服务,确保模型开发、测试和部署的不同阶段之间的一致性和透明度。


在检索方面,RAG-Bot与用户查询进行交互,使用相同的LlamaIndex和Qdrant设置。RAG-Bot处理传入的请求,并将它们发送到来自MLflow的LlamaIndex检索器,该检索器查询Qdrant存储以根据查询嵌入获取最相关的索引文档。此检索器设计为高速运行,能够快速响应用户。然后,将检索到的数据作为推理过程的一部分发送回用户。


MLflow设置:

安装MLflow


pip install mlflow


要开始使用MLflow,首先需要安装它。MLflow是一个用于管理机器学习实验、跟踪指标、打包代码和部署模型的开源工具。使用pip install mlflow命令将安装所有必要的依赖项,使MLflow在你的环境中准备就绪。


启动MLflow服务器:


mlflow server # this will run the server on port 5000
mlflow server --host 127.0.0.1 --port 3001  # runs the server on custom port


4


编写代码以使用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
# Load the dataset
data = load_diabetes()
X = data.data
y = data.target
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Set model parameters
alpha = 0.5
l1_ratio = 0.5
# set mlflow tracking uri
mlflow.set_tracking_uri('http://127.0.0.1:3001/')
# Start an MLflow experiment
with mlflow.start_run():
    # Train the model
    model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
    model.fit(X_train, y_train)
    # Predict on the test set
    predictions = model.predict(X_test)
    # Calculate metrics
    mse = mean_squared_error(y_test, predictions)
    r2 = r2_score(y_test, predictions)
    # Log parameters and metrics with MLflow
    mlflow.log_param("alpha", alpha)
    mlflow.log_param("l1_ratio", l1_ratio)
    mlflow.log_metric("mse", mse)
    mlflow.log_metric("r2", r2)
    # Log the model itself
    mlflow.sklearn.log_model(model, "model")
    # Advanced Use: Generate a plot for residuals
    plt.scatter(y_test, predictions)
    plt.xlabel("True Values")
    plt.ylabel("Predictions")
    plt.savefig("residuals_plot.png")
    # Log the plot as an artifact
    mlflow.log_artifact("residuals_plot.png")
print("MLflow run complete!")


我们创建一个Python脚本(train.py),该脚本使用MLflow来跟踪机器学习模型的训练和评估过程。首先,我们导入必要的库,如MLflow、scikit-learn等。接着,我们加载糖尿病数据集,将其拆分为训练集和测试集,并定义模型参数。通过使用mlflow.start_run(),我们开始一个实验运行,训练一个ElasticNet回归模型,并进行预测。我们计算评估指标(均方误差MSE和R2得分),并使用MLflow的日志记录功能记录模型参数、指标和训练好的模型本身。这样,我们就可以轻松地跟踪实验、比较不同的运行,并存储模型以供后续使用。代码成功运行后,可以在MLflow的用户界面中查看跟踪信息。


5


6


7


如果你想要永久保存实验并且希望能够追溯历史记录,请按照以下方式运行mlflow服务器。


# this will plugin the mlflow with postgres and log all details to postgres.
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网站,并点击主页屏幕右上角的登录按钮。


8


在登录页面,选择适当的方法进入云托管的Qdrant平台。登录成功后,你应该会进入如下所示的环境。


9


如果你已经有一个集群,你可以重启它,或者你可以免费创建一个终身使用的集群。


10


11


设置Ollama:

第一步:如果你使用的是Mac,请使用以下命令,否则请前往https://ollama.com/download选择适合你的平台。


https://ollama.com/download/Ollama-darwin.zip # if on mac


第二步:检查安装情况

安装完成后,通过运行以下命令来检查Ollama是否成功安装:


ollama --version


如果一切设置正确,此命令将打印出已安装的版本。


第三步:设置模型


# LLM model
ollama pull llama3.2:latest
# Embedding Model
ollama pull nomic-embed-text:latest


第四步:检查系统中是否有所有模型。


ollama list


集成MLflow + LlamaIndex + Qdrant的 Playground 代码:

既然我们已经启动了MLflow服务器、Qdrant以及Ollama,我们就可以使用LlamaIndex来创建一个简单的集成,以测试所有这些工具是否在同一方向上协同工作。项目框架如下所示。


.
├── .env
├── data
│   └── vllm.pdf
├── model_indexing.py
├── model_logging.py
└── requirements.txt


让我们开始编码环境设置。


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'


让我们看看下面的requirements.txt文件内容。


mlflow==2.17.1
psycopg2-binary==2.9.10
psycopg2==2.9.10
llama-index==0.11.20
llama-index-llms-ollama==0.3.4
llama-index-embeddings-ollama==0.3.1
llama-index-vector-stores-qdrant==0.3.2
qdrant-client==1.12.0
python-dotenv==1.0.1


让我们编写model_indexing.py文件。


from llama_index.core import Settings, SimpleDirectoryReader, StorageContext, VectorStoreIndex
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.vector_stores.qdrant import QdrantVectorStore
from dotenv import load_dotenv, find_dotenv
import qdrant_client
import mlflow
import os
load_dotenv(find_dotenv())
Settings.llm = Ollama(model=os.environ.get('LANGUAGE_MODEL'), base_url=os.environ.get('OLLAMA_URL'))
Settings.embed_model = OllamaEmbedding(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'))
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",  # chat, query & retrieve
    )
    print(model_info.model_uri)
    index: VectorStoreIndex = mlflow.llama_index.load_model(model_info.model_uri)
    
    print(index)


在运行model_logging.py之前,我们的MLflow服务器应该是运行状态。


12


运行model_logging.py之后,输出应该类似于以下内容。


13


14


15


16


结论:

总之,本文为我们的通用人工智能(GenAI)流水线打下坚实的基础,确保所有关键组件都已正确安装并运行。我们已经成功安装并验证了Ollama、MLflow和Qdrant,确保它们已准备好进入下一阶段。



文章来源:https://medium.com/stackademic/building-robust-genai-pipelines-leveraging-llamaindex-qdrant-and-mlflow-for-advanced-indexing-c3293be5735c
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消