为应对关于实习项目的问答,整理此篇文章为整理实习项目
1.项目的架构是怎么样的,是用于处理什么业务的,能说出一个业务流程嘛?
项目是基于RAG的智能检索项目,通过人工上传文件文档,对文件文档进行语义分析和向量化处理存储到ES数据库中,结合人工智能去检索公司内部文档并总结内容来回答用户提问,解决公司内文件孤岛情况,便于员工进行业务查询以及响应的技术支持。
项目被分为文件上传,文件向量化,智能检索,生成回答这四个方面。项目整体上使用的是SpringBoot搭建,在文件上传模块使用了MinIO进行切片文件的整理以及存储,使用redis的bitMap保证文件的切片上传以及断点传输,还利用了消息队列进行。在文件向量化中使用ApacheTIcka进行文件语义的智能向量化切割,将切割好的文件块利用豆包的向量化模型存入ES中,在智能检索模块,使用Kafaka消息队列让进行异步解耦和削峰作用。在智能检索模块,使用ES的混合检索,BM2.5的关键词检索配合KNN算法检测出适合的相关信息。在生成回答方面,我使用redis缓存了历史会话,利用从ES中检索出的相关信息加上历史会话配合我的提示词Prompt,发送给DeepSeek大模型生成回答内容。最后关于数据层我使用的是MySQL,利用myBaits进行与数据库的连接。
整个业务流程是这样的,前端使用MD5将文件分割传给后端,文件分块中有两个重要的属性md5分割之后的编号以及顺序编号,在后端redis使用bitMap对以md5为key,记录同一文件下文件分块上传情况,当然分块的文件是存储在MinIO中的,文件上传完成之后使用MinIO进行文件整合,整合好的文件会被ApacheTIka进行智能的语义块分割,分割的语义块会利用豆包的向量模型进行向量化存储在ES中,这个过程使用Kafaka进行削峰,消费者根据自己的消费能力消费。之后用户给我们的模型发送问题,问题同样会被切割向量化发送给ES进行混合检索,同时我的redis会用时间和用户ID作为key记录历史对话内容,将历史会话和ES返回的相关信息配合我设计的提示词,prompt用于是大模型更加准确的回答我们的内容,我设定了模型扮演的角色,模型一定要用返回的信息进行回答等内容。
2.看你的说明中负责的是文件的分割上传和断点传续,你能说说你扶着的文件上传部分吗?
文件上传部分设计分割上传和断点续传,前端利用MD5分割文件发送给后端的时候,会携带MD5编号和一个顺序值的属性,当后端首次接受这个文件的时候,会在数据库记录文件信息,关键的一点是文件上传的状态,同时利用数据库的唯一性实现幂等操作,防止重复传输,分片的文件会被存储在MinIO中,我以文件的MD5编号和顺序进行存储,这样就可以分辨文件分片的归属和之后的合成,同时我的redis会使用bitMap记录分片上传的进度,这样就算网络出现问题,会检查数据库文件是否上传完成以及根据redis中的记录去断点传续,传输完成之后更新数据库状态并且删除redis中的记录和MinIO中的临时分片。假如不可抗拒因素导致传输失败了,多次传输失败后,前端会暂停上传并提示用户手动重试。用户重试后会利用现有的断点续传机制从失败的地方继续。如果遇到永久性故障导致始终无法成功,系统后台会主动清理临时资源(Redis中的标记和MinIO中的分片),并最终向用户报告一个不可恢复的错误,同时触发监控警报通知运维人员介入排查。
3.你说实现了性能提升,这个部分你做了什么内容?
在我们尝试上传100页大小的PDF时,发现时间长达10多分钟,之后发现有两个地方可以调整,一个时文件的分割,这个任务是cpu密集型的,我将分割抽象为任务交由线程池并发处理,核心线程数设定为cpu的核心数。其次是向量化时,我采用了分组传输,设计一个队列,容量为256,当文件块数量达到队列容量时发送给向量化模型,减少了调用向量化模型的网络开销









