什么是 RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种先进的自然语言处理技术架构。它旨在克服传统大型语言模型(LLMs)在处理开放域问题时的信息容量限制和时效性不足。RAG 的核心机制融合了信息检索系统的精确性和语言模型的强大生成能力,为基于自然语言的任务提供了更为灵活和精准的解决方案。
RAG 与 LLM 的关系
RAG 不是对 LLM 的替代,而是对其能力的扩展与升级。传统 LLM 受限于训练数据的边界,对于未见信息或快速变化的知识难以有效处理。RAG 通过动态接入外部资源,使 LLM 得以即时访问和利用广泛且不断更新的知识库,进而提升模型在问答、对话、文本生成等任务中的表现。
RAG 就像是为大型语言模型配备了一个即时查询的'超级知识库'。这个'外挂'不仅扩大了模型的知识覆盖范围,还提高了其回答特定领域问题的准确性和时效性。
想象一下,传统的 LLM 像是一个博学多才但记忆力有限的学者,它依赖于训练时吸收的信息来回答问题。而 RAG,则是这位学者随时可以连线的庞大图书馆和实时资讯网络。当面临复杂或最新的查询时,RAG 能让模型即时搜索并引用这些外部资源,从而提供更加精准、全面和最新的答案。这种设计尤其适用于需要高度专业化或快速更新信息的场景,比如医学咨询、法律意见、新闻摘要等。
基于此,RAG 技术特别适合用来做个人或企业的本地知识库应用,利用现有知识库资料结合 LLM 的能力,针对特定领域知识的问题能够提供自然语言对话交互,且答案比单纯用 LLM 准确性要高得多。
实践方案选型
现成的 RAG 方案有很多,例如 LangChain + ChromaDB, LlamaIndex 等。本文将采用 Ollama + Qwen2.5 + AnythingLLM 的组合来实现轻量级、易部署的本地知识库。
1. Ollama 环境搭建
Ollama 本身不是 LLM,而是一个服务于 LLM 的工具。它提供了一个平台和环境,使得开发者和研究人员能够在本地机器上轻松地运行、测试和部署各种大型语言模型。
下载地址: https://ollama.ai/
支持 Windows、Mac、Linux。
当然你也可以使用 Docker 安装镜像,官方镜像更多细节请参考 GitHub Readme: https://github.com/ollama/ollama
当你运行 ollama --version 命令成功查询到版本时,表示 Ollama 的安装已经顺利完成。
接下来便可以用 pull 命令从下载模型,例如:
ollama pull llama3
还有更简单的方法直接使用 run 命令,它会在运行之前自动检查模型是否下载,如果没有会自动下载:
ollama run llama3
但是我想搭建的是本地知识库,当然是以中文为主,所以需要对中文支持最好的模型。Ollama 官方提供的模型中,对中文支持较好的有:
- Llama2-Chinese:基于 Llama2 微调。搜'Chinese'关键词就能找到。
- Qwen 1.5 / 2.5:阿里的通义千问。一共有多个尺寸,默认是 4b 或 7b。所有尺寸的模型都支持长上下文长度。多语言支持。
本想用智谱的 GLM,奈何不兼容 Ollama,也没有 GGUF 格式文件,于是作罢。巧的是阿里的通义 Qwen2.5 模型刚刚开源,正好可以试一下。
阿里开源了通义 Qwen2.5 模型,可以说是现阶段这个规模最强的开源模型之一。发布后直接在 Huggingface LLM 开源模型榜单获得第一名。Qwen2.5 在代表推理能力的代码和数学以及长文本表现尤其突出。推理相关测试及大海捞针测试都取得了很好的成绩。
模型概览: Qwen 2.5 模型组成包括 Qwen2.5-0.5B、Qwen2.5-1.5B、Qwen2.5-7B、Qwen2.5-14B 等。其中 Qwen2.5-72B-Instruct 最高达到 128K tokens 上下文。
安装并运行 Qwen2.5 模型,注意这里由于笔记本配置问题,选用的是 7B 参数的模型:
ollama run qwen2.5:7b
模型下载的默认路径通常是:~/.ollama/models (Linux/Mac) 或 %USERPROFILE%\.ollama\models (Windows)。
以下是我机器的配置示例:
- CPU: Intel Core i7
- RAM: 32GB
- OS: macOS Ventura
安装完成后就可以对话了。通过命令行交互的方式不算太友好,所以我们需要一个好看好用的 UI 界面来与模型进行交互。
Open Web UI
Open Web UI 就是这样一个软件,它通过 Docker 可以非常容易地进行部署。部署完成后,这样使用是不是就友好多了?
但由于我们是要搭建一个个人本地知识库,需要对知识库有更多的掌控,Open Web UI 有些不满足需求,所以我们选择另一个更专注于知识库管理的软件。
2. AnythingLLM 部署与配置
我们先下载安装 AnythingLLM。
完成安装后大概长这个样子。然后我们就要开始选择模型了。
这里注意,我们要用服务器模式启动 Ollama。Ollama 其实有两种模式:
- 聊天模式:仅用于 CLI 交互。
- 服务器模式:后端运行大模型,开放端口供其他软件调用。
要开启服务器模式非常简单。在终端里输入:
ollama serve
用服务器模式启动 Ollama 后:
- 在 AnythingLLM 界面中选择
Ollama
- 然后在 Base URL 中填:
http://localhost:11434
- 模型选择之前下载的 Qwen2.5 7b
- Token context window 可以先用默认的 4096
完成以上设置后来到下一步。
搭建一个知识库,会涉及到另外两个关键组件:
- Embedding Model(嵌入模型):负责把高维度的数据转化为低维度的嵌入空间。这个数据处理过程在 RAG 中非常重要,决定了检索的准确度。
- Vector Store(向量数据库):专门用来高效处理大规模向量数据,如 ChromaDB, Pgvector, Weaviate 等。
上图中就是默认的嵌入模型以及向量数据库,我们先使用默认的 ChromaDB。
- 往下走,下一步是填写个人信息,这步我就省略了。
- 再下一步是给你的 Workspace 起名,我也省略。
接着你就可以在建好的 Workspace 中上传你的个人知识库的内容了。
你可以上传文件(支持多种格式 pdf word txt markdown…),甚至是一个外部的网站链接。不太好的是它不能上传一个文件夹,如果你的文件夹包含多级目录,那么它无法识别,你需要把所有文件平铺放在同一级目录中再全选上传。
数据源也可以是其他知识网站:
你可以根据项目来创建 Workspace,一个项目建一个。然后,把关于这个项目的所有文档、所有网页都导入 Workspace。聊天模式还有两种可以设置:
- 对话模式:大模型会根据你给的文档,以及它本来就有的知识储备,综合起来回答。
- 查询模式:大模型只是简单地针对文档进行回答,减少幻觉。
比如我随便上传了一个《劳动合同法》的 pdf 文件,用查询模式进行对话。虽然偶尔不太对,但内容是从上传的文件里找到的,还可以点击查看源文件。
我将笔记本中的很多计算机相关的 markdown 文件作为'知识'上传后,进行问答,效果显著提升。
至此,我的本地个人知识库就搭建完成了!
进阶优化与最佳实践
为了让本地知识库更加稳定高效,建议关注以下几点:
1. 嵌入模型的选择
默认嵌入模型可能不适合所有场景。如果追求更高的检索精度,可以尝试更换 Embedding 模型。例如 nomic-embed-text 或 mxbai-embed-large。在 AnythingLLM 的设置中,可以在 Workspace 设置里切换 Embedding Provider。
2. 分块策略(Chunking Strategy)
RAG 的效果很大程度上取决于文档如何被切分成小块。AnythingLLM 默认的分块策略可能不够精细。建议根据文档类型调整 Chunk Size 和 Chunk Overlap。
- 代码类文档:建议按函数或类进行分割,保持逻辑完整性。
- 文本类文档:建议按段落或语义单元分割,重叠部分设为 10%-20% 以保证上下文连贯。
3. 性能调优
- GPU 加速:如果本地有 NVIDIA 显卡,确保 Ollama 能调用 GPU 加速推理。在 Ollama 环境变量中设置
OLLAMA_NUM_GPU=999。
- 内存管理:如果运行大模型时内存不足,尝试使用量化版本(如 Q4_K_M)的模型,或者减小 Batch Size。
4. 数据安全与隐私
使用本地部署方案的最大优势在于数据不出内网。请确保 Ollama 和 AnythingLLM 的端口没有暴露在公网,或者通过反向代理(如 Nginx)配合 HTTPS 和认证保护访问入口。
常见问题排查
- 连接失败:检查 Ollama 服务是否正在运行 (
ollama serve),并确保防火墙未拦截 11434 端口。
- 模型加载慢:首次加载模型需要下载权重,请耐心等待。后续加载速度会快很多。
- 检索不准:尝试更换 Embedding 模型,或增加文档的预处理步骤(如去除乱码、统一编码)。
通过上述配置和优化,你可以构建一个既安全又高效的私有化 AI 知识库系统。