1.詞向量
1.定義
詞向量(Word Vector)是將單詞表示為向量形式的技術,是自然語言處理(NLP)中的一種常用方法。通過將單詞轉化為向量,計算機能夠更好地理解和處理語言。簡單來說,詞向量就是將單詞表示為一組數字,通常是高維空間中的點,每個單詞都有一個獨特的向量表示。
2.目的
為什么需要將單詞轉化為詞向量呢,因為他能夠捕捉單詞之間的語義相似性。如果數據庫中存放的是文字,那么我們可能需要去一個個比對,比對關鍵字相同的數量或兩個單詞是否完全一致。但是如果使用向量的方式進行表達,可以通過計算來獲取數據在語義層面上的相似度,且計算效率更高。
2.向量數據庫
1.定義及特點
檢索和管理高維向量數據的數據庫。隨著機器學習、自然語言處理(NLP)和計算機視覺等領域的發展,向量數據庫在處理復雜數據類型(如圖像、文本和音頻)的相似性搜索和推薦系統中變得越來越重要。
向量數據庫能夠有效存儲高維向量數據,且支持快速地相似性搜索,可以在大量向量中找到與查詢向量最相似的向量。最重要的一點就是向量數據庫使用特定的索引結構,加快檢索效率。
2.常見的向量數據庫
1.Pinecone
2.Faiss
3.Chroma
3.對RAG的意義
向量數據庫在RAG算法中通過高效存儲和檢索大規模文檔的向量表示,顯著提升了檢索相關文檔的效率和質量,支持大規模數據處理,加速生成過程,從而使生成的答案更加準確和相關,滿足實時性要求高的應用需求。
3.調用Embedding API
我使用的環境是Python3.11
需要安裝langchain_community庫
今天我嘗試了調用星火大模型的Embedding API,使用demo調用成功。
后續我嘗試使用SparkLLMTextEmbeddings對后面的向量化數據庫存儲的數據進行向量化操作。官方文檔如下圖所示:
編寫代碼如下:
4.數據讀取與處理
為了構建我的本地知識庫,需要對多種類型存儲的本地文檔進行處理,讀取本地文檔并通過前文描述的 Embedding 方法將本地文檔的內容轉化為詞向量來構建向量數據庫。后續我使用的是一個隨意的pdf文檔進行處理。
1.讀取pdf文檔
我們可以使用 LangChain 的 PyMuPDFLoader 來讀取知識庫的 PDF 文件。PyMuPDFLoader 是 PDF 解析器中速度最快的一種,結果會包含 PDF 及其頁面的詳細元數據,并且每頁返回一個文檔。
以下是我的一個代碼過程:
讀取之后需要調用load()方法,是因為讀取的內容還是字符串類型的,為了后續的操作,我們需要調用load方法將類型轉換為document類型,才能進行后續操作。
2.數據清洗
我提供的pdf文檔中,只存在著少量的空行,因此這里的處理,我模仿文檔中的處理方式,將一些無關空行\n進行刪除。
3.文檔分割
為什么需要文檔分割呢,假如我們將文檔作為大模型的一個輸入,并且希望大模型能利用輸入作為背景知識,解決一些專業領域內的知識,但是我們都知道對于token一般都會有限制,如果發送的token超過了大模型api輸入的最大token就會報錯。此時我們的文檔是十分龐大的,因此需要對文檔進行分割,將文檔按照固定的長度分為若干個chunk。
以下是文檔分割的代碼:
其中的參數:
chunk_size:表示分割后每一塊chunk的大小。
chunk_overlap表示塊與塊之間的重疊大小。指的是分割后的每個chunk里包含多少上一個chunk結尾的內容,主要是為了保持每個chunk之間的上下文關聯性。比如chunk_overlap設置為2,此時上一塊chunk的結尾為aaaaa,那么下一塊chunk的開頭就是aabbbbbb。
Langchain 還提供了多種文檔分割方式,區別在怎么確定塊與塊之間的邊界、塊由哪些字符/token組成、以及如何測量塊大小。但是這些方法我還未來得及嘗試:
RecursiveCharacterTextSplitter(): 按字符串分割文本,遞歸地嘗試按不同的分隔符進行分割文本。
CharacterTextSplitter(): 按字符來分割文本。
MarkdownHeaderTextSplitter(): 基于指定的標題來分割markdown 文件。
TokenTextSplitter(): 按token來分割文本。
SentenceTransformersTokenTextSplitter(): 按token來分割文本
Language(): 用于 CPP、Python、Ruby、Markdown 等。
NLTKTextSplitter(): 使用 NLTK(自然語言工具包)按句子分割文本。
SpacyTextSplitter(): 使用 Spacy按句子的切割文本。
4.搭建向量數據庫
對于分割后的文檔,我們就可以將每一塊文檔轉換為向量,存儲到向量數據庫中了。這里我嘗試了Chroma數據庫。一開始我還不太了解Chroma數據庫,認為他是和MySQL那樣的數據庫類似,通過調研發現,他類似于sqlite,是一個可以存儲在本地的文件。以下是我搭建Chroma向量數據庫的代碼,首先需要pip install chroma:
對于這一塊內容,我嘗試了一天,一直在報錯,還未搭建起來,通過搜索與調研。我嘗試更換Python環境,當我將Python環境更換到12時,又會出現數據庫無法安裝的報錯,嘗試安裝后,又會提示不存在Chroma庫。當我把環境換回11時,還是出現了key error報錯我認為主要的問題可能出現在Embedding那一塊。后序的話我打算嘗試改變Embedding API調用后,再繼續更新該筆記。