llm學習-3(向量數據庫的使用)

1:數據讀取和加載

接著上面的常規操作

加載環境變量---》獲取所有路徑---》加載文檔---》切分文檔

代碼如下:

import os
from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 獲取folder_path下所有文件路徑,儲存在file_paths里
file_paths = []
folder_path = './llm-universe/data_base/knowledge_db'
for root, dirs, files in os.walk(folder_path):# print('*'*50)# print('root:', root)# print('dirs:', dirs)# print('files:', files)# print('*'*50)for file in files:file_path = os.path.join(root, file)file_paths.append(file_path)
print('*'*50)
print('file_paths:', file_paths)from langchain.document_loaders.pdf import PyMuPDFLoader
from langchain.document_loaders.markdown import UnstructuredMarkdownLoader# 遍歷文件路徑并把實例化的loader存放在loaders里
loaders = []for file_path in file_paths:# 按照后綴對文件進行讀取file_type = file_path.split('.')[-1]if file_type == 'pdf':loaders.append(PyMuPDFLoader(file_path))elif file_type == 'md':loaders.append(UnstructuredMarkdownLoader(file_path))# 加載文件并存儲到text
texts = []
for loader in loaders: texts.extend(loader.load())
'''
載入后的變量類型為langchain_core.documents.base.Document, 文檔變量類型同樣包含兩個屬性
page_content 包含該文檔的內容。
meta_data 為文檔相關的描述性數據。
'''
text = texts[1]
# print(f"每一個元素的類型:{type(text)}.", 
#     f"該文檔的描述性數據:{text.metadata}", 
#     f"查看該文檔的內容:\n{text.page_content[0:]}", 
#     sep="\n------\n")from langchain.text_splitter import RecursiveCharacterTextSplitter# 切分文檔
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
print('text_splitter_type:',  type(text_splitter))
split_docs = text_splitter.split_documents(texts)
print('split_docs_type:', type(split_docs))
print('split_docs長度:', len(split_docs))
print('split_docs[0]:', split_docs[0])


2:加載詞向量模型和向量數據庫

# 定義持久化路徑
persist_directory = './vector_db_test/'# 刪除舊的數據庫文件(如果文件夾中有文件的話),windows電腦請手動刪除  !rm -rf '../../data_base/vector_db/chroma'#加載chroma
from langchain.vectorstores.chroma import Chromavectordb = Chroma.from_documents(documents=split_docs[:5], # 為了速度,只選擇前 20 個切分的 doc 進行生成;使用千帆時因QPS限制,建議選擇前 5 個docembedding=embedding,persist_directory=persist_directory  # 允許我們將persist_directory目錄保存到磁盤上
)#存儲向量數據庫
vectordb.persist()
print(f"向量庫中存儲的數量:{vectordb._collection.count()}")

在加載chroma的時候如果本身有向量數據庫可能會產生錯誤:

Traceback (most recent call last):File "/workspaces/test_codespace/createVectordb.py", line 94, in <module>vectordb = Chroma.from_documents(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 778, in from_documentsreturn cls.from_texts(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 736, in from_textschroma_collection.add_texts(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/langchain_community/vectorstores/chroma.py", line 297, in add_textsself._collection.upsert(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/models/Collection.py", line 299, in upsertself._client._upsert(File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 352, in _upsertself._validate_embedding_record(coll, r)File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 633, in _validate_embedding_recordself._validate_dimension(collection, len(record["embedding"]), update=True)File "/opt/conda/envs/zyx_llm/lib/python3.10/site-packages/chromadb/api/segment.py", line 648, in _validate_dimensionraise InvalidDimensionException(
chromadb.errors.InvalidDimensionException: Embedding dimension 384 does not match collection dimensionality 1024

這個就是因為你沒有把之前的刪除干凈,解決方法就是要么刪除原來的,要么重新開一個路徑


3:向量檢索

(1):相似度檢索

Chroma的相似度搜索使用的是余弦距離,即:下面博客里面有相似度計算的向量數據庫相關知識(搬運學習,建議還是看原文,這個只是我自己的學習記錄)-CSDN博客

當你需要數據庫返回嚴謹的按余弦相似度排序的結果時可以使用similarity_search函數。

(2):最大邊際相關性 (MMR, Maximum marginal relevance)?檢索

如果只考慮檢索出內容的相關性會導致內容過于單一,可能丟失重要信息。

最大邊際相關性 (MMR, Maximum marginal relevance) 可以幫助我們在保持相關性的同時,增加內容的豐富度。

核心思想是在已經選擇了一個相關性高的文檔之后,再選擇一個與已選文檔相關性較低但是信息豐富的文檔。這樣可以在保持相關性的同時,增加內容的多樣性,避免過于單一的結果。

參考:最大邊界相關算法MMR(Maximal Marginal Relevance) 實踐-CSDN博客

兩個檢索的代碼:

#向量檢索
######相似度檢索
question="什么是大語言模型"
# 按余弦相似度排序的結果
sim_docs = vectordb.similarity_search(question,k=3)
print(f"檢索到的內容數:{len(sim_docs)}")
for i, sim_doc in enumerate(sim_docs):print(f"檢索到的第{i}個內容: \n{sim_doc.page_content[:200]}", end="\n--------------\n")#######MMR檢索
mmr_docs = vectordb.max_marginal_relevance_search(question,k=3)
for i, sim_doc in enumerate(mmr_docs):print(f"MMR 檢索到的第{i}個內容: \n{sim_doc.page_content[:200]}", end="\n--------------\n")

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

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

相關文章

【力扣 - 每日一題】3099. 哈沙德數 | 模擬 (Go/C++)

題目內容 如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個整數 x 。如果 x 是 哈沙德數 &#xff0c;則返回 x 各個數位上的數字之和&#xff0c;否則&#xff0c;返回 -1 。 示例 1&#xff1…

C++Primer Plus 第十四章代碼重用:編程練習,第3題

CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題 編程練習,第3題 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題前言定義一個 QueueTp 模板…

中國國產AI芯片的崛起

一、CUDA的壟斷 當討論半導體行業面臨的挑戰時&#xff0c;你首先想到的是什么&#xff1f;光刻機&#xff1f;3納米或者5納米技術&#xff1f;我們無法生產的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人們經常把半導體芯片歸類為硬件產業&#xff0c;但實際上…

【大模型LLM面試合集】大語言模型基礎_llm概念

1.llm概念 1.目前 主流的開源模型體系 有哪些&#xff1f; 目前主流的開源LLM&#xff08;語言模型&#xff09;模型體系包括以下幾個&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI發布的一系列基于Transformer架構…

Linux常用查看日志方法-如使用less查看日志文件

在Linux系統中&#xff0c;查看日志文件是常見的運維任務之一。less命令是一個非常強大的工具&#xff0c;用于查看長文本文件&#xff0c;例如日志文件。它允許你按頁瀏覽文件&#xff0c;并提供了一些便捷的導航和搜索功能。 使用less查看日志文件 假設你有一個日志文件/va…

linux環境安裝elasticsearch緩存數據庫和Kibana客戶端

linux環境安裝elasticsearch緩存數據庫&#xff0c;今天我們安裝7.17.18版本&#xff0c;并分析遇到的問題。 一、elasticsearch安裝運行 1、直接下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解壓 tar -…

驚艷眼球的視覺盛宴【二】

當晨光初破黎明的靜謐&#xff0c;一片絢爛便悄然鋪展在蔚藍的天際。那一刻&#xff0c;大地蘇醒&#xff0c;萬物復蘇&#xff0c;我們仿佛踏入了一幅活生生的畫卷。霧氣繚繞之中&#xff0c;群山似乎在低語&#xff0c;古樹在輕搖&#xff0c;一切都沐浴在柔和而金黃的光芒之…

如何理解vuex中的每個概念(通俗易懂)

文章目錄 1. 什么是 Vuex&#xff1f;2. Vuex 的四個核心概念 1. 什么是 Vuex&#xff1f; 想象一下&#xff0c;你家里有一個大冰箱&#xff0c;所有家庭成員都可以訪問這個冰箱。每個人都可以往里面放東西&#xff0c;也可以從里面拿東西。這個冰箱就像是 Vuex 中的“狀態”…

戰略流程-麥肯錫企業數字化業務變革成熟度評估模型及案例深度解析

一、企業變革成熟度評估模型 企業變革成熟度診斷模型是一種評估工具&#xff0c;用于全面掃描和評估企業在變革轉型過程中的能力水平。該模型通過一系列量化指標和定性分析&#xff0c;對企業在不同變革領域的成熟度進行評分&#xff0c;從而幫助企業識別在變革過程中的優勢和…

第12天:上下文管理器

今日學習目標 了解上下文管理器的基本概念和作用學習如何使用 with 語句學習如何創建自定義上下文管理器理解上下文管理器的實際應用場景 1. 上下文管理器簡介 上下文管理器是一種用于管理資源的機制&#xff0c;它可以在一段代碼執行前后自動執行一些操作。最常見的上下文管…

QAM MMA

MMA是改進的CMA&#xff0c;有RCA和CMA的優點&#xff0c;還能對相位誤差進行修正。 N 5e5; % 仿真符號數 M 16; % QAM16msg randi([0 M-1],N,1); % 產生隨機符號 tx qammod(msg,M); % QAM調制test_snr 20:5:30; …

無畏契約/valorant匹配無反應、無法聯機、聯機報錯的解決辦法

無畏契約/valorant是一款熱度超高的戰術射擊游戲&#xff0c;通過其獨特的美漫英雄設計和豐富的戰術性&#xff0c;以及武器技能設計系統&#xff0c;在全球吸引了不少玩家的加入和喜愛。不過近期伴隨第九賽季更新&#xff0c;很多玩家重回服務器&#xff0c;卻遇到了匹配無反應…

進程和內存管理 如何檢查內存和CPU 內存的使用和剩余情況,當前CPU的負載情況,找進程id,結束某個進程

一、檢查內存 方法一&#xff1a;查看/proc/meminfo文件&#xff0c;又被稱為偽文件&#xff0c;記錄了內存的相關信息&#xff0c;不可用vi/vim打開編輯&#xff0c;可用cat等命令查看。 方法二&#xff1a;free -m 命令 以MB為單位來顯示內存情況。 二、檢查CPU 方法一…

基于用戶的協同過濾算法

目錄 原理&#xff1a; 計算相似度&#xff1a; 步驟&#xff1a; 計算方法&#xff1a;Jaccard相似系數、余弦相似度。 推薦 原理&#xff1a; 先“找到相似用戶”&#xff0c;再“找到他們喜歡的物品”--->人以群分。即&#xff0c;給用戶推薦“和他興趣相似的其他用…

C語言 輸出*的圖案(1,3,5,7,5,3,1順序)

輸出以下圖案&#xff08;不是直接輸出&#xff0c;且要求輸出時符號居中對齊&#xff09;。 * *** ***** ******* ***** *** * 這個程序輸出一個特定的圖案&#xff0c;符號居中對齊。 #include <stdio.h>int main() {int n 4; // 圖案的中間行數// 輸出上半部分for …

絕地求生PUBG服務器延遲太高 購買領取響應時間長怎么解決

絕地求生PUBG是一款特別熱門的射擊類吃雞游戲&#xff0c;游戲還有多張地圖可供玩家選擇&#xff0c;玩家們需要乘坐飛機空投跳傘至不同的各個角落&#xff0c;赤手空拳尋找武器&#xff0c;車輛以及物資&#xff0c;并在多種多樣的地形中展開戰斗。想要取得勝利&#xff0c;我…

分享一款可編輯本地電腦文件的在線編輯器

背景 之前見過在線版的VSCode&#xff0c;被驚訝到了。網頁上竟然可以編輯電腦本地的文件&#xff0c;打破了網頁無法編輯本地電腦文件的限制。一直好奇怎么做的。抽空研究了一下&#xff0c;然后發現其實也不難。 分析 先給大家介紹一下這款在線編輯器的效果。 左側欄為文件…

徹底解決網絡哈希沖突,百度百舸的高性能網絡 HPN 落地實踐

GPU 的通信性能對于大模型的訓練有著至關重要的影響。在 HPN 網絡工程實踐中&#xff0c;我們的核心關注點是如何充分利用網絡硬件資源的能力&#xff0c;將通信性能最大化&#xff0c;從而提升大模型端到端的訓練性能。 1 HPN 網絡 — AIPod 下圖是百度百舸的高性能網絡 …

Vue如何使用封裝接口

在Vue項目中封裝接口&#xff08;API&#xff09;是一個常見的需求&#xff0c;特別是在與后端服務進行交互時。封裝接口的目的是為了將請求邏輯與組件邏輯分離&#xff0c;提高代碼的可維護性和復用性。以下是一個簡單的步驟和示例&#xff0c;說明如何在Vue項目中封裝接口。 …

洛谷 P1020 [NOIP1999 提高組] 導彈攔截

題目描述 某國為了防御敵國的導彈襲擊&#xff0c;發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷&#xff1a;雖然它的第一發炮彈能夠到達任意的高度&#xff0c;但是以后每一發炮彈都不能高于前一發的高度。某天&#xff0c;雷達捕捉到敵國的導彈來襲。由于該系統…