智能文档助手:基于RAG的本地化文档问答系统实战指南

引言

在信息爆炸的时代,如何快速从海量文档中获取精准答案成为企业和个人的迫切需求。传统的文档检索方式效率低下,而基于大语言模型的智能问答系统则为我们提供了全新的解决方案。今天,我将为大家介绍一个开箱即用的智能文档助手项目------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 文件,脚本会自动完成以下所有步骤:

  1. 环境检测:检查Python 3.10+、Node.js 18+、npm是否已安装
  2. 配置文件 :自动从.env.example创建backend/.env(首次运行时可交互输入API Key)
  3. Python环境:创建虚拟环境并安装全部Python依赖
  4. 前端依赖:安装npm依赖
  5. 启动服务:弹出后端窗口(端口8000)和前端窗口(端口3000)
  6. 健康检查:轮询等待服务就绪(最多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等多种编码

上传流程

  1. 点击左侧「上传文档」按钮
  2. 选择文件或拖拽到上传区域
  3. 系统自动解析、分块、向量化
  4. 文档出现在左侧文档列表中

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

解决方案

  1. 查看弹出的后端/前端窗口错误信息
  2. 检查端口是否被占用(脚本会自动清理)
  3. 确认API Key配置正确
  4. 手动安装依赖:cd backend && venv\Scripts\python.exe -m pip install -r requirements.txt

Q: 上传文档处理失败

可能原因

  1. 文件格式不支持(仅支持PDF、.docx、.txt)
  2. 文件大小超过50MB限制
  3. 文件编码问题(TXT文件推荐UTF-8编码)
  4. 查看后端窗口日志获取详细错误信息

Q: 对话时显示"API Key无效"

解决方案

  1. 确认backend/.env中的OPENAI_API_KEY配置正确
  2. 注册对应服务商获取API Key:

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应用,具有以下优势:

  1. 开箱即用:提供跨平台一键启动脚本,降低部署门槛
  2. 灵活扩展:支持多种大模型服务商,可根据需求自由切换
  3. 用户体验优秀:现代化的Web界面,支持深浅主题切换
  4. 功能完整:从文档上传到智能问答的全流程覆盖
  5. 技术栈先进:采用FastAPI、Vue 3、LangChain等主流技术

无论是个人学习、企业知识库建设,还是作为RAG技术的入门实践项目,Smart Doc Assistant都是一个值得尝试的优秀选择。项目代码结构清晰,文档完善,适合开发者学习和二次开发。

下一步学习建议

如果您对这个项目感兴趣,可以:

  1. 深入研究RAG原理:了解检索增强生成的技术细节
  2. 尝试不同向量数据库:如Pinecone、Weaviate等
  3. 优化分块策略:根据文档类型调整分块大小和重叠度
  4. 添加更多文档格式支持:如PPT、Excel、图片OCR等
  5. 部署到生产环境:使用Docker容器化部署

项目源码和最新文档请参考GitHub仓库。祝您使用愉快!

相关推荐
zhangfeng11332 小时前
CodeBuddy 是否支持 SDD(Spec-Driven Development 规范驱动开发
人工智能·驱动开发
阿里云大数据AI技术2 小时前
基于阿里云EMR Serverless StarRocks提效多模态工单标注和舆情研判
人工智能
等一朵映山红2 小时前
基于 OpenCV 实现摄像头实时人脸检测完整流程
人工智能·opencv·计算机视觉
小兔子2 小时前
Agent 一旦能出网、改仓、调工具:对照 AISI 越权事件,把四层控制写进架构
人工智能·agent
jkyy20142 小时前
以科技赋能运动康养!健康有益×泰康养老,打造智能运动新体系
大数据·人工智能·健康医疗
不瘦80斤不改名2 小时前
05-vibe-coding-向agentic-engineering演进
人工智能·笔记·python·prompt
Smoothcloud润云2 小时前
GPU租赁数据安全怎么做?
人工智能·算法·ai·aigc·gpu算力·gpu
北墨NoLimit2 小时前
TRAE Work实战:把办公Agent竞品调研从2-3天压到32分钟,有完整指令模板
前端·人工智能·数据可视化