Skip to content

Vectorstore

https://python.langchain.com/docs/integrations/vectorstores

Overview

  1. EmebddingしたVectorを格納するDatastore
  2. LangChainのVectorStoreの中のvectorstoreに実際のvectorstoreが格納されている
  3. DeepLakeならdeeplake_vectorstore.pyが本体のvectorstore.
    1. dataset

      1. delete_and_commit

Types of Vector Store

  1. Qdrant
  2. Deeplake

Usage: Embedding -> Vector -> VectorStore (Qdrant) -> RetrievalQA

  1. Qdrant のClientの初期化(local fileの場合)
    client = QdrantClient(path=QDRANT_PATH)
    
    Qdrant
    Qdrant(client=client, collection_name=COLLECTION_NAME, embeddings=OpenAIEmbeddings())
    
  2. QdrantにstrまたはDocumentを追加
    qdrant.add_texts(texts_or_docs)
    qdrant.add_documents(texts_or_docs)
    
  3. Retrieverの初期化
    retriever = qdrant.as_retriever(
        # "mmr",  "similarity_score_threshold" などもある
        search_type="similarity",
        # 文書を何個取得するか (default: 4)
        search_kwargs={"k": 5},
    )
    return RetrievalQA.from_chain_type(
        llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True, verbose=True
    )
    
  4. Question&Answer: 上で作成したretriverに質問する
    qa("ウェブサイト上でユーザに問題があったケースを教えてください。")
    

VectorStore (Interface for vector store)

  1. VectorStore.from_documentsは texts と metadatasをfrom_textsに渡しているだけ:

    @classmethod
    def from_documents(
        cls: Type[VST],
        documents: List[Document],
        embedding: Embeddings,
        **kwargs: Any,
    ) -> VST:
        """Return VectorStore initialized from documents and embeddings."""
        texts = [d.page_content for d in documents]
        metadatas = [d.metadata for d in documents]
        return cls.from_texts(texts, embedding, metadatas=metadatas, **kwargs)
    
  2. DeepLake.from_textsは 結局はadd_textsをしてるだけ

        @classmethod
        def from_texts(
            cls,
            texts: List[str],
            embedding: Optional[Embeddings] = None,
            metadatas: Optional[List[dict]] = None,
            ids: Optional[List[str]] = None,
            dataset_path: str = _LANGCHAIN_DEFAULT_DEEPLAKE_PATH,
            **kwargs: Any,
        ) -> DeepLake:
            deeplake_dataset = cls(dataset_path=dataset_path, embedding=embedding, **kwargs)
            deeplake_dataset.add_texts(
                texts=texts,
                metadatas=metadatas,
                ids=ids,
            )
            return deeplake_dataset
    

  3. DeepLake.add_textsは、DeepLakeVectorStore.add (https://github.com/activeloopai/deeplake)している (具体的にやっていることはEmbedding Function (このケースだとOpenAI)を叩いて与えられたテキストをEmbeddingしてVectorStoreに格納する)

        return self.vectorstore.add(
            text=texts,
            metadata=metadatas,
            embedding_data=texts,
            embedding_tensor="embedding",
            embedding_function=self._embedding_function.embed_documents,  # type: ignore
            return_ids=True,
            **kwargs,
        )
    

Tips

vector_store = DeepLake(
    dataset_path=DATASET_PATH,
    read_only=False,
    embedding=cached_embedder,
)
  1. datasetサマリー
    vector_store.vectorstore.dataset.summary()
    Dataset(path='./datasets/v1', tensors=['embedding', 'id', 'metadata', 'text'])
    
      tensor      htype     shape    dtype  compression
      -------    -------   -------  -------  -------
     embedding  embedding   (0,)    float32   None
        id        text      (0,)      str     None
     metadata     json      (0,)      str     None
       text       text      (0,)      str     None
    
  2. datasetをリセットする (Tensorも消えるので注意)

    import deeplake
    deeplake.empty(vector_store.vectorstore.dataset.path, overwrite=True)
    

    with delete_all_samples_if_specified

    from deeplake.core.vectorstore.vector_search import dataset as dataset_utils
    dataset_utils.delete_all_samples_if_specified(vector_store.vectorstore.dataset, True)
    

    from deeplake.core.vectorstore.vector_search import dataset as dataset_utils
    
    1. datasetのtensorをClearする (idはTensor名)
    vector_store.vectorstore.dataset.id.clear()