首页 > 教程攻略 > ai资讯 >使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 应用

使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 应用

来源:互联网 时间:2026-08-26 14:30:22

大语言模型(LLM)的能力确实令人印象深刻——它们能跟人自如对话、翻译文章、写代码、做摘要……几乎无所不能。但这一切能力背后,靠的是海量数据的预训练。说白了,就是让模型根据前面的词,猜下一个词是什么。这种方法叫作“标记预测”,它让LLM学会了生成流畅、有上下文的回复。

不过,问题也随之而来。模型太专注于“猜最可能的下一个词”,而不是去验证事实,因此有时候输出可能不准确,甚至带点误导性。更麻烦的是,预训练数据可能是几个月前的,LLM没法回答关于最新数据的问题。除非你自己就是专家,否则很难判断它说的到底靠不靠谱。

这时候,检索增强生成(RAG)就派上了大用场。这篇文章就来好好聊聊RAG。

01 什么是RAG

大语言模型无疑是AI圈最火的话题,能搞定各种自然语言问题。但它的软肋也很明显——受限于训练数据的更新时间。举个例子,GPT-4 Turbo的训练数据最后更新是2023年12月。假如你在那之后问它一个问题,它给出的答案就可能不准确。这种现象被称为“LLM幻觉”——看起来正确,实际上完全是错的。

检测幻觉是个大难题,至今还有很多科研人员在研究。虽然可以用困惑度之类的指标评估文本质量,但这并没有解决核心问题:我们怎么确保LLM的回答正确且符合事实?

这时候就要请出RAG了。它的目的就是减轻幻觉问题。流程很简单:我们先向LLM提交一个问题,但并不是直接甩过去,而是先找出能帮LLM给出更准确答案的相关上下文。然后把两样东西给LLM:原始问题 + 最相关的上下文。最后,LLM基于这些信息生成回复。这样一来,LLM就不会随机瞎编,而是给出一个富含上下文的靠谱答案。

02 RAG的组件

RAG主要由三个组件构成:检索、增强、生成。

检索组件


检索组件的目标是基于用户的问题找出相似的上下文候选。第一步是把输入问题用数值表示出来——也就是转成Embedding向量。向量的维度取决于你用的Embedding模型。HuggingFace上有不少开源免费的Embedding模型(比如SentenceTransformers)。这些向量保留了原始文本的语义——两个文本的语义越相似,它们在向量空间中的位置就越近。通过计算任意两个向量之间的欧氏距离(L2)就能判断相似度。

理解了Embedding向量的概念后,搜索相似上下文就明了了:计算查询向量与数据库中上下文向量之间的距离。向量数据少的时候还好说,但如果有数百万个向量,计算成本就高了,本地机器可能都存不下。这时候就需要一个高度可扩展的向量数据库(比如Milvus)来高效处理。

Milvus提供高级索引算法,能高效存储十亿级向量并执行超大规摸的相似性搜索。它还跟主流AI框架集成,简化了RAG应用的开发。

增强组件


向量相似性搜索完成后,进入增强阶段。把上一步检索到的top-k最相关上下文跟用户查询组合起来,形成一个完整的Prompt,作为LLM的输入。

根据具体用例可以尝试不同的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等)根据包含用户查询和最相关上下文的Prompt生成回复。LLM会基于提供的上下文来回答,而不是仅依赖训练数据里的知识。这方法能有效降低幻觉风险。

下面这张图展示了RAG应用的完整组件和工作流程:

03 Milvus Lite、Llama 3 与 LlamaIndex 简介

接下来我们准备用Milvus和LlamaIndex搭建一个RAG驱动的LLM应用。先简单介绍一下会用到的工具。

Milvus Lite


Milvus是开源向量数据库,能存储十亿级向量并高效搜索。在接下来的Demo里,我们用Milvus来存上下文向量并计算相似度。安装方式有多种,最简单的是Milvus Lite——轻量版,适合快速开发原型,比如想试试不同的文档分块策略或Embedding模型。

安装只需一条pip命令:

pip install "pymilvus>=2.4.2"

装好后就能用Python初始化Milvus了。需要注意的是,Milvus Lite最多支持存储100万条向量数据。如果需要更多,生产环境建议用Docker或Kubernetes部署。

Llama3


除了向量数据库,RAG的另一个关键组件是LLM。市面上有很多开源模型,Llama和Mistral比较受欢迎。本文用Meta开发的Llama3。Llama3基于比Llama2大7倍的数据集预训练,性能提升明显。它有两种规格:80亿参数和700亿参数。性能测试显示,两种规格都比同级别模型有优势。

本文用80亿参数的Llama3。默认需要约32GB显存,超出免费GPU上限。但通过4-bit量化可以把模型压缩到约4GB显存。加载并量化有两种方法:一是用HuggingFace + bitsandbytes,二是装Ollama直接加载模型(Ollama上的LLM默认已量化)。本文用Ollama在本地运行各种LLM。安装完成后,运行以下命令下载Llama3:

ollama run llama3

LlamaIndex


LlamaIndex是协调RAG Pipeline的框架。前面我们装好了向量数据库和LLM,现在缺的就是把这两部分连起来的框架。LlamaIndex负责预处理各种数据源,转成向量存到数据库,搜索上下文,组合查询和搜索结果,最后输出LLM的回复。

安装也简单:

pip install llama
pip install llama-index-vector-stores-milvus llama-index-llms-ollama llama-index-embeddings-huggingface

04 使用 Milvus Lite、Llama3 和 LlamaIndex 搭建 RAG 聊天机器人

现在开始动手!本示例将搭建一个聊天机器人,回答关于《Attention is All You Need》这篇论文的问题(也就是介绍Transformer的那篇)。你也可以换成其他论文。所有代码可在notebook中找到。

先导入库:

!pip install arxiv 
import arxiv
from llama_index.core import SimpleDirectoryReader
from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.core import VectorStoreIndex, Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from 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上每篇论文都有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)

向量维度设为768,跟BGE base模型输出一致。现在把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 ha ve multiple PDFs inside the directory
pdf_document = SimpleDirectoryReader(
    dir_name, recursive=True
).load_data()

"""
Output:
Number of Input documents: 15
"""

输入文档数量是15(论文有15页)。然后用LlamaIndex的Settings把LLM和Embedding模型绑定起来,同时自定义分块大小和overlap:

Settings.llm = llm
Settings.embed_model = embedding_model
Settings.chunk_size = 128
Settings.chunk_overlap = 64

接下来把PDF文档Ingest到Milvus向量数据库中。PDF会被分割成块,每个块用BGE base模型转成向量,然后存进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个块。调用as_query_engine方法就可以提出问题。以上就是用LlamaIndex构建完整RAG Pipeline的全部步骤。现在问一个论文相关的问题:“multi-head attention相比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, a veraging inhibits this.
"""

答案高度相关!你也可以用RAG应用问更复杂的问题。

05 优化 RAG Pipeline

生产环境部署RAG Pipeline可比原型开发难多了。一个常见问题就是如何评估生成的响应质量。好在有几个开源工具可以用,比如Ragas和TruLens-Eval。Ragas提供了测试上下文精确度的方法,还提供了忠实度、答案相关性等指标来评估生成组件质量。更多信息请参考官方文档。

如果发现响应质量下滑,第一步就是看这些评估指标。指标不好就针对性改进。当然,最重要的还是先评估数据质量:向量数据库里有没有正确的上下文?分块大小合适吗?数据分块前需要先清理吗?确认数据没问题后,可以试着换更好的LLM和Embedding模型。关于RAG优化,推荐阅读以下两篇文章:《走向生产:LLM应用评估与可观测性》和《RAG修炼手册|如何评估RAG应用?》。

06 总结

多亏了Ollama、LlamaIndex、HuggingFace这些框架,构建RAG Pipeline变得前所未有的简单。Milvus支持高效存储海量上下文向量,跟各种AI框架无缝集成。因此,只用几行代码就能搭完一个RAG应用。Milvus Lite更是通过一个简单的pip命令就搞定安装和设置,让你轻松开发多个RAG原型。