iT邦幫忙

2024 iThome 鐵人賽

DAY 19
1
生成式 AI

懶人救星:生成式AI 系列 第 19

Day19-從零開始:如何透過LlamaIndex儲存Index、Documents、Vector?

  • 分享至 

  • xImage
  •  

前言✨

在先前的文章已經介紹了如何創建 Documents、Index 等方法,今天要介紹如何將結果儲存起來,這樣就不需要每次都重新訓練了。 LlamaIndex Storing 功能允許開發者將索引及其相關數據儲存在不同的後端,例如本地檔案系統、資料庫或雲端存儲中。這項功能不僅提供了便捷的數據持久化方案,還能確保數據的完整性和快速檢索的性能。
https://ithelp.ithome.com.tw/upload/images/20240918/20168117r02zSIfq2R.png

【Storing💾】

Storing 功能主要解決的問題如下:
資料持久化:在應用程式關閉或重啟後仍保留索引,無需重新生成。
資源節省:減少系統每次需要重新建立索引的運算成本,節省系統資源。
便捷存取:提供簡易的方法讓應用程式能隨時載入並使用之前保存的索引。

  • Vector Stores🧮:
    Vector Stores 是一種用於儲存嵌入向量的資料結構。這些存儲庫不僅可以保存向量,還可以選擇性地保存原始文檔片段或元數據,便於後續檢索和分析。

    LlamaIndex 支援超過 20 種不同的向量儲存選項,並不斷增加更多的集成和功能。以下是一些常見的儲存庫:

    • ChromaDB:是一個高效能的開源向量數據庫,專為機器學習和人工智慧應用設計。它支援快速的相似性搜尋,能夠處理大量的數據,並提供靈活的查詢功能。
    • Qdrant:是一個開源的向量相似性搜索引擎,專為高效處理和管理高維向量數據而設計。它提供簡單的 API ,支援快速儲存、搜索和查詢向量,並能夠處理文本、圖像和音頻等多種數據類型。
    • Elasticsearch:是一個基於Apache Lucene的開源分散式搜尋和分析引擎,支援快速的全文搜尋和數據分析,能夠處理結構化和非結構化數據。具備高可擴展性,可以在多台伺服器上運行,並能夠即時存取和分析大量數據。
    • Pinecone:是一個雲原生的向量數據庫,專為高效能 AI 應用設計。它提供簡單的 API 無需用戶管理基礎設施,能夠在數十億個向量中以低延遲提供查詢結果。支援實時數據更新和元數據過濾,適用於生成問答、圖像相似度搜索和產品推薦等應用。

    每個向量儲存選項都具有不同的功能,如異步操作、刪除操作及文檔儲存等,以滿足多樣化的應用需求,以下將示範 ChromaDB + LlamaIndex:

    1. 安裝相關依賴
    pip install chromadb
    pip install llama-index-vector-stores-chroma
    
    1. 可能會遇到C++ Error error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/,下載並安裝 Microsoft C++ Build Tools 並安裝 build-tools 即可解決。

    2. 執行程式碼:

    import os
    os.environ["OPENAI_API_KEY"] = "YOUR-API-KEY"
    import chromadb
    from llama_index.vector_stores.chroma import ChromaVectorStore
    from llama_index.core import Document, VectorStoreIndex, StorageContext
    
    # Create documents
    ...
    
    # Connect to Chroma
    chroma_client = chromadb.EphemeralClient()
    chroma_collection = chroma_client.get_or_create_collection("quickstart")
    
    # Set LlamaIndex
    vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
    storage_context = StorageContext.from_defaults(vector_store=vector_store)
    
    # Embedding + Storing
    index = VectorStoreIndex.from_documents(
        documents, storage_context=storage_context
    )
    
    # View ChromaDB content 
    print(chroma_collection.get())
    
  • Document Stores📄:
    Document Stores 是用於儲存已處理文檔塊(Chunk)的資料結構,這些片段被稱為 Node 物件。這些存儲系統允許用戶將文檔數據持久化,並提供多種後端選擇以適應不同的需求。
    支援的後端

    • MongoDB:用戶可以使用 MongoDocumentStore 將數據持久化到 MongoDB 數據庫。支持自動將新加入的 Node 物件儲存到指定的集合中,並支援自動加載現有集合。
    • Redis:使用 RedisDocumentStore,用戶可以將 Node 物件儲存在 Redis 數據庫中。這種方式同樣支援自動持久化,並且可以根據需要重新連接到 Redis 客戶端。
    • Firestore:透過 FirestoreDocumentStore,用戶可以將數據儲存在 Google Cloud 的 Firestore 中。存儲庫也支援自動持久化,並可按需重新初始化以加載現有數據。
      因為 Vector DB 大部分也同時支援儲存 Documents 的功能,這章節就不特別實作介紹,如有興趣者能至 LlamaIndex官網查看。
  • Index Stores📑:
    Index Stores 是用於存儲輕量級索引、元數據的資料結構,這些元數據是建立索引過程中生成的附加狀態訊息。LlamaIndex 提供了多種索引儲存選項,以便用戶根據需求選擇合適的後端。
    支援的後端

    • MongoDB:支持使用 MongoDB 作為索引存儲後端。用戶可以通過以下代碼來創建或加載索引存儲。
    • Redis:也可以作為索引存儲後端。用戶可以通過以下代碼來創建 Redis 索引存儲。
  • Chat Stores💬:
    Chat Stores 是一種專門用於儲存聊天歷史的資料結構,主要功能為保持訊息的順序,這對於維護整體對話至關重要。這些存儲系統能夠通過鍵(如 user_ids 或其他唯一標識符)來組織聊天消息序列,並支持 delete、insert 和 get 操作。

    • SimpleChatStore:最基本的儲存方式 SimpleChatStore,它將訊息儲存在內核中,並可以將數據保存到磁碟或序列化以便在其他地方儲存。
    from llama_index.core.storage.chat_store import SimpleChatStore
    from llama_index.core.memory import ChatMemoryBuffer
    
    # Create Document
    ...
    
    # Embedding or Other Indexing
    ...
    
    # Create Chat Stores
    chat_store = SimpleChatStore()
    chat_memory = ChatMemoryBuffer.from_defaults(
        token_limit=3000,
        chat_store=chat_store,
        chat_store_key="user1",
    )
    
    # Create Chat Object
    agent = OpenAIAgent.from_tools(tools, memory=memory)
    # OR
    chat_engine = index.as_chat_engine(memory=memory)
    
    # Save/Load from Disk
    chat_store.persist(persist_path="chat_store.json")
    loaded_chat_store = SimpleChatStore.from_persist_path(
        persist_path="chat_store.json"
    )
    
    • RedisChatStore:用戶將聊天歷史遠程儲存,免去手動持久化和加載的麻煩。
    • AzureChatStore:用戶可以將聊天歷史遠程儲存在 Azure 表格存儲或 CosmosDB 中,同樣不需要手動處理持久化。
  • Persisting & Loading Data💾:
    Persisting & Loading Data 是 LlamaIndex 中一個重要的功能,幫助用戶有效地管理數據的持久化和加載。預設情況下,LlamaIndex 將數據儲存在內存中,用戶可以選擇將其持久化到磁碟中。

    • Loading Data:提供了簡單加載數據的方法,使用者只需重新創建儲存上下文,並使用相同的配置,如指定相同的 persist_dir 。以下是加載數據的示例:
    storage_context = StorageContext.from_defaults(
    docstore=SimpleDocumentStore.from_persist_dir(persist_dir="<persist_dir>"),
    vector_store=SimpleVectorStore.from_persist_dir(
        persist_dir="<persist_dir>"
    ),
        index_store=SimpleIndexStore.from_persist_dir(persist_dir="<persist_dir>"),
    )
    

結論🎯

在本篇文章中,我們介紹了 LlamaIndex 的各種數據存儲選項,這些選項能夠有效地解決資料持久化和系統資源節省的問題。透過不同的 Vector Stores、Document Stores、Index Stores 及 Chat Stores,開發者可以根據應用需求靈活選擇合適的存儲庫,確保數據的安全性與快速檢索能力。此外,LlamaIndex 提供的 Persisting & Loading Data 功能,更進一步提升了數據的持久性與便利性。

透過 LlamaIndex 的強大儲存功能,開發者不僅能節省重複訓練的時間,還能優化系統效能,為 AI 應用程序提供穩定且高效的資料管理方案。


上一篇
Day18-從零開始:如何透過LlamaIndex建立Indexing?
下一篇
Day20-RAG大秘密揭露!資料檢索其實可以這麼高效
系列文
懶人救星:生成式AI 25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言