SDU软件学院创新实训(四)
这段时间我主要把项目里的知识库管理模块重新梳理和优化了一遍然后优化了一下前端界面。刚开始做这个模块时目标其实很直接就是让后台能够上传 PDF 文档完成解析、切片、入库再给前面的智能问答提供知识支撑。但真正推进下去之后我才发现知识库管理并不是“把文件传上去”这么简单它更像是在做一条完整的数据链路文件能不能传、传完怎么分类、重复文件怎么处理、删除时会不会留下脏数据、向量索引和数据库记录能不能保持一致这些问题如果不提前处理好后面的问答效果和系统稳定性都会受到影响。所以这次优化我没有只盯着“功能有没有”这种较为基础的需求而是更多地去想实际运行环境中如何使用。现在回头看这个模块从最初的基础版本已经慢慢变成了一个相对完整的后台管理能力。在上传流程上最先解决的是“上传体验不清晰”的问题。以前做文件上传时最容易忽略的一点就是用户并不知道系统到底处理到了哪一步。尤其知识库上传不是普通附件上传文件传到服务器之后还要继续做 PDF 文本提取、分页切片、向量化、写入向量库这个过程比单纯的上传耗时长得多。如果前端只是一个转圈很容易让人误以为系统卡住了。所以这次我把上传过程拆成了两个阶段。第一个阶段是浏览器到服务端的网络上传进度第二个阶段是服务端内部的解析和入库进度。前端通过progressId 轮询后端处理状态把“正在上传文件”“正在解析并入库”“正在刷新向量索引”这些状态展示出来。这样做之后整个过程不再是黑盒哪怕文件多、处理时间长管理员也知道系统正在工作而且知道工作到了哪里。这一点虽然不是特别“炫技”但实际上非常影响使用感受。上传功能的第二个重点是把约束做得更扎实。知识库不是所有文件都能往里塞的这里我明确收紧了几个条件。第一只允许上传 PDF 文件。前端选择文件时就先拦一次后端真正接收时再校验一次避免单靠前端校验带来的漏洞。第二支持批量上传但批量不代表无脑导入重复文件会被自动跳过。这个地方我一开始想过直接报错终止但后来发现实际使用中这样会很影响效率因为管理员可能一次选十几个文件不应该因为其中一个重复就让整批失败。最后采用的是“部分成功”的思路能导入的继续导入重复文件单独列出来提示格式不符合的文件也单独提示这样既保证了规则也照顾了使用体验。重复文件判断这一块是我这次做下来比较有收获的地方。表面上看只是“文件名查重”但真正实现时不能只靠一个字段硬判。因为同一份资料可能存在文件路径变化、分类调整、重新整理目录这些情况所以系统里同时结合了文档标题和来源路径文件名去做判断。这个方案不是绝对完美但在当前项目阶段已经足够实用可以有效拦住大部分重复上传问题现在的数据质量明显更可控。分类管理也是这次优化里我比较重视的一部分。知识库内容一旦逐渐变多如果分类做不好后面维护会越来越乱。现在上传时支持两种分类模式一种是直接选择已有分类另一种是新建分类。这个设计看起来不复杂但它解决了两个实际问题。一个是保证已有内容的归类一致性避免同类文档被分散到很多名字相近的标签里另一个是给后续扩展留空间管理员遇到新主题时不需要等开发改代码自己就能补充分类。同时对于没有明确分类的内容系统会落到“未分类”这个默认项避免出现空值数据后续筛选和维护也更方便。除了上传我觉得删除功能才是这个模块最难的地方。最开始如果只是删掉数据库里的一条文档记录看起来好像完成了删除但其实还远远不够。因为一份知识文档在系统里往往对应三层数据本地源文件、数据库中的文档和切片记录、向量库里的向量数据。如果只删其中一层剩下两层就会变成脏数据。最直接的后果就是后台列表里看不见这篇文档了但智能问答依然可能检索到它的内容这会带来非常严重的一致性问题。所以这次我把删除链路做成了联动处理。删除一个文档时系统会先尝试删除源 PDF 文件再清理该文档对应的所有切片记录同时删除向量库中的向量数据最后再物理删除数据库中的文档记录。如果对应目录已经空了还会顺带把空目录清理掉。这样做的好处很明显删除是真正意义上的“删干净”不会留下看不见但还能影响结果的残留数据。批量删除也是基于单文档删除逻辑逐个执行尽量保证行为一致而不是为了省事另写一套逻辑埋下不同步的问题。以前做后台管理很容易把“删除”理解成一个简单按钮但这次做知识库模块让我更明显地意识到删除其实是一种数据治理能力。尤其在带有向量检索的系统里文档内容不是只存在一处任何一次删除都必须考虑全链路否则前台问答结果就可能和后台管理状态对不上。这种问题平时测试时未必立刻暴露但一旦上线就会很麻烦。另外考虑到向量库本身也可能出现索引状态异常、模型维度调整、历史数据需要重建这些情况我还保留了“重建向量索引”的能力。这个功能在日常使用中不一定高频但在开发和迭代阶段非常重要。因为知识库系统不是一次性做完就不动了后面模可能需要重新同步。把这个入口放在后台里本质上也是在给系统预留维护能力而不是只做一个静态页面。本次优化也顺便优化了管理员端的前端web界面进行了一定的美化。总体来说这次知识库管理模块的优化完成的并不只是上传、删除、分类这些表层功能而是把知识文档从进入系统到离开系统的整个生命周期补完整了。它让我进一步体会到项目开发真正难的地方往往不是把一个按钮做出来而是让按钮背后的逻辑稳定、清楚、可维护。