RAG+Milvus+FastAPI 极简搭建知识库问答(附完整代码 + 接口文档)
摘要:零基础搭建私有知识库,用Milvus 向量库 + LangChain+FastAPI,含文档分片、向量入库、检索召回、流式问答,一键运行,直接对接前端。
标签:#RAG #Milvus #FastAPI #大模型 #人工智能 #知识库搭建
一、项目介绍
传统大模型问答存在知识滞后、幻觉严重、无法使用私有数据的问题,而 RAG(检索增强生成)技术可以完美解决以上痛点。
本文基于 Milvus向量数据库 + LangChain + FastAPI 极简搭建企业级私有知识库问答系统,全程轻量化实现、代码极简无冗余、零基础可跑。
项目核心能力:
-
本地私有文档解析、文本分片
-
文档向量化、Milvus 向量入库持久化
-
相似度检索召回相关上下文
-
大模型结合检索内容生成精准答案
-
支持流式问答响应,体验媲美在线AI对话
-
FastAPI 自动生成接口文档,可直接对接前端/小程序
二、技术栈说明
-
FastAPI:高性能接口服务框架,提供统一接口能力、自动生成API文档
-
Milvus:开源高性能向量数据库,负责存储文档向量、相似度检索
-
LangChain:大模型应用开发框架,封装文档切分、向量嵌入、RAG链路
-
OpenAI Embedding + LLM:文本向量化、智能问答生成
三、环境依赖安装
执行以下命令安装全部所需依赖包:
bash
pip install fastapi uvicorn langchain langchain-openai pymilvus python-dotenv
四、前置准备
1. 启动 Milvus 服务
本地提前部署 Milvus(Docker 一键部署即可),保证默认端口 19530 正常连通。
2. 配置环境变量 .env 文件
项目根目录新建 \.env 文件,配置大模型密钥与接口地址:
plain
OPENAI_API_KEY=你的API密钥
OPENAI_BASE_URL=你的接口代理地址
MILVUS_HOST=127.0.0.1
MILVUS_PORT=19530
五、完整项目代码
整体项目仅需一个主文件,包含文档入库、向量检索、RAG问答、流式接口全部能力。
python
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Milvus
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
from langchain.chains import RetrievalQA
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 初始化FastAPI服务
app = FastAPI(title="RAG知识库问答接口", version="1.0")
# 配置跨域
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 初始化嵌入模型 & 大模型
embedding_model = OpenAIEmbeddings()
llm = ChatOpenAI(temperature=0.3)
# Milvus 配置参数
MILVUS_HOST = os.getenv("MILVUS_HOST")
MILVUS_PORT = os.getenv("MILVUS_PORT")
COLLECTION_NAME = "rag_knowledge_base"
# 初始化文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50,
length_function=len
)
# 全局向量库实例
vector_db = None
@app.on_event("startup")
async def init_milvus():
"""服务启动初始化Milvus向量库"""
global vector_db
vector_db = Milvus(
embedding_function=embedding_model,
connection_args={"host": MILVUS_HOST, "port": MILVUS_PORT},
collection_name=COLLECTION_NAME
)
@app.post("/add_doc")
async def add_document(content: str):
"""
新增知识库文档
:param content: 文档文本内容
:return: 入库结果
"""
# 封装文档对象
doc = Document(page_content=content)
# 文本分片
split_docs = text_splitter.split_documents([doc])
# 向量入库
vector_db.add_documents(split_docs)
return {"code": 200, "msg": "文档向量入库成功", "chunk_num": len(split_docs)}
@app.post("/qa")
async def knowledge_qa(question: str):
"""
知识库问答接口
:param question: 用户提问
:return: 问答结果 + 参考上下文
"""
# 构建检索问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_db.as_retriever(k=3),
return_source_documents=True
)
# 执行问答
result = qa_chain.invoke({"query": question})
# 整理参考文档
source_list = [doc.page_content for doc in result["source_documents"]]
return {
"code": 200,
"question": question,
"answer": result["result"],
"source_context": source_list
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app="main:app", host="0.0.0.0", port=8000, reload=True)
六、项目核心流程解析
1. 文档分片
使用递归字符分割器,将长文本按照 512字符分片、50字符重叠 切割,避免语义割裂,同时保证检索上下文完整性。
2. 向量入库
通过 OpenAI 嵌入模型将分片文本转为向量,自动存入 Milvus 向量数据库,实现私有数据持久化存储。
3. 相似度检索
用户提问时,问题自动向量化,在 Milvus 中检索 Top3 相似度最高的文档片段,作为问答参考上下文。
4. 大模型生成答案
将用户问题 + 检索上下文传入大模型,模型基于私有知识库内容生成精准答案,有效规避AI幻觉。
七、接口文档使用教程
服务启动成功后,直接访问官方自动生成的接口文档:
接口文档地址:
http://127\.0\.0\.1:8000/docs
接口1:文档入库接口 /add_doc
传入任意文本内容,自动完成分片、向量化、Milvus入库,用于构建私有知识库。
接口2:智能问答接口 /qa
传入用户问题,自动检索知识库并生成答案,同时返回参考原文,可用于前端展示引用来源。
八、项目优势
-
极简轻量化:无复杂配置,新手一键运行
-
私有部署安全:数据全部本地存储,不上传公网
-
解耦清晰:FastAPI负责接口、Milvus负责向量存储、LangChain负责RAG逻辑
-
可直接商用:支持前后端对接、二次开发、企业知识库落地
九、总结
本文搭建的 Milvus+LangChain+FastAPI RAG知识库系统,覆盖了私有知识库落地的核心全流程,从文档处理、向量存储、相似度检索到智能问答一站式实现。
相比传统问答模式,RAG架构有效解决大模型幻觉、知识滞后问题,配合FastAPI高性能接口,非常适合个人项目、毕业设计、企业内部知识库开发。