HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/langchain/retrievers/__pycache__/ensemble.cpython-310.pyc
o

���g~)�@sdZddlZddlmZddlmZddlmZddlm	Z	m
Z
mZmZm
Z
mZmZmZmZddlmZmZddlmZdd	lmZmZdd
lmZddlmZmZddlm Z m!Z!dd
l"m#Z#ed�Z$eded�Z%dee$de
e$ge%fde
e$fdd�Z&Gdd�de�Z'dS)zo
Ensemble retriever that ensemble the results of
multiple retrievers by using weighted  Reciprocal Rank Fusion
�N)�defaultdict)�Hashable)�chain)	�Any�Callable�Dict�Iterable�Iterator�List�Optional�TypeVar�cast)�#AsyncCallbackManagerForRetrieverRun�CallbackManagerForRetrieverRun)�Document)�
BaseRetriever�
RetrieverLike)�RunnableConfig)�
ensure_config�patch_config)�ConfigurableFieldSpec�get_unique_config_specs)�model_validator�T�H)�bound�iterable�key�returnccs6�t�}|D]}||�}|vr|�|�|VqdS)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)rr�seen�e�k�r$�H/usr/local/lib/python3.10/dist-packages/langchain/retrievers/ensemble.py�
unique_by_key(s�

��r&c
@sreZdZUdZeeed<eeed<dZe	ed<dZ
eeed<e
deefd	d
��Zedd�ed
eeefdefdd���Z	d%dedeededeefdd�Z	d%dedeededeefdd�Zdededeefdd�Zdededeefdd�Zdd�dededeedeefdd�Zdd�dededeedeefd d!�Zd"eeedeefd#d$�ZdS)&�EnsembleRetrieveraeRetriever 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.
            Default is 60.
        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_keyrcCstdd�|jD��S)z+List configurable fields for this runnable.css �|]}|jD]}|VqqdS�N)�config_specs)�.0�	retriever�specr$r$r%�	<genexpr>Qs���z1EnsembleRetriever.config_specs.<locals>.<genexpr>)rr(��selfr$r$r%r.Ns�zEnsembleRetriever.config_specs�before)�mode�valuescCs,|�d�st|d�}d|g||d<|S)Nr)r(�)�get�len)�clsr7�n_retrieversr$r$r%�set_weightsUs
zEnsembleRetriever.set_weights�input�config�kwargsc	
Ks�ddlm}t|�}|j|�d�d|�dd�|�dg�|j|�di�|jd�}|jd|fd	|�d
�p5|��i|��}z
|j	|||d�}Wnt
yW}z|�|�|�d}~ww|j|fi|��|S)Nr)�CallbackManager�	callbacks�verboseF�tags�metadata�rC�inheritable_tags�
local_tags�inheritable_metadata�local_metadata�name�run_name��run_managerr?)
�langchain_core.callbacksrAr�	configurer9rDrE�on_retriever_start�get_name�rank_fusion�	Exception�on_retriever_error�on_retriever_end)	r4r>r?r@rA�callback_managerrN�resultr"r$r$r%�invoke]s@


�	���
����zEnsembleRetriever.invokec	
�s��ddlm}t|�}|j|�d�d|�dd�|�dg�|j|�di�|jd�}|jd|fd	|�d
�p6|��i|��IdH}z
|j	|||d�IdH}Wnt
ya}z
|�|�IdH|�d}~ww|j|fi|��IdH|S)Nr)�AsyncCallbackManagerrBrCFrDrErFrKrLrM)
rOrZrrPr9rDrErQrR�arank_fusionrTrUrV)	r4r>r?r@rZrWrNrXr"r$r$r%�ainvoke~sF�


�	��������zEnsembleRetriever.ainvoke�queryrNcCs|�||�}|S)z�
        Get the relevant documents for a given query.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        )rS�r4r]rN�fused_documentsr$r$r%�_get_relevant_documents�sz)EnsembleRetriever._get_relevant_documentsc�s�|�||�IdH}|S)z�
        Asynchronously get the relevant documents for a given query.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        N)r[r^r$r$r%�_aget_relevant_documents�s�z*EnsembleRetriever._aget_relevant_documents)r?csR���fdd�t|j�D�}tt|��D]
}dd�||D�||<q|�|�}|S)z�
        Retrieve the results of the retrievers and use rank_fusion_func to get
        the final result.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        c�6g|]\}}|��t��jd|d��d�d���qS��
retriever_r8)�tag)rB)rYr�	get_child�r/�ir0�r?r]rNr$r%�
<listcomp>�s����z1EnsembleRetriever.rank_fusion.<locals>.<listcomp>cSs*g|]}t|t�rttt|�d�n|�qS�)�page_content)�
isinstance�strrr
�r/�docr$r$r%rj�s��)�	enumerater(�ranger:�weighted_reciprocal_rank�r4r]rNr?�retriever_docsrhr_r$rir%rS�s��
zEnsembleRetriever.rank_fusionc�s`�tj���fdd�t|j�D��IdH}tt|��D]
}dd�||D�||<q|�|�}|S)z�
        Asynchronously retrieve the results of the retrievers
        and use rank_fusion_func to get the final result.

        Args:
            query: The query to search for.

        Returns:
            A list of reranked documents.
        crbrc)r\rrfrgrir$r%rjs����z2EnsembleRetriever.arank_fusion.<locals>.<listcomp>NcSs$g|]}t|t�st|d�n|�qSrk)rmrror$r$r%rjs��)�asyncio�gatherrqr(rrr:rsrtr$rir%r[�s��
��
zEnsembleRetriever.arank_fusion�	doc_listscs�t|�t�j�kr
td��tt��t|�j�D](\}}t|dd�D]\}}��jdur.|jn|j	�j||�j
7<q!qt�|�}t
t|�fdd��d��fdd�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:
            list: 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.r8)�startNcs�jdur|jS|j�jSr-�r,rlrE�rpr3r$r%�<lambda>Fs
�z<EnsembleRetriever.weighted_reciprocal_rank.<locals>.<lambda>Tcs"��jdur
|jS|j�jSr-rzr{��	rrf_scorer4r$r%r|Ms
�
�)�reverser)r:r)�
ValueErrorr�float�ziprqr,rlrEr+r�
from_iterable�sortedr&)r4rx�doc_list�weight�rankrp�all_docs�sorted_docsr$r}r%rs s2�
�
���


��z*EnsembleRetriever.weighted_reciprocal_rankr-) �__name__�
__module__�__qualname__�__doc__r
r�__annotations__r�r+�intr,rrn�propertyrr.r�classmethodrrr=rrrYr\rr`rrarSr[rsr$r$r$r%r'9s�
����
�"����
�#��
���
�����
�.����
�,
��r')(r�rv�collectionsr�collections.abcr�	itertoolsr�typingrrrrr	r
rrr
rOrr�langchain_core.documentsr�langchain_core.retrieversrr�langchain_core.runnablesr�langchain_core.runnables.configrr�langchain_core.runnables.utilsrr�pydanticrrrr&r'r$r$r$r%�<module>s",(