文章目錄
- 準備
- 按批次嵌入
- 加載csv文件,分割文檔并嵌入
- 測試嵌入效果
- 總結
- 代碼
上一篇文章: 本地大模型編程實戰(02)語義檢索(1) 詳細介紹了如何使用
langchain
實現語義檢索,為了演示方便,使用的是langchain
提供的內存數據庫。
在實際工作中,更多的使用場景是將矢量化的數據物理存儲下來,在查詢的時候在從存儲介質中讀取矢量數據進行查詢,不會每次使用矢量數據時都必須想做嵌入。
本文描述了如何使用 Chroma
對csv數據進行矢量化,并且將矢量存儲在硬盤中,未來查詢矢量數據時,直接從硬盤中讀取矢量數據進行查詢。
另外,如果數據量大一些,矢量化數據是很花時間的,我們將使用進度條顯示嵌入csv的進度。
準備
在正式開始擼代碼之前,需要準備一下編程環境。
-
計算機
本文涉及的所有代碼可以在沒有顯存的環境中執行。 我使用的機器配置為:- CPU: Intel i5-8400 2.80GHz
- 內存: 16GB
-
Visual Studio Code 和 venv
這是很受歡迎的開發工具,相關文章的代碼可以在Visual Studio Code
中開發和調試。 我們用python
的venv
創建虛擬環境, 詳見:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama
平臺上部署本地大模型非常方便,基于此平臺,我們可以讓langchain
使用llama3.1
、qwen2.5
等各種本地大模型。詳見:
在langchian中使用本地部署的llama3.1大模型 。 -
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
🪐祝好運🪐