Source code for langchain.retrievers.self_query.base
"""Retriever that generates and executes structured queries over its own data source."""importloggingfromtypingimportAny,Dict,List,Optional,Sequence,Tuple,Type,Unionfromlangchain_core.callbacks.managerimport(AsyncCallbackManagerForRetrieverRun,CallbackManagerForRetrieverRun,)fromlangchain_core.documentsimportDocumentfromlangchain_core.language_modelsimportBaseLanguageModelfromlangchain_core.pydantic_v1importField,root_validatorfromlangchain_core.retrieversimportBaseRetrieverfromlangchain_core.runnablesimportRunnablefromlangchain_core.structured_queryimportStructuredQuery,Visitorfromlangchain_core.vectorstoresimportVectorStorefromlangchain.chains.query_constructor.baseimportload_query_constructor_runnablefromlangchain.chains.query_constructor.schemaimportAttributeInfologger=logging.getLogger(__name__)QUERY_CONSTRUCTOR_RUN_NAME="query_constructor"def_get_builtin_translator(vectorstore:VectorStore)->Visitor:"""Get the translator class corresponding to the vector store class."""try:importlangchain_community# noqa: F401exceptImportError:raiseImportError("The langchain-community package must be installed to use this feature."" Please install it using `pip install langchain-community`.")fromlangchain_community.query_constructors.astradbimportAstraDBTranslatorfromlangchain_community.query_constructors.chromaimportChromaTranslatorfromlangchain_community.query_constructors.dashvectorimportDashvectorTranslatorfromlangchain_community.query_constructors.databricks_vector_searchimport(DatabricksVectorSearchTranslator,)fromlangchain_community.query_constructors.deeplakeimportDeepLakeTranslatorfromlangchain_community.query_constructors.dingoimportDingoDBTranslatorfromlangchain_community.query_constructors.elasticsearchimport(ElasticsearchTranslator,)fromlangchain_community.query_constructors.milvusimportMilvusTranslatorfromlangchain_community.query_constructors.mongodb_atlasimport(MongoDBAtlasTranslator,)fromlangchain_community.query_constructors.myscaleimportMyScaleTranslatorfromlangchain_community.query_constructors.neo4jimportNeo4jTranslatorfromlangchain_community.query_constructors.opensearchimportOpenSearchTranslatorfromlangchain_community.query_constructors.pgvectorimportPGVectorTranslatorfromlangchain_community.query_constructors.pineconeimportPineconeTranslatorfromlangchain_community.query_constructors.qdrantimportQdrantTranslatorfromlangchain_community.query_constructors.redisimportRedisTranslatorfromlangchain_community.query_constructors.supabaseimportSupabaseVectorTranslatorfromlangchain_community.query_constructors.tencentvectordbimport(TencentVectorDBTranslator,)fromlangchain_community.query_constructors.timescalevectorimport(TimescaleVectorTranslator,)fromlangchain_community.query_constructors.vectaraimportVectaraTranslatorfromlangchain_community.query_constructors.weaviateimportWeaviateTranslatorfromlangchain_community.vectorstoresimport(AstraDB,DashVector,DatabricksVectorSearch,DeepLake,Dingo,Milvus,MyScale,Neo4jVector,OpenSearchVectorSearch,PGVector,Qdrant,Redis,SupabaseVectorStore,TencentVectorDB,TimescaleVector,Vectara,Weaviate,)fromlangchain_community.vectorstoresimport(ChromaasCommunityChroma,)fromlangchain_community.vectorstoresimport(ElasticsearchStoreasElasticsearchStoreCommunity,)fromlangchain_community.vectorstoresimport(MongoDBAtlasVectorSearchasCommunityMongoDBAtlasVectorSearch,)fromlangchain_community.vectorstoresimport(PineconeasCommunityPinecone,)BUILTIN_TRANSLATORS:Dict[Type[VectorStore],Type[Visitor]]={AstraDB:AstraDBTranslator,PGVector:PGVectorTranslator,CommunityPinecone:PineconeTranslator,CommunityChroma:ChromaTranslator,DashVector:DashvectorTranslator,Dingo:DingoDBTranslator,Weaviate:WeaviateTranslator,Vectara:VectaraTranslator,Qdrant:QdrantTranslator,MyScale:MyScaleTranslator,DeepLake:DeepLakeTranslator,ElasticsearchStoreCommunity:ElasticsearchTranslator,Milvus:MilvusTranslator,SupabaseVectorStore:SupabaseVectorTranslator,TimescaleVector:TimescaleVectorTranslator,OpenSearchVectorSearch:OpenSearchTranslator,CommunityMongoDBAtlasVectorSearch:MongoDBAtlasTranslator,Neo4jVector:Neo4jTranslator,}ifisinstance(vectorstore,DatabricksVectorSearch):returnDatabricksVectorSearchTranslator()elifisinstance(vectorstore,MyScale):returnMyScaleTranslator(metadata_key=vectorstore.metadata_column)elifisinstance(vectorstore,Redis):returnRedisTranslator.from_vectorstore(vectorstore)elifisinstance(vectorstore,TencentVectorDB):fields=[field.nameforfieldin(vectorstore.meta_fieldsor[])iffield.index]returnTencentVectorDBTranslator(fields)elifvectorstore.__class__inBUILTIN_TRANSLATORS:returnBUILTIN_TRANSLATORS[vectorstore.__class__]()else:try:fromlangchain_astradb.vectorstoresimportAstraDBVectorStoreexceptImportError:passelse:ifisinstance(vectorstore,AstraDBVectorStore):returnAstraDBTranslator()try:fromlangchain_elasticsearch.vectorstoresimportElasticsearchStoreexceptImportError:passelse:ifisinstance(vectorstore,ElasticsearchStore):returnElasticsearchTranslator()try:fromlangchain_pineconeimportPineconeVectorStoreexceptImportError:passelse:ifisinstance(vectorstore,PineconeVectorStore):returnPineconeTranslator()try:fromlangchain_mongodbimportMongoDBAtlasVectorSearchexceptImportError:passelse:ifisinstance(vectorstore,MongoDBAtlasVectorSearch):returnMongoDBAtlasTranslator()try:fromlangchain_chromaimportChromaexceptImportError:passelse:ifisinstance(vectorstore,Chroma):returnChromaTranslator()try:fromlangchain_postgresimportPGVector# type: ignore[no-redef]fromlangchain_postgresimportPGVectorTranslatorasNewPGVectorTranslatorexceptImportError:passelse:ifisinstance(vectorstore,PGVector):returnNewPGVectorTranslator()try:fromlangchain_qdrantimportQdrantVectorStoreexceptImportError:passelse:ifisinstance(vectorstore,QdrantVectorStore):returnQdrantTranslator(metadata_key=vectorstore.metadata_payload_key)try:# Added in langchain-community==0.2.11fromlangchain_community.query_constructors.hanavectorimportHanaTranslatorfromlangchain_community.vectorstoresimportHanaDBexceptImportError:passelse:ifisinstance(vectorstore,HanaDB):returnHanaTranslator()raiseValueError(f"Self query retriever with Vector Store type {vectorstore.__class__}"f" not supported.")
[docs]classSelfQueryRetriever(BaseRetriever):"""Retriever that uses a vector store and an LLM to generate the vector store queries."""vectorstore:VectorStore"""The underlying vector store from which documents will be retrieved."""query_constructor:Runnable[dict,StructuredQuery]=Field(alias="llm_chain")"""The query constructor chain for generating the vector store queries. llm_chain is legacy name kept for backwards compatibility."""search_type:str="similarity""""The search type to perform on the vector store."""search_kwargs:dict=Field(default_factory=dict)"""Keyword arguments to pass in to the vector store search."""structured_query_translator:Visitor"""Translator for turning internal query language into vectorstore search params."""verbose:bool=Falseuse_original_query:bool=False"""Use original query instead of the revised new query from LLM"""classConfig:allow_population_by_field_name=Truearbitrary_types_allowed=True@root_validator(pre=True)defvalidate_translator(cls,values:Dict)->Dict:"""Validate translator."""if"structured_query_translator"notinvalues:values["structured_query_translator"]=_get_builtin_translator(values["vectorstore"])returnvalues@propertydefllm_chain(self)->Runnable:"""llm_chain is legacy name kept for backwards compatibility."""returnself.query_constructordef_prepare_query(self,query:str,structured_query:StructuredQuery)->Tuple[str,Dict[str,Any]]:new_query,new_kwargs=self.structured_query_translator.visit_structured_query(structured_query)ifstructured_query.limitisnotNone:new_kwargs["k"]=structured_query.limitifself.use_original_query:new_query=querysearch_kwargs={**self.search_kwargs,**new_kwargs}returnnew_query,search_kwargsdef_get_docs_with_query(self,query:str,search_kwargs:Dict[str,Any])->List[Document]:docs=self.vectorstore.search(query,self.search_type,**search_kwargs)returndocsasyncdef_aget_docs_with_query(self,query:str,search_kwargs:Dict[str,Any])->List[Document]:docs=awaitself.vectorstore.asearch(query,self.search_type,**search_kwargs)returndocsdef_get_relevant_documents(self,query:str,*,run_manager:CallbackManagerForRetrieverRun)->List[Document]:"""Get documents relevant for a query. Args: query: string to find relevant documents for Returns: List of relevant documents """structured_query=self.query_constructor.invoke({"query":query},config={"callbacks":run_manager.get_child()})ifself.verbose:logger.info(f"Generated Query: {structured_query}")new_query,search_kwargs=self._prepare_query(query,structured_query)docs=self._get_docs_with_query(new_query,search_kwargs)returndocsasyncdef_aget_relevant_documents(self,query:str,*,run_manager:AsyncCallbackManagerForRetrieverRun)->List[Document]:"""Get documents relevant for a query. Args: query: string to find relevant documents for Returns: List of relevant documents """structured_query=awaitself.query_constructor.ainvoke({"query":query},config={"callbacks":run_manager.get_child()})ifself.verbose:logger.info(f"Generated Query: {structured_query}")new_query,search_kwargs=self._prepare_query(query,structured_query)docs=awaitself._aget_docs_with_query(new_query,search_kwargs)returndocs