关键要点
- RAG = 上传文档,让模型回答问题并引用来源。
- Open WebUI提供最简单的内置RAG。上传PDF,提出问题。5分钟设置。
- LlamaIndex是构建RAG管道最灵活的框架。
- LangChain是最广泛使用的专业框架。拥有庞大的生态系统。
- Chroma和Qdrant是存储文档分块的领先向量数据库。
- 截至2026年4月,本地RAG已成熟,生产就绪。
RAG(检索增强生成)是什么?
RAG是一种技术,让LLM能够在不微调模型的情况下回答关于自己文档的问题。
流程:(1)上传文档(PDF、文本文件),(2)将其分割成块,(3)将块转换为嵌入(数值向量),(4)将嵌入存储在向量数据库中,(5)当提出问题时,从数据库检索相关块,(6)将块+问题传递给LLM,(7)LLM基于块提供答案。
RAG优于微调的场景:文档频繁变化(微调是一次性训练),需要来源归属(显示使用了哪些文档)。
2026年排名前8的本地RAG工具
| 工具 | 类型 | 最适合 | 向量数据库 | 学习曲线 |
|---|---|---|---|---|
| Open WebUI | 网络应用(Docker) | 初学者,最简单的设置 | 内置 | 无 |
| LlamaIndex | Python框架 | 灵活的管道 | 任意(Chroma、Qdrant、Pinecone) | 中等 |
| LangChain | Python框架 | 生产系统 | 任意 | 中等 |
| Chroma | 向量数据库 | 简单RAG | Chroma(嵌入式) | 低 |
| Qdrant | 向量数据库 | 可扩展的RAG | Qdrant(分布式) | 中等 |
| Weaviate | 向量数据库 | GraphQL查询 | Weaviate | 中等 |
| Milvus | 向量数据库 | 大规模部署 | Milvus | 高 |
| Text-Generation-WebUI RAG | 扩展 | 与模型集成 | 内置 | 低 |
如何使用Open WebUI RAG(最简单)
Open WebUI内置RAG功能。 除了Docker设置,无需其他配置。上传文档,提出问题。
# 1. 使用Docker运行Open WebUI
docker run -d -p 3000:8080 \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
ghcr.io/open-webui/open-webui:latest
# 2. 打开 http://localhost:3000
# 3. 点击消息输入旁的 "+" → "上传文件"
# 4. 选择PDF或文本文件
# 5. 提出问题 -- Open WebUI检索相关分块
# 6. 模型基于文档回答并显示引用如何使用LlamaIndex构建RAG
LlamaIndex是处理文档加载、分块、嵌入和检索的框架。 灵活,支持任何向量数据库。
# 1. 安装
pip install llama-index
pip install llama-index-embeddings-ollama # 使用本地Ollama嵌入
pip install llama-index-vector-stores-chroma # 使用Chroma存储
# 2. 简单的RAG管道
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.ollama import OllamaEmbedding
# 加载文档
documents = SimpleDirectoryReader("./documents").load_data()
# 使用本地嵌入创建索引
embedding_model = OllamaEmbedding(model_name="nomic-embed-text")
index = VectorStoreIndex.from_documents(
documents,
embed_model=embedding_model
)
# 查询
query_engine = index.as_query_engine()
response = query_engine.query("文档中关于X说了什么?")
print(response)如何使用LangChain构建RAG
LangChain是用于生产RAG系统最广泛使用的框架。 支持所有向量数据库和LLM提供商。
# pip install langchain langchain-community langchain-chroma
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOllama
from langchain.chains import RetrievalQA
# 加载文档
loader = DirectoryLoader("./documents")
docs = loader.load()
# 分割成块
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(docs)
# 创建嵌入和向量存储
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 创建QA链
llm = ChatOllama(model="llama3.2:8b")
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 回答问题
result = qa.run("文档中关于X说了什么?")
print(result)本地RAG最适合的向量数据库
Chroma(最简单):进程内向量数据库。无需服务器设置。适合小型RAG项目(<100万文档)。
Qdrant(可扩展):分布式向量数据库。推荐用于大型RAG项目。
Weaviate(企业级):支持GraphQL查询。需要复杂过滤时使用。
Milvus(大规模):高级扩展。适合数百万文档。
RAG与微调对比
使用RAG的场景:文档频繁变化、需要显示来源、提供事实信息。
使用微调的场景:改变模型的性格或文体、教授推理模式或推理技能。
最佳实践:许多生产系统结合RAG + 微调。RAG用于事实检索,微调用于推理。
常见错误
- 块大小过大。超过1000个token的块容易包含无关信息。建议512-1000个token。
- 嵌入模型不适合。事实信息使用nomic-embed-text,文本分类使用jina-embeddings-v3。
- 向量搜索结果不足。通常建议每个问题检索前5-10个块。
- 忽视LLM上下文长度。需要匹配RAG检索的块与LLM的上下文长度。
常见问题
本地RAG需要多少GB的VRAM?
本地LLM模型(7B-13B)需要8GB,大型模型(34B+)需要16GB+。向量数据库本身几乎不使用VRAM。
RAG应该使用哪个向量嵌入模型?
nomic-embed-text广泛推荐。小型嵌入(384维)内存占用少。大型语料库考虑jina-embeddings-v3(1024维)。
RAG能用于生产环境吗?
可以。Open WebUI、LlamaIndex、LangChain都生产就绪。取决于文档质量、嵌入模型、向量数据库设置。
本地RAG安全吗?
本地运行的数据保留在你的机器上。但要限制向量数据库访问,生产环境建议加防火墙保护。
参考资料
- Open WebUI GitHub -- github.com/open-webui/open-webui
- LlamaIndex文档 -- docs.llamaindex.ai
- LangChain文档 -- python.langchain.com
- Chroma文档 -- docs.trychroma.com
- Qdrant文档 -- qdrant.tech/documentation