diff --git a/CHANGELOG.md b/CHANGELOG.md index d276f17cf..c3e0ac312 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Next +### Added + +- Added support for multi-vector collection in Qdrant driver. + ### Changed - Improved log output readability in Retrievers and GraphRAG and added embedded vector to retriever result metadata for debugging. diff --git a/docs/source/user_guide_rag.rst b/docs/source/user_guide_rag.rst index b51c019a1..42859c41c 100644 --- a/docs/source/user_guide_rag.rst +++ b/docs/source/user_guide_rag.rst @@ -704,6 +704,7 @@ Qdrant Retrievers driver=driver, client=client, collection_name="my-collection", + using="my-vector", id_property_external="neo4j_id", # The payload field that contains identifier to a corresponding Neo4j node id property id_property_neo4j="id", embedder=embedder, diff --git a/src/neo4j_graphrag/retrievers/external/qdrant/qdrant.py b/src/neo4j_graphrag/retrievers/external/qdrant/qdrant.py index ecd3dd2e8..a5e47f2a3 100644 --- a/src/neo4j_graphrag/retrievers/external/qdrant/qdrant.py +++ b/src/neo4j_graphrag/retrievers/external/qdrant/qdrant.py @@ -62,6 +62,7 @@ class QdrantNeo4jRetriever(ExternalRetriever): driver=neo4j_driver, client=client, collection_name="my_collection", + using="my_vector", id_property_external="neo4j_id" ) embedding = ... @@ -71,6 +72,7 @@ class QdrantNeo4jRetriever(ExternalRetriever): driver (neo4j.Driver): The Neo4j Python driver. client (QdrantClient): The Qdrant client object. collection_name (str): The name of the Qdrant collection to use. + using (str): The name of the Qdrant vector contained in your collection in case of multi-vector collection id_property_neo4j (str): The name of the Neo4j node property that's used as the identifier for relating matches from Qdrant to Neo4j nodes. id_property_external (str): The name of the Qdrant payload property with identifier that refers to a corresponding Neo4j node id property. embedder (Optional[Embedder]): Embedder object to embed query text. @@ -89,6 +91,7 @@ def __init__( collection_name: str, id_property_neo4j: str, id_property_external: str = "id", + using: Optional[str] = None, embedder: Optional[Embedder] = None, return_properties: Optional[list[str]] = None, retrieval_query: Optional[str] = None, @@ -105,6 +108,7 @@ def __init__( driver_model=driver_model, client_model=client_model, collection_name=collection_name, + using=using, id_property_neo4j=id_property_neo4j, id_property_external=id_property_external, embedder_model=embedder_model, @@ -125,6 +129,7 @@ def __init__( self.driver = validated_data.driver_model.driver self.client = validated_data.client_model.client self.collection_name = validated_data.collection_name + self.using = validated_data.using self.embedder = ( validated_data.embedder_model.embedder if validated_data.embedder_model @@ -202,6 +207,7 @@ def get_search_results( points = self.client.query_points( collection_name=self.collection_name, query=query_vector, + using=self.using, limit=top_k, with_payload=[self.id_property_external], **kwargs, diff --git a/src/neo4j_graphrag/retrievers/external/qdrant/types.py b/src/neo4j_graphrag/retrievers/external/qdrant/types.py index d731bf735..d0240c150 100644 --- a/src/neo4j_graphrag/retrievers/external/qdrant/types.py +++ b/src/neo4j_graphrag/retrievers/external/qdrant/types.py @@ -48,6 +48,7 @@ class QdrantNeo4jRetrieverModel(BaseModel): collection_name: str id_property_external: str id_property_neo4j: str + using: Optional[str] = None embedder_model: Optional[EmbedderModel] = None return_properties: Optional[list[str]] = None retrieval_query: Optional[str] = None