在 RAG (Retrieval-Augmented Generation,检索增强生成) 技术日益普及的今天,如何构建一个完全本地化、开源且易于部署的 RAG 系统,成为了许多开发者和研究人员关注的焦点。本文将带你深入了解如何利用 Deepseek、Ollama 和 Elasticsearch,结合 Docker 技术,搭建一个功能强大的本地 RAG 试验场。告别对 OpenAI API 或外部云服务的依赖,真正实现本地自主可控的 LLM 应用。
RAG:语言模型与知识库的完美结合
RAG 是一种将大型语言模型 (LLM) 的推理能力与结构化知识库或文档相结合的技术。通过检索相关信息,并将其融入 LLM 的生成过程中,RAG 能够显著提高 LLM 的回答质量和准确性。 传统的 LLM 依赖于训练数据,对于训练数据中没有包含的信息,LLM 往往无法给出准确的答案。而 RAG 则弥补了这一缺陷,它允许 LLM 在回答问题之前,先从知识库中检索相关信息,从而使得 LLM 能够处理更加复杂和专业的任务。例如,一个RAG系统可以查询公司内部的知识库,帮助员工快速找到需要的答案,解决日常工作中的疑问。据 Gartner 预测,到 2027 年,RAG 将成为企业知识管理的重要组成部分。
Ollama:轻量级 LLM 本地运行利器
Ollama 是一款强大的工具,能够让你在本地快速运行各种 LLM,如 Mistral 或 Deepseek。它的主要优势在于其轻量级和易用性。Ollama 通过 Docker 容器化技术,简化了 LLM 的部署和管理过程,即使是只有 8GB 内存的笔记本电脑也能轻松运行。例如,你可以使用 Ollama 快速部署一个 Mistral 模型,用于本地文本生成或问答。
根据 Ollama 官方网站的介绍,Ollama 支持多种 LLM 模型,包括 Llama 2, Mistral, Gemma 等。只需一行命令,即可下载并运行这些模型。 这极大地降低了 LLM 的使用门槛,使得开发者能够更加专注于模型的应用,而不是底层的基础设施。
Elasticsearch:强大的语义搜索和向量数据库
Elasticsearch 不仅仅是一个搜索引擎,更是一个功能强大的向量数据库,能够存储语义上下文和向量嵌入。在 RAG 系统中,Elasticsearch 负责存储和检索与用户查询相关的文档或文本片段。通过向量搜索技术,Elasticsearch 能够根据语义相似度,快速找到最相关的结果。比如,你可以使用 Elasticsearch 存储大量的技术文档,然后根据用户的搜索意图,返回最相关的文档片段。
Elasticsearch 的向量搜索功能依赖于其强大的索引能力和近似最近邻 (ANN) 算法。 ANN 算法能够在大规模向量数据中,快速找到与查询向量最相似的向量。 这种高效的搜索能力,使得 Elasticsearch 成为 RAG 系统的理想选择。根据 Elastic 官方的报告,Elasticsearch 的向量搜索性能在同类产品中处于领先地位。
Docker:RAG 堆栈的一键部署
Docker 技术的引入,使得 RAG 堆栈的部署变得异常简单。通过 Docker 容器,我们可以将 Ollama、Elasticsearch 和 Kibana 等组件打包成独立的单元,从而实现一键部署和管理。 本文提供的脚本正是基于 Docker,让你无需担心环境配置和依赖关系,即可快速搭建一个完整的 RAG 系统。
Docker 的优势在于其隔离性和可移植性。 通过 Docker 容器,我们可以将应用程序及其依赖项打包在一起,从而确保应用程序在不同环境中都能够以相同的方式运行。 这种特性极大地简化了应用程序的部署和管理过程。例如,你可以使用 Docker 将 RAG 系统部署到本地服务器、云服务器或 Kubernetes 集群中,而无需修改任何代码。
Kibana:RAG 结果的可视化 Playground
Kibana 作为一个强大的数据可视化工具,可以用于展示和交互 RAG 系统的结果。通过 Kibana 的 Playground,你可以方便地测试不同的提示词,查看模型生成的文本,并分析 RAG 系统的性能。 Kibana 提供的丰富的图表和仪表盘,可以帮助你更好地理解 RAG 系统的工作原理和效果。
Kibana 的 Playground 允许你通过 OpenAI 兼容的连接器,与 Ollama 中运行的 LLM 进行交互。 你可以输入问题,然后查看模型生成的答案。 Playground 还提供了多种配置选项,让你能够调整模型的参数,从而优化 RAG 系统的性能。 例如,你可以使用 Kibana 的 Playground 测试不同的提示词,然后根据结果调整提示词,以获得更好的回答质量。
详细步骤:本地 RAG 系统的搭建
以下是搭建本地 RAG 系统的详细步骤,即使你没有 AI 或 DevOps 背景,也能轻松上手:
-
克隆代码仓库:
git clone https://github.com/Som23Git/ollama_plus_elasticsearch_kibana.git cd ollama_plus_elasticsearch_kibana
-
启动 Ollama 并选择模型:
chmod +x start-ollama.sh ./start-ollama.sh
运行脚本后,会提示你选择一个模型,例如 mistral 或 deepseek-r1。Mistral 模型相对轻量级,占用约 4GB 内存,而 Deepseek 模型则更强大,占用约 5.5GB 内存。选择适合你硬件配置的模型。请注意,Deepseek 在某些任务上的表现更佳。
-
安装和启动 Elasticsearch + Kibana:
curl -fsSL https://elastic.co/start-local | sh -s -- -v 8.18.2
这是首次安装时需要执行的步骤。如果已经安装过,则跳过此步骤,直接启动服务。
-
启动 Elasticsearch 和 Kibana 服务:
cd elastic-start-local chmod +x start.sh ./start.sh cd ..
-
检查网络连接:
chmod +x network-check.sh ./network-check.sh
此步骤用于验证容器之间的网络连通性。确保 Kibana 可以访问 Ollama 服务。
-
导入数据:
chmod +x ingest_alice_book.sh ./ingest_alice_book.sh
此脚本将《爱丽丝梦游仙境》这本书导入到 Elasticsearch 中。你需要输入 Elasticsearch 的用户名和密码。
-
进入 Kibana Playground 并添加连接器:
打开 Kibana 🌐:http://localhost:5601
在 Kibana 的 Playground 中,创建一个连接器,并配置以下信息:
- 模型: 你选择的模型,如 mistral 或 deepseek-r1
- Endpoint: http://ollama:11434/v1/chat/completions
- API Key: dummy-value (Ollama 不需要 API Key,但 Kibana 需要填写)
模型选择:Mistral vs Deepseek
在选择模型时,需要考虑硬件配置和任务需求。Mistral 模型相对轻量级,适合在资源有限的设备上运行。Deepseek 模型则更加强大,适合处理复杂的任务。
根据测试结果,Deepseek 模型在生成文本和回答问题方面的表现优于 Mistral 模型。 例如,在回答关于《爱丽丝梦游仙境》的问题时,Deepseek 模型能够提供更加详细和准确的答案。 然而,Deepseek 模型需要更多的计算资源,因此需要在性能和资源消耗之间进行权衡。
网络设计:容器间的无缝通信
所有服务(Ollama、Elasticsearch、Kibana)都运行在同一个 Docker 网络(rag-network)中,从而实现容器间的无缝通信。 你可以使用以下命令,从 Kibana 容器内部测试是否可以访问 Ollama 服务:
docker exec -it es-local-dev curl http://ollama:11434
如果能够成功访问,则说明网络配置正确。 这种网络设计简化了 RAG 系统的部署和管理,使得开发者能够更加专注于应用程序的逻辑。
Elasticsearch 数据摄取流程详解
ingest_alice_book.sh
脚本执行了一系列关键步骤,将《爱丽丝梦游仙境》的数据导入 Elasticsearch,并为其后续的 RAG 应用做好准备。
- 检查可用的推理模型: 脚本首先检查 Elasticsearch 中可用的推理模型,例如
.elser-2-elasticsearch
、.multilingual-e5-small-elasticsearch
和.rerank-v1-elasticsearch
。 这些模型用于文本嵌入、语义搜索和结果重排序。 - 初始化推理模型: 脚本触发推理模型
.multilingual-e5-small-elasticsearch
的预热过程。 这个模型将文本转换为向量嵌入,使得 Elasticsearch 能够根据语义相似度进行搜索。 - 创建数据管道(Ingest Pipeline): 脚本创建一个名为
alice-pipeline
的数据管道。 这个管道定义了数据摄取的处理流程,包括提取附件内容和丰富数据。 - 创建索引: 脚本创建一个名为
book_alice
的索引,用于存储《爱丽丝梦游仙境》的数据。 索引的映射定义了数据的结构和类型,包括semantic_text
和附件字段。 - 数据导入: 脚本将
payload.json
文件中的数据导入到book_alice
索引中,使用alice-pipeline
进行处理。 每个文档都会被嵌入向量,并存储在 Elasticsearch 中。
利用 Kibana Playground 进行 RAG 测试
数据导入完成后,就可以使用 Kibana Playground 进行 RAG 测试了。 在 Playground 中,你可以输入关于《爱丽丝梦游仙境》的问题,然后查看模型生成的答案。
例如,你可以问:
- “爱丽丝掉进了什么地方?”
- “疯帽子是谁?”
- “红皇后的性格是什么样的?”
Kibana Playground 会将你的问题发送到 Ollama 中运行的 LLM,然后将 LLM 生成的答案返回给你。 你可以根据答案的质量,调整提示词和模型参数,从而优化 RAG 系统的性能。
本地 RAG 系统的优势
- 本地化部署: 无需依赖外部云服务,所有数据和计算都在本地进行。
- 开源: 所有组件都是开源的,你可以自由地使用、修改和分发它们。
- 易于部署: 通过 Docker 技术,可以一键部署 RAG 系统。
- 可定制性: 你可以根据自己的需求,选择不同的 LLM 模型和知识库。
- 低成本: 无需支付 API 调用费用,可以大幅降低 RAG 系统的成本。
RAG 应用场景展望
本地 RAG 系统具有广泛的应用前景。 例如,它可以用于:
- 企业知识库: 帮助员工快速找到需要的答案,提高工作效率。
- 智能客服: 提供更加准确和个性化的客户服务。
- 教育: 为学生提供个性化的学习辅导。
- 研究: 加速科研数据的分析和挖掘。
随着 LLM 技术的不断发展,RAG 系统将会在各个领域发挥越来越重要的作用。
总结与展望
本文详细介绍了如何利用 Deepseek、Ollama 和 Elasticsearch,结合 Docker 技术,搭建一个本地 RAG 试验场。 通过本文的指导,你可以快速构建一个功能强大的 RAG 系统,并在本地探索 LLM 的各种应用场景。无论是测试 RAG 流程,避免云费用,还是使用自己的文档进行向量搜索,这都是一个很好的起点。 期待你在本地 RAG 的道路上越走越远!
希望你能尝试、fork、扩展,或者在自己的工作坊中运行它。 欢迎分享你的想法和反馈!