摘要:在 ChatGPT 和 Claude 占据云端的时代,数据隐私和昂贵的 API 调用费用成为了企业与个人开发者的痛点。本文将带你通过 GitHub 上最热门的开源工具 Ollama,结合 LangChainChromaDB,在本地笔记本上从零搭建一个基于 Llama3 的 RAG(检索增强生成)应用。不花一分钱,守护你的数据隐私。


🚀 为什么选择本地 RAG?

在当前的 AI 浪潮中,RAG (Retrieval-Augmented Generation) 是解决大模型“幻觉”和“知识截止”问题的最佳方案。但是,直接调用 OpenAI 的 API 存在两个问题:

  1. 数据安全:公司的私密文档(如合同、技术架构图)不能传到云端。

  2. 成本不可控:Token 数量一旦上来,账单非常感人。

今天我们要介绍的“全本地化技术栈”完美解决了这两个问题。

本次实战技术栈

  • LLM 运行时: Ollama (GitHub ⭐ 60k+) - 极其轻量级的本地大模型运行框架,被誉为 "LLM 界的 Docker"。

  • 编排框架: LangChain - 大模型应用开发的“胶水”层。

  • 向量数据库: ChromaDB - 轻量级、嵌入式的开源向量数据库。

  • 核心模型: Meta Llama 3 (8B) - 目前开源界最能打的小参数模型。


🛠️ 第一步:环境准备与 Ollama 部署

1.1 安装 Ollama

Ollama 是目前让小白也能在 1 分钟内跑起大模型的神器。

  • macOS/Linux: 直接访问官网下载或使用命令行。

  • Windows: 官方预览版已出,直接安装即可。

1.2 拉取 Llama 3 模型

安装完成后,打开终端(Terminal),输入以下命令拉取 Meta 的 Llama 3 模型:

Bash

ollama run llama3

实战经验注:8B 版本的 Llama 3 只需要约 4GB 显存或内存,M1/M2 芯片的 Mac 跑起来飞快,大部分集显 Windows 笔记本也能流畅运行。

1.3 验证 API

Ollama 默认会在本地开启 11434 端口。我们可以测试一下它是否在后台运行:

Bash

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "为什么天空是蓝色的?"
}'

💻 第二步:Python 项目构建 (后端逻辑)

我们将使用 Python 来编写 RAG 的核心逻辑。

2.1 安装依赖库

创建一个新的虚拟环境,并安装 LangChain 社区版及相关依赖:

Bash

pip install langchain langchain-community langchain-chroma bs4

2.2 核心代码实现:从文档加载到问答

这里我们模拟一个场景:让 AI 读取一篇关于“Kubernetes 故障排查”的本地 Markdown 文档,并回答相关问题。

新建 local_rag.py

Python

import os
from langchain_community.llms import Ollama
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1. 初始化本地大模型 (连接到 Ollama)
llm = Ollama(model="llama3")

# 2. 加载本地数据 (这里假设你有一个 tech_guide.txt)
# 实战技巧:生产环境中通常使用 PyPDFLoader 或 UnstructuredLoader 处理复杂格式
loader = TextLoader("./tech_guide.txt", encoding='utf-8')
docs = loader.load()

# 3. 文本分割 (Chunking)
# 这一步至关重要,决定了检索的精准度
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splits = text_splitter.split_documents(docs)

# 4. 向量化并存入 ChromaDB
# 我们使用 nomic-embed-text 模型,这比用 llama3 直接做 embedding 快得多且效果好
# 需要先运行: ollama pull nomic-embed-text
vectorstore = Chroma.from_documents(
    documents=splits, 
    embedding=OllamaEmbeddings(model="nomic-embed-text")
)
retriever = vectorstore.as_retriever()

# 5. 构建 RAG Prompt 模板
template = """你是一个智能技术助手。请根据下面的上下文(Context)回答问题。
如果上下文中没有答案,请直接说“我不知道”,不要编造内容。

上下文:
{context}

问题:
{question}
"""
prompt = ChatPromptTemplate.from_template(template)

# 6. 构建 LCEL (LangChain Expression Language) 链
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 7. 执行测试
query = "如果 Pod 状态是 CrashLoopBackOff,我该怎么排查?"
print(f"User: {query}")
print("-" * 20)
print(f"AI: {rag_chain.invoke(query)}")

🔍 深度解析:为什么这么设计?

1. 嵌入模型(Embedding Model)的选择

在代码中我使用了 nomic-embed-text 而不是 llama3 来做 Embedding。

  • 实战经验:生成式模型(如 Llama3)虽然通用,但在将文本转化为向量(Embedding)这一特定任务上,不如专门的嵌入模型(如 Nomic 或 mxbai-embed-large)效果好,且速度慢很多。

  • 操作:记得在终端执行 ollama pull nomic-embed-text

2. 文本分割(Chunking)的艺术

chunk_size=500 是一个经验值。

  • 如果切分太小,AI 可能会丢失上下文逻辑。

  • 如果切分太大,检索时会包含太多无关噪音,且容易撑爆 Context Window(虽然 Llama3 支持 8k,但越短响应越快)。


📊 效果演示

假设 tech_guide.txt 中包含以下内容:

“当 Kubernetes Pod 出现 CrashLoopBackOff 时,首先使用 kubectl logs 查看日志,其次检查 Liveness Probe 配置...”

运行脚本后,控制台输出:

Plaintext

User: 如果 Pod 状态是 CrashLoopBackOff,我该怎么排查?
--------------------
AI: 根据文档,针对 CrashLoopBackOff 状态,建议的排查步骤如下:
1. 首先使用 kubectl logs 命令查看容器日志,获取崩溃原因。
2. 检查 Liveness Probe(存活探针)的配置是否过于敏感导致频繁重启。

成功! 模型没有瞎编乱造,而是精准地复述了我们本地文档中的知识。


🔮 总结与展望

通过 Ollama + LangChain,我们仅用了不到 50 行代码,就实现了一个完全私有化、零成本的智能知识库。

接下来的进阶玩法(TODO):

  1. 前端化:使用 Streamlit 或 Next.js 封装成带 UI 的聊天机器人。

  2. 多模态:结合 Llama 3.2 Vision 版本,实现对图片的检索和理解。

  3. 微服务化:将此 Python 脚本封装为 FastAPI 接口,供业务系统调用。

如果你对 AI 落地实战Linux 运维自动化GitHub 优质项目解析 感兴趣,欢迎关注我的博客,我们下期见!


参考资料

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐