搭一套完全本地运行的知识库系统,数据不出机器,用起来也放心。这里记录一下我用 Chroma、Ollama 和 Llama 3.1 把 RAG 管道跑通的步骤,供参考。
整体流程很简单:原始文档(PDF/Word/TXT/Markdown)先解析分块,然后向量化存入 Chroma,最后用 Ollama 跑的 Llama 3.1 结合检索结果回答问题——全在本地闭环。
组件选择
| 组件 | 选用 | 理由 |
|---|---|---|
| 文档解析 | Unstructured + PyPDF2 / docx2txt | 能处理常见格式,表格结构保留得不错 |
| 文本分块 | LangChain RecursiveCharacterTextSplitter | 按段落、句子递归切分,语义割裂少 |
| 嵌入模型 | BAAI/bge-large-zh-v1.5 | 中文 SOTA,HuggingFace 开源,4096 上下文;nomic-embed-text 多语言也行,但中文场景 bge 更稳 |
| 向量数据库 | ChromaDB | 单机文件存储,零配置启动;Qdrant 更灵活但暂时用不上那种复杂度 |
| 大模型推理 | Ollama + Llama 3.1 8B | 一键拉模型,API 兼容 OpenAI,日常够用;vLLM 吞吐高但配置麻烦点 |
| 应用框架 | LangChain | 生态丰富,调试工具顺手 |
有人可能想到 Elasticsearch——它确实支持向量检索,但太重了,Chroma 为 embedding 而定,轻巧得多。
环境准备
先装基础环境:Python 3.10+,再装 Ollama 并后台启动。
# 安装 Python 依赖工具
sudo apt install python3-pip
# 安装 Ollama(脚本会自动下载 Llama 3)
curl -fsSL https://ollama.com/install.sh | sh
# 后台启动服务
ollama serve &
然后是 Python 包:
pip install langchain chromadb unstructured PyPDF2 python-docx sentence-transformers
准备文档
把你的知识文件扔进 ./docs/ 目录,支持 .pdf、.docx、.txt、.md、.html 等。
构建向量库
创建 build_kb.py 脚本,核心是加载、分块、嵌入、存入 Chroma。把模型加载的 device 参数看好了——没 GPU 就老老实实改成 cpu,不然报错。
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
langchain.vectorstores Chroma
os
loader = DirectoryLoader(, glob=, show_progress=)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=,
chunk_overlap=,
separators=[,,,,,,,]
)
chunks = text_splitter.split_documents(docs)
embeddings = HuggingFaceEmbeddings(
model_name=,
model_kwargs={: }
)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=
)
vectorstore.persist()
()


