
    3fiX5                       d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ erd d	lmZ  ed
eeef         Z ej>                  e       Z!dZ" eddd       G d de             Z#y)    )annotationsN)TYPE_CHECKINGAnyCallableDict	GeneratorIterableListOptionalTupleTypeVarUnion)
deprecated)Document)
Embeddings)VectorStore)maximal_marginal_relevance)
CollectionMongoDBDocumentType)boundd   z0.0.25z1.0z*langchain_mongodb.MongoDBAtlasVectorSearch)sinceremovalalternative_importc                  f   e Zd ZdZddddd	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zdd	Ze	 	 	 	 	 	 	 	 	 	 dd
       Z		 d	 	 	 	 	 	 	 ddZ
ddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZe	 	 d 	 	 	 	 	 	 	 	 	 	 	 d!d       Zy)"MongoDBAtlasVectorSearcha  `MongoDB Atlas Vector Search` vector store.

    To use, you should have both:
    - the ``pymongo`` python package installed
    - a connection string associated with a MongoDB Atlas Cluster having deployed an
        Atlas Search index

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import MongoDBAtlasVectorSearch
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            from pymongo import MongoClient

            mongo_client = MongoClient("<YOUR-CONNECTION-STRING>")
            collection = mongo_client["<db_name>"]["<collection_name>"]
            embeddings = OpenAIEmbeddings()
            vectorstore = MongoDBAtlasVectorSearch(collection, embeddings)
    defaulttext	embeddingcosine)
index_nametext_keyembedding_keyrelevance_score_fnc               X    || _         || _        || _        || _        || _        || _        y)a  
        Args:
            collection: MongoDB collection to add the texts to.
            embedding: Text embedding model to use.
            text_key: MongoDB field that will contain the text for each
                document.
            embedding_key: MongoDB field that will contain the embedding for
                each document.
            index_name: Name of the Atlas Search index.
            relevance_score_fn: The similarity score used for the index.
            Currently supported: Euclidean, cosine, and dot product.
        N)_collection
_embedding_index_name	_text_key_embedding_key_relevance_score_fn)self
collectionr   r!   r"   r#   r$   s          l/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/mongodb_atlas.py__init__z!MongoDBAtlasVectorSearch.__init__>   s2    , &#%!+#5     c                    | j                   S N)r'   r,   s    r.   
embeddingsz#MongoDBAtlasVectorSearch.embeddings[   s    r0   c                    | j                   dk(  r| j                  S | j                   dk(  r| j                  S | j                   dk(  r| j                  S t	        d| j                          )N	euclidean
dotProductr    z!No relevance score function for $)r+   _euclidean_relevance_score_fn%_max_inner_product_relevance_score_fn_cosine_relevance_score_fnNotImplementedErrorr3   s    r.   _select_relevance_score_fnz3MongoDBAtlasVectorSearch._select_relevance_score_fn_   sn    ##{2555%%5===%%1222%3D4L4L3MN r0   c           	         	 ddl m} ddlm} ddlm}  || |d |d            	      }|j                  d
      \  }	}
||	   |
   } | ||fi |S # t        $ r t        d      w xY w)a  Construct a `MongoDB Atlas Vector Search` vector store
        from a MongoDB connection URI.

        Args:
            connection_string: A valid MongoDB connection URI.
            namespace: A valid MongoDB namespace (database and collection).
            embedding: The text embedding model to use for the vector store.

        Returns:
            A new MongoDBAtlasVectorSearch instance.

        r   )version)MongoClient)
DriverInfozGCould not import pymongo, please install it with `pip install pymongo`.	Langchain	langchain)namer>   )driver.)importlib.metadatar>   pymongor?   pymongo.driver_infor@   ImportErrorsplit)clsconnection_string	namespacer   kwargsr>   r?   r@   clientdb_namecollection_namer-   s               r.   from_connection_stringz/MongoDBAtlasVectorSearch.from_connection_stringk   s    (		2+6 *;8LM
 $-??3#7 G__5
:y3F33  	) 	s   A A'Nc                   |j                  dt              }|xs	 d |D        }g }g }g }t        t        ||            D ][  \  }	\  }
}|j	                  |
       |j	                  |       |	dz   |z  dk(  s7|j                  | j                  ||             g }g }] |r!|j                  | j                  ||             |S )a>  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.

        Returns:
            List of ids from adding the texts into the vectorstore.
        
batch_sizec              3      K   | ]  }i   y wr2    ).0_s     r.   	<genexpr>z5MongoDBAtlasVectorSearch.add_texts.<locals>.<genexpr>   s     :M!2:Ms      r   )getDEFAULT_INSERT_BATCH_SIZE	enumeratezipappendextend_insert_texts)r,   texts	metadatasrN   rT   
_metadatastexts_batchmetadatas_batch
result_idsir   metadatas               r.   	add_textsz"MongoDBAtlasVectorSearch.add_texts   s     ZZ.GH
-6-M:Mu:M

#,S
-C#D 	%Aht$""8,A#q(!!$"4"4[/"RS "$	% d00oNOr0   c           	        |sg S | j                   j                  |      }t        |||      D cg c]"  \  }}}| j                  || j                  |i|$ }}}}| j
                  j                  |      }|j                  S c c}}}w r2   )r'   embed_documentsr^   r)   r*   r&   insert_manyinserted_ids)	r,   rb   rc   r4   tmr   	to_insertinsert_results	            r.   ra   z&MongoDBAtlasVectorSearch._insert_texts   s    I__44U;
 $'ui#D
 
1i ^^Q 3 3YD!D
	 

 ((44Y?)))
s   'Bc                p   || j                   |dz  || j                  d}|r||d<   d|i}|ddddiiig}||j                  |       | j                  j	                  |      }g }	|D ]L  }
|
j                  | j                        }|
j                  d      }|	j                  t        ||
	      |f       N |	S )
N
   )queryVectorpathnumCandidateslimitindexfilterz$vectorSearchz$setscorez$metavectorSearchScore)page_contentri   )	r*   r(   r`   r&   	aggregatepopr)   r_   r   )r,   r   k
pre_filterpost_filter_pipelineparamsquerypipelinecursordocsresr   r{   s                r.   _similarity_search_with_scorez6MongoDBAtlasVectorSearch._similarity_search_with_score   s     %''V%%
 )F8 &) g)<=>?
  +OO01!!++H5 	LC774>>*DGGG$EKKtcBEJK	L r0   c                f    | j                   j                  |      }| j                  ||||      }|S )a  Return MongoDB documents most similar to the given query and their scores.

        Uses the vectorSearch operator available in MongoDB Atlas Search.
        For more: https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/

        Args:
            query: Text to look up documents similar to.
            k: (Optional) number of documents to return. Defaults to 4.
            pre_filter: (Optional) dictionary of argument(s) to prefilter document
                fields on.
            post_filter_pipeline: (Optional) Pipeline of MongoDB aggregation stages
                following the vectorSearch stage.

        Returns:
            List of documents most similar to the query and their scores.
        r   r   r   )r'   embed_queryr   )r,   r   r   r   r   r   r   s          r.   similarity_search_with_scorez5MongoDBAtlasVectorSearch.similarity_search_with_score   s@    . OO//6	11!!5	 2 
 r0   c                    |j                  d      }| j                  ||||      }|rd|v r|D ]  \  }}	|	|j                  d<    |D 
cg c]  \  }}
|	 c}
}S c c}
}w )a  Return MongoDB documents most similar to the given query.

        Uses the vectorSearch operator available in MongoDB Atlas Search.
        For more: https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-stage/

        Args:
            query: Text to look up documents similar to.
            k: (Optional) number of documents to return. Defaults to 4.
            pre_filter: (Optional) dictionary of argument(s) to prefilter document
                fields on.
            post_filter_pipeline: (Optional) Pipeline of MongoDB aggregation stages
                following the vectorSearch stage.

        Returns:
            List of documents most similar to the query and their scores.
        
additionalr   similarity_scorer{   )r[   r   ri   )r,   r   r   r   r   rN   r   docs_and_scoresdocr{   rX   s              r.   similarity_searchz*MongoDBAtlasVectorSearch.similarity_search   sy    0 ZZ-
;;!!5	 < 
 ,
:- .
U(-W%."12Q222s   Ac           	     >   | j                   j                  |      }| j                  ||||      }	t        t	        j
                  |      |	D 
cg c]  \  }
}|
j                  | j                       c}}
||      }|D cg c]
  }|	|   d    }}|S c c}}
w c c}w )a   Return documents selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: (Optional) number of documents to return. Defaults to 4.
            fetch_k: (Optional) number of documents to fetch before passing to MMR
                algorithm. Defaults to 20.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            pre_filter: (Optional) dictionary of argument(s) to prefilter on document
                fields.
            post_filter_pipeline: (Optional) pipeline of MongoDB aggregation stages
                following the vectorSearch stage.
        Returns:
            List of documents selected by maximal marginal relevance.
        r   )r   lambda_multr   )r'   r   r   r   nparrayri   r*   )r,   r   r   fetch_kr   r   r   rN   query_embeddingr   r   rX   mmr_doc_indexesrh   mmr_docss                  r.   max_marginal_relevance_searchz6MongoDBAtlasVectorSearch.max_marginal_relevance_search"  s    > //55e<11!!5	 2 
 5HH_%=AB63S\\$--.B#	
 )881DGAJ88 C 9s   #BBc                Z    |t        d       | ||fi |}|j                  ||       |S )a  Construct a `MongoDB Atlas Vector Search` vector store from raw documents.

        This is a user-friendly interface that:
            1. Embeds documents.
            2. Adds the documents to a provided MongoDB Atlas Vector Search index
                (Lucene)

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python
                from pymongo import MongoClient

                from langchain_community.vectorstores import MongoDBAtlasVectorSearch
                from langchain_community.embeddings import OpenAIEmbeddings

                mongo_client = MongoClient("<YOUR-CONNECTION-STRING>")
                collection = mongo_client["<db_name>"]["<collection_name>"]
                embeddings = OpenAIEmbeddings()
                vectorstore = MongoDBAtlasVectorSearch.from_texts(
                    texts,
                    embeddings,
                    metadatas=metadatas,
                    collection=collection
                )
        z*Must provide 'collection' named parameter.)rc   )
ValueErrorrj   )rK   rb   r   rc   r-   rN   vectorstores          r.   
from_textsz#MongoDBAtlasVectorSearch.from_textsQ  sA    F IJJ*i:6:ey9r0   )r-   zCollection[MongoDBDocumentType]r   r   r!   strr"   r   r#   r   r$   r   )returnr   )r   zCallable[[float], float])
rL   r   rM   r   r   r   rN   r   r   r   r2   )rb   zIterable[str]rc   zOptional[List[Dict[str, Any]]]rN   r   r   r
   )rb   	List[str]rc   zList[Dict[str, Any]]r   r
   )   NN)
r   zList[float]r   intr   Optional[Dict]r   Optional[List[Dict]]r   List[Tuple[Document, float]])
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   rN   r   r   List[Document])r      g      ?NN)r   r   r   r   r   r   r   floatr   r   r   r   rN   r   r   r   )NN)rb   r   r   r   rc   r   r-   z)Optional[Collection[MongoDBDocumentType]]rN   r   r   r   )__name__
__module____qualname____doc__r/   propertyr4   r<   classmethodrR   rj   ra   r   r   r   r   r   rV   r0   r.   r   r   $   so   2 $("*636 6
 6 6 6  6:  
 #4#4 #4 	#4
 #4 
"#4 #4P 59 2 	
 
>*  %)59  #	
 3 
&F %)59  #	
 3 
&F %)59#3#3 #3 #	#3
 3#3 #3 
#3P  %)59-- - 	-
 - #- 3- - 
-^ 
 +/@D&& & (	&
 >& & 
"& &r0   r   )$
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   r   r   r   numpyr   langchain_core._api.deprecationr   langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   pymongo.collectionr   r   r   	getLoggerr   loggerr\   r   rV   r0   r.   <module>r      s    "      6 - 0 3 M-34S>J 			8	$  
C
O{ O
Or0   