本地大模型編程實戰(02)語義檢索(2)

文章目錄

    • 準備
    • 按批次嵌入
    • 加載csv文件,分割文檔并嵌入
    • 測試嵌入效果
    • 總結
    • 代碼


上一篇文章: 本地大模型編程實戰(02)語義檢索(1) 詳細介紹了如何使用 langchain 實現語義檢索,為了演示方便,使用的是 langchain 提供的內存數據庫。
在實際工作中,更多的使用場景是將矢量化的數據物理存儲下來,在查詢的時候在從存儲介質中讀取矢量數據進行查詢,不會每次使用矢量數據時都必須想做嵌入。

本文描述了如何使用 Chroma 對csv數據進行矢量化,并且將矢量存儲在硬盤中,未來查詢矢量數據時,直接從硬盤中讀取矢量數據進行查詢。
另外,如果數據量大一些,矢量化數據是很花時間的,我們將使用進度條顯示嵌入csv的進度。

準備

在正式開始擼代碼之前,需要準備一下編程環境。

  1. 計算機
    本文涉及的所有代碼可以在沒有顯存的環境中執行。 我使用的機器配置為:

    • CPU: Intel i5-8400 2.80GHz
    • 內存: 16GB
  2. Visual Studio Code 和 venv
    這是很受歡迎的開發工具,相關文章的代碼可以在 Visual Studio Code 中開發和調試。 我們用 pythonvenv 創建虛擬環境, 詳見:
    在Visual Studio Code中配置venv。

  3. Ollama
    Ollama 平臺上部署本地大模型非常方便,基于此平臺,我們可以讓 langchain 使用 llama3.1qwen2.5 等各種本地大模型。詳見:
    在langchian中使用本地部署的llama3.1大模型 。

  4. C++編譯器
    安裝 Chroma 時需要C++編譯器的支持。我是通過安裝 Visual Studio .Net Community 2022 來安裝C++編譯器的。
    點擊這里下載Visual Studio .Net Community

按批次嵌入

一般來說,將文本矢量化很消耗資源,所以耗時較長,我們定義一個按照批次嵌入文檔的方法,使用 tqdm 顯示進度:

def embed_documents_in_batches(documents, batch_size=10):"""按批次嵌入,可以顯示進度。vectordb會自動持久化存儲在磁盤。"""vectordb = Chroma(persist_directory=persist_directory,embedding_function=embedding)for i in tqdm(range(0, len(documents), batch_size), desc="嵌入進度"):batch = documents[i:i + batch_size]# 從文本塊生成嵌入,并將嵌入存儲在本地磁盤。vectordb.add_documents(batch)

加載csv文件,分割文檔并嵌入

這里調用之前的按批次嵌入方法,完成嵌入:

def create():"""對文本矢量化并存儲在本地磁盤"""data_file = os.path.join(current_dir,'assert/law.csv')loader = CSVLoader(file_path=data_file,csv_args={"delimiter": "#"},autodetect_encoding=True)docs = loader.load()#print(f'加載文件成功,第一個文件內容:{docs[0]}')# 用于將長文本拆分成較小的段,便于嵌入和大模型處理。# 每個文本塊的最大長度是1000個字符,拆分的文本塊之間重疊部分為200。text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)texts = text_splitter.split_documents(docs)   # 耗時較長,需要耐心等候...embed_documents_in_batches(texts,batch_size=3)

在執行的過程中,我們會在 VS Code 的 Terminal 中直觀的看到進入:
矢量化嵌入過程

測試嵌入效果

此時在assert文件夾中已經生成了一個 db_law 文件夾,這里面存儲的就是矢量化的數據。

def search(query):"""查詢矢量數據庫"""vector_store = Chroma(persist_directory=persist_directory,embedding_function=embedding)results = vector_store.similarity_search_with_score(query,k=2)return results

我們調用此方法做一下測試:

results = search("惡意商標申請")
print(f'search results:\n{results}')
search results:
[(Document(id='3ef03cff-e0b1-416c-93f6-1ff281af323c', metadata={'row': 1, 'source': 'E:\\project\\my_opensource\\programming-with-local-large-language-model-gitee\\server\\services\\practice\\assert/law.csv'}, page_content='第六章  法律責任    第三十三條  管理專利工作的部門認定專利侵權行為成立,作出處理決定的,應當責令侵權人立即停止侵權行為,采取下列制止侵權行為的措施:    (一)侵權人制造專利產品
的,責令其立即停止制造行為,銷毀制造侵權產品的專用設備、模具,并且不得銷售、使用尚未售出的侵權產品或者以任何其他形式將其投放市場;侵權產品難以保存的,責令侵權人銷毀該產品。    (二)侵權人使用專利方法
的,責令其立即停止使用行為,銷毀實施專利方法的專用設備、模具,并且不得銷售、使用尚未售出的依照專利方法所直接獲得的產品或者以任何其他形式將其投放市場;侵權產品難以保存的,責令侵權人銷毀該產品。    (三
)侵權人銷售專利產品或者依照專利方法直接獲得產品的,責令其立即停止銷售行為,并且不得使用尚未售出的侵權產品或者以任何其他形式將其投放市場;尚未售出的侵權產品難以保存的,責令侵權人銷毀該產品。    (四)
侵權人許諾銷售專利產品或者依照專利方法直接獲得產品的,責令其立即停止許諾銷售行為,消除影響,并且不得進行任何實際銷售行為。    (五)侵權人進口專利產品或者依照專利方法直接獲得產品的,責令侵權人立即停止
進口行為;侵權產品已經入境的,不得銷售、使用該侵權產品或者以任何其他形式將其投放市場;侵權產品難以保存的,責令侵權人銷毀該產品;侵權產品尚未入境的,可以將處理決定通知有關海關。    (六)停止侵權行為的
其他必要措施。    第三十四條  管理專利工作的部門作出認定專利侵權行為成立的處理決定后,被請求人向人民法院提起行政訴訟的,在訴訟期間不停止決定的執行。    侵權人對管理專利工作的部門作出的認定侵權行為成立
的處理決定期滿不起訴又不停止侵權行為的,管理專利工作的部門可以申請人民法院強制執行。    第三十五條  假冒他人專利,涉嫌觸犯刑法第二百一十六條的,由管理專利工作的部門移送司法機關依法追究刑事責任。    偽
造或者變造專利證書,涉嫌觸犯刑法第二百八十條規定的,由管理專利工作的部門移送司法機關追究刑事責任。    第三十六條  管理專利工作的部門認定假冒他人專利、冒充專利行為成立的,應當責令行為人采取下列改正措施
:'), 0.9691819652571181)]

總結

通過以上步驟,我們實現了將csv數據矢量化并存儲在本地,后面我們可以基于此繼續開發 RAG 系統和 Agent

代碼

本文涉及的所有代碼以及相關資源都已經共享,參見:

  • github
  • gitee

🪐祝好運🪐

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67105.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows平臺intel-vpl編譯

需要先在本機編譯好opencl庫 git clone --recursive https://github.com/KhronosGroup/OpenCL-SDK.git cmake -A x64 -T v143 -D OPENCL_SDK_BUILD_OPENGL_SAMPLESOFF -B OpenCL-SDK\build -S OpenCL-SDKcmake --build OpenCL-SDK\build --config Releasecmake --install O…

Vue 3 30天精進之旅:Day 05 - 事件處理

引言 在前幾天的學習中,我們探討了Vue實例、計算屬性和偵聽器。這些概念為我們搭建了Vue應用的基礎。今天,我們將專注于事件處理,這是交互式Web應用的核心部分。通過學習如何在Vue中處理事件,你將能夠更好地與用戶進行交互&#…

[C語言日寄]exit函數的使用及其拓展

【作者主頁】siy2333 【專欄介紹】?c語言日寄?:這是一個專注于C語言刷題的專欄,精選題目,搭配詳細題解、拓展算法。從基礎語法到復雜算法,題目涉及的知識點全面覆蓋,助力你系統提升。無論你是初學者,還是…

React 中hooks之useSyncExternalStore使用總結

1. 基本概念 useSyncExternalStore 是 React 18 引入的一個 Hook,用于訂閱外部數據源,確保在并發渲染下數據的一致性。它主要用于: 訂閱瀏覽器 API(如 window.width)訂閱第三方狀態管理庫訂閱任何外部數據源 1.1 基…

激光雷達和相機早期融合

通過外參和內參的標定將激光雷達的點云投影到圖像上。 ? 傳感器標定 首先需要對激光雷達和相機(用于獲取 2D 圖像)進行外參和內參標定。這是為了確定激光雷達坐標系和相機坐標系之間的轉換關系,包括旋轉和平移。通常采用棋盤格等標定工具&…

Linux--權限

Linux系統的權限管理是保障系統安全的重要機制,以下詳細講解權限相關概念及操作指令: 一、基礎權限機制 1. 權限的三元組,讀(r)、寫(w)、執行(x) 每個文件或目錄有三組…

iic、spi以及uart

何為總線? 連接多個部件的信息傳輸線,是部件共享的傳輸介質 總線的作用? 實現數據傳輸,即模塊之間的通信 總線如何分類? 根據總線連接的外設屬于內部外設還是外部外設將總線可以分為片內總線和片外總線 可分為數…

“破冰”探索兩周年,AI和媒體碰撞出了什么火花?

2022年末,大模型浪潮席卷而來。在“所有行業都值得用AI重塑”的氛圍下,各個行業都受到了影響和沖擊。 其中新聞媒體可以說是受影響最為劇烈的行業。 因為內容的生產方式被重新定義,媒體從業者普遍存在焦慮情緒:擔心錯過新一輪的…

DeepSeek明確學術研究方向效果如何?

明確學術研究方向 在學術寫作中,選擇一個出色的研究主題至關重要,因為它直接關系到論文是否能登上高級別的學術期刊。不少學者在這個過程中走入了誤區,他們往往將大把的時間花在寫作本身,而忽略了對選題的深入思考,這…

WPF實戰案例 | C# WPF實現大學選課系統

WPF實戰案例 | C# WPF實現大學選課系統 一、設計來源1.1 主界面1.2 登錄界面1.3 新增課程界面1.4 修改密碼界面 二、效果和源碼2.1 界面設計(XAML)2.2 代碼邏輯(C#) 源碼下載更多優質源碼分享 作者:xcLeigh 文章地址&a…

《 C++ 點滴漫談: 二十四 》深入 C++ 變量與類型的世界:高性能編程的根基

摘要 本文深入探討了 C 中變量與類型的方方面面,包括變量的基本概念、基本與復合數據類型、動態類型與內存管理、類型推導與模板支持,以及類型系統的高級特性。通過全面的理論講解與實際案例分析,展示了 C 類型系統的強大靈活性與實踐價值。…

STM32 GPIO配置 點亮LED燈

本次是基于STM32F407ZET6做一個GPIO配置,實現點燈實驗。 新建文件 LED.c、LED.h文件,將其封裝到Driver文件中。 雙擊Driver文件將LED.c添加進來 編寫頭文件,這里注意需要將Driver頭文件聲明一下。 在LED.c、main.c里面引入頭文件LED.h LED初…

window保存好看的桌面壁紙

1、按下【WINR】快捷鍵調出“運行”窗口,輸入以下命令后回車。 %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets 2、依次點擊【查看】【顯示】,勾選【隱藏的項目】,然后按【CtrlA】全部…

TCP 三次握手四次揮手

目錄 TCP 三次握手 1. SYN (Synchronize:同步) 2. SYN-ACK (Synchronize Acknowledge:同步確認) 3. ACK (Acknowledge:確認) 為什么是三次而不是兩次或四次? 三次握手的作用 TCP 四次揮手 第一次揮手:客戶端發送 FIN …

C語言初階牛客網刷題—— HJ34 圖片整理【難度:中等】

1. 題目描述 牛客網在線OJ鏈接 Lily上課時使用字母數字圖片教小朋友們學習英語單詞,每次都需要把這些圖片按照大小(ASCII碼值從小到大)排列收好。請大家給Lily幫忙,通過C語言解決。 輸入描述:Lily使用的圖片包括 “A…

MVCC底層原理實現

MVCC的實現原理 了解實現原理之前,先理解下面幾個組件的內容 1、 當前讀和快照讀 先普及一下什么是當前讀和快照讀。 當前讀:讀取數據的最新版本,并對數據進行加鎖。 例如:insert、update、delete、select for update、 sele…

python實現http文件服務器訪問下載

//1.py import http.server import socketserver import os import threading import sys# 獲取當前腳本所在的目錄 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 設置服務器的端口 PORT 8000# 自定義Handler,將根目錄設置為腳本所在目錄 class MyHTT…

Cpp::靜態 動態的類型轉換全解析(36)

文章目錄 前言一、C語言中的類型轉換二、為什么C會有四種類型轉換?內置類型 -> 自定義類型自定義類型 -> 內置類型自定義類型 -> 自定義類型隱式類型轉換的坑 三、C強制類型轉換static_castreinterpret_castconst_castdynamic_cast 四、RTTI總結 前言 Hell…

2024年終總結:技術成長與突破之路

文章目錄 前言一、技術成長:菜鳥成長之路1. 學習與實踐的結合2. 技術分享與社區交流 二、生活與事業的平衡:技術之外的思考1. 時間管理與效率提升2. 技術對生活的積極影響 三、突破與展望:未來之路1. 技術領域的突破2. 未來規劃與目標 四、結…

ComfyUI實現老照片修復——AI修復老照片(ComfyUI-ReActor / ReSwapper)解決天坑問題及加速pip下載

AI修復老照片,試試吧,不一定好~~哈哈 2023年4月曾用過ComfyUI,當時就感慨這個工具和虛幻的藍圖很像,以后肯定是專業人玩的。 2024年我寫代碼去了,AI做圖沒太關注,沒想到,現在ComfyUI真的變成了工…