Milvus 提供高级的索引算法,能够高效存储十亿级向量并执行大规模向量相似性计算和搜索。Milvus 还与主流 AI 框架集成,简化了开发 RAG 驱动的 LLM 应用的流程。
增强组件
在使用向量数据库执行向量相似性搜索之后,我们进入了 RAG 应用的增强阶段。将上一步检索到的 top-k 最相关的上下文与用户查询相结合,形成一个完整的 Prompt 作为 LLM 的输入。
根据您的具体用例,您可以尝试不同的 Prompt。但是,Prompt 的基本模板通常如下所示:
Use the following pieces of context to answer the question at the end.{context}Question: {question}Helpful Answer:
生成组件
RAG 的最后一个组件是生成组件。在这个阶段,我们选择的 LLM(如 GPT、Llama、Mistral、Claude 等 LLM 模型)会根据包含用户查询和最相关上下文的 Prompt 生成响应。
LLM 将基于提供的上下文来生成对用户查询的回答,而不是仅仅依赖其训练数据中的知识。这种方法有助于减轻 LLM 产生幻觉的风险。
下图展示了 RAG 应用的完整组件和工作流程:
03
Milvus Lite、Llama 3 与 LlamaIndex 简介
在接下来的部分中,我们将使用 Milvus 和流行的 AI 框架(如 LlamaIndex)构建一个 RAG 驱动的 LLM 应用。让我们简单介绍一下本项目将使用到的工具。
Milvus Lite
Milvus 是一款开源向量数据库,能够存储十亿级向量数据并执行高效的向量搜索。在接下来的 Demo 中,我们将使用 Milvus 来存储上下文向量并计算查询向量与上下文向量间相似度。
Milvus 提供多种安装方式及部署模式。其中最简单的就是安装 Milvus Lite。Milvus Lite 是 Milvus 的轻量级版本,适用于快速开发原型,例如希望尝试不同的文本文档分块(Chunking)策略或 Embedding 模型的场景。
Milvus Lite 的安装方法非常简单。您只需要执行以下 pip 命令:
pipinstall"pymilvus>=2.4.2"
安装后,您可以立即使用 Python 轻松初始化 Milvus。需要注意的是,如果您想存储多达一百万个向量嵌入,Milvus Lite 支持最多存储 100 万条向量数据。
如果您需要存储更多的向量数据,并用于生产环境,请使用 Docker 或者 Kubernetes 安装、部署和运行 Milvus。详情请阅读安装指南。
Llama3
除了向量数据库以外,RAG 应用的另一个关键组件是 LLM。市面上有多种开源 LLM,其中 Llama 和 Mistral 是较为受欢迎的两种。在本文将使用 Meta 开发的 Llama3 模型作为我们的 LLM。Llama3 模型相比 Llama2 基于 7 倍更大的数据集进行预训练,极大提升了性能。
Llama3 模型有两种不同的大小:80 亿参数和 700 亿参数。如下图性能测试结果所示,Llama 3 两种大小的模型的性能相比同等规模的 LLM 都更具优势。
本文将使用包含 80 亿参数的 Llama3 模型。默认情况下,该模型需要大约 32 GB 的 VRAM。这超过了免费 GPU 的可用 VRAM 上限。但是,我们可以通过执行 4-bit 量化(quantization)将模型大小缩减到约 4 GB VRAM。
有多种方法可以加载 Llama3 模型并进行 4-bit 量化。第一种方法使用 HuggingFace 和 bitsandbytes 库。第二种方法是安装 Ollama 并直接通过 Ollama 加载模型。Ollama 上的 LLM 已默认进行过 4-bit 量化。
文本将使用 Ollama 轻松地在本地机器上运行各种 LLM。请参考 Ollama 文档获取最新的安装指南。
Ollama 安装完成后,您就可以下载 LLM。本文使用 Llama3,因此,您可以运行以下命令:
ollamarunllama3
LlamaIndex
LlamaIndex 是用于协调 RAG Pipeline 的框架。在前文中,我们已经为 RAG 应用安装了向量数据库和 LLM。现在缺少的是将这两个组件连接起来,构建一个功能齐全的 RAG 系统的框架。这正是 LlamaIndex 的作用。
LlamaIndex 易于使用,能够预处理来自各种数据源的输入数据,将其转换为 Embedding 向量并存储在向量数据库中,搜索相关上下文,将搜索结果结合查询发送到 LLM,最终输出 LLM 响应。
如下所示,我们可以使用一个简单的 pip 命令来安装 LlamaIndex。
pipinstallllamapipinstallllama-index-vector-stores-milvusllama-index-llms-ollamallama-index-embeddings-huggingface
04
使用 Milvus Lite、LLama3 和 LlamaIndex 搭建 RAG 聊天机器人
现在让我们使用 Milvus Lite、Llama3 和 LlamaIndex 搭建一个 RAG 系统吧!本示例将构建一个聊天机器人,用于回答针对《Attention is All You Need》这篇论文的问题。这篇论文主要介绍了 Transformer 架构。您也可以替换本示例中使用的研究论文。
您可以通过 notebook 获取本文中所有代码并跟随以下指南一起操作。
首先,让我们导入所有需要的库:
!pip install arxivimport arxivfrom llama_index.core import SimpleDirectoryReaderfrom llama_index.vector_stores.milvus import MilvusVectorStorefrom llama_index.core import VectorStoreIndex, Settingsfrom llama_index.llms.ollama import Ollamafrom llama_index.embeddings.huggingface import HuggingFaceEmbeddingfrom pymilvus import MilvusClient
我们可以通过 Arxiv 的官方 Python 库将 PDF 版的研究论文下载到本地机器。
dir_name = "./Documents/pdf_data/"arxiv_client = arxiv.Client()paper = next(arxiv.Client().results(arxiv.Search(id_list=["1706.03762"])))# Download the PDF to a specified directory with a custom filename.paper.download_pdf(dirpath=dir_name, filename="attention.pdf")
在以上代码中,我们通过其 ID 将论文《Attention is All You Need》下载到本地目录。Arxiv 上的每篇研究论文在 URL 中都有其 ID,您可以直接复制并粘贴其他的论文 ID 到上面的代码中进行替换。
接下来,初始化 Milvus 向量数据库和 Llama3 模型。将原始输入文本转换为向量时,我们将使用可以从 HuggingFace 上的 BGE base 模型。
vector_store=MilvusVectorStore(uri="./milvus_rag_demo.db",dim=768,overwrite=True)embedding_model=HuggingFaceEmbedding(model_name="BAAI/bge-base-en-v1.5")llm=Ollama(model="llama3",temperature=0.1,request_timeout=480.0)
通过上述代码,我们初始化了 Milvus 向量数据库。Milvus 中可存储的向量维度为 768,与 BGE base 模型生成的 Embedding 向量维度一致。
现在,让我们 Ingest 下载的 PDF 论文。我们只需要调用 LlamaIndex 的 SimpleDirectoryReader 对象即可。
pdf_document = SimpleDirectoryReader(input_files=[f"{dir_name}attention.pdf"]).load_data()print("Number of Input documents:", len(pdf_document))# OR execute this command if you have multiple PDFs inside the directorypdf_document = SimpleDirectoryReader(dir_name, recursive=True).load_data()"""Output:Number of Input documents: 15"""
输入文档的数量是 15,这是因为我们使用的论文共有 15 页。
我们需要使用 LlamaIndex 的 Settings class 将 LLM 与 Embedding 模型进行绑定。在 Settings 中,我们还可以自定义 PDF 文档的分块大小(chunk size)和 overlap。
Settings.llm=llmSettings.embed_model=embedding_modelSettings.chunk_size=128Settings.chunk_overlap=64
然后,将 PDF 文档 Ingest 到 Milvus 向量数据库中。通过以下命令,PDF 文档将被分割成块(Chunk)。使用 BGE base 模型将每个 Chunk 转换为向量。最后,将这些 Chunk 向量存储在 Milvus 向量数据库中。
index = VectorStoreIndex.from_documents(pdf_document)print("Number of nodes:", len(index.docstore.docs))query_engine = index.as_query_engine()"""Output:Number of nodes: 196"""
可以看到,现在向量数据库中共有 196 个 Chunk 的向量。我们还在 index 中调用了as_query_engine 的方法实现对向量数据库中的数据提出问题。
以上就是使用 LlamaIndex 构建一个完整的 RAG Pipeline 的所有步骤。现在我们可以问一个与研究论文相关的问题。例如 “What is the benefit of multi-head attention instead of single-head attention?”。
query = "What is the benefit of multi-head attention instead of single-head attention?"result = query_engine.query(query)print(result)"""Output:Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this."""
基于研究论文中提供的信息,不难看出我们得到了一个高度相关的答案!同样,您可以通过 RAG 应用询问更复杂的问题。
05
优化 RAG Pipeline
在生产环境中部署 RAG Pipline 比原型开发更具挑战!一个最常见的问题就是如何评估 RAG 系统生成的响应质量。好在市面上有几个开源工具可以用于评估 RAG 系统响应质量,比如 Ragas 和 TruLens-Eval。
如需评估检索组件的质量,Ragas 也提供了测试上下文精确度的方法。Ragas 中有关忠实度(faithfulness)和答案相关性(answer relevancy)等指标可用于评估生成组件质量。更多信息,请参考文档。https://docs.ragas.io/en/stable/concepts/metrics/index.html
RAG 修炼手册|如何评估 RAG 应用?https://zilliz.com.cn/blog/how-to-evaluate-rag-zilliz
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |