通过上传使大模型读取并分析文件实战

一、技术背景与需求分析

        我们日常在使用AI的时候一定都上传过文件,AI会根据用户上传的文件内容结合用户的请求进行分析,给出用户解答。但是这是怎么实现的呢?在我们开发自己的大模型应用时肯定是不可避免的要思考这个问题,今天我会将从文件上传开始到大模型给出分析的整个流程进行讲解

二、核心技术实现路径

        在这里我先将整体的流程说一下:

前端文件上传 → 服务端接收文件 → 解析文件 → 生成唯一Id → 将文件存储(id:content)|                                     |—————————————————存储id←———————————————↓
用户发送请求 → 用户信息+文件id → 服务端接收请求 → 根据id获取文件内容 → 拼接用户消息和文件内容↓大模型分析↓返回响应

1.文件上传于预处理

        文件上传的前端部分我不再进行讲解,但是需要说明的是,在前端需要加上对文件的约束和校验,比如文件大小、文件格式等。

        后端的编写上首先需要准备一个接口去接收文件。

在这个接口中实现的效果就是流程图中第一行的功能

 @RequestMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public UploadFileResultDto upload(@RequestPart("filedata") MultipartFile multipartFile) throws IOException {if (multipartFile.getSize() > 1024 * 1024 * 10){throw new RuntimeException("文件大小不能超过10M");}//解析文件String content = fileParseService.parse(multipartFile);//唯一idString fileId = UUID.randomUUID().toString();//存储文件memoryStorage.save(fileId, content);UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();uploadFileResultDto.setFileId(fileId);return uploadFileResultDto;}

 解析文件类,这个的最佳实践是:通过一个工厂类检测文件类型,将不同文件类型的文件交给不同的解析工具类执行

我这里仅举一个例子,只包含解析txt文件的条件

public interface FileParseService {String parse(MultipartFile file);
}

 中专工厂

@Service
public class FileParseServiceImpl implements FileParseService {@Overridepublic String parse(MultipartFile file) {//根据文件类型解析文件try {if (Objects.equals(file.getContentType(), "text/plain")){return new TxtFileParser().parse(file);}} catch (Exception e) {throw new RuntimeException(e);}return null;}
}

解析工具类

@Component
public class TxtFileParser {public String parse(MultipartFile file) throws Exception {StringBuilder Totalline;try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {Totalline = new StringBuilder();Totalline.append("文件【").append(file.getOriginalFilename()).append("】:\n");String line;while ((line = reader.readLine()) != null) {Totalline.append(line);}}return Totalline.toString();}
}

当响应结束后,返回文件的内容,然后在controller中生成一个UUID

以UUID作为key文件内作为value,因为最终是要将文件信息以Map的格式保存

创建一个存储类,用于存储文件信息。

@Component
public class MemoryStorage {//文件存储private static final ConcurrentHashMap<String,String> storage = new ConcurrentHashMap<>();//存储文件public void save(String fileId, String content) {storage.put(fileId, content);System.out.println("文件存储成功"+fileId);}//获取文件public String get(String fileId) {return storage.get(fileId);}//删除文件public void remove(String fileId) {storage.remove(fileId);System.out.println("文件删除成功"+fileId);}//清空所有文件public void clear() {storage.clear();System.out.println("文件清空成功");}
}

执行完这些后,文件的上传工作已经完成

此时前端会收到该文件的唯一Id,其会对这个id进行保存。

当用户发送消息时,会带着文件id的列表一并发送到服务器。

请求体:

@Data
public class GetRequest {//消息private String message;.....其余属性//文件列表private List<String> fileIds;

如果文件id列表不为空,服务端会从存储类中取得对应的文件内容

然后将文件内容和用户消息进行拼接

//用户消息
String userMessage = request.getMessage();
//文件内容->将用户消息和文件内容进行拼接
if (request.getFileIds() != null){userMessage = formatFile(request.getFileIds()) + "【用户消息】:\n"+userMessage;
}
 @Autowiredprivate MemoryStorage memoryStorage;public String formatFile(List<String> fileIds){if (fileIds == null){return null;}StringBuilder fileContent = new StringBuilder();for (String fileId : fileIds){String content = memoryStorage.get(fileId);fileContent.append(content).append("\n");}return fileContent.toString();}

最终模型收到的用户消息类似于这样的格式:

文件【xxx】:...【用户消息】:...

使得模型能够区分文件内容和具体的指令并进行分析

这是我的实验效果

 

三.优化路线

 模型对文件进行分析的操作,大致还会有以下的优化步骤

1.数据脱敏:对敏感信息进行屏蔽再进行分析+尽量在用户本地解析,当然这是针对商业化的需求

2.加密传输:对一些重要的信息和文件,在进行网络传输时需要对其进行加密操作

3.分块传输:一些大的文件一次性无法直接传输,需要进行分块

4.文件处理:在本文中我只介绍了文本文件的处理,这种是可以直接进行读取的,其他类型的文件                       例如PDF、EXCEL等还需要进行拓展工具类。甚至是图片、视频、音频等都需要根                         据不同的情况和技术选型选择不同的处理方案

开源项目参考

        以上代码和技术实现都是根据我的开源项目进行的展示,大家需要详细的了解的可以访问下载我的项目,跪求点个star!!!

  Local_Helper: 支持本地大模型的可视化应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/80988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCSA Linux 系统 硬盘管理

Linux 系统 硬盘管理 1扇区 512B&#xff0c;分区 多个扇区 512B 查看硬盘命令 [rootlocalhost ~]# lsblk 1.一般存储相关操作 (1) 分区 ① MBR 分区 ➤分区数量限制&#xff1a;主分区 0 - 4 个&#x…

计算机网络——Session、Cookie 和 Token

在 Web 开发中&#xff0c;Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系&#xff0c;也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。 一、基本定义与原理 1. Cookie 定义&#xff1a; 是浏览器存储在客户端的小…

双均线量化交易策略指南

策略原理 采用两条不同周期的简单移动平均线&#xff08;SMA&#xff09;&#xff1a; 短期均线&#xff1a;5日线&#xff08;快速反应价格变化&#xff09;长期均线&#xff1a;20日线&#xff08;反映长期趋势&#xff09; 交易信号生成规则&#xff1a; 当 5日线 > …

视频太大?用魔影工厂压缩并转MP4,画质不打折!

在日常生活中&#xff0c;我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具&#xff0c;深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式&#xff0c;并进行个性化设置…

大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径

在当今激烈的市场竞争中&#xff0c;产品迭代速度与质量已成为企业生存与发展的核心命脉。面对客户需求多元化、供应链协同复杂化、研发成本管控精细化等挑战&#xff0c;企业亟需一套能够贯穿产品全生命周期的数字化解决方案。 大腾智能PDM系统通过构建覆盖设计、研发、生产、…

CodeBuddy一腾讯内部已有超过 85% 的程序员正在使用de编程工具

大家好&#xff0c;我是程序员500佰&#xff0c;目前正在前往独立开发路线&#xff0c;我会在这里分享关于编程技术、独立开发、技术资讯以及编程感悟等内容。 如果本文能给你提供启发和帮助&#xff0c;还请留下你的一健三连&#xff0c;给我一些鼓励&#xff0c;谢谢。 本文直…

解锁 Zblog 资讯系统:502 错误修复与双域名适配的实战秘籍

在网络世界的激烈竞争中&#xff0c;资讯类网站如同战场上的士兵&#xff0c;每一次页面加载、每一次内容展示都关乎着用户的留存与转化。而 Zblog 作为备受青睐的资讯系统&#xff0c;承载着众多站长的流量梦想。然而&#xff0c;在网站运营过程中&#xff0c;502 错误页面的突…

今日打卡,Leetcode第四题:寻找两个正序数组的中位数,博主表示就会sorted

4. 寻找两个正序数组的中位数 博主只会第一个暴力解法&#xff0c;然后将官网上的源码上添加些注释&#xff0c;尝试理解&#xff0c;分下今日刷题记录 题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个…

Jouier 普及组十连测 R3

反思 首先&#xff0c;先悔恨一下这次的比赛成绩。 这次比赛的教训就是&#xff0c;简单的题目一定要打不要被复杂的题面震慑到&#xff0c;以及变量名不能是保留字&#xff0c;如第一题的x1,y1&#xff0c;要开long long&#xff0c;计算好数据范围&#xff0c;如第三第四题。…

Open CASCADE学习|非线性方程组求解技术详解

引言 在几何建模与工程计算中&#xff0c;非线性方程组的求解是常见的核心问题。Open CASCADE&#xff08;以下简称OCC&#xff09;作为开源的几何建模内核&#xff0c;提供了丰富的数学工具库&#xff0c;其中math_FunctionSetRoot类专为求解非线性方程组设计。本文将深入探讨…

科技初创企业创新推动商业未来

在这个因变革而蓬勃发展的世界里&#xff0c;科技初创企业已成为各行业创新、颠覆与转型的驱动力。这些雄心勃勃的企业正在重塑商业格局&#xff0c;挑战既定规范&#xff0c;并不断突破可能性的边界。本文将深入探索科技初创企业的精彩领域&#xff0c;探讨它们如何通过创新塑…

霍尼韦尔HMR2300-D00-485数字模块

型号&#xff1a;HMR2300-D00-485 类型&#xff1a;数字通信模块&#xff08;RS-485接口&#xff09; 制造商&#xff1a;霍尼韦尔&#xff08;Honeywell&#xff09;&#xff0c;隶属于其工业自动化或楼宇自动化产品线。 典型用途&#xff1a; 用于扩展主控制器&#xff08;如…

如何在 Windows 11 或 10 上更改 WIFI 或以太网 MAC 地址?

无论你使用的是哪种操作系统,更改 MAC 地址在各种场景中都有其益处。每个网卡的 MAC 地址都是唯一的,由网络适配器在出厂时就已经分配完成;它帮助系统在物理网络上进行通信,并为其提供身份识别。然而,如果你出于某种合法原因想要更改 Windows 上的当前 MAC 地址,那么我们…

Python语法特点与编码规范

注释 单行注释 把#号当做注释符号 多行注释 python中并没有规定多行注释标记&#xff0c;通常使用单引号作为多行注释 中文注释 规定文件所用编码&#xff0c;当时是为解决python2不支持中文的问题 #codingutf-8代码缩进 python采用代码缩进和冒号区分代码层次&#xff0c…

跟Gemini学做PPT:字号选择

字号的选择对于 PPT 的可读性和视觉效果至关重要。以下是一些通用的建议和针对你具体情况的字号选择指南&#xff1a; 通用字号选择原则&#xff1a; 对比度&#xff1a; 文字颜色与背景颜色形成高对比度&#xff0c;确保易读。字体&#xff1a; 选择清晰、专业的字体&#x…

【JVM 03-JVM内存结构之-虚拟机栈】

虚拟机栈 笔记记录 1. 定义1.1 演示栈帧 2. 特点3. 线程运行诊断3.1 案例1 cpu占用过多&解决3.2 案例2 程序运行很长时间没有结果 4. 拓展知识&问题辨析4.1 栈的内存越大越好嘛&#xff1f;(不是)4.2 方法内的局部变量是否线程安全&#xff1f;(是线程安全的)4.2.1 局部…

文章记单词 | 第104篇(六级)

一&#xff0c;单词释义 keyboard /ˈkiːbɔːrd/ n. 键盘underlying /ˌʌndərˈlaɪɪŋ/ adj. 潜在的&#xff1b;根本的&#xff1b;基础的June /dʒuːn/ n. 六月tactics /ˈtktɪks/ n. 战术&#xff1b;策略&#xff1b;手段south /saʊθ/ n./adj./adv. 南方&#x…

中宏立达与天空卫士达成战略合作

战略合作篇 中宏立达-天空卫士 2025年5月23日&#xff0c;中宏立达与天空卫士在中宏立达集团总部北京丽金智地中心正式签署战略合作协议。中宏立达总经理王博先生与天空卫士高级副总裁兼首席运营官巩文坚先生代表双方签署协议。这标志着两家领军企业在数字安全领域的深度合作正…

RxJS 高阶映射操作符详解:map、mergeMap 和 switchMap

1. map 操作符 map 是最基本的转换操作符&#xff0c;用于对 Observable 发出的每个值进行一对一转换。 基本特点&#xff1a; 同步操作一对一转换不改变 Observable 的发出时机 详细示例&#xff1a; import { of } from rxjs; import { map } from rxjs/operators;// 示…

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

由于一直在调试本项目&#xff0c;好久没有发文章&#xff0c;最近本项目的PID调试初见成效&#xff01;开始正文前首先感谢各位粉丝的支持&#xff0c;以及对本项目技术上支持的老师以及师兄&#xff0c;谢谢你们&#xff01; 对应源码及文件&#xff1a;源码及文件下载 基于…