§
    šŠtj²  ã                   óÄ   — 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dS )é    )Ú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dS )Ú
SearchTypez-Enumerator of the types of search to perform.Ú
similarityÚmmrN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © ó    úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/retrievers/docarray.pyr   r      s   € € € € € Ø7Ð7à€JØ
€C€C€Cr   r   c            
       ó~  — 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dS )Ú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                ó:  — t          j        | j                             |¦  «        ¦  «        }| j        t
          j        k    r|                      |¦  «        }nC| j        t
          j        k    r|  	                    |¦  «        }nt          d| j        › d�¦  «        ‚|S )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˜Tœ_×8Ò8¸Ñ?Ô?Ñ@Ô@ˆ	àÔ�zÔ4Ò4Ð4Ø×-Ò-¨iÑ8Ô8ˆGˆGØÔ¥¤Ò/Ð/Ø×&Ò& yÑ1Ô1ˆGˆGåð8˜tÔ/ð 8ð 8ð 8ñô ð ð
 ˆr   r1   c                 ó$  — ddl m}m} i }| j        }t	          | j        |¦  «        r| j        |d<   d}n*t	          | j        |¦  «        r| j        |d<   n
| j        |d<   | j        r‰ | j                             ¦   «                              ||¬¦  «        j	        di |¤Ž 
                    |¬¦  «        }| j                             |¦  «        }t          |d	¦  «        r|j        }|d
|…         }n"| 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   sZ  € ð 	JÐIÐIÐIÐIÐIÐIÐIàˆØÔ(ˆÝ�d”jÐ"7Ñ8Ô8ð 	7Ø*.¬,ˆK˜Ñ'ØˆLˆLÝ˜œ
 OÑ4Ô4ð 	7Ø#'¤<ˆK˜Ñ Ð à*.¬,ˆK˜Ñ'àŒ<ð 	ð�”
×&Ò&Ñ(Ô(ß’Ø#°,ð ñ ô ô ð	'ð 'ð &ð	'ð '÷
 ’˜U�Ñ#Ô#ð ð ”:×+Ò+¨EÑ2Ô2ˆDÝ�t˜[Ñ)Ô)ð &Ø”~�Ø˜˜˜”<ˆDˆDà”:—?’?Ø¨lÀ%ð #ñ ô äð ð ˆr   c                 ó\   ‡ — ‰                       |‰ j        ¬¦  «        }ˆ fd„|D ¦   «         }|S )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#   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   ©Ú_docarray_to_langchain_doc©Ú.0Údocr0   s     €r   ú
<listcomp>z8DocArrayRetriever._similarity_search.<locals>.<listcomp>Š   s'   ø€ ÐHÐHÐH¸C�4×2Ò2°3Ñ7Ô7ÐHÐHÐHr   )rF   r#   )r0   r1   rE   r2   s   `   r   r-   z$DocArrayRetriever._similarity_search   s:   ø€ ð �|Š| i°t´zˆ|ÑBÔBˆØHÐHÐHÐHÀ4ÐHÑHÔHˆØˆr   c                 óœ   ‡ ‡— ‰                       |d¬¦  «        Št          |ˆ fd„‰D ¦   «         ‰ j        ¬¦  «        }ˆˆ fd„|D ¦   «         }|S )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   c                 ó~   •— g | ]9}t          |t          ¦  «        r|‰j                 nt          |‰j        ¦  «        ‘Œ:S r   )r=   Údictr   ÚgetattrrL   s     €r   rO   z1DocArrayRetriever._mmr_search.<locals>.<listcomp>›   sW   ø€ ð ð ð ð õ ˜c¥4Ñ(Ô(ð5��DÔ%Ô&Ð&å˜S $Ô"3Ñ4Ô4ðð ð r   )Úkc                 óF   •— g | ]}‰                      ‰|         ¦  «        ‘ŒS r   rJ   )rM   ÚidxrE   r0   s     €€r   rO   z1DocArrayRetriever._mmr_search.<locals>.<listcomp>£   s+   ø€ ÐVÐVÐVÀ#�4×2Ò2°4¸´9Ñ=Ô=ÐVÐVÐVr   )rF   r   r#   )r0   r1   Úmmr_selectedr2   rE   s   `   @r   r.   zDocArrayRetriever._mmr_search�   s…   øø€ ð �|Š| i°rˆ|Ñ:Ô:ˆå1Øðð ð ð ð  ð	ñ ô ð Œjð	
ñ 	
ô 	
ˆð WÐVÐVÐVÐVÈÐVÑVÔVˆØˆr   rN   c                 ó   — t          |t          ¦  «        r|                     ¦   «         nt          |¦  «        }| j        |vrt          d| j        › d�¦  «        ‚t          t          |t          ¦  «        r|| j                 nt          || j        ¦  «        ¬¦  «        }|D ]l}t          |t          ¦  «        r||         nt          ||¦  «        }t          |t          t          t          t          f¦  «        r|| j        k    r
||j        |<   Œm|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=   rS   Úkeysr   r    r/   r
   rT   ÚstrÚintÚfloatÚboolÚmetadata)r0   rN   ÚfieldsÚlc_docÚnameÚvalues         r   rK   z,DocArrayRetriever._docarray_to_langchain_doc¦   s  € õ,  *¨#­tÑ4Ô4ÐI�—’‘”�½*ÀS¹/¼/ˆàÔ VÐ+Ð+ÝØVÀÔASÐVÐVÐVñô ð õ å˜#�tÑ$Ô$ð2˜˜TÔ/Ô0Ð0å˜˜dÔ0Ñ1Ô1ð
ñ 
ô 
ˆð ð 	.ð 	.ˆDÝ!+¨CµÑ!6Ô!6ÐN�C˜”I�I½GÀCÈÑ<NÔ<NˆEå˜5¥3­­UµDÐ"9Ñ:Ô:ð.à˜DÔ.Ò.Ð.à(-�” Ñ%øàˆr   )r   r   r   r   r   r   Ú__annotations__r   r]   r   r   r!   r#   r^   r$   r   r   Úmodel_configr	   r   r
   r3   r*   Úndarrayr   r   rF   r-   r.   rK   r   r   r   r   r      s¡  € € € € € € ðð ð$ €Eˆ3ÐÐÑØÐÐÑØÐÐÑØÐÐÑØ(Ô3€K�Ð3Ð3Ñ3Ø€Eˆ3€N€N�NØ!€GˆX�cŒ]Ð!Ð!Ñ!à�:Ø $ðñ ô €Lðàðð 4ð	ð
 
ˆhŒðð ð ð ð8,Øœð,Ø,/ð,à	ˆe�D˜˜c˜”N CÐ'Ô(Ô	)ð,ð ,ð ,ð ,ð\¨B¬Jð ¸4À¼>ð ð ð ð ð R¤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   r]   r   r   r   r   r   ú<module>rs      s5  ðØ Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð Ø CÐ CÐ CÐ CÐ CÐ CØ -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø Ð Ð Ð Ð Ð à MÐ MÐ MÐ MÐ MÐ Mðð ð ð ð ��dñ ô ð ðzð zð zð zð z˜ñ zô zð zð zð zr   