40.RAG開發(fā)-27-VectorStores向量存儲

Vector stores 向量存儲

基于LangChain的向量存儲,存儲嵌入數(shù)據(jù),并執(zhí)行相似性搜索。

image.png

如圖,這是一個典型的向量存儲應(yīng)用,也即是典型的RAG流程。

這部分開發(fā)主要涉及到:

  • 如何文本轉(zhuǎn)向量
  • 創(chuàng)建向量存儲,基于向量存儲完成:
    ** 存入向量
    ** 刪除向量
    ** 向量檢索

內(nèi)置向量存儲的使用

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings

vector_store = InMemoryVectorStore(embedding=DashScopeEmbeddings())
# 添加文檔到向量存儲,并指定id
vector_store.add_documents(documents=[doc1, doc2], ids=["id1", "id2"])
# 刪除文檔(通過指定的id刪除)
vector_store.delete(ids=["id1"])
# 相似性搜索
similar_docs = vector_store.similarity_search("your query here", 4)

外部(Chroma)向量存儲的使用

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_chroma import Chroma

vector_store = Chroma(
    collection_name="example_collection",
    embedding_function=DashScopeEmbeddings(),
    persist_directory="./chroma_langchain_db",  # Where to save data locally, remove if not necessary
)

stu.csv

name,age,gender,hobby
王梓涵,25,男,"吃飯,rap"
劉若曦,22,女,"睡覺,rap"
陳俊宇,20,男,"吃飯,rap"
趙思瑤,28,女,"睡覺,rap"
黃浩然,15,男,"吃飯,rap"
林雨桐,20,女,"唱跳,rap"
周博文,20,男,"吃飯,rap"
吳詩琪,24,女,"吃飯,rap"
馬子軒,22,男,"睡覺,rap"
孫悅?cè)?27,女,"吃飯,rap"

內(nèi)存向量存儲

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import CSVLoader

vector_store = InMemoryVectorStore(
    embedding=DashScopeEmbeddings()
)

loader = CSVLoader(
    "data/stu.csv",  # CSV文件路徑
    encoding="utf-8",  # 編碼格式
    source_column="name"  # 文檔來源列名
)

documents = loader.load()

# 向量存儲的新增、刪除、檢索
vector_store.add_documents(
    documents = documents, # 被添加的文檔,類型:list[Document]
    ids = ["id"+str(i) for i in range(1, len(documents)+1)] #給添加的文檔提供id(字符串)list[str]
)

# 刪除傳入[id,id...]
vector_store.delete(["id1", "id2"])

# 檢索傳入查詢字符串
results = vector_store.similarity_search(
    "周博文",
    k=3  # 返回的文檔數(shù)量,默認值為1
)
print(results)


外部向量持久化存儲

from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import CSVLoader
from langchain_chroma import Chroma

# Chroma向量數(shù)據(jù)庫(輕量級的)
# 確保langchain-chroma和chromadb這兩個庫安裝了最新版本
vector_store = Chroma(
    collection_name="test",  #當前向量存儲起個名字,類似數(shù)據(jù)庫的表名稱
    embedding_function=DashScopeEmbeddings(),  # 向量嵌入模型
    persist_directory="./chroma_db"  # 持久化目錄
)

loader = CSVLoader(
    "data/stu.csv",  # CSV文件路徑
    encoding="utf-8",  # 編碼格式
    source_column="name",  # 文檔來源列名
    csv_args={"delimiter": ",", "quotechar": "\""}  # 明確指定分隔符和引號
)

documents = loader.load()

# 向量存儲的新增、刪除、檢索
vector_store.add_documents(
    documents = documents, # 被添加的文檔,類型:list[Document]
    ids = ["id"+str(i) for i in range(1, len(documents)+1)] #給添加的文檔提供id(字符串)list[str]
)

# 刪除傳入[id,id...]
vector_store.delete(["id1", "id2"])

# 檢索傳入查詢字符串
results = vector_store.similarity_search(
    "周博文",
    k=3   # 返回的文檔數(shù)量,默認值為1
    # filter={"name": "周博文"}  # 過濾條件,類型:dict[str, str]
)
print(results)


(用 python3.14運行此代碼會報錯,不是代碼的問題是3.14太新了,換python3.11就可以正常運行了,langchain 和 chromadb 及其底層依賴庫 pydantic 目前尚未完全適配 Python 3.14(目前 Python 3.14 還處于早期開發(fā)/測試階段,并非穩(wěn)定版)。chromadb 內(nèi)部使用了 pydantic 的舊版本特性(v1),而這些特性在 Python 3.14 中無法正常工作,導致類型推斷失敗。)

Langchain內(nèi)提供向量存儲功能,可以基于:

  • InMemoryVectorStore,完成內(nèi)存向量存儲
  • Chroma,外部數(shù)據(jù)庫向量存儲

向量存儲類均提供3個通用API接口:

  • add_document,添加文檔到向量存儲
  • delete,從向量存儲中刪除文檔
  • similarity_search:相似度搜索

整體向量存儲使用流程如下(RAG流程):

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容