(1)嵌入模型的定義和作用
????????嵌入模型(Embedding Model)的本質在于將高維的、稀疏的數據轉換為低維的、密集的向量表示,使得這些向量能夠在數學空間中表達原始數據的語義信息。作用如下:
-
降維表示:嵌入模型能夠將文本、圖像或其它類型的數據映射到一個連續的向量空間中,這個過程通常伴隨著維度的降低。例如,一個包含大量詞匯的文本可以通過嵌入模型被表示為固定長度的向量。
-
捕捉語義關系:在生成的向量空間中,相似或相關的概念在空間中的距離較近,而不相關或相異的概念則距離較遠。這意味著嵌入模型不僅能捕捉單個詞語或數據點的含義,還能反映它們之間的語義關系。在計算嵌入向量之間的相似度時,有多種方法可供選擇,如點積、余弦相似度等。LlamaIndex 在默認情況下使用余弦相似度來進行嵌入比較。
-
應用于各種任務:這些向量表示可以用于各種自然語言處理和機器學習任務,如文本分類、情感分析、問答系統、推薦系統等。通過使用嵌入向量,模型可以在不需要理解人類語言復雜性的情況下,理解和處理輸入數據。
-
基于上下文的學習:對于一些先進的嵌入模型(如BERT及其變體),它們不僅考慮單詞本身的含義,還考慮了單詞在其出現的上下文中的意義。這種方式極大地提高了對多義詞的理解能力,并能更好地捕捉句子層面的語義信息。?
下面介紹一個llamaindex里面最常用的詞嵌入類HuggingFaceEmbedding用之前先安裝庫
pip install llama-index-embeddings-huggingface
# 導入 HuggingFaceEmbedding 類,用于加載本地的詞嵌入(Embedding)模型
from llama_index.embeddings.huggingface import HuggingFaceEmbedding# 初始化一個 HuggingFaceEmbedding 實例
# 指定模型路徑為本地已經下載好的中文 BGE 模型(版本1.5)
# 該模型可以將文本轉換為向量表示(即 Embedding)
embed_model = HuggingFaceEmbedding(model_name="/root/workspace/llm_models/bge_small_zh_v1.5"
)# 使用詞嵌入模型對文本 "Hello World!" 進行編碼,得到其對應的向量表示
# 注意:雖然這是中文模型,但也能處理英文文本
embeddings = embed_model.get_text_embedding("Hello World!")# 打印向量的長度(維度),通常 BGE 模型輸出為 384 或 768 維等
print(len(embeddings))# 打印前5個維度的數值,查看部分向量結果
print(embeddings[:5])
(2)向量數據庫ChromaDB
????????ChromaDB是LlamaIndex中的一個存儲向量數據的組件。它允許用戶將文本數據轉換為向量,并將這些向量存儲在數據庫中,以便進行高效的相似性搜索。ChromaDB特別適用于需要快速檢索與查詢最相似文檔的場景。
pip install chromadb
pip install llama-index-vector-stores-chroma
臨時存放數據(放在內存里)?
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.vector_stores.chroma import ChromaClient# 初始化 ChromaVectorStore
vector_store = ChromaVectorStore()# ChromaVectorStore 需要一個 ChromaDB 客戶端來存儲和管理向量數據。你可以選擇連接到一個現有的 ChromaDB 實例,或者創建一個新的臨時實例。
# 創建一個臨時客戶端
chroma_client = chromadb.EphemeralClient()# 創建一個集合
collection_name = "example_collection"
chroma_collection = chroma_client.create_collection(collection_name)# 通過將客戶端實例傳遞給 ChromaVectorStore,可以將其與具體的數據庫集合關聯起來。
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)# 完成初始化后,您可以使用 ChromaVectorStore 來添加、查詢和檢索向量數據。
持久存放數據(存在磁盤里)
# 初始化一個 ChromaDB 的持久化客戶端,數據將被保存在 "./chroma_db" 目錄下
db = chromadb.PersistentClient(path="./chroma_db")# 獲取或創建一個名為 "quickstart" 的集合(collection),用于存儲向量數據
chroma_collection = db.get_or_create_collection("quickstart")# 將該集合包裝成 LlamaIndex 可用的 VectorStore 接口
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)# 創建一個 StorageContext,指定當前使用的 vector_store,用于控制索引如何存儲和加載數據
storage_context = StorageContext.from_defaults(vector_store=vector_store)# 使用文檔(documents)和 storage_context 構建一個 VectorStoreIndex 索引
# 在此過程中會使用 embed_model 對文檔進行嵌入編碼,并將結果寫入磁盤上的 ChromaDB
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context, embed_model=embed_model
)
從磁盤加載(恢復索引)
# 重新初始化一個 ChromaDB 客戶端,指向同一個路徑
db2 = chromadb.PersistentClient(path="./chroma_db")# 獲取之前創建的 collection(集合)
chroma_collection = db2.get_or_create_collection("quickstart")# 同樣包裝成 LlamaIndex 的 VectorStore
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)# 從現有的 vector_store 中重建索引,不依賴原始文檔
index = VectorStoreIndex.from_vector_store(vector_store,embed_model=embed_model,
)
查詢索引:查詢引擎會在底層自動將問題嵌入,然后在向量庫中查找最相關的文檔片段。結合檢索結果,生成自然語言的回答。
# 將索引封裝為一個查詢引擎
query_engine = index.as_query_engine()# 執行自然語言查詢:"作者在成長過程中做了什么?"
response = query_engine.query("作者在成長過程中做了什么?")展示響應結果
print(response)