📋 项目概述
本项目是面向植物病害资料检索、知识管理与辅助问答的 Web 系统,采用 Vue 3 与 Flask 前后端分离架构。系统将文档、病害档案、田间案例和图谱三元组组织为可追溯的领域知识,并在问答时将检索证据与用户问题一起交给大语言模型生成回答。
系统包含普通用户端和管理端。普通用户可完成密码或短信验证码登录、图片辅助问答、会话管理、资料浏览与个人资料维护;管理员可维护用户、知识库、图谱三元组、模型配置、病害档案、案例记录及 SQLite 业务数据。系统用于学习、演示和辅助信息检索,页面中的病害判断和防治建议不构成真实诊断或用药依据。

🎯 项目创新点
多源证据问答:将知识库文档、病害档案、田间案例和图谱关系一起作为问答证据,并在回答完成后展示检索依据。
受限本体图谱:围绕植物病害场景固定 10 类节点和 11 类关系,结合词典、别名和规则抽取,减少自由文本建图带来的类型漂移。
可降级的图数据服务:三元组先持久化到 SQLite,并在 Neo4j 可用时同步;Neo4j 暂不可用时,检索和可视化仍可使用 SQLite 三元组完成只读展示。
文本与视觉双模型路由:模型配置按文本和视觉能力、优先级、启停状态路由到 OpenAI 兼容接口;模型密钥使用 Fernet 加密保存,接口不返回明文密钥。
可感知的流式交互:SSE 输出实体识别、文档匹配、图谱关联、上下文聚合与回答格式化等阶段进度,只描述可验证的处理步骤,不展示模型内部思维链。
安全认证闭环:密码采用 PBKDF2 哈希保存,支持 JWT 双角色权限、短信验证码登录和短信校验后的密码重置。
可操作的图谱界面:支持节点搜索、1--2 跳邻居、类型和关系筛选、力导向/环形布局、节点数量限制及节点关系详情。
完整业务数据管理:除问答反馈表外,管理端可对 SQLite 中的业务表进行元数据驱动的增删改查,并对敏感字段做脱敏处理。
🚀 主要功能
用户端功能
账号与个人中心:支持普通用户注册、用户名密码登录、短信验证码登录、短信验证码重置密码、退出登录、个人资料和头像维护。
文档浏览:支持按标题、摘要、目录和图谱状态浏览知识库文档,查看正文、摘要和关联状态。
智能问答:支持多轮会话、Markdown 安全渲染、文本问答和图片辅助问答;图片支持 JPG、PNG、WebP,服务端会验证真实图片内容并将 WebP 规范化为视觉模型可用格式。
会话管理:支持新建、重命名、删除、清空历史、重新进入历史会话和 Word 导出;历史消息中的上传图片会随会话恢复。
LLM 标题生成:可对当前会话发起标题生成,展示阶段进度,并允许用户在保存前编辑标题。
检索依据与图谱证据:回答完成后展示匹配文档、病害档案、案例记录、实体关键词和关联图谱;文档、档案和案例均可在弹窗中查看详情。
问答反馈:支持对单条问答提交正向或负向评价及补充说明。
管理端功能
控制台与数据大屏:展示用户、文档、会话、问答、图谱和业务数据的统计概览、分布和趋势。
用户管理:支持用户查询、新增、编辑、角色切换、启停、密码重置和删除;管理员路由与普通用户路由严格分离。
模型管理:支持维护文本/视觉模型的供应商、展示名称、模型名、Base URL、优先级、启停状态和连通性测试结果;API Key 加密存储,仅展示是否已配置。
文档与目录管理:支持目录树维护、文档上传、内容提取、摘要生成、下载、删除、单文档或目录级建图同步。
知识图谱管理:支持图谱全量重建、增量构建、目录同步、任务状态查看,以及图谱三元组的分页查询和 CRUD;写入后会尝试同步 Neo4j。
知识图谱可视化:支持节点关键词搜索、实体类型和关系类型筛选、关系多选、1--2 跳邻居展开、力导向/环形布局、节点数量上限和全屏查看。节点数量查询参数为 node_limit,默认 50,范围为 1--500;节点详情会展示真实的关系统计、相邻节点、关系方向和展开深度。
植物病害档案管理:支持病害档案的分页查询、搜索、统计、图片管理和完整 CRUD。
病害案例管理:支持关联病害的案例记录、多图管理、关键词与条件筛选、统计和完整 CRUD。
SQLite 数据管理:按表元数据展示除 qa_feedback 外的全部业务表,左右区域独立滚动,表格分页展示;支持新增、编辑和删除,密码哈希、验证码哈希和模型密钥等敏感字段不直接回显。
核心技术功能
领域实体识别:通过植物病害词典、同义词和规则补充识别病害、植物、病原体、症状、药剂、防治措施、地点、机构、文档和时间点。
三元组构建与本体校验:从文档摘要和正文中抽取并归一化 <源节点, 关系, 目标节点>,只允许写入预定义的节点与关系类型。
GraphRAG 检索:按实体、关键词和问题片段查询文档、病害档案、案例和图谱三元组,形成结构化检索快照。
证据约束生成:将检索结果序列化为模型上下文;图片作为辅助输入,证据不足时要求模型说明边界,避免虚构病害或药剂结论。
流式问答与持久化:使用 SSE 输出回答阶段和文本片段;完成后持久化问题、回答、图片路径、检索快照、图谱快照及实际使用的模型信息。
文件安全处理:文档支持 TXT、MD、PDF、DOCX、XLSX,图片上传验证扩展名与真实格式,所有上传文件由受控目录统一管理。
🏗️ 系统架构和技术栈
整体架构
┌────────────────────┐ HTTP / SSE ┌────────────────────┐
│ Vue 3 前端 │ ◄─────────────────► │ Flask 后端 │
│ Port: 3000 │ │ Port: 5010 │
│ 用户端 / 管理端 │ │ JWT / RBAC / API │
└────────────────────┘ └───────┬────────────┘
│
┌──────────────────────────────────────┼──────────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│ SQLite │ │ Neo4j │ │ OpenAI 兼容模型服务 │
│ 业务数据/三元组 │ │ 图谱同步与管理 │ │ 文本 / 视觉能力 │
└────────────────────┘ └────────────────────┘ └────────────────────┘
│
▼
┌────────────────────┐
│ 本地受控文件存储 │
│ 文档/头像/病害图/案例图/问答图 │
└────────────────────┘
前端通过 Axios 访问 REST API,并通过 POST /api/chat/stream 接收问答流。后端使用 SQLite 保存业务事实和图谱三元组,Neo4j 用于正式图谱同步;当 Neo4j 不可达时,系统保留 SQLite 三元组的检索和可视化读能力。模型服务由管理端动态配置,不绑定某一个固定厂商。
技术栈详解
前端技术栈
Vue 3 + TypeScript:使用 Composition API 组织页面、状态与交互逻辑。
Vite:提供本地开发服务与生产构建。
Vue Router + Pinia:实现前端路由守卫、登录态恢复和角色页面跳转。
Element Plus:提供表单、表格、对话框、分页、通知等基础 UI 组件。
ECharts:实现可拖拽、缩放的知识图谱力导向图和环形布局。
Axios:封装鉴权请求、错误处理和文件上传。
安全 Markdown 渲染组件:将问答中的标题、强调、列表和分隔线转换为受控页面结构,避免直接注入 HTML。
后端技术栈
Flask + Flask-CORS:提供 REST 接口、SSE 问答流和跨域支持。
SQLite:保存用户、目录、文档、会话、问答历史、病害档案、案例、图谱三元组、图谱任务、问答反馈、模型配置和验证码等数据。
PyJWT:签发并校验 JWT;用户状态、角色和 token 版本参与认证校验。
PBKDF2-HMAC:对用户密码进行带盐哈希;短信验证码仅保存 SHA-256 哈希。
cryptography/Fernet:加密模型 API Key,管理接口仅返回 has_api_key 等状态信息。
pdfplumber、python-docx、openpyxl:分别解析 PDF、DOCX 和 XLSX 文档内容。
Pillow:验证图片内容、读取格式并在必要时将 WebP 转换为 JPEG。
Requests:调用模型服务和阿里云市场短信网关。
算法服务技术栈
Neo4j Python Driver:负责 Neo4j 连通性检查、图谱清空和三元组同步。
领域词典与规则抽取:以植物病害本体为约束,完成实体识别、别名归一和三元组构建。
LangChain Core + LangChain OpenAI:调用可配置的 OpenAI 兼容文本或视觉模型。
模型路由器:根据能力类型、启停状态和优先级选择模型;无可用密钥时使用 mock 适配器支持本地演示与测试。
阿里云市场短信网关:复用项目 短信/SendSms.java 的接口约定,实现验证码发送、冷却、过期和失败提示。

























