§
    ™Štjr,  ã                   óP  — d Z ddlZddlmZ ddlmZmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZmZ ddlm Z  ddl!m"Z"  ed¦  «        Z# ede¬¦  «        Z$dee#         dee#ge$f         dee#         fd„Z% G d„ de¦  «        Z&dS )z„Ensemble Retriever.

Ensemble retriever that ensemble the results of
multiple retrievers by using weighted  Reciprocal Rank Fusion.
é    N)Údefaultdict)ÚCallableÚHashableÚIterableÚIterator)Úchain)ÚAnyÚTypeVarÚcast)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚDocument)ÚBaseRetrieverÚRetrieverLike)ÚRunnableConfig)Úensure_configÚpatch_config)ÚConfigurableFieldSpecÚget_unique_config_specs)Úmodel_validator)ÚoverrideÚTÚH)ÚboundÚiterableÚkeyÚreturnc              #   ó€   K  — t          ¦   «         }| D ]*} ||¦  «        x}|vr|                     |¦  «         |V — Œ+dS )a  Yield unique elements of an iterable based on a key function.

    Args:
        iterable: The iterable to filter.
        key: A function that returns a hashable key for each element.

    Yields:
        Unique elements of the iterable based on the key function.
    N)ÚsetÚadd)r   r   ÚseenÚeÚks        úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/retrievers/ensemble.pyÚunique_by_keyr%   $   sZ   è è € õ ‰5Œ5€DØð ð ˆØ��Q‘”ˆKˆA Ð$Ð$Ø�HŠH�Q‰KŒKˆKØˆGˆGˆGøðð ó    c                   ó.  — e Zd ZU dZee         ed<   ee         ed<   dZe	ed<   dZ
edz  ed<   edee         fd	„¦   «         Z ed
¬¦  «        edeeef         defd„¦   «         ¦   «         Ze	 ddededz  dedee         fd„¦   «         Ze	 ddededz  dedee         fd„¦   «         Zdededee         fd„Zdededee         fd„Zddœdedededz  dee         fd„Zddœdedededz  dee         fd„Zdeee                  dee         fd„ZdS )ÚEnsembleRetrieveraJ  Retriever that ensembles the multiple retrievers.

    It uses a rank fusion.

    Args:
        retrievers: A list of retrievers to ensemble.
        weights: A list of weights corresponding to the retrievers. Defaults to equal
            weighting for all retrievers.
        c: A constant added to the rank, controlling the balance between the importance
            of high-ranked items and the consideration given to lower-ranked items.
        id_key: The key in the document's metadata used to determine unique documents.
            If not specified, page_content is used.
    Ú
retrieversÚweightsé<   ÚcNÚid_keyr   c                 ó>   — t          d„ | j        D ¦   «         ¦  «        S )z+List configurable fields for this runnable.c              3   ó.   K  — | ]}|j         D ]}|V — ŒŒd S ©N)Úconfig_specs)Ú.0Ú	retrieverÚspecs      r$   ú	<genexpr>z1EnsembleRetriever.config_specs.<locals>.<genexpr>L   sJ   è è € ð '
ð '
Ø¸iÔ>Tð'
ð '
Ø6:ˆDð'
ð '
ð '
ð '
ð '
ð '
ð '
r&   )r   r)   )Úselfs    r$   r1   zEnsembleRetriever.config_specsI   s4   € õ 'ð '
ð '
Ø"&¤/ð'
ñ '
ô '
ñ 
ô 
ð 	
r&   Úbefore)ÚmodeÚvaluesc                 ó‚  — |                      d¦  «        }|s#t          |d         ¦  «        }d|z  g|z  |d<   |S |d         }t          |¦  «        t          |¦  «        k    r2dt          |¦  «        › dt          |¦  «        › d�}t          |¦  «        ‚t          d„ |D ¦   «         ¦  «        sd}t          |¦  «        ‚|S )	Nr*   r)   é   z7Length of weights must match number of retrievers (got z weights for z retrievers).c              3   ó"   K  — | ]
}|d k    V — ŒdS )r   N© )r2   Úws     r$   r5   z1EnsembleRetriever._set_weights.<locals>.<genexpr>b   s&   è è € Ð*Ð*˜Q�1�q’5Ð*Ð*Ð*Ð*Ð*Ð*r&   z7At least one ensemble weight must be greater than zero.)ÚgetÚlenÚ
ValueErrorÚany)Úclsr9   r*   Ún_retrieversr)   Úmsgs         r$   Ú_set_weightszEnsembleRetriever._set_weightsP   sê   € ð —*’*˜YÑ'Ô'ˆàð 	Ý˜v lÔ3Ñ4Ô4ˆLØ!" \Ñ!1Ð 2°\Ñ AˆF�9ÑØˆMà˜LÔ)ˆ
Ýˆw‰<Œ<�3˜z™?œ?Ò*Ð*ðRÝ˜G™œðRð RÝ36°z±?´?ðRð Rð Rð õ ˜S‘/”/Ð!åÐ*Ð* 'Ð*Ñ*Ô*Ñ*Ô*ð 	"ØKˆCÝ˜S‘/”/Ð!àˆr&   ÚinputÚconfigÚkwargsc                 ó(  — ddl m} t          |¦  «        }|                     |                     d¦  «        d |                     dd¦  «        |                     dg ¦  «        | j        |                     di ¦  «        | j        ¬¦  «        } |j        d |fd	|                     d
¦  «        p|                      ¦   «         i|¤Ž}	 |  	                    |||¬¦  «        } |j
        |fi |¤Ž |S # t          $ r}|                     |¦  «         ‚ d }~ww xY w)Nr   )ÚCallbackManagerÚ	callbacksÚverboseFÚtagsÚmetadata©rM   Úinheritable_tagsÚ
local_tagsÚinheritable_metadataÚlocal_metadataÚnameÚrun_name©Úrun_managerrH   )Úlangchain_core.callbacksrK   r   Ú	configurer?   rN   rO   Úon_retriever_startÚget_nameÚrank_fusionÚon_retriever_endÚ	ExceptionÚon_retriever_error)	r6   rG   rH   rI   rK   Úcallback_managerrX   Úresultr"   s	            r$   ÚinvokezEnsembleRetriever.invokeh   sc  € ð 	=Ð<Ð<Ð<Ð<Ð<å˜vÑ&Ô&ˆØ*×4Ò4Ø�JŠJ�{Ñ#Ô#ØØ—J’J˜y¨%Ñ0Ô0Ø#ŸZšZ¨°Ñ3Ô3Ø”yØ!'§¢¨J¸Ñ!;Ô!;Øœ=ð 5ñ 
ô 
Ðð :Ð&Ô9ØØð
ð 
ð —’˜JÑ'Ô'Ð:¨4¯=ª=©?¬?ð
ð ð	
ð 
ˆð
	Ø×%Ò% e¸ÈVÐ%ÑTÔTˆFð
 )ˆKÔ(Øðð àðð ð ð ˆMøõ ð 	ð 	ð 	Ø×*Ò*¨1Ñ-Ô-Ð-Øøøøøð	øøøs   ÃC, Ã,
DÃ6DÄDc              ‹   ó\  K  — ddl m} t          |¦  «        }|                     |                     d¦  «        d |                     dd¦  «        |                     dg ¦  «        | j        |                     di ¦  «        | j        ¬¦  «        } |j        d |fd	|                     d
¦  «        p|                      ¦   «         i|¤Žƒ d {V —†}	 |  	                    |||¬¦  «        ƒ d {V —†} |j
        |fi |¤Žƒ d {V —† |S # t          $ r!}|                     |¦  «        ƒ d {V —† ‚ d }~ww xY w)Nr   )ÚAsyncCallbackManagerrL   rM   FrN   rO   rP   rU   rV   rW   )rY   re   r   rZ   r?   rN   rO   r[   r\   Úarank_fusionr^   r_   r`   )	r6   rG   rH   rI   re   ra   rX   rb   r"   s	            r$   ÚainvokezEnsembleRetriever.ainvoke�   sÞ  è è € ð 	BÐAÐAÐAÐAÐAå˜vÑ&Ô&ˆØ/×9Ò9Ø�JŠJ�{Ñ#Ô#ØØ—J’J˜y¨%Ñ0Ô0Ø#ŸZšZ¨°Ñ3Ô3Ø”yØ!'§¢¨J¸Ñ!;Ô!;Øœ=ð :ñ 
ô 
Ðð @Ð,Ô?ØØð
ð 
ð —’˜JÑ'Ô'Ð:¨4¯=ª=©?¬?ð
ð ð	
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð	Ø×,Ò,ØØ'Øð -ñ ô ð ð ð ð ð ð ˆFð /�+Ô.Øðð àðð ð ð ð ð ð ð ð ð ˆMøõ ð 	ð 	ð 	Ø×0Ò0°Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Øøøøøð	øøøs   ÃD  Ä 
D+Ä
D&Ä&D+ÚqueryrX   c                ó.   — |                       ||¦  «        S )zãGet the relevant documents for a given query.

        Args:
            query: The query to search for.
            run_manager: The callback handler to use.

        Returns:
            A list of reranked documents.
        )r]   ©r6   rh   rX   s      r$   Ú_get_relevant_documentsz)EnsembleRetriever._get_relevant_documents¶   s   € ð  ×Ò  {Ñ3Ô3Ð3r&   c             ƒ   ó>   K  — |                       ||¦  «        ƒ d{V —†S )zòAsynchronously get the relevant documents for a given query.

        Args:
            query: The query to search for.
            run_manager: The callback handler to use.

        Returns:
            A list of reranked documents.
        N)rf   rj   s      r$   Ú_aget_relevant_documentsz*EnsembleRetriever._aget_relevant_documentsÈ   s0   è è € ð  ×&Ò& u¨kÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:r&   )rH   c                óÞ   ‡‡‡— ˆˆˆfd„t          | j        ¦  «        D ¦   «         }t          t          |¦  «        ¦  «        D ]}d„ ||         D ¦   «         ||<   Œ|                      |¦  «        S )ak  Rank fusion.

        Retrieve the results of the retrievers and use rank_fusion_func to get
        the final result.

        Args:
            query: The query to search for.
            run_manager: The callback handler to use.
            config: Optional configuration for the retrievers.

        Returns:
            A list of reranked documents.
        c                 ó”   •— g | ]D\  }}|                      ‰t          ‰‰                     d |dz   › �¬¦  «        ¬¦  «        ¦  «        ‘ŒES ©Ú
retriever_r;   )Útag)rL   )rc   r   Ú	get_child©r2   Úir3   rH   rh   rX   s      €€€r$   ú
<listcomp>z1EnsembleRetriever.rank_fusion.<locals>.<listcomp>ï   sx   ø€ ð 	
ð 	
ð 	
ñ ��9ð ×ÒØÝØØ)×3Ò3Ð8LÀQÈÁUÐ8LÐ8LÐ3ÑMÔMðñ ô ñô ð	
ð 	
ð 	
r&   c                 óx   — g | ]7}t          |t          ¦  «        rt          t          d |¦  «        ¬¦  «        n|‘Œ8S )Ústr©Úpage_content)Ú
isinstancerx   r   r   ©r2   Údocs     r$   rv   z1EnsembleRetriever.rank_fusion.<locals>.<listcomp>ü   sS   € ð !ð !ð !àõ <FÀcÍ3Ñ;OÔ;OÐX•¥d¨5°#Ñ&6Ô&6Ð7Ñ7Ô7Ð7ÐUXð!ð !ð !r&   )Ú	enumerater)   Úranger@   Úweighted_reciprocal_rank©r6   rh   rX   rH   Úretriever_docsru   s    ```  r$   r]   zEnsembleRetriever.rank_fusionÚ   s¥   øøø€ ð*	
ð 	
ð 	
ð 	
ð 	
ð 	
õ !*¨$¬/Ñ :Ô :ð	
ñ 	
ô 	
ˆõ •s˜>Ñ*Ô*Ñ+Ô+ð 	ð 	ˆAð!ð !à)¨!Ô,ð!ñ !ô !ˆN˜1ÑÐð ×,Ò,¨^Ñ<Ô<Ð<r&   c             ƒ   ó  ‡‡‡K  — t          j        ˆˆˆfd„t          | j        ¦  «        D ¦   «         Ž ƒ d{V —†}t	          t          |¦  «        ¦  «        D ]}d„ ||         D ¦   «         ||<   Œ|                      |¦  «        S )az  Rank fusion.

        Asynchronously retrieve the results of the retrievers
        and use rank_fusion_func to get the final result.

        Args:
            query: The query to search for.
            run_manager: The callback handler to use.
            config: Optional configuration for the retrievers.

        Returns:
            A list of reranked documents.
        c                 ó”   •— g | ]D\  }}|                      ‰t          ‰‰                     d |dz   › �¬¦  «        ¬¦  «        ¦  «        ‘ŒES rp   )rg   r   rs   rt   s      €€€r$   rv   z2EnsembleRetriever.arank_fusion.<locals>.<listcomp>  sx   ø€ ð 	ð 	ð 	ñ !�A�yð ×!Ò!ØÝ ØØ"-×"7Ò"7Ð<PÈÈQÉÐ<PÐ<PÐ"7Ñ"QÔ"Qðñ ô ñô ð	ð 	ð 	r&   Nc                 ó\   — g | ])}t          |t          ¦  «        st          |¬ ¦  «        n|‘Œ*S )ry   )r{   r   r|   s     r$   rv   z2EnsembleRetriever.arank_fusion.<locals>.<listcomp>(  sH   € ð !ð !ð !àõ 3=¸SÅ(Ñ2KÔ2KÐT• cÐ*Ñ*Ô*Ð*ÐQTð!ð !ð !r&   )ÚasyncioÚgatherr~   r)   r   r@   r€   r�   s    ```  r$   rf   zEnsembleRetriever.arank_fusion  sÓ   øøøè è € õ*  'œ~ð	ð 	ð 	ð 	ð 	ð 	õ %.¨d¬oÑ$>Ô$>ð	ñ 	ô 	ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ •s˜>Ñ*Ô*Ñ+Ô+ð 	ð 	ˆAð!ð !à)¨!Ô,ð!ñ !ô !ˆN˜1ÑÐð ×,Ò,¨^Ñ<Ô<Ð<r&   Ú	doc_listsc                 óê  ‡ ‡— t          |¦  «        t          ‰ j        ¦  «        k    rd}t          |¦  «        ‚t          t          ¦  «        Št          |‰ j        d¬¦  «        D ]U\  }}t          |d¬¦  «        D ]>\  }}‰‰ j        €|j        n|j	        ‰ j                 xx         ||‰ j
        z   z  z  cc<   Œ?ŒVt          j        |¦  «        }t          t          |ˆ fd„¦  «        dˆˆ fd	„¬
¦  «        S )a¬  Perform weighted Reciprocal Rank Fusion on multiple rank lists.

        You can find more details about RRF here:
        https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf.

        Args:
            doc_lists: A list of rank lists, where each rank list contains unique items.

        Returns:
            The final aggregated list of items sorted by their weighted RRF
            scores in descending order.
        z<Number of rank lists must be equal to the number of weights.F)Ústrictr;   )ÚstartNc                 óD   •— ‰j         €| j        n| j        ‰j                  S r0   ©r-   rz   rO   )r}   r6   s    €r$   ú<lambda>z<EnsembleRetriever.weighted_reciprocal_rank.<locals>.<lambda>V  s'   ø€ à”{Ð*ð Ô$Ð$àœ d¤kÔ2ð r&   Tc                 óP   •— ‰‰j         €| j        n| j        ‰j                           S r0   r�   )r}   Ú	rrf_scorer6   s    €€r$   rŽ   z<EnsembleRetriever.weighted_reciprocal_rank.<locals>.<lambda>]  s'   ø€ ˜IØ$(¤KÐ$7�Ô Ð ¸S¼\È$Ì+Ô=Vô€ r&   )Úreverser   )r@   r*   rA   r   ÚfloatÚzipr~   r-   rz   rO   r,   r   Úfrom_iterableÚsortedr%   )	r6   rˆ   rE   Údoc_listÚweightÚrankr}   Úall_docsr�   s	   `       @r$   r€   z*EnsembleRetriever.weighted_reciprocal_rank0  sR  øø€ õ  ˆy‰>Œ>�S ¤Ñ.Ô.Ò.Ð.ØPˆCÝ˜S‘/”/Ð!õ '2µ%Ñ&8Ô&8ˆ	Ý # I¨t¬|ÀEÐ JÑ JÔ Jð 	.ð 	.ÑˆH�fÝ& x°qÐ9Ñ9Ô9ð .ð .‘	��cØð  œ;Ð.ð Ô(Ð(à œ\¨$¬+Ô6ð	ð ô ð ˜t d¤f™}Ñ-ñ.ð ð ñ ð ð.õ Ô& yÑ1Ô1ˆÝÝØðð ð ð ñô ð ðð ð ð ð ð
ñ 
ô 
ð 	
r&   r0   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úlistr   Ú__annotations__r’   r,   Úintr-   rx   Úpropertyr   r1   r   ÚclassmethodÚdictr	   rF   r   r   r   rc   rg   r   rk   r   rm   r]   rf   r€   r=   r&   r$   r(   r(   5   sÒ  € € € € € € ðð ð �]Ô#Ð#Ð#Ñ#Ø�%Œ[ÐÐÑØ€A€s€K€K�KØ€FˆC�$‰JÐÐÑàð
˜dÐ#8Ô9ð 
ð 
ð 
ñ „Xð
ð €_˜(Ð#Ñ#Ô#Øð $ s¨C x¤.ð °Sð ð ð ñ „[ñ $Ô#ðð, ð )-ð"ð "àð"ð  Ñ%ð"ð ð	"ð
 
ˆhŒð"ð "ð "ñ „Xð"ðH ð )-ð&ð &àð&ð  Ñ%ð&ð ð	&ð
 
ˆhŒð&ð &ð &ñ „Xð&ðP4àð4ð 4ð	4ð
 
ˆhŒð4ð 4ð 4ð 4ð$;àð;ð 9ð	;ð
 
ˆhŒð;ð ;ð ;ð ;ð. )-ð(=ð (=ð (=àð(=ð 4ð(=ð
  Ñ%ð(=ð 
ˆhŒð(=ð (=ð (=ð (=ð^ )-ð*=ð *=ð *=àð*=ð 9ð*=ð
  Ñ%ð*=ð 
ˆhŒð*=ð *=ð *=ð *=ðX0
à˜˜XœÔ'ð0
ð 
ˆhŒð0
ð 0
ð 0
ð 0
ð 0
ð 0
r&   r(   )'r�   r†   Úcollectionsr   Úcollections.abcr   r   r   r   Ú	itertoolsr   Útypingr	   r
   r   rY   r   r   Úlangchain_core.documentsr   Úlangchain_core.retrieversr   r   Úlangchain_core.runnablesr   Úlangchain_core.runnables.configr   r   Úlangchain_core.runnables.utilsr   r   Úpydanticr   Útyping_extensionsr   r   r   r%   r(   r=   r&   r$   ú<module>r¯      sû  ððð ð €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gðð ð ð ð ð ð ð ð %Ð $Ð $Ð $Ð $Ð $Ø &Ð &Ð &Ð &Ð &Ð &à€GˆC�L„L€Ø€GˆC�xÐ Ñ Ô €ð˜H QœKð ¨h¸°s¸A°vÔ.>ð À8ÈAÄ;ð ð ð ð ð"k
ð k
ð k
ð k
ð k
˜ñ k
ô k
ð k
ð k
ð k
r&   