整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          分塊之難:RAG應用中的Chunking技術解析

          分塊之難:RAG應用中的Chunking技術解析

          構建基于大型語言模型(LLM)的應用程序需要將LLM的回答與我們行業的特定領域數據結合起來。

          盡管微調LLM可以使其更了解特定領域,但仍可能存在不準確和幻覺的問題。

          因此,出現了檢索增強生成(RAG)技術,以便讓LLM的回答基于具體數據并提供來源支持。

          RAG的工作原理

          RAG的工作原理是為你想使用的數據片段創建文本嵌入,這樣可以將源文本的一部分放入LLM用來生成回答的語義空間中。同時,RAG系統還能返回源文本,這樣LLM的回答就有了人類撰寫的文本作為支持,并且附帶引用。

          1、構建索引

          將分塊后的文本數據構建索引,以便快速檢索相關塊。

          from sklearn.feature_extraction.text import TfidfVectorizer
          
          def build_index(chunks):
              vectorizer=TfidfVectorizer()
              X=vectorizer.fit_transform(chunks)
              return vectorizer, X

          2、檢索相關塊

          根據查詢在索引中檢索相關的文本塊。

          def retrieve_chunks(query, vectorizer, X, top_k=5):
              query_vec=vectorizer.transform([query])
              scores=(X * query_vec.T).toarray()
              top_indices=scores.flatten().argsort()[-top_k:][::-1]
              return top_indices

          3、生成響應

          將檢索到的相關塊提供給LLM,生成最終的響應。

          def generate_response(query, chunks, vectorizer, X, model):
              top_indices=retrieve_chunks(query, vectorizer, X)
              relevant_chunks=[chunks[i] for i in top_indices]
              context=' '.join(relevant_chunks)
              response=model.generate_response(query, context)
              return response

          在RAG系統中,我們需要特別注意數據片段的大小。

          如何劃分數據就是所謂的分塊,這比直接嵌入整篇文檔要復雜得多。

          什么是分塊?

          分塊(Chunking)是將長文檔或數據集切割成較小的、獨立的部分,以便于處理、存儲和檢索。

          這種方法在處理大規模文本數據時尤為重要,因為LLM對長文本的處理能力有限。

          分塊的優點

          • 減少計算資源消耗:處理較小的文本塊比處理整篇長文檔消耗的資源少。
          • 提高檢索效率:較小的塊可以加快搜索和匹配過程,因為每個塊包含的信息更集中。
          • 提升生成質量:模型可以更專注于特定的內容塊,從而生成更準確和相關的響應。

          為什么分塊很重要?

          在構建基于大型語言模型(LLM)的應用程序時,分塊數據的大小對于搜索結果的準確性至關重要。

          當你嵌入一段數據時,整個數據會被轉換為一個向量

          如果一個塊包含的內容過多,向量就會失去對特定內容的準確描述。

          如果分塊太小,則會失去數據的上下文。

          Pinecone 公司的 Roie Schwaber-Cohen指出:“開始思考如何將我的內容分成更小的塊的原因是,這樣當我檢索時,它實際上能夠命中正確的內容。你將用戶的查詢嵌入,然后將其與內容的嵌入進行比較。如果你嵌入的內容大小與用戶查詢的大小差異很大,你就更可能得到較低的相似度得分。”

          如何考慮大小

          考慮到查詢和響應的大小也至關重要。根據 Schwaber-Cohen 的觀點,你將文本塊向量與查詢向量進行匹配。

          但你還需要考慮作為響應的塊的大小。

          例如,如果你嵌入了整章的內容而不是一頁或一段,向量數據庫可能會在查詢和整章之間找到一些語義相似性。

          但所有章節都相關嗎?可能不是。

          更重要的是,LLM 能否從檢索到的內容和用戶的查詢中產生相關的響應?

          最佳策略選擇

          分塊并不是一個簡單的問題。行業并沒有一種通用的標準。

          最佳的分塊策略取決于具體的用例。

          幸運的是,你不僅僅是簡單地對數據進行分塊、向量化然后碰運氣。

          你還有元數據。這可以是指向原始塊或更大文檔部分的鏈接、類別和標簽、文本,或者實際上任何內容。

          正如 Schwaber-Cohen 所說:“這有點像一個 JSON blob,你可以用它來過濾東西。如果你只是在尋找特定子集的數據,你可以大大減少搜索空間,并且你可以使用元數據將你在響應中使用的內容鏈接回原始內容。”

          總而言之,大小很重要。而選擇最佳的分塊策略和利用元數據則可以進一步提高檢索和響應的效率和準確性。

          分塊策略

          一般有以下四種分塊策略:

          1、固定大小塊分塊策略(fixed sizes)

          在處理數據時,一種常見的方法是將文本分成固定大小的塊。這種方法適用于內容格式和大小相似的數據集,如新聞文章或博客帖子。雖然這種方法成本較低,但它并未考慮到分塊內容的上下文,可能對某些應用場景影響不大,但對于其他場景可能非常重要。

          示例:

          def chunk_text(text, chunk_size=500):
              words=text.split()
              chunks=[]
              current_chunk=[]
              current_length=0
              for word in words:
                  current_length +=len(word) + 1  # 計算單詞長度和空格
                  if current_length > chunk_size:
                      chunks.append(' '.join(current_chunk))
                      current_chunk=[word]
                      current_length=len(word) + 1
                  else:
                      current_chunk.append(word)
              chunks.append(' '.join(current_chunk))  # 添加最后一個塊
              return chunks

          2、隨機塊分塊策略(random chunk sizes)

          如果數據集包含多種文檔類型,一種可行的方法是使用隨機大小的塊。這種方法可能捕捉到更廣泛的語義上下文和主題,而不受任何給定文檔類型的約定的限制。然而,隨機塊可能導致文本被打斷,產生無意義的塊。

          3、滑動窗口分塊策略(sliding windows)

          滑動窗口方法是一種常用的分塊策略,它使新的塊與前一個塊的內容重疊,并包含部分內容。這樣可以更好地捕捉每個塊周圍的上下文,提高整個系統的語義相關性。然而,這也需要更多的存儲空間,并可能導致冗余信息,使搜索過程變慢,并增加RAG系統提取正確來源的難度。

          4、上下文感知分塊策略(Context-aware chunking)

          上下文感知分塊方法根據標點符號或Markdown/HTML標簽等語義標記將文本分塊。這種方法可以遞歸地將文檔分成更小、重疊的片段,每個片段都能保持上下文的完整性。盡管這種方法可以提供良好的結果,但它需要額外的預處理來分割文本,可能增加了計算需求,從而減慢了分塊過程。

          確定最佳方法

          要確定適合你用例的最佳分塊策略,需要一些工作。

          測試不同方法的效果,并根據評估結果選擇最佳策略。通過人工審核和LLM評估器對它們進行評分。當你確定哪種方法表現更好時,你可以通過基于余弦相似度分數對結果進行進一步過濾來進一步增強結果。

          分塊只是生成式AI技術拼圖中的一部分,我們還需要LLM、矢量數據庫和存儲。

          最重要的是,要有一個明確的目標,這樣才能確保項目取得成功。

          參考

          https://stackoverflow.blog/2024/06/06/breaking-up-is-hard-to-do-chunking-in-rag-applications/

          ava實現瀏覽器端大文件分片上傳,Java實現大文件分片上傳,Java實現大文件分片上傳解決方案,Java實現大文件分片上傳思路,Java實現大文件分片上傳實例,Java實現大文件分片上傳源碼,Java實現大文件分塊上傳,Java實現大文件切片上傳,Java實現大文件加密上傳,Java實現文件夾上傳,


          java大文件10G,50G,100G上傳,JSP大文件10G,50G,100G上傳,JAVA大文件10G,50G,100G上傳,斷點續傳。

          一般這么大的文件不用HTML的一次性上傳,而是采用分塊,分片,分段,分割,切割技術上傳。

          JAVA話一般是負責后端的邏輯,比如文件初始化,文件塊上傳,合并,存儲等。

          前端的話用JSP,VUE2,VUE3,React,HTML5,JS,JQ都行。這個都無所謂。

          網上一般的做法都是用的HTML5的API,也就是chrome提供的API,能夠滿足基本需求,但是還是有痛點,chrome限制死了,固定死了無法擴展,每個域名只允許5個TCP連接,導致了速度有上限,你也無法修改和擴展。然后就是瀏覽器也只能用chrome,用戶用了IE就不行了,用戶現有的系統跑在IE上,也不能換。

          進度信息容易丟失,用戶關閉網頁,刷新網頁,關閉瀏覽器,重啟瀏覽器,關閉電腦,重啟電腦后,進度信息都會丟失,無解,沒辦法。擴展性還是差了點。

          傳大文件,超大文件,文件數量多的話,前端就卡,網頁反應慢,容易死,崩潰,在配置較差的電腦或者配置一般的電腦上這個痛點體現的非常明顯。

          對于大文件的處理,無論是用戶端還是服務端,如果一次性進行讀取發送、接收都是不可取,很容易導致內存問題。所以對于大文件上傳,采用切塊分段上傳

          從上傳的效率來看,利用多線程并發上傳能夠達到最大效率。

          斷點續傳,就是在文件上傳的過程中發生了中斷,人為因素(暫停)或者不可抗力(斷網或者網絡差)導致了文件上傳到一半失敗了。然后在環境恢復的時候,重新上傳該文件,而不至于是從新開始上傳的。

          斷點續傳的功能是基于分塊上傳來實現的,把一個大文件分成很多個小塊,服務端能夠把每個上傳成功的分塊都落地下來,客戶端在上傳文件開始時調用接口快速驗證,條件選擇跳過某個分塊。

          實現原理,就是在每個文件上傳前,就獲取到文件MD5取值,在上傳文件前調用接口,如果獲取的文件狀態是未完成,則返回所有的還沒上傳的分塊的編號,然后前端進行條件篩算出哪些沒上傳的分塊,然后進行上傳。

          當接收到文件塊后就可以直接寫入到服務器的文件中。


          導入項目:
          導入到Eclipse:
          http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
          導入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
          springboot統一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



          下載示例:

          https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




          工程



          NOSQL

          NOSQL示例不需要任何配置,可以直接訪問測試



          創建數據表

          選擇對應的數據表腳本,這里以SQL為例




          修改數據庫連接信息


          訪問頁面進行測試



          文件存儲路徑

          up6/upload/年/月/日/guid/filename






          相關問題:
          1.javax.servlet.http.HttpServlet錯誤
          2.項目無法發布到tomcat
          3.md5計算完畢后卡住
          4.服務器找不到config.json文件

          相關參考:

          文件保存位置


          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl



          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          產品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
          授權生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

          S實現大文件上傳——分片上傳方法,完美解決WEB無法上傳大文件方法,HTML大文件上傳源碼,WEBUPLOAD組件實現文件上傳功能和下載功能,js大文件上傳下載解決方案,vue大文件上傳下載解決方案,asp.net大文件上傳下載解決方案,.net大文件上傳下載解決方案,webform大文件上傳下載解決方案,jsp大文件上傳下載解決方案,java大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載切片解決方案,JAVASCRIPT 大文件上傳下載切割解決方案,JAVASCRIPT 大文件上傳下載分割解決方案,JAVASCRIPT 大文件上傳下載分塊解決方案,JAVASCRIPT 大文件上傳下載分片解決方案,web大文件上傳下載解決方案,網頁大文件上傳下載解決方案,前端大文件上傳下載解決方案,html5大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載解決方案,支持HTML5,VUE2,VUE3,React,javascript等常用前端UI框架,JS框架,網上找的方案大多數都只是一些代碼片段,沒有提供完整的前后端代碼。

          支持IE,Chrome和信創國產化環境,比如銀河麒麟,統信UOS,龍芯,

          支持分片,分塊,分段,切片,分割上傳。能夠突破chrome每域名的5個TCP連接限制,能夠突破chrome重啟,關閉瀏覽器續傳的限制。

          支持10G,20G,50G,100G文件上傳和續傳,支持秒傳,支持文件夾上傳,重復文件檢測,重復文件校驗

          支持文件下載,批量下載,下載斷點續傳,加密下載,端到端加密,加密算法支持國密SM4,多線程下載

          支持在服務端保存文件夾層級結構,支持將文件夾層級結構信息保存到數據庫中,支持下載時能夠將文件夾層級結構下載下來,支持下載文件夾,下載文件夾支持斷點續傳,

          支持加密傳輸,包括加密上傳,加密下載,加密算法支持國密SM4,

          支持云對象存儲,比如華為云,阿里云,騰訊云,七牛云,AWS,MinIO,FastDFS,

          提供手機,QQ,微信,郵箱等聯系方式,提供7*24小時技術支持,提供長期技術支持和維護服務,提供遠程1對1技術指導,提供二次開發指導,提供文檔教程,提供視頻教程。

          1.下載示例

          https://gitee.com/xproer/up6-vue-cli



          將up6組件復制到項目中

          示例中已經包含此目錄



          1.引入up6組件



          2.配置接口地址

          接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表

          參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



          3.處理事件



          啟動測試



          啟動成功



          效果



          數據庫



          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

          OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc


          主站蜘蛛池模板: 国产精品亚洲一区二区无码| 在线电影一区二区| 亚洲一区AV无码少妇电影☆| 久久久精品人妻一区二区三区蜜桃| 毛片一区二区三区无码| 亚洲AV无码一区二区二三区软件 | 波多野结衣一区二区三区88| 人妻无码久久一区二区三区免费 | 国产亚洲一区二区三区在线观看| 国产人妖视频一区二区破除| 中文字幕一区二区三区人妻少妇 | 精品福利一区二区三区| 日韩在线视频一区二区三区| 精品国产一区二区三区麻豆 | 精品不卡一区二区| 亚洲av鲁丝一区二区三区| 久久久久人妻精品一区三寸蜜桃| 夜夜爽一区二区三区精品| 精品人妻一区二区三区四区| 视频在线观看一区二区| 无码日韩人妻AV一区二区三区| 精品乱码一区二区三区在线| 国产精品一区二区AV麻豆 | 亚欧成人中文字幕一区 | 日韩精品一区二区三区在线观看 | 久久精品一区二区影院| 精品久久久久一区二区三区| 精品视频一区二区三区四区五区| 精品视频午夜一区二区| 色一情一乱一伦一区二区三区日本 | 人妻无码一区二区视频| 日本精品高清一区二区| 一区二区视频在线播放| 无码播放一区二区三区| 日韩精品久久一区二区三区| 亚洲福利精品一区二区三区| 国产在线不卡一区二区三区| 久久er99热精品一区二区| 亚洲av乱码中文一区二区三区| 在线视频一区二区日韩国产| 好爽毛片一区二区三区四|