本地 RAG 知识库搭建全流程:手把手实操指南

126 阅读4分钟

这是一个基于本地知识库的检索增强生成(RAG)系统,集成了向量数据库、语义搜索和深度求索(DeepSeek)API,提供智能问答服务。

这份代码构建了一个经典的 RAG(检索增强生成) 系统,架构如下:

  1. Qdrant: 向量数据库,存储知识。
  2. SentenceTransformer: 嵌入模型(负责把文字变成向量)。
  3. DeepSeek: 大模型(负责根据检索到的知识回答问题)。
  4. FastAPI: 提供后端接口。


🛠️ 第一步:环境准备

项目完整代码仓库:gitee.com/yunstabc/lo…

在开始之前,请确保你的电脑上安装了 Python (3.8+)Docker (用于运行 Qdrant)。

1.1 创建项目文件夹

创建一个文件夹(例如 my_rag_bot),并按照以下结构组织文件:

my_rag_bot/
├── common.py            # (复制仓库代码)
├── init_vector_db.py    # (复制仓库代码)
├── main_api.py          # (复制仓库代码)
└── doc/                 # 新建这个文件夹
    └── 1.txt            # 在这里放入你要测试的文本文档

1.2 安装依赖库

打开终端(CMD 或 Terminal),进入项目目录,运行以下命令安装 Python 库:

pip install fastapi uvicorn sentence-transformers  openai langchain-text-splitters qdrant-client 

注意:由于 sentence-transformers 依赖 torch,如果你的下载速度慢,建议使用国内镜像源(如清华源)。


🐳 第二步:启动向量数据库 (Qdrant)

代码中默认配置连接本地的 Qdrant (localhost:6333)。我们需要通过 Docker 启动它。

在终端运行:

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage \
    qdrant/qdrant
  • 如果你看到类似 Qdrant is listening on ... 的日志,说明数据库启动成功。
  • 你可以访问 http://localhost:6333/dashboard 查看 Qdrant 的可视化界面。


⚙️ 第三步:配置 API Key

打开 common.py,找到以下部分:

# DeepSeek 配置
DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-db99f49207304b2caa6afda8a739b509")

你需要将 "sk-..." 替换为你自己的 DeepSeek API Key。 或者,更推荐的方式是在终端设置环境变量(Linux/Mac): export DEEPSEEK_API_KEY="你的真实key"


📚 第四步:构建知识库 (入库)

doc/1.txt 中随便写一些公司内部资料,例如:

"公司的午休时间是中午12点到下午2点。周末双休。财务报销需要找王经理签字。"

然后运行初始化脚本,将文字转化为向量存入 Qdrant:

python init_vector_db.py

运行预期结果:

  1. 第一次运行会下载 shibing624/text2vec-base-chinese 模型(约 400MB),请耐心等待。
  2. 控制台会显示:
    • 文档已切分为 X 个片段
    • 正在加载向量模型...
    • -> 已插入第 1 批...
    • 所有数据处理完成!

🚀 第五步:启动 API 服务

知识入库后,我们启动问答服务。在终端运行:

uvicorn main_api:app --reload --host 0.0.0.0 --port 8000

运行预期结果:

  • 控制台显示 Uvicorn running on http://0.0.0.0:8000
  • 同时会预加载向量模型。


🧪 第六步:测试提问

现在你可以测试你的 AI 助手了。由于接口是流式输出 (stream), 我们使用 curl 或者编写一个简单的 Python 脚本来测试。

方式 A:使用 Curl (命令行)

curl -X POST "http://localhost:8000/stream_answer" \
     -H "Content-Type: application/json" \
     -d '{"question": "公司午休时间是多久?"}'

注意:Windows CMD 可能不支持单引号,请使用双引号并将内部双引号转义,推荐使用 Git Bash 或 Postman。

方式 B:使用 Python 脚本测试 (推荐)

新建一个 test_bot.py

import requests

url = "http://localhost:8000/stream_answer"
payload = {"question": "公司午休时间是多久?财务找谁?"}

print("🤖 AI 正在思考...")
with requests.post(url, json=payload, stream=True) as r:
    for chunk in r.iter_content(chunk_size=None):
        if chunk:
            print(chunk.decode("utf-8"), end="", flush=True)
print("\n✅ 回答结束")

运行 python test_bot.py,你应该能看到 AI 根据 1.txt 的内容回答了问题,并且是打字机效果(流式)输出的。


💡 代码关键点解析 (帮助你理解)

  1. 单例模式 (**common.py**):
    • load_embedding_model 使用了 global _model_instance。这非常重要,因为加载模型很慢且占内存,不管是入库脚本还是 API 服务,在一次运行生命周期内只应该加载一次模型。
  2. 文本切分 (**init_vector_db.py**):
    • 使用了 RecursiveCharacterTextSplitter
    • chunk_size=400:意味着每段文字大约 400 字。这个大小对中文 RAG 来说比较合适,既保留了上下文,又不会因为太长导致检索不精准。
  3. Prompt 工程 (**main_api.py**):
    • system_prompt 被设计为“公司行政助理”。
    • 防幻觉机制:提示词中明确要求 资料中没有的信息明确告知“未在资料中找到”,严禁编造。这是企业级知识库的核心要求。

接下来你可以做什么?

  • 支持更多文件:修改 init_vector_db.py 中的 get_file_chunks 函数,使其遍历 doc/ 目录下的所有 .txt.pdf 文件。
  • 前端界面:使用大模型快速写一个聊天界面对接这个 API(想要和我一模一样的界面,复制我的提示词)。