这是一个基于本地知识库的检索增强生成(RAG)系统,集成了向量数据库、语义搜索和深度求索(DeepSeek)API,提供智能问答服务。
这份代码构建了一个经典的 RAG(检索增强生成) 系统,架构如下:
- Qdrant: 向量数据库,存储知识。
- SentenceTransformer: 嵌入模型(负责把文字变成向量)。
- DeepSeek: 大模型(负责根据检索到的知识回答问题)。
- 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
运行预期结果:
- 第一次运行会下载
shibing624/text2vec-base-chinese模型(约 400MB),请耐心等待。 - 控制台会显示:
文档已切分为 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 的内容回答了问题,并且是打字机效果(流式)输出的。
💡 代码关键点解析 (帮助你理解)
- 单例模式 (
**common.py**):load_embedding_model使用了global _model_instance。这非常重要,因为加载模型很慢且占内存,不管是入库脚本还是 API 服务,在一次运行生命周期内只应该加载一次模型。
- 文本切分 (
**init_vector_db.py**):- 使用了
RecursiveCharacterTextSplitter。 chunk_size=400:意味着每段文字大约 400 字。这个大小对中文 RAG 来说比较合适,既保留了上下文,又不会因为太长导致检索不精准。
- 使用了
- Prompt 工程 (
**main_api.py**):system_prompt被设计为“公司行政助理”。- 防幻觉机制:提示词中明确要求
资料中没有的信息明确告知“未在资料中找到”,严禁编造。这是企业级知识库的核心要求。
接下来你可以做什么?
- 支持更多文件:修改
init_vector_db.py中的get_file_chunks函数,使其遍历doc/目录下的所有.txt或.pdf文件。 - 前端界面:使用大模型快速写一个聊天界面对接这个 API(想要和我一模一样的界面,复制我的提示词)。