来源:互联网 更新时间:2026-08-26 14:30
大语言模型(LLM)的能力确实令人印象深刻——它们能跟人自如对话、翻译文章、写代码、做摘要……几乎无所不能。但这一切能力背后,靠的是海量数据的预训练。说白了,就是让模型根据前面的词,猜下一个词是什么。这种方法叫作“标记预测”,它让LLM学会了生成流畅、有上下文的回复。
不过,问题也随之而来。模型太专注于“猜最可能的下一个词”,而不是去验证事实,因此有时候输出可能不准确,甚至带点误导性。更麻烦的是,预训练数据可能是几个月前的,LLM没法回答关于最新数据的问题。除非你自己就是专家,否则很难判断它说的到底靠不靠谱。
这时候,检索增强生成(RAG)就派上了大用场。这篇文章就来好好聊聊RAG。
大语言模型无疑是AI圈最火的话题,能搞定各种自然语言问题。但它的软肋也很明显——受限于训练数据的更新时间。举个例子,GPT-4 Turbo的训练数据最后更新是2023年12月。假如你在那之后问它一个问题,它给出的答案就可能不准确。这种现象被称为“LLM幻觉”——看起来正确,实际上完全是错的。
检测幻觉是个大难题,至今还有很多科研人员在研究。虽然可以用困惑度之类的指标评估文本质量,但这并没有解决核心问题:我们怎么确保LLM的回答正确且符合事实?
这时候就要请出RAG了。它的目的就是减轻幻觉问题。流程很简单:我们先向LLM提交一个问题,但并不是直接甩过去,而是先找出能帮LLM给出更准确答案的相关上下文。然后把两样东西给LLM:原始问题 + 最相关的上下文。最后,LLM基于这些信息生成回复。这样一来,LLM就不会随机瞎编,而是给出一个富含上下文的靠谱答案。
RAG主要由三个组件构成:检索、增强、生成。

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

Milvus提供高级索引算法,能高效存储十亿级向量并执行超大规摸的相似性搜索。它还跟主流AI框架集成,简化了RAG应用的开发。
根据具体用例可以尝试不同的Prompt,但基本模板通常长这样:
Use the following pieces of context to answer the question at the end.
{context}
Question: {question}
Helpful Answer:
下面这张图展示了RAG应用的完整组件和工作流程:

接下来我们准备用Milvus和LlamaIndex搭建一个RAG驱动的LLM应用。先简单介绍一下会用到的工具。
安装只需一条pip命令:
pip install "pymilvus>=2.4.2"
装好后就能用Python初始化Milvus了。需要注意的是,Milvus Lite最多支持存储100万条向量数据。如果需要更多,生产环境建议用Docker或Kubernetes部署。

本文用80亿参数的Llama3。默认需要约32GB显存,超出免费GPU上限。但通过4-bit量化可以把模型压缩到约4GB显存。加载并量化有两种方法:一是用HuggingFace + bitsandbytes,二是装Ollama直接加载模型(Ollama上的LLM默认已量化)。本文用Ollama在本地运行各种LLM。安装完成后,运行以下命令下载Llama3:
ollama run llama3
安装也简单:
pip install llama
pip install llama-index-vector-stores-milvus llama-index-llms-ollama llama-index-embeddings-huggingface
现在开始动手!本示例将搭建一个聊天机器人,回答关于《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应用问更复杂的问题。
生产环境部署RAG Pipeline可比原型开发难多了。一个常见问题就是如何评估生成的响应质量。好在有几个开源工具可以用,比如Ragas和TruLens-Eval。Ragas提供了测试上下文精确度的方法,还提供了忠实度、答案相关性等指标来评估生成组件质量。更多信息请参考官方文档。

如果发现响应质量下滑,第一步就是看这些评估指标。指标不好就针对性改进。当然,最重要的还是先评估数据质量:向量数据库里有没有正确的上下文?分块大小合适吗?数据分块前需要先清理吗?确认数据没问题后,可以试着换更好的LLM和Embedding模型。关于RAG优化,推荐阅读以下两篇文章:《走向生产:LLM应用评估与可观测性》和《RAG修炼手册|如何评估RAG应用?》。
多亏了Ollama、LlamaIndex、HuggingFace这些框架,构建RAG Pipeline变得前所未有的简单。Milvus支持高效存储海量上下文向量,跟各种AI框架无缝集成。因此,只用几行代码就能搭完一个RAG应用。Milvus Lite更是通过一个简单的pip命令就搞定安装和设置,让你轻松开发多个RAG原型。
腾讯ima怎么把微信内容一键导入知识库?
腾讯ima怎么创建共享知识库?
Celestia价格预测2026-2032:TIA币能否引领山寨币上涨行情?历史价格回顾
比特币(BTC)核心周期指标复刻历史走势 价格或跌破5.8万美元关键支撑位
比特币 2025 年价格预测:BTC 的未来走势
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
WorkBuddy微信版怎么获得积分?
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
5000元起的鼠标哪个最值得入手?
腾讯ima知识库怎么分类管理?
短剧《史上最强洪荒修为》剧情介绍
海尔消毒柜自动消毒如何中止
博世壁挂炉关闭暖气怎么操作
男生高性价比充电头?
车载冰箱重置到出厂设置几步?
Windy卫星云图怎么看?云层变化识别技巧
WorkBuddy积分怎么获得?
5000-6000元鼠标有什么推荐?
管线机怎么接云米净水器
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc