引言
在信息爆炸的时代,如何快速从海量文档中获取精准答案成为企业和个人的迫切需求。传统的文档检索方式效率低下,而基于大语言模型的智能问答系统则为我们提供了全新的解决方案。今天,我将为大家介绍一个开箱即用的智能文档助手项目------Smart Doc Assistant,这是一个基于RAG(检索增强生成)技术的本地化文档问答系统。
项目概述
智能文档助手(Smart Doc Assistant) 是一个功能完整的RAG应用,支持上传PDF、Word、TXT等多种格式文档,通过AI自动理解文档内容并回答用户问题。项目采用前后端分离架构,支持一键启动、多模型服务商接入,并提供了完善的文档管理和对话功能。
核心特性
- 📁 多格式支持:PDF、DOCX、TXT文档解析
- 🧠 智能检索:基于语义相似度的文档检索
- 💬 智能对话:普通对话与流式输出(打字机效果)
- 🎨 美观界面:Vue 3 + Element Plus现代化UI
- 🔧 开箱即用:跨平台一键启动脚本
- 🌐 多模型支持 :DeepSeek、OpenAI、智谱AI、Ollama等

快速开始
环境要求
在开始之前,请确保您的系统满足以下要求:
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| Python | ≥ 3.10 | 后端运行环境 |
| Node.js | ≥ 18 | 前端构建工具链 |
| npm | ≥ 9 | 前端包管理器 |
一键启动(推荐)
Windows用户
双击项目根目录下的 setup_and_run.bat 文件,脚本会自动完成以下所有步骤:
- 环境检测:检查Python 3.10+、Node.js 18+、npm是否已安装
- 配置文件 :自动从
.env.example创建backend/.env(首次运行时可交互输入API Key) - Python环境:创建虚拟环境并安装全部Python依赖
- 前端依赖:安装npm依赖
- 启动服务:弹出后端窗口(端口8000)和前端窗口(端口3000)
- 健康检查:轮询等待服务就绪(最多30秒),确认可用后自动打开浏览器
Mac/Linux用户
在终端中执行以下命令:
bash
cd smart-doc-assistant-master
chmod +x setup_and_run.sh
./setup_and_run.sh
API Key配置
启动前需要配置大模型API Key,编辑backend/.env文件:
env
# 使用DeepSeek(推荐,国内可用,价格低廉)
OPENAI_API_KEY=sk-你的密钥
OPENAI_BASE_URL=https://api.deepseek.com/v1
CHAT_MODEL=deepseek-chat
# 或使用OpenAI官方
# OPENAI_API_KEY=sk-你的密钥
# OPENAI_BASE_URL=https://api.openai.com/v1
# CHAT_MODEL=gpt-4o
# 或使用智谱AI
# OPENAI_API_KEY=你的智谱APIKey
# OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4
# CHAT_MODEL=glm-4-flash
# 或使用本地Ollama
# OPENAI_API_KEY=ollama
# OPENAI_BASE_URL=http://localhost:11434/v1
# CHAT_MODEL=qwen2.5:7b
重要提示 :系统会自动检测API端点类型。使用DeepSeek、智谱AI等不提供嵌入接口的服务时,会自动回退到本地
all-MiniLM-L6-v2模型进行文档向量化,无需额外配置嵌入模型API Key。
项目架构详解
目录结构
smart-doc-assistant-master/
├── setup_and_run.bat # Windows一键启动脚本
├── setup_and_run.sh # Mac/Linux一键启动脚本
├── .env.example # 环境变量配置模板
├── README.md # 项目说明文档
│
├── backend/ # 后端 --- FastAPI + LangChain + ChromaDB
│ ├── app/
│ │ ├── main.py # FastAPI应用入口
│ │ ├── config.py # 全局配置管理
│ │ ├── api/ # REST API接口层
│ │ ├── services/ # 业务逻辑层
│ │ └── models/ # 数据模型
│ ├── requirements.txt # Python依赖清单
│ ├── uploads/ # 上传文件存储目录
│ └── chroma_db/ # 向量数据持久化目录
│
└── frontend/ # 前端 --- Vue 3 + TypeScript + Vite
├── src/
│ ├── components/ # UI组件
│ ├── composables/ # 组合式函数
│ ├── types/ # TypeScript类型定义
│ └── utils/ # 工具函数
└── vite.config.ts # Vite配置
技术栈
| 层级 | 技术 | 说明 |
|---|---|---|
| 后端框架 | Python FastAPI | 异步高性能Web框架 |
| RAG框架 | LangChain | 文档加载、文本分片、检索链 |
| 向量数据库 | ChromaDB | 轻量级本地向量存储 |
| 嵌入模型 | OpenAI Embeddings / 本地all-MiniLM-L6-v2 | 自动根据API端点选择 |
| LLM调用 | OpenAI Compatible API | 支持所有兼容OpenAI接口的服务 |
| 前端框架 | Vue 3 Composition API | 组件化UI框架 |
| UI组件库 | Element Plus | 企业级Vue 3组件库 |
| 构建工具 | Vite 6 | 极速前端构建 |
| 语言 | TypeScript | 类型安全的前端开发 |
核心功能使用指南
1. 文档上传与管理
系统支持三种文档格式:
- PDF:自动提取文本内容
- DOCX:解析Word文档
- TXT:支持UTF-8、GBK、GB2312等多种编码
上传流程:
- 点击左侧「上传文档」按钮
- 选择文件或拖拽到上传区域
- 系统自动解析、分块、向量化
- 文档出现在左侧文档列表中
2. 智能问答
系统提供两种问答模式:
- 文档专属问答:点击左侧文档,针对该文档提问
- 全局知识库问答:选择「新建对话」,基于所有已上传文档提问
问答特性:
- ✅ 显示参考来源和相关度评分
- ✅ 支持多轮对话上下文记忆
- ✅ 普通对话与流式输出(SSE协议)
- ✅ 复制答案和重新生成功能
3. API接口
启动后端后访问 http://localhost:8000/docs 查看Swagger交互式文档。
主要接口:
- 文档管理:上传、列表、详情、删除、统计
- 对话聊天:普通对话、流式对话、对话历史管理
- 系统管理:关闭项目
使用流程
#mermaid-svg-sk1OqUNFylvcIN1f{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sk1OqUNFylvcIN1f .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sk1OqUNFylvcIN1f .error-icon{fill:#552222;}#mermaid-svg-sk1OqUNFylvcIN1f .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sk1OqUNFylvcIN1f .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sk1OqUNFylvcIN1f .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sk1OqUNFylvcIN1f .marker.cross{stroke:#333333;}#mermaid-svg-sk1OqUNFylvcIN1f svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sk1OqUNFylvcIN1f p{margin:0;}#mermaid-svg-sk1OqUNFylvcIN1f .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sk1OqUNFylvcIN1f .cluster-label text{fill:#333;}#mermaid-svg-sk1OqUNFylvcIN1f .cluster-label span{color:#333;}#mermaid-svg-sk1OqUNFylvcIN1f .cluster-label span p{background-color:transparent;}#mermaid-svg-sk1OqUNFylvcIN1f .label text,#mermaid-svg-sk1OqUNFylvcIN1f span{fill:#333;color:#333;}#mermaid-svg-sk1OqUNFylvcIN1f .node rect,#mermaid-svg-sk1OqUNFylvcIN1f .node circle,#mermaid-svg-sk1OqUNFylvcIN1f .node ellipse,#mermaid-svg-sk1OqUNFylvcIN1f .node polygon,#mermaid-svg-sk1OqUNFylvcIN1f .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sk1OqUNFylvcIN1f .rough-node .label text,#mermaid-svg-sk1OqUNFylvcIN1f .node .label text,#mermaid-svg-sk1OqUNFylvcIN1f .image-shape .label,#mermaid-svg-sk1OqUNFylvcIN1f .icon-shape .label{text-anchor:middle;}#mermaid-svg-sk1OqUNFylvcIN1f .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sk1OqUNFylvcIN1f .rough-node .label,#mermaid-svg-sk1OqUNFylvcIN1f .node .label,#mermaid-svg-sk1OqUNFylvcIN1f .image-shape .label,#mermaid-svg-sk1OqUNFylvcIN1f .icon-shape .label{text-align:center;}#mermaid-svg-sk1OqUNFylvcIN1f .node.clickable{cursor:pointer;}#mermaid-svg-sk1OqUNFylvcIN1f .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sk1OqUNFylvcIN1f .arrowheadPath{fill:#333333;}#mermaid-svg-sk1OqUNFylvcIN1f .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sk1OqUNFylvcIN1f .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sk1OqUNFylvcIN1f .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sk1OqUNFylvcIN1f .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sk1OqUNFylvcIN1f .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sk1OqUNFylvcIN1f .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sk1OqUNFylvcIN1f .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sk1OqUNFylvcIN1f .cluster text{fill:#333;}#mermaid-svg-sk1OqUNFylvcIN1f .cluster span{color:#333;}#mermaid-svg-sk1OqUNFylvcIN1f div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sk1OqUNFylvcIN1f .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sk1OqUNFylvcIN1f rect.text{fill:none;stroke-width:0;}#mermaid-svg-sk1OqUNFylvcIN1f .icon-shape,#mermaid-svg-sk1OqUNFylvcIN1f .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sk1OqUNFylvcIN1f .icon-shape p,#mermaid-svg-sk1OqUNFylvcIN1f .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sk1OqUNFylvcIN1f .icon-shape .label rect,#mermaid-svg-sk1OqUNFylvcIN1f .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sk1OqUNFylvcIN1f .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sk1OqUNFylvcIN1f .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sk1OqUNFylvcIN1f :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置API Key
编辑backend/.env
一键启动
setup_and_run.bat/.sh
上传文档
PDF/DOCX/TXT
选择文档
或新建对话
输入问题
获取智能回答
查看来源
和相关度评分
常见问题排查
Q: 启动后无法访问 http://localhost:3000
解决方案:
- 查看弹出的后端/前端窗口错误信息
- 检查端口是否被占用(脚本会自动清理)
- 确认API Key配置正确
- 手动安装依赖:
cd backend && venv\Scripts\python.exe -m pip install -r requirements.txt
Q: 上传文档处理失败
可能原因:
- 文件格式不支持(仅支持PDF、.docx、.txt)
- 文件大小超过50MB限制
- 文件编码问题(TXT文件推荐UTF-8编码)
- 查看后端窗口日志获取详细错误信息
Q: 对话时显示"API Key无效"
解决方案:
- 确认
backend/.env中的OPENAI_API_KEY配置正确 - 注册对应服务商获取API Key:
- DeepSeek:platform.deepseek.com
- OpenAI:platform.openai.com/api-keys
- 智谱AI:open.bigmodel.cn
Q: 如何更换大模型服务商
编辑backend/.env文件,修改以下配置:
env
# 智谱AI示例
OPENAI_API_KEY=你的智谱APIKey
OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4
CHAT_MODEL=glm-4-flash
# 本地Ollama示例
OPENAI_API_KEY=ollama
OPENAI_BASE_URL=http://localhost:11434/v1
CHAT_MODEL=qwen2.5:7b
停止服务
方式一:浏览器一键关闭(推荐)
在浏览器网页右上角点击 「关闭项目」 按钮,确认后系统将自动停止后端和前端服务。
方式二:手动关闭
- Windows:关闭弹出的「SmartDoc-Backend」和「SmartDoc-Frontend」命令行窗口
- Mac/Linux :在终端按
Ctrl + C停止所有服务
总结
智能文档助手Smart Doc Assistant是一个功能完善、易于部署的RAG应用,具有以下优势:
- 开箱即用:提供跨平台一键启动脚本,降低部署门槛
- 灵活扩展:支持多种大模型服务商,可根据需求自由切换
- 用户体验优秀:现代化的Web界面,支持深浅主题切换
- 功能完整:从文档上传到智能问答的全流程覆盖
- 技术栈先进:采用FastAPI、Vue 3、LangChain等主流技术
无论是个人学习、企业知识库建设,还是作为RAG技术的入门实践项目,Smart Doc Assistant都是一个值得尝试的优秀选择。项目代码结构清晰,文档完善,适合开发者学习和二次开发。
下一步学习建议
如果您对这个项目感兴趣,可以:
- 深入研究RAG原理:了解检索增强生成的技术细节
- 尝试不同向量数据库:如Pinecone、Weaviate等
- 优化分块策略:根据文档类型调整分块大小和重叠度
- 添加更多文档格式支持:如PPT、Excel、图片OCR等
- 部署到生产环境:使用Docker容器化部署
项目源码和最新文档请参考GitHub仓库。祝您使用愉快!