§
    è˜ºh�<  ã                   ó  — d Z ddlmZ ddl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mZ ddlmZ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  G d„ dee¦  «        Z G d„ de¦  «        Z  G d„ de e¦  «        Z! G d„ de e¦  «        Z"dS )z@A chain for comparing the output of two models using embeddings.é    )ÚEnum)ÚAnyÚDictÚListÚOptionalN)ÚOpenAIEmbeddings)Ú
Embeddings)ÚFieldÚroot_validator)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRunÚ	Callbacks)ÚChain)ÚPairwiseStringEvaluatorÚStringEvaluator©ÚRUN_KEY©Úcosine_similarityc                   ó&   — e Zd ZdZdZdZdZdZdZdS )ÚEmbeddingDistancea  Embedding Distance Metric.

    Attributes:
        COSINE: Cosine distance metric.
        EUCLIDEAN: Euclidean distance metric.
        MANHATTAN: Manhattan distance metric.
        CHEBYSHEV: Chebyshev distance metric.
        HAMMING: Hamming distance metric.
    ÚcosineÚ	euclideanÚ	manhattanÚ	chebyshevÚhammingN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCOSINEÚ	EUCLIDEANÚ	MANHATTANÚ	CHEBYSHEVÚHAMMING© ó    út/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/evaluation/embedding_distance/base.pyr   r      s3   € € € € € ðð ð €FØ€IØ€IØ€IØ€G€G€Gr'   r   c                   ó|  — e Zd ZU dZ ee¬¦  «        Zeed<    ee	j
        ¬¦  «        Ze	ed<    ed¬¦  «        deeef         d	eeef         fd
„¦   «         Z G d„ d¦  «        Zed	ee         fd„¦   «         Zded	efd„Zde	d	efd„Zedej        dej        d	ej        fd„¦   «         Zedej        dej        d	ej        fd„¦   «         Zedej        dej        d	ej        fd„¦   «         Zedej        dej        d	ej        fd„¦   «         Zedej        dej        d	ej        fd„¦   «         Z dej        d	e!fd„Z"dS )Ú_EmbeddingDistanceChainMixina0  Shared functionality for embedding distance evaluators.

    Attributes:
        embeddings (Embeddings): The embedding objects to vectorize the outputs.
        distance_metric (EmbeddingDistance): The distance metric to use
                                            for comparing the embeddings.
    )Údefault_factoryÚ
embeddings)ÚdefaultÚdistance_metricF)ÚpreÚvaluesÚreturnc                 ó    — |                      d¦  «        }t          |t          ¦  «        r#	 ddl}n# t          $ r t	          d¦  «        ‚w xY w|S )zÇValidate that the TikTok library is installed.

        Args:
            values (Dict[str, Any]): The values to validate.

        Returns:
            Dict[str, Any]: The validated values.
        r,   r   Nz×The tiktoken library is required to use the default OpenAI embeddings with embedding distance evaluators. Please either manually select a different Embeddings object or install tiktoken using `pip install tiktoken`.)ÚgetÚ
isinstancer   ÚtiktokenÚImportError)Úclsr0   r,   r5   s       r(   Ú_validate_tiktoken_installedz9_EmbeddingDistanceChainMixin._validate_tiktoken_installed3   sr   € ð —Z’Z Ñ-Ô-ˆ
Ý�jÕ"2Ñ3Ô3ð 		ðØ����øÝð ð ð Ý!ðIñô ð ðøøøð ˆs	   ¬1 ±Ac                   ó"   — e Zd ZU dZdZeed<   dS )ú#_EmbeddingDistanceChainMixin.Configz$Permit embeddings to go unvalidated.TÚarbitrary_types_allowedN)r   r   r   r    r;   ÚboolÚ__annotations__r&   r'   r(   ÚConfigr:   J   s)   € € € € € € Ø2Ð2à(,Ð Ð,Ð,Ñ,Ð,Ð,r'   r>   c                 ó   — dgS )zgReturn the output keys of the chain.

        Returns:
            List[str]: The output keys.
        Úscorer&   ©Úselfs    r(   Úoutput_keysz(_EmbeddingDistanceChainMixin.output_keysO   s   € ð ˆyÐr'   Úresultc                 óV   — d|d         i}t           |v r|t                    |t           <   |S )Nr@   r   )rB   rD   Úparseds      r(   Ú_prepare_outputz,_EmbeddingDistanceChainMixin._prepare_outputX   s-   € Ø˜6 'œ?Ð+ˆÝ�fÐÐØ$¥WœoˆF•7‰OØˆr'   Úmetricc           
      óì   — t           j        | j        t           j        | j        t           j        | j        t           j        | j        t           j	        | j
        i}||v r||         S t          d|› �¦  «        ‚)z»Get the metric function for the given metric name.

        Args:
            metric (EmbeddingDistance): The metric name.

        Returns:
            Any: The metric function.
        zInvalid metric: )r   r!   Ú_cosine_distancer"   Ú_euclidean_distancer#   Ú_manhattan_distancer$   Ú_chebyshev_distancer%   Ú_hamming_distanceÚ
ValueError)rB   rH   Úmetricss      r(   Ú_get_metricz(_EmbeddingDistanceChainMixin._get_metric^   sp   € õ Ô$ dÔ&;ÝÔ'¨Ô)AÝÔ'¨Ô)AÝÔ'¨Ô)AÝÔ% tÔ'=ð
ˆð �WÐÐØ˜6”?Ð"åÐ8°Ð8Ð8Ñ9Ô9Ð9r'   ÚaÚbc                 ó(   — dt          | |¦  «        z
  S )zäCompute the cosine distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.ndarray: The cosine distance.
        g      ð?r   ©rR   rS   s     r(   rJ   z-_EmbeddingDistanceChainMixin._cosine_distances   s   € ð Õ& q¨!Ñ,Ô,Ñ,Ð,r'   c                 óF   — t           j                             | |z
  ¦  «        S )zëCompute the Euclidean distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Euclidean distance.
        )ÚnpÚlinalgÚnormrU   s     r(   rK   z0_EmbeddingDistanceChainMixin._euclidean_distance€   s   € õ Œy�~Š~˜a !™eÑ$Ô$Ð$r'   c                 óT   — t          j        t          j        | |z
  ¦  «        ¦  «        S )zëCompute the Manhattan distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Manhattan distance.
        )rW   ÚsumÚabsrU   s     r(   rL   z0_EmbeddingDistanceChainMixin._manhattan_distance�   ó    € õ Œv•b”f˜Q ™U‘m”mÑ$Ô$Ð$r'   c                 óT   — t          j        t          j        | |z
  ¦  «        ¦  «        S )zëCompute the Chebyshev distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Chebyshev distance.
        )rW   Úmaxr\   rU   s     r(   rM   z0_EmbeddingDistanceChainMixin._chebyshev_distanceš   r]   r'   c                 ó2   — t          j        | |k    ¦  «        S )zçCompute the Hamming distance between two vectors.

        Args:
            a (np.ndarray): The first vector.
            b (np.ndarray): The second vector.

        Returns:
            np.floating: The Hamming distance.
        )rW   ÚmeanrU   s     r(   rN   z._EmbeddingDistanceChainMixin._hamming_distance§   s   € õ Œw�q˜A’v‰ŒÐr'   Úvectorsc                 óÞ   — |                       | j        ¦  «        } ||d                              dd¦  «        |d                              dd¦  «        ¦  «                             ¦   «         }|S )zµCompute the score based on the distance metric.

        Args:
            vectors (np.ndarray): The input vectors.

        Returns:
            float: The computed score.
        r   é   éÿÿÿÿ)rQ   r.   ÚreshapeÚitem)rB   rb   rH   r@   s       r(   Ú_compute_scorez+_EmbeddingDistanceChainMixin._compute_score´   sd   € ð ×!Ò! $Ô"6Ñ7Ô7ˆØ��w˜q”z×)Ò)¨!¨RÑ0Ô0°'¸!´*×2DÒ2DÀQÈÑ2KÔ2KÑLÔL×QÒQÑSÔSˆØˆr'   N)#r   r   r   r    r
   r   r,   r	   r=   r   r!   r.   r   r   Ústrr   r8   r>   Úpropertyr   rC   ÚdictrG   rQ   ÚstaticmethodrW   ÚndarrayrJ   ÚfloatingrK   rL   rM   rN   Úfloatrh   r&   r'   r(   r*   r*   '   s�  € € € € € € ðð ð #˜UÐ3CÐDÑDÔD€J�
ÐDÐDÑDØ).¨Ð7HÔ7OÐ)PÑ)PÔ)P€OÐ&ÐPÐPÑPà€^˜ÐÑÔð°$°s¸C°x´.ð ÀTÈ#ÈsÈ(Ä^ð ð ð ñ Ôðð,-ð -ð -ð -ð -ñ -ô -ð -ð
 ð˜T #œYð ð ð ñ „Xðð dð ¨tð ð ð ð ð:Ð"3ð :¸ð :ð :ð :ð :ð* ð
-˜BœJð 
-¨2¬:ð 
-¸"¼*ð 
-ð 
-ð 
-ñ „\ð
-ð ð
%˜rœzð 
%¨b¬jð 
%¸R¼[ð 
%ð 
%ð 
%ñ „\ð
%ð ð
%˜rœzð 
%¨b¬jð 
%¸R¼[ð 
%ð 
%ð 
%ñ „\ð
%ð ð
%˜rœzð 
%¨b¬jð 
%¸R¼[ð 
%ð 
%ð 
%ñ „\ð
%ð ð
˜RœZð 
¨B¬Jð 
¸2¼;ð 
ð 
ð 
ñ „\ð
ð b¤jð °Uð ð ð ð ð ð r'   r*   c                   óæ  — e Zd ZdZedefd„¦   «         Zedefd„¦   «         Zede	e         fd„¦   «         Z
	 ddeeef         dee         deeef         fd	„Z	 ddeeef         dee         deeef         fd
„Zddddddœdedee         dedee	e                  deeeef                  dededefd„Zddddddœdedee         dedee	e                  deeeef                  dededefd„ZdS )ÚEmbeddingDistanceEvalChaina"  Use embedding distances to score semantic difference between
    a prediction and reference.

    Examples:
        >>> chain = EmbeddingDistanceEvalChain()
        >>> result = chain.evaluate_strings(prediction="Hello", reference="Hi")
        >>> print(result)
        {'score': 0.5}
    r1   c                 ó   — dS )z�Return whether the chain requires a reference.

        Returns:
            bool: True if a reference is required, False otherwise.
        Tr&   rA   s    r(   Úrequires_referencez-EmbeddingDistanceEvalChain.requires_referenceÍ   s	   € ð ˆtr'   c                 ó"   — d| j         j        › d�S )NÚ
embedding_Ú	_distance©r.   ÚvaluerA   s    r(   Úevaluation_namez*EmbeddingDistanceEvalChain.evaluation_nameÖ   s   € àA˜DÔ0Ô6ÐAÐAÐAÐAr'   c                 ó
   — ddgS )úeReturn the input keys of the chain.

        Returns:
            List[str]: The input keys.
        Ú
predictionÚ	referencer&   rA   s    r(   Ú
input_keysz%EmbeddingDistanceEvalChain.input_keysÚ   s   € ð ˜kÐ*Ð*r'   NÚinputsÚrun_managerc                 ó¨   — t          j        | j                             |d         |d         g¦  «        ¦  «        }|                      |¦  «        }d|iS )a0  Compute the score for a prediction and reference.

        Args:
            inputs (Dict[str, Any]): The input data.
            run_manager (Optional[CallbackManagerForChainRun], optional):
                The callback manager.

        Returns:
            Dict[str, Any]: The computed score.
        r|   r}   r@   ©rW   Úarrayr,   Úembed_documentsrh   ©rB   r   r€   rb   r@   s        r(   Ú_callz EmbeddingDistanceEvalChain._callã   sW   € õ ”(ØŒO×+Ò+¨V°LÔ-AÀ6È+ÔCVÐ,WÑXÔXñ
ô 
ˆð ×#Ò# GÑ,Ô,ˆØ˜ÐÐr'   c              ƒ   ó¼   K  — | j                              |d         |d         g¦  «        ƒ d{V —†}t          j        |¦  «        }|                      |¦  «        }d|iS )a:  Asynchronously compute the score for a prediction and reference.

        Args:
            inputs (Dict[str, Any]): The input data.
            run_manager (AsyncCallbackManagerForChainRun, optional):
                The callback manager.

        Returns:
            Dict[str, Any]: The computed score.
        r|   r}   Nr@   ©r,   Úaembed_documentsrW   rƒ   rh   ©rB   r   r€   Úembeddedrb   r@   s         r(   Ú_acallz!EmbeddingDistanceEvalChain._acallø   s~   è è € ð œ×9Ò9Ø�LÔ! 6¨+Ô#6Ð7ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ ”(˜8Ñ$Ô$ˆØ×#Ò# GÑ,Ô,ˆØ˜ÐÐr'   F)r}   Ú	callbacksÚtagsÚmetadataÚinclude_run_infor|   r}   r�   rŽ   r�   r�   Úkwargsc                óR   —  | ||dœ||||¬¦  «        }|                       |¦  «        S )a  Evaluate the embedding distance between a prediction and
        reference.

        Args:
            prediction (str): The output string from the first model.
            reference (str): The reference string (required)
            callbacks (Callbacks, optional): The callbacks to use.
            **kwargs (Any): Additional keyword arguments.

        Returns:
            dict: A dictionary containing:
                - score: The embedding distance between the two
                    predictions.
        ©r|   r}   ©r   r�   rŽ   r�   r�   ©rG   ©	rB   r|   r}   r�   rŽ   r�   r�   r‘   rD   s	            r(   Ú_evaluate_stringsz,EmbeddingDistanceEvalChain._evaluate_strings  sG   € ð2 �Ø",¸9ÐEÐEØØØØ-ð
ñ 
ô 
ˆð ×#Ò# FÑ+Ô+Ð+r'   c             ‹   óv   K  — |                       ||dœ||||¬¦  «        ƒ d{V —†}|                      |¦  «        S )a  Asynchronously evaluate the embedding distance between
        a prediction and reference.

        Args:
            prediction (str): The output string from the first model.
            reference (str): The output string from the second model.
            callbacks (Callbacks, optional): The callbacks to use.
            **kwargs (Any): Additional keyword arguments.

        Returns:
            dict: A dictionary containing:
                - score: The embedding distance between the two
                    predictions.
        r“   r”   N©ÚacallrG   r–   s	            r(   Ú_aevaluate_stringsz-EmbeddingDistanceEvalChain._aevaluate_strings0  sk   è è € ð2 —z’zØ",¸9ÐEÐEØØØØ-ð "ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×#Ò# FÑ+Ô+Ð+r'   ©N)r   r   r   r    rj   r<   rs   ri   ry   r   r~   r   r   r   r   r†   r   rŒ   r   rk   r—   r›   r&   r'   r(   rq   rq   Â   sr  € € € € € ðð ð ð Dð ð ð ñ „Xðð ðB ð Bð Bð Bñ „XðBð ð+˜D œIð +ð +ð +ñ „Xð+ð =Að ð  à�S˜#�X”ð ð Ð8Ô9ð ð 
ˆc�3ˆhŒð	 ð  ð  ð  ð0 BFð ð  à�S˜#�X”ð ð Ð=Ô>ð ð 
ˆc�3ˆhŒð	 ð  ð  ð  ð4 $(Ø#Ø$(Ø-1Ø!&ð ,ð  ,ð  ,ð ð ,ð ˜C”=ð	 ,ð
 ð ,ð �t˜C”yÔ!ð ,ð ˜4  S œ>Ô*ð ,ð ð ,ð ð ,ð 
ð ,ð  ,ð  ,ð  ,ðL $(Ø#Ø$(Ø-1Ø!&ð ,ð  ,ð  ,ð ð ,ð ˜C”=ð	 ,ð
 ð ,ð �t˜C”yÔ!ð ,ð ˜4  S œ>Ô*ð ,ð ð ,ð ð ,ð 
ð ,ð  ,ð  ,ð  ,ð  ,ð  ,r'   rq   c                   ó®  — e Zd ZdZedee         fd„¦   «         Zedefd„¦   «         Z	 dde	ee
f         dee         de	ee
f         fd„Z	 dde	ee
f         dee         de	ee
f         fd	„Zdddd
dœdedededeee                  dee	ee
f                  dede
defd„Zdddd
dœdedededeee                  dee	ee
f                  dede
defd„ZdS )Ú"PairwiseEmbeddingDistanceEvalChaina  Use embedding distances to score semantic difference between two predictions.

    Examples:
    >>> chain = PairwiseEmbeddingDistanceEvalChain()
    >>> result = chain.evaluate_string_pairs(prediction="Hello", prediction_b="Hi")
    >>> print(result)
    {'score': 0.5}
    r1   c                 ó
   — ddgS )r{   r|   Úprediction_br&   rA   s    r(   r~   z-PairwiseEmbeddingDistanceEvalChain.input_keys_  s   € ð ˜nÐ-Ð-r'   c                 ó"   — d| j         j        › d�S )NÚpairwise_embedding_rv   rw   rA   s    r(   ry   z2PairwiseEmbeddingDistanceEvalChain.evaluation_nameh  s   € àJ TÔ%9Ô%?ÐJÐJÐJÐJr'   Nr   r€   c                 ó¨   — t          j        | j                             |d         |d         g¦  «        ¦  «        }|                      |¦  «        }d|iS )a  Compute the score for two predictions.

        Args:
            inputs (Dict[str, Any]): The input data.
            run_manager (CallbackManagerForChainRun, optional):
                The callback manager.

        Returns:
            Dict[str, Any]: The computed score.
        r|   r    r@   r‚   r…   s        r(   r†   z(PairwiseEmbeddingDistanceEvalChain._calll  s\   € õ ”(ØŒO×+Ò+Ø˜Ô% v¨nÔ'=Ð>ñô ñ
ô 
ˆð
 ×#Ò# GÑ,Ô,ˆØ˜ÐÐr'   c              ƒ   ó¼   K  — | j                              |d         |d         g¦  «        ƒ d{V —†}t          j        |¦  «        }|                      |¦  «        }d|iS )a/  Asynchronously compute the score for two predictions.

        Args:
            inputs (Dict[str, Any]): The input data.
            run_manager (AsyncCallbackManagerForChainRun, optional):
                The callback manager.

        Returns:
            Dict[str, Any]: The computed score.
        r|   r    Nr@   rˆ   rŠ   s         r(   rŒ   z)PairwiseEmbeddingDistanceEvalChain._acallƒ  s~   è è € ð œ×9Ò9Ø�LÔ! 6¨.Ô#9Ð:ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ ”(˜8Ñ$Ô$ˆØ×#Ò# GÑ,Ô,ˆØ˜ÐÐr'   F)r�   rŽ   r�   r�   r|   r    r�   rŽ   r�   r�   r‘   c                óR   —  | ||dœ||||¬¦  «        }|                       |¦  «        S )a€  Evaluate the embedding distance between two predictions.

        Args:
            prediction (str): The output string from the first model.
            prediction_b (str): The output string from the second model.
            callbacks (Callbacks, optional): The callbacks to use.
            tags (List[str], optional): Tags to apply to traces
            metadata (Dict[str, Any], optional): metadata to apply to
            **kwargs (Any): Additional keyword arguments.

        Returns:
            dict: A dictionary containing:
                - score: The embedding distance between the two
                    predictions.
        ©r|   r    r”   r•   ©	rB   r|   r    r�   rŽ   r�   r�   r‘   rD   s	            r(   Ú_evaluate_string_pairsz9PairwiseEmbeddingDistanceEvalChain._evaluate_string_pairs™  sG   € ð4 �Ø",¸lÐKÐKØØØØ-ð
ñ 
ô 
ˆð ×#Ò# FÑ+Ô+Ð+r'   c             ‹   óv   K  — |                       ||dœ||||¬¦  «        ƒ d{V —†}|                      |¦  «        S )aŸ  Asynchronously evaluate the embedding distance

        between two predictions.

        Args:
            prediction (str): The output string from the first model.
            prediction_b (str): The output string from the second model.
            callbacks (Callbacks, optional): The callbacks to use.
            tags (List[str], optional): Tags to apply to traces
            metadata (Dict[str, Any], optional): metadata to apply to traces
            **kwargs (Any): Additional keyword arguments.

        Returns:
            dict: A dictionary containing:
                - score: The embedding distance between the two
                    predictions.
        r¦   r”   Nr™   r§   s	            r(   Ú_aevaluate_string_pairsz:PairwiseEmbeddingDistanceEvalChain._aevaluate_string_pairs¼  sk   è è € ð8 —z’zØ",¸lÐKÐKØØØØ-ð "ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×#Ò# FÑ+Ô+Ð+r'   rœ   )r   r   r   r    rj   r   ri   r~   ry   r   r   r   r   r†   r   rŒ   r   r<   rk   r¨   rª   r&   r'   r(   rž   rž   S  s=  € € € € € ðð ð ð.˜D œIð .ð .ð .ñ „Xð.ð ðK ð Kð Kð Kñ „XðKð =Að ð  à�S˜#�X”ð ð Ð8Ô9ð ð 
ˆc�3ˆhŒð	 ð  ð  ð  ð4 BFð ð  à�S˜#�X”ð ð Ð=Ô>ð ð 
ˆc�3ˆhŒð	 ð  ð  ð  ð6  $Ø$(Ø-1Ø!&ð!,ð !,ð !,ð ð!,ð ð	!,ð
 ð!,ð �t˜C”yÔ!ð!,ð ˜4  S œ>Ô*ð!,ð ð!,ð ð!,ð 
ð!,ð !,ð !,ð !,ðP  $Ø$(Ø-1Ø!&ð#,ð #,ð #,ð ð#,ð ð	#,ð
 ð#,ð �t˜C”yÔ!ð#,ð ˜4  S œ>Ô*ð#,ð ð#,ð ð#,ð 
ð#,ð #,ð #,ð #,ð #,ð #,r'   rž   )#r    Úenumr   Útypingr   r   r   r   ÚnumpyrW   Ú%langchain_community.embeddings.openair   Úlangchain_core.embeddingsr	   Úlangchain_core.pydantic_v1r
   r   Úlangchain.callbacks.managerr   r   r   Úlangchain.chains.baser   Úlangchain.evaluation.schemar   r   Úlangchain.schemar   Úlangchain.utils.mathr   ri   r   r*   rq   rž   r&   r'   r(   ú<module>r¶      sâ  ðØ FÐ FØ Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð ð ð
 (Ð 'Ð 'Ð 'Ð 'Ð 'Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ $Ð $Ð $Ð $Ð $Ð $Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ð ˜˜Tñ ô ð ð$Xð Xð Xð Xð X 5ñ Xô Xð XðvN,ð N,ð N,ð N,ð N,Ð!=¸ñ N,ô N,ð N,ðbL,ð L,ð L,ð L,ð L,Ø Ð"9ñL,ô L,ð L,ð L,ð L,r'   