Using Vector Storesο
LlamaIndex offers multiple integration points with vector stores / vector databases:
LlamaIndex can load data from vector stores, similar to any other data connector. This data can then be used within LlamaIndex data structures.
LlamaIndex can use a vector store itself as an index. Like any other index, this index can store documents and be used to answer queries.
Loading Data from Vector Stores using Data Connectorο
LlamaIndex supports loading data from the following sources. See Data Connectors for more details and API documentation.
Chroma (
ChromaReader
) InstallationDeepLake (
DeepLakeReader
) InstallationQdrant (
QdrantReader
) Installation Python ClientWeaviate (
WeaviateReader
). Installation. Python Client.Pinecone (
PineconeReader
). Installation/Quickstart.Faiss (
FaissReader
). Installation.Milvus (
MilvusReader
). InstallationZilliz (
MilvusReader
). QuickstartMyScale (
MyScaleReader
). Quickstart. Installation/Python Client.
Chroma stores both documents and vectors. This is an example of how to use Chroma:
from llama_index.readers.chroma import ChromaReader
from llama_index.indices import GPTListIndex
# The chroma reader loads data from a persisted Chroma collection.
# This requires a collection name and a persist directory.
reader = ChromaReader(
collection_name="chroma_collection",
persist_directory="examples/data_connectors/chroma_collection"
)
query_vector=[n1, n2, n3, ...]
documents = reader.load_data(collection_name="demo", query_vector=query_vector, limit=5)
index = GPTListIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("<query_text>")
display(Markdown(f"<b>{response}</b>"))
Qdrant also stores both documents and vectors. This is an example of how to use Qdrant:
from llama_index.readers.qdrant import QdrantReader
reader = QdrantReader(host="localhost")
# the query_vector is an embedding representation of your query_vector
# Example query_vector
# query_vector = [0.3, 0.3, 0.3, 0.3, ...]
query_vector = [n1, n2, n3, ...]
# NOTE: Required args are collection_name, query_vector.
# See the Python client: https;//github.com/qdrant/qdrant_client
# for more details
documents = reader.load_data(collection_name="demo", query_vector=query_vector, limit=5)
NOTE: Since Weaviate can store a hybrid of document and vector objects, the user may either choose to explicitly specify class_name
and properties
in order to query documents, or they may choose to specify a raw GraphQL query. See below for usage.
# option 1: specify class_name and properties
# 1) load data using class_name and properties
documents = reader.load_data(
class_name="<class_name>",
properties=["property1", "property2", "..."],
separate_documents=True
)
# 2) example GraphQL query
query = """
{
Get {
<class_name> {
<property1>
<property2>
}
}
}
"""
documents = reader.load_data(graphql_query=query, separate_documents=True)
NOTE: Both Pinecone and Faiss data loaders assume that the respective data sources only store vectors; text content is stored elsewhere. Therefore, both data loaders require that the user specifies an id_to_text_map
in the load_data call.
For instance, this is an example usage of the Pinecone data loader PineconeReader
:
from llama_index.readers.pinecone import PineconeReader
reader = PineconeReader(api_key=api_key, environment="us-west1-gcp")
id_to_text_map = {
"id1": "text blob 1",
"id2": "text blob 2",
}
query_vector=[n1, n2, n3, ..]
documents = reader.load_data(
index_name="quickstart", id_to_text_map=id_to_text_map, top_k=3, vector=query_vector, separate_documents=True
)
Using a Vector Store as an Indexο
LlamaIndex also supports different vector stores
as the storage backend for GPTVectorStoreIndex
.
A detailed API reference is found here.
Similar to any other index within LlamaIndex (tree, keyword table, list), GPTVectorStoreIndex
can be constructed upon any collection
of documents.
We use the vector store within the index to store embeddings for the input text chunks.
Once constructed, the index can be used for querying.
Default Vector Store Index Construction/Querying
By default, GPTVectorStoreIndex
uses a in-memory SimpleVectorStore
thatβs initialized as part of the default storage context.
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
# Load documents and build index
documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
# Query index
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
Custom Vector Store Index Construction/Querying
We can query over a custom vector store as follows:
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, StorageContext
from llama_index.vector_stores import DeepLakeVectorStore
# construct vector store and customize storage context
storage_context = StorageContext.from_defaults(
vector_store = DeepLakeVectorStore(dataset_path="<dataset_path>")
)
# Load documents and build index
documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()
index = GPTVectorStoreIndex.from_documents(documents, storage_context=storage_context)
# Query index
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
Below we show more examples of how to construct various vector stores we support.
DeepLake
import os
import getpath
from llama_index.vector_stores import DeepLakeVectorStore
os.environ["OPENAI_API_KEY"] = getpath.getpath("OPENAI_API_KEY: ")
os.environ["ACTIVELOOP_TOKEN"] = getpath.getpath("ACTIVELOOP_TOKEN: ")
dataset_path = "hub://adilkhan/paul_graham_essay"
# construct vector store
vector_store = DeepLakeVectorStore(dataset_path=dataset_path, overwrite=True)
Faiss
import faiss
from llama_index.vector_stores import FaissVectorStore
# create faiss index
d = 1536
faiss_index = faiss.IndexFlatL2(d)
# construct vector store
vector_store = FaissVectorStore(faiss_index)
...
# NOTE: since faiss index is in-memory, we need to explicitly call
# vector_store.persist() or storage_context.persist() to save it to disk.
# persist() takes in optional arg persist_path. If none give, will use default paths.
storage_context.persist()
Weaviate
import weaviate
from llama_index.vector_stores import WeaviateVectorStore
# creating a Weaviate client
resource_owner_config = weaviate.AuthClientPassword(
username="<username>",
password="<password>",
)
client = weaviate.Client(
"https://<cluster-id>.semi.network/", auth_client_secret=resource_owner_config
)
# construct vector store
vector_store = WeaviateVectorStore(weaviate_client=client)
Pinecone
import pinecone
from llama_index.vector_stores import PineconeVectorStore
# Creating a Pinecone index
api_key = "api_key"
pinecone.init(api_key=api_key, environment="us-west1-gcp")
pinecone.create_index(
"quickstart",
dimension=1536,
metric="euclidean",
pod_type="p1"
)
index = pinecone.Index("quickstart")
# can define filters specific to this vector index (so you can
# reuse pinecone indexes)
metadata_filters = {"title": "paul_graham_essay"}
# construct vector store
vector_store = PineconeVectorStore(
pinecone_index=index,
metadata_filters=metadata_filters
)
Qdrant
import qdrant_client
from llama_index.vector_stores import QdrantVectorStore
# Creating a Qdrant vector store
client = qdrant_client.QdrantClient(
host="<qdrant-host>",
api_key="<qdrant-api-key>",
https=True
)
collection_name = "paul_graham"
# construct vector store
vector_store = QdrantVectorStore(
client=client,
collection_name=collection_name,
)
Chroma
import chromadb
from llama_index.vector_stores import ChromaVectorStore
# Creating a Chroma client
# By default, Chroma will operate purely in-memory.
chroma_client = chromadb.Client()
chroma_collection = chroma_client.create_collection("quickstart")
# construct vector store
vector_store = ChromaVectorStore(
chroma_collection=chroma_collection,
)
Milvus
Milvus Index offers the ability to store both Documents and their embeddings. Documents are limited to the predefined Document attributes and does not include extra_info.
import pymilvus
from llama_index.vector_stores import MilvusVectorStore
# construct vector store
vector_store = MilvusVectorStore(
host='localhost',
port=19530,
overwrite='True'
)
Note: MilvusVectorStore
depends on the pymilvus
library.
Use pip install pymilvus
if not already installed.
If you get stuck at building wheel for grpcio
, check if you are using python 3.11
(thereβs a known issue: https://github.com/milvus-io/pymilvus/issues/1308)
and try downgrading.
Zilliz
Zilliz Cloud (hosted version of Milvus) uses the Milvus Index with some extra arguments.
import pymilvus
from llama_index.vector_stores import MilvusVectorStore
# construct vector store
vector_store = MilvusVectorStore(
host='foo.vectordb.zillizcloud.com',
port=403,
user="db_admin",
password="foo",
use_secure=True,
overwrite='True'
)
Note: MilvusVectorStore
depends on the pymilvus
library.
Use pip install pymilvus
if not already installed.
If you get stuck at building wheel for grpcio
, check if you are using python 3.11
(thereβs a known issue: https://github.com/milvus-io/pymilvus/issues/1308)
and try downgrading.
MyScale
import clickhouse_connect
from llama_index.vector_stores import MyScaleVectorStore
# Creating a MyScale client
client = clickhouse_connect.get_client(
host='YOUR_CLUSTER_HOST',
port=8443,
username='YOUR_USERNAME',
password='YOUR_CLUSTER_PASSWORD'
)
# construct vector store
vector_store = MyScaleVectorStore(
myscale_client=client
)
Example notebooks can be found here.
Examples
- Simple Vector Store
- Qdrant Vector Store
- Faiss Vector Store
- DeepLake Vector Store
- MyScale Vector Store
- Metal Vector Store
- Weaviate Vector Store
- Using as a vector index.
- Pinecone Vector Store
- Chroma Vector Store
- LanceDB Vector Store
- Milvus Vector Store
- Weaviate Vector Store - Hybrid Search
- Pinecone Vector Store - Hybrid Search
- Simple Vector Store - Async Index Creation