【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】
基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统
- 一、系统整体架构:从前端到后端的全链路设计
- 1.1 架构总览
- 1.2 后端MVC架构详解
- 二、核心功能模块:从文档管理到智能生成
- 2.1 功能模块图
- 三、关键数据流解析:以文档上传与PPT生成为例
- 3.1 文档上传与知识库构建流程
- 3.2 智能PPT生成流程
- 四、核心技术解析:大模型与FAISS如何赋能?
- 4.1 FAISS向量数据库:让检索从"关键词匹配"到"语义理解"
- 4.2 大模型(Ollama+DeepSeek):从文本到结构化内容的"翻译官"
- 4.3 文本分块策略:平衡检索精度与效率
- 五、快速上手:部署与使用指南
- 5.1 环境配置
- 5.2 核心功能演示
- 六、总结与扩展方向
为什么需要本地知识库+智能生成系统?
在信息爆炸的时代,企业和个人积累的文档数据呈指数级增长,但如何高效利用这些数据一直是痛点:
- 手动从海量文档中提取关键信息耗时费力;
- 基于文档生成PPT、报告等二次创作成本高;
- 传统关键词搜索难以理解语义,召回率低。
本文将介绍一套基于大模型(Ollama+DeepSeek) 和FAISS向量数据库构建的本地知识库系统,不仅能实现文档的智能管理与检索,还能自动生成结构化PPT。系统采用前后端分离架构,代码开源可部署,适合企业内部知识沉淀与高效办公。
一、系统整体架构:从前端到后端的全链路设计
1.1 架构总览
系统采用前后端分离+MVC后端架构,整体分为5层,实现"数据输入-处理-存储-检索-输出"的全流程闭环:
- 前端层:Vue 3 + Element UI,负责用户交互(文档上传、查询、PPT生成操作);
- API网关层:Flask蓝图(Blueprints),处理跨域(CORS)与请求路由;
- 业务逻辑层:后端控制器(Controllers),协调各模块完成业务流程;
- 核心服务层:模型(Models)与工具(Utils),包括向量检索、文本处理、大模型调用等;
- 数据存储层:FAISS向量库(知识向量)、MySQL(用户数据)、文件系统(文档/PPT存储)。
1.2 后端MVC架构详解
后端基于Flask实现MVC架构,目录结构清晰,便于维护和扩展:
backend/
├── app.py # 控制器入口
├── config.py # 配置文件
├── models/
│ ├── __init__.py
│ ├── document.py # 文档处理模型
│ ├── faiss_wrapper.py # 向量数据库模型
│ ├── user.py # 用户模型
│ ├── image.py # 图片处理模型
│ ├── ppt.py # PPT生成模型
├── views/
│ ├── __init__.py
│ ├── templates/ # 模板文件(可用于渲染特定页面,此处暂时可能用不到)
│ ├── static/ # 静态文件(可用于存放一些后端静态资源)
├── controllers/
│ ├── __init__.py
│ ├── chat_controller.py # 聊天控制器
│ ├── upload_controller.py # 文件上传控制器
│ ├── query_controller.py # 知识查询控制器
│ ├── user_controller.py # 用户控制器
│ ├── image_controller.py # 图片上传与识别控制器
│ ├── ppt_controller.py # PPT生成控制器
├── utils/
│ ├── __init__.py
│ ├── file_parser.py # 文件解析工具
│ ├── text_processor.py # 文本处理工具
│ ├── image_recognition.py # 图片识别工具
├── tests/
│ ├── __init__.py
│ ├── view_vector_db.py
├── requirements.txt
├── LICENSE
├── README.md
├── README.en.md
- Model:封装数据处理逻辑(如
faiss_wrapper.py
实现向量存储与检索,ppt.py
实现PPT生成); - View:此处简化为API响应(前后端分离,无需模板渲染);
- Controller:接收前端请求,调用模型与工具完成业务(如
upload_controller.py
处理文档上传)。
二、核心功能模块:从文档管理到智能生成
2.1 功能模块图
系统核心功能可分为5大模块,相互协同实现端到端智能处理:
-
用户管理模块
- 基于MySQL的用户注册、登录、权限控制(
user.py
模型+user_controller.py
); - 支持用户信息修改、状态管理(活跃/禁用)。
- 基于MySQL的用户注册、登录、权限控制(
-
文档处理模块
- 支持多格式文档上传(PDF、DOCX、TXT等,
file_parser.py
解析); - 文本智能分块(
text_processor.py
,基于RecursiveCharacterTextSplitter
); - 文档元数据管理(哈希校验、大小、上传时间等,
document.py
)。
- 支持多格式文档上传(PDF、DOCX、TXT等,
-
向量知识库模块
- 基于FAISS的向量存储(单例模式
VectorDB
,确保全局唯一实例); - 文档向量生成(
SentenceTransformer
模型,all-MiniLM-L6-v2
); - 相似性检索(支持跨文档/单文档内检索,
search_for_knowledge_base
方法)。
- 基于FAISS的向量存储(单例模式
-
图片识别模块
- 图片上传与OCR识别(
pytesseract
,image.py
模型); - 识别文本可接入知识库,支持后续检索与生成。
- 图片上传与OCR识别(
-
PPT智能生成模块
- 基于文档内容的PPT结构生成(大模型
deepseek-r1:14b
,generate_ppt_structure
方法); - 内容填充(从知识库检索相关片段,
extract_relevant_content
); - PPT文件生成(
python-pptx
,支持分页、样式美化)。
- 基于文档内容的PPT结构生成(大模型
三、关键数据流解析:以文档上传与PPT生成为例
3.1 文档上传与知识库构建流程
- 用户上传文档:前端通过Element UI的
el-upload
组件发送请求至/api/upload
; - 后端处理:
upload_controller.py
接收文件,保存临时路径; - 解析与分块:
file_parser.py
根据文件类型(如PDF用PyPDF2
,DOCX用python-docx
)提取文本;text_processor.py
按CHUNK_SIZE=512
分块(支持Markdown、代码文件的针对性分块);
- 向量存储:
- 文本块通过
SentenceTransformer
编码为384维向量; VectorDB
(FAISS)将向量加入索引,同时存储文档元数据(用户ID、文件名等)。
- 文本块通过
3.2 智能PPT生成流程
- 用户触发生成:前端传入文件名与用户ID,请求
/ppt/generate_ppt
; - 知识库检索:
vector_db.find_document_by_name
获取目标文档的文本块; - 结构生成:
- 大模型(Ollama的
deepseek-r1:14b
)接收文档文本,生成JSON格式的PPT结构(含标题、核心要点); - 示例结构:
{"title": "XXX报告", "slides": [{"title": "引言", "key_points": ["背景", "目的"]}]}
;
- 大模型(Ollama的
- 内容填充:对每一页幻灯片,调用
extract_relevant_content
从文档中提取相关文本作为内容; - 文件生成:
PPTModel
使用python-pptx
创建文件,设置样式(字体、页码、布局),保存至ppt_output
目录。
四、核心技术解析:大模型与FAISS如何赋能?
4.1 FAISS向量数据库:让检索从"关键词匹配"到"语义理解"
-
工作原理
FAISS(Facebook AI Similarity Search)是高效的向量检索库,解决了高维向量的快速相似性搜索问题:- 向量表示:文档文本通过
SentenceTransformer
转换为384维向量,语义相似的文本向量距离更近; - 索引构建:系统使用
IndexFlatL2
索引(L2距离度量),支持百万级向量的毫秒级检索; - 单例模式:
VectorDB
通过__new__
方法确保全局唯一实例,避免多控制器操作时的状态不一致。
- 向量表示:文档文本通过
-
关键代码(向量存储与检索)
# 向FAISS添加文档向量(faiss_wrapper.py) def add_document(self, user_id, doc_id, chunks, metadata):vectors = self.encoder.encode(chunks) # 文本→向量start_idx = self.index.ntotalself.index.add(np.array(vectors)) # 加入索引self.metadata[doc_id] = {"user_id": user_id, "vector_range": (start_idx, self.index.ntotal)}# 检索相似内容(faiss_wrapper.py) def search_for_generate_ppt(self, user_id, query, top_k=3):query_vec = self.encoder.encode([query]) # 查询→向量distances, indices = self.index.search(query_vec, top_k) # 检索最相似向量return [{"chunk": self.metadata[doc_id]["chunks"][idx], "distance": dist} for idx, dist, doc_id in zip(indices[0], distances[0], self.metadata.keys())]
4.2 大模型(Ollama+DeepSeek):从文本到结构化内容的"翻译官"
-
核心作用
- PPT结构生成:通过提示词(Prompt)引导模型输出规范的JSON结构,确保PPT逻辑清晰(6-8页,每页3-5个要点);
- 知识问答:结合用户问题与知识库检索结果,生成自然语言回答(
query_controller.py
的流式响应);
-
提示词设计(PPT结构生成)
prompt = f""" 你是PPT生成助手,请根据文本生成6-8页PPT大纲: 1. 首页为标题,末页为结束页; 2. 每页含标题(≤8字)和3-5个要点(≤15字); 3. 输出JSON格式:{{"title": "...", "slides": [{{"title": "...", "key_points": [...]}}]}} 文本:{text} """
4.3 文本分块策略:平衡检索精度与效率
系统采用递归字符分块(RecursiveCharacterTextSplitter
),针对不同文本类型优化:
- 普通文本:按
\n\n
、。
、!
等分隔符拆分,确保语义完整; - Markdown:保留
#
标题层级,通过MarkdownHeaderTextSplitter
分块; - 代码文件:按编程语言语法(如Python的
def
、class
)分块,避免函数/类被截断。
五、快速上手:部署与使用指南
5.1 环境配置
# 后端依赖
pip install flask flask-cors faiss-cpu sentence-transformers python-pptx pytesseract ollama
# 前端依赖
npm install vue@3 element-plus axios vue-router# 启动后端(默认5000端口)
cd backend && python app.py
# 启动前端(默认8080端口)
cd frontend && npm run serve
5.2 核心功能演示
-
用户注册登录:访问
/login
页面,完成注册后登录;
-
上传文档:在"文档管理"页面上传PDF/DOCX,系统自动解析并加入知识库;
-
生成PPT:在"PPT生成"页面选择已上传文档,点击"生成",等待10-30秒即可下载PPT;
-
知识查询:在"问答"页面输入问题(如"文档中提到的核心观点是什么?"),系统返回基于文档的答案。
六、总结与扩展方向
本系统通过大模型的内容生成能力与FAISS的高效向量检索,实现了从文档管理到智能创作的闭环。相比传统方案,其优势在于:
- 本地化部署:数据不泄露,适合敏感场景;
- 多模态支持:除文本外,还可扩展音频、视频的处理;
- 可定制化:大模型提示词、分块策略、PPT样式均可按需调整。
【未来可优化方向】:
- 引入RAG增强:通过多轮检索提升大模型回答的准确性;
- 支持PPT模板定制:允许用户上传模板,保持企业风格一致;
- 优化向量检索效率:使用FAISS的IVF索引或GPU加速,支持更大规模知识库。
代码地址:源码下载地址
技术交流:欢迎在评论区留言讨论向量检索、大模型应用等问题!