RAG+Milvus+FastAPI 极简搭建知识库问答(附完整代码 + 接口文档)
摘要:零基础搭建私有知识库,用Milvus 向量库 + LangChain+FastAPI,含文档分片、向量入库、检索召回、流式问答,一键运行,直接对接前端。
标签:#RAG #Milvus #FastAPI #大模型 #人工智能 #知识库搭建
一、项目介绍
传统大模型问答存在知识滞后、幻觉严重、无法使用私有数据的问题,而 RAG(检索增强生成)技术可以完美解决以上痛点。
本文基于Milvus向量数据库 + LangChain + FastAPI极简搭建企业级私有知识库问答系统,全程轻量化实现、代码极简无冗余、零基础可跑。
项目核心能力:
本地私有文档解析、文本分片
文档向量化、Milvus 向量入库持久化
相似度检索召回相关上下文
大模型结合检索内容生成精准答案
支持流式问答响应,体验媲美在线AI对话
FastAPI 自动生成接口文档,可直接对接前端/小程序
二、技术栈说明
FastAPI:高性能接口服务框架,提供统一接口能力、自动生成API文档
Milvus:开源高性能向量数据库,负责存储文档向量、相似度检索
LangChain:大模型应用开发框架,封装文档切分、向量嵌入、RAG链路
OpenAI Embedding + LLM:文本向量化、智能问答生成
三、环境依赖安装
执行以下命令安装全部所需依赖包:
pipinstallfastapi uvicorn langchain langchain-openai pymilvus python-dotenv四、前置准备
1. 启动 Milvus 服务
本地提前部署 Milvus(Docker 一键部署即可),保证默认端口19530正常连通。
2. 配置环境变量 .env 文件
项目根目录新建\.env文件,配置大模型密钥与接口地址:
OPENAI_API_KEY=你的API密钥 OPENAI_BASE_URL=你的接口代理地址 MILVUS_HOST=127.0.0.1 MILVUS_PORT=19530五、完整项目代码
整体项目仅需一个主文件,包含文档入库、向量检索、RAG问答、流式接口全部能力。
fromfastapiimportFastAPIfromfastapi.middleware.corsimportCORSMiddlewarefromlangchain_openaiimportOpenAIEmbeddings,ChatOpenAIfromlangchain_community.vectorstoresimportMilvusfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain.schemaimportDocumentfromlangchain.chainsimportRetrievalQAimportosfromdotenvimportload_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")asyncdefinit_milvus():"""服务启动初始化Milvus向量库"""globalvector_db vector_db=Milvus(embedding_function=embedding_model,connection_args={"host":MILVUS_HOST,"port":MILVUS_PORT},collection_name=COLLECTION_NAME)@app.post("/add_doc")asyncdefadd_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")asyncdefknowledge_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_contentfordocinresult["source_documents"]]return{"code":200,"question":question,"answer":result["result"],"source_context":source_list}if__name__=="__main__":importuvicorn 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高性能接口,非常适合个人项目、毕业设计、企业内部知识库开发。