Ë
    µŒj²  ã                   ó¶   — d dl mZ d dl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 d d	lmZ d d
lmZ  G d„ dee«      Z G d„ de«      Zy)é    )ÚEnum)ÚAnyÚDictÚListÚOptionalÚUnionN)ÚCallbackManagerForRetrieverRun)ÚDocument)Ú
Embeddings)ÚBaseRetriever)Ú
get_fields)Ú
ConfigDict)Úmaximal_marginal_relevancec                   ó   — e Zd ZdZdZdZy)Ú
SearchTypez-Enumerator of the types of search to perform.Ú
similarityÚmmrN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © ó    úq/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/retrievers/docarray.pyr   r      s   „ Ù7à€JØ
�Cr   r   c            
       óh  — e Zd ZU dZdZeed<   eed<   eed<   eed<   e	j                  Ze	ed<   dZeed	<   dZee   ed
<    ed¬«      Zdededee   fd„Zdej.                  d	edeeeeef   ef      fd„Zdej.                  dee   fd„Zdej.                  dee   fd„Zdeeeef   ef   defd„Zy)ÚDocArrayRetrievera  `DocArray Document Indices` retriever.

    Currently, it supports 5 backends:
    InMemoryExactNNIndex, HnswDocumentIndex, QdrantDocumentIndex,
    ElasticDocIndex, and WeaviateDocumentIndex.

    Args:
        index: One of the above-mentioned index instances
        embeddings: Embedding model to represent text as vectors
        search_field: Field to consider for searching in the documents.
            Should be an embedding/vector/tensor.
        content_field: Field that represents the main content in your document schema.
            Will be used as a `page_content`. Everything else will go into `metadata`.
        search_type: Type of search to perform (similarity / mmr)
        filters: Filters applied for document retrieval.
        top_k: Number of documents to return
    NÚindexÚ
embeddingsÚsearch_fieldÚcontent_fieldÚsearch_typeé   Útop_kÚfiltersT)Úarbitrary_types_allowedÚqueryÚrun_managerÚreturnc                óP  — t        j                  | j                  j                  |«      «      }| j                  t
        j                  k(  r| j                  |«      }|S | j                  t
        j                  k(  r| j                  |«      }|S t        d| j                  › d�«      ‚)z­Get documents relevant for a query.

        Args:
            query: string to find relevant documents for

        Returns:
            List of relevant documents
        zSearch type z5 does not exist. Choose either 'similarity' or 'mmr'.)ÚnpÚarrayr   Úembed_queryr!   r   r   Ú_similarity_searchr   Ú_mmr_searchÚ
ValueError)Úselfr&   r'   Ú	query_embÚresultss        r   Ú_get_relevant_documentsz)DocArrayRetriever._get_relevant_documents5   sž   € ô —H‘H˜TŸ_™_×8Ñ8¸Ó?Ó@ˆ	à×Ñœz×4Ñ4Ò4Ø×-Ñ-¨iÓ8ˆGð ˆð ×Ñ¤§¡Ò/Ø×&Ñ& yÓ1ˆGð ˆô Ø˜t×/Ñ/Ð0ð 17ð 8óð r   r1   c                 ó^  — ddl m}m} i }| j                  }t	        | j
                  |«      r| j                  |d<   d}n5t	        | j
                  |«      r| j                  |d<   n| j                  |d<   | j                  r… | j
                  j                  «       j                  ||¬«      j                  di |¤Žj                  |¬«      }| j
                  j                  |«      }t        |d	«      r|j                  }|d
| }|S | j
                  j                  |||¬«      j                  }|S )a  
        Perform a search using the query embedding and return top_k documents.

        Args:
            query_emb: Query represented as an embedding
            top_k: Number of documents to return

        Returns:
            A list of top_k documents matching the query
        r   )ÚElasticDocIndexÚWeaviateDocumentIndexÚwhere_filterÚ r&   Úfilter_query)r&   r   )ÚlimitÚ	documentsN)r&   r   r:   r   )Údocarray.indexr5   r6   r   Ú
isinstancer   r$   Úbuild_queryÚfindÚfilterÚbuildÚexecute_queryÚhasattrr;   )	r0   r1   r#   r5   r6   Úfilter_argsr   r&   Údocss	            r   Ú_searchzDocArrayRetriever._searchQ   s&  € ÷ 	JàˆØ×(Ñ(ˆÜ�d—j‘jÐ"7Ô8Ø*.¯,©,ˆK˜Ñ'Ø‰LÜ˜Ÿ
™
 OÔ4Ø#'§<¡<ˆK˜Ò à*.¯,©,ˆK˜Ñ'à�<Š<ð�—
‘
×&Ñ&Ó(ß‘Ø#°,ð ó ÷ ‘ñ	'ð &ñ	'÷
 ‘˜U�Ó#ð ð —:‘:×+Ñ+¨EÓ2ˆDÜ�t˜[Ô)Ø—~‘~�Ø˜˜�<ˆDð
 ˆð —:‘:—?‘?Ø¨lÀ%ð #ó ç‰ið ð ˆr   c                 ó†   — | j                  || j                  ¬«      }|D �cg c]  }| j                  |«      ‘Œ }}|S c c}w )zÂ
        Perform a similarity search.

        Args:
            query_emb: Query represented as an embedding

        Returns:
            A list of documents most similar to the query
        ©r1   r#   )rF   r#   Ú_docarray_to_langchain_doc)r0   r1   rE   Údocr2   s        r   r-   z$DocArrayRetriever._similarity_search   sD   € ð �|‰| i°t·z±zˆ|ÓBˆÙCGÓHÁ4¸C�4×2Ñ2°3Õ7À4ˆÐHØˆùò Is   ¢>c           
      ó4  — | j                  |d¬«      }t        ||D �cg c]7  }t        |t        «      r|| j                     nt        || j                  «      ‘Œ9 c}| j                  ¬«      }|D �cg c]  }| j                  ||   «      ‘Œ }}|S c c}w c c}w )zÛ
        Perform a maximal marginal relevance (mmr) search.

        Args:
            query_emb: Query represented as an embedding

        Returns:
            A list of diverse documents related to the query
        é   rH   )Úk)rF   r   r=   Údictr   Úgetattrr#   rI   )r0   r1   rE   rJ   Úmmr_selectedÚidxr2   s          r   r.   zDocArrayRetriever._mmr_search�   s°   € ð �|‰| i°rˆ|Ó:ˆä1Øñ
  ó	ñ  �Cô ˜c¤4Ô(ð �D×%Ñ%Ò&ä˜S $×"3Ñ"3Ó4ñ5ð  ñ	ð �j‰jô	
ˆñ JVÓVÉÀ#�4×2Ñ2°4¸±9Õ=ÈˆÐVØˆùòùò Ws   ž<B
Á1BrJ   c                 óø  — t        |t        «      r|j                  «       n
t        |«      }| j                  |vrt        d| j                  › d�«      ‚t        t        |t        «      r|| j                     nt        || j                  «      ¬«      }|D ]c  }t        |t        «      r||   nt        ||«      }t        |t        t        t        t        f«      sŒE|| j                  k7  sŒU||j                  |<   Œe |S )a;  
        Convert a DocArray document (which also might be a dict)
        to a langchain document format.

        DocArray document can contain arbitrary fields, so the mapping is done
        in the following way:

        page_content <-> content_field
        metadata <-> all other fields excluding
            tensors and embeddings (so float, int, string)

        Args:
            doc: DocArray document

        Returns:
            Document in langchain format

        Raises:
            ValueError: If the document doesn't contain the content field
        z.Document does not contain the content field - Ú.)Úpage_content)r=   rN   Úkeysr   r    r/   r
   rO   ÚstrÚintÚfloatÚboolÚmetadata)r0   rJ   ÚfieldsÚlc_docÚnameÚvalues         r   rI   z,DocArrayRetriever._docarray_to_langchain_doc¦   sà   € ô,  *¨#¬tÔ4�—‘”¼*ÀS»/ˆà×Ñ VÑ+ÜØ@À×ASÑASÐ@TÐTUÐVóð ô ä˜#œtÔ$ð ˜T×/Ñ/Ò0ä˜˜d×0Ñ0Ó1ô
ˆó ˆDÜ!+¨C´Ô!6�C˜’I¼GÀCÈÓ<NˆEä˜5¤3¬¬U´DÐ"9Õ:Ø˜D×.Ñ.Ó.à(-�—‘ Ò%ð ð ˆr   )r   r   r   r   r   r   Ú__annotations__r   rV   r   r   r!   r#   rW   r$   r   r   Úmodel_configr	   r   r
   r3   r*   Úndarrayr   r   rF   r-   r.   rI   r   r   r   r   r      s  … ñð$ €Eˆ3ÓØÓØÓØÓØ(×3Ñ3€K�Ó3Ø€Eˆ3ƒNØ!€GˆX�c‰]Ó!áØ $ô€Lðàðð 4ð	ð
 
ˆh‰óð8,ØŸ™ð,Ø,/ð,à	ˆe�D˜˜c˜‘N CÐ'Ñ(Ñ	)ó,ð\¨B¯J©Jð ¸4À¹>ó ð R§Z¡Zð °D¸±Nó ð2*¨e°D¸¸c¸±NÀCÐ4GÑ.Hð *ÈXô *r   r   )Úenumr   Útypingr   r   r   r   r   Únumpyr*   Úlangchain_core.callbacksr	   Úlangchain_core.documentsr
   Úlangchain_core.embeddingsr   Úlangchain_core.retrieversr   Úlangchain_core.utils.pydanticr   Úpydanticr   Ú&langchain_community.vectorstores.utilsr   rV   r   r   r   r   r   Ú<module>rl      sB   ðÝ ß 3Õ 3ã Ý CÝ -Ý 0Ý 3Ý 4Ý å Mô��dô ôz˜õ zr   