构建本地知识库:基于 LangChain 和 Ollama 的 RAG 实现教程
简介
在这个教程中,我们将学习如何构建一个本地运行的知识库系统,它能够让用户上传 PDF 或 TXT 文档,并通过自然语言与文档内容进行交互。这个系统使用了 RAG(检索增强生成)技术,结合了 LangChain、Ollama 和 Streamlit 等现代工具,实现了一个完整的本地知识库解决方案。
技术栈
- LangChain: 用于构建 LLM 应用的框架
- Ollama: 本地运行的 LLM 模型服务
- FastEmbed: 高效的文本嵌入模型
- Chroma: 向量数据库
- Streamlit: Web 界面框架
系统架构
该系统主要包含以下几个核心组件:
- 文档处理器: 支持 PDF 和 TXT 文件的加载和处理
- 文本分割器: 将文档分割成适当大小的块
- 向量存储: 使用 Chroma 存储文档块的向量表示
- 检索器: 基于相似度搜索相关文档块
- LLM 接口: 与 Ollama 模型交互生成回答
- Web 界面: 用户友好的交互界面
实现步骤
1. 环境配置
首先,创建一个新的 Python 环境并安装必要的依赖:
# 创建虚拟环境
python -m venv .venv
# 激活环境
# Windows:
.venv\Scripts\activate
# Linux/Mac:
source .venv/bin/activate
# 安装依赖
pip install -r requirements-windows.txt
requirements-windows.txt
aiohappyeyeballs>=2.4.0
aiohttp>=3.10.5
aiosignal>=1.3.1
altair>=5.4.1
annotated-types>=0.7.0
anyio>=4.6.0
asgiref>=3.8.1
attrs>=24.2.0
backoff>=1.11.1
bcrypt>=4.2.0
blinker>=1.8.2
build>=1.2.2
cachetools>=5.5.0
certifi>=2024.8.30
charset-normalizer>=3.3.2
chroma-hnswlib>=0.7.6
chromadb>=0.5.7
click>=8.1.7
coloredlogs>=15.0.1
dataclasses-json>=0.6.7
Deprecated>=1.2.14
distlib>=0.3.8
durationpy>=0.7
fastapi>=0.115.0
fastembed>=0.3.6
filelock>=3.16.1
flatbuffers>=24.3.25
frozenlist>=1.4.1
fsspec>=2024.9.0
gitdb>=4.0.11
GitPython>=3.1.43
google-auth>=2.35.0
googleapis-common-protos>=1.65.0
grpcio>=1.66.1
h11>=0.14.0
httpcore>=1.0.5
httptools>=0.6.1
httpx>=0.27.2
huggingface-hub>=0.25.0
humanfriendly>=10.0
idna>=3.10
importlib_metadata>=8.4.0
importlib_resources>=6.4.5
Jinja2>=3.1.4
jsonpatch>=1.33
jsonpointer>=3.0.0
jsonschema>=4.23.0
jsonschema-specifications>=2023.12.1
langchain>=0.1.12
langchain-community>=0.0.27
langchain-core>=0.1.30
langsmith>=0.1.27
markdown-it-py>=3.0.0
MarkupSafe>=2.1.5
marshmallow>=3.20.2
mdurl>=0.1.2
monotonic>=1.6
mpmath>=1.3.0
multidict>=6.0.5
mypy-extensions>=1.0.0
numpy>=1.26.4
oauthlib>=3.2.2
onnxruntime>=1.17.1
openai>=1.12.0
opentelemetry-api>=1.23.0
opentelemetry-instrumentation>=0.44b0
opentelemetry-semantic-conventions>=0.44b0
overrides>=7.7.0
packaging>=23.2
pandas>=2.2.0
Pillow>=10.2.0
pip>=24.0
platformdirs>=4.2.0
posthog>=3.4.1
protobuf>=4.25.3
pulsar-client>=3.4.0
pyarrow>=15.0.0
pydantic>=2.6.1
pydantic_core>=2.16.2
pydeck>=0.8.1b0
Pygments>=2.17.2
PyJWT>=2.8.0
pyparsing>=3.1.1
python-dateutil>=2.8.2
python-dotenv>=1.0.1
pytz>=2024.1
PyYAML>=6.0.1
referencing>=0.33.0
regex&