通過上傳使大模型讀取并分析文件實戰

一、技術背景與需求分析

? ? ? ? 我們日常在使用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
繁體地址,請注明出處:http://hk.pswp.cn/web/80988.shtml
英文地址,請注明出處:http://en.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;源碼及文件下載 基于…