
    hFA                    >   d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	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 dd
lmZ ddlmZmZ ddlmZ ddlmZmZmZm Z  ddl!m"Z" e
rddlm#Z#m$Z$ e%Z&e'e   Z(ee&e(f   Z)eee(f   Z* G d ded      Z+ G d dee&e(f   e      Z,y)a  **Retriever** class returns Documents given a text **query**.

It is more general than a vector store. A retriever does not need to be able to
store documents, only to return (or retrieve) it. Vector stores can be used as
the backbone of a retriever, but there are other types of retrievers as well.

**Class hierarchy:**

.. code-block::

    BaseRetriever --> <name>Retriever  # Examples: ArxivRetriever, MergerRetriever

**Main helpers:**

.. code-block::

    RetrieverInput, RetrieverOutput, RetrieverLike, RetrieverOutputLike,
    Document, Serializable, Callbacks,
    CallbackManagerForRetrieverRun, AsyncCallbackManagerForRetrieverRun
    )annotationsN)ABCabstractmethod)	signature)TYPE_CHECKINGAnyOptional)
ConfigDict)Self	TypedDictoverride)
deprecated)	Callbacks)AsyncCallbackManagerCallbackManager)Document)RunnableRunnableConfigRunnableSerializableensure_config)run_in_executor)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRunc                  @    e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   y)	LangSmithRetrieverParamsz!LangSmith parameters for tracing.strls_retriever_nameOptional[str]ls_vector_store_providerls_embedding_providerls_embedding_modelN)__name__
__module____qualname____doc____annotations__     W/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_core/retrievers.pyr   r   8   s)    +++ ((%%r(   r   F)totalc                      e Zd ZU dZ ed      ZdZded<   dZded<   dZ	d	ed
<   	 dZ
ded<   	 ed fd       ZddZe	 d	 	 	 	 	 	 	 dd       Ze	 d	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 dd       Z	 	 	 	 	 	 d dZ eddd      ddddd	 	 	 	 	 	 	 	 	 	 	 	 	 d!d       Z eddd      ddddd	 	 	 	 	 	 	 	 	 	 	 	 	 d!d       Z xZS )"BaseRetrieveraK	  Abstract base class for a Document retrieval system.

    A retrieval system is defined as something that can take string queries and return
    the most 'relevant' Documents from some source.

    Usage:

    A retriever follows the standard Runnable interface, and should be used
    via the standard Runnable methods of `invoke`, `ainvoke`, `batch`, `abatch`.

    Implementation:

    When implementing a custom retriever, the class should implement
    the `_get_relevant_documents` method to define the logic for retrieving documents.

    Optionally, an async native implementations can be provided by overriding the
    `_aget_relevant_documents` method.

    Example: A retriever that returns the first 5 documents from a list of documents

        .. code-block:: python

            from langchain_core.documents import Document
            from langchain_core.retrievers import BaseRetriever

            class SimpleRetriever(BaseRetriever):
                docs: list[Document]
                k: int = 5

                def _get_relevant_documents(self, query: str) -> list[Document]:
                    """Return the first k documents from the list of documents"""
                    return self.docs[:self.k]

                async def _aget_relevant_documents(self, query: str) -> list[Document]:
                    """(Optional) async native implementation."""
                    return self.docs[:self.k]

    Example: A simple retriever based on a scikit-learn vectorizer

        .. code-block:: python

            from sklearn.metrics.pairwise import cosine_similarity


            class TFIDFRetriever(BaseRetriever, BaseModel):
                vectorizer: Any
                docs: list[Document]
                tfidf_array: Any
                k: int = 4

                class Config:
                    arbitrary_types_allowed = True

                def _get_relevant_documents(self, query: str) -> list[Document]:
                    # Ip -- (n_docs,x), Op -- (n_docs,n_Feats)
                    query_vec = self.vectorizer.transform([query])
                    # Op -- (n_docs,1) -- Cosine Sim with each doc
                    results = cosine_similarity(self.tfidf_array, query_vec).reshape(
                        (-1,)
                    )
                    return [self.docs[i] for i in results.argsort()[-self.k :][::-1]]

    T)arbitrary_types_allowedFbool_new_arg_supported_expects_other_argsNOptional[list[str]]tagsOptional[dict[str, Any]]metadatac                    t        |   d
i | | j                  t        j                  k7  rDt	        j
                  dt        d       | j                  }t        j                  | _        || _        t        | d      ra| j                  t        j                  k7  rDt	        j
                  dt        d       | j                  }t        j                  | _	        || _
        t        | j                        j                  }|j                  d      d u| _        | j                  s.| j                  t        j                  k(  r	 	 	 	 	 	 dd}|| _
        t        t!        |j#                               h dz
        d	kD  | _        y )NzgRetrievers must implement abstract `_get_relevant_documents` method instead of `get_relevant_documents`   )
stacklevelaget_relevant_documentsziRetrievers must implement abstract `_aget_relevant_documents` method instead of `aget_relevant_documents`run_managerc                L   K   t        d | j                  |       d {   S 7 wN)r   _get_relevant_documents)selfquerys     r)   _aget_relevant_documentszABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents   s$      -T43O3OQVWWWWs   $"$>   r=   r>   r9   r   r'   )r=   r   r>   r   returnlist[Document])super__init_subclass__get_relevant_documentsr,   warningswarnDeprecationWarningr<   hasattrr8   r?   r   
parametersgetr/   lensetkeysr0   )clskwargsswapaswaprI   r?   	__class__s         r)   rC   zBaseRetriever.__init_subclass__   sd   !+F+ %%)M)MMMM7"	 --D44 & +/C'C23++}/T/TTMM8"	 //E55 ' ,1C(s::;FF
!+!>d!J&&,,0V0VVXX#&XX
 ,DC( JOO%&)IIJQN 	r(   c                    | j                         }|j                  d      r|dd }n|j                  d      r|dd }|j                         }t	        |      S )z Get standard params for tracing.	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r=   _kwargsdefault_retriever_names      r)   _get_ls_paramszBaseRetriever._get_ls_params   s_    !%!,,[9%;AB%?"#,,[9%;CR%@"!7!=!=!?':PQQr(   c           	        t        |      }i |j                  d      xs i  | j                  di |}t        j                  |j                  d      d|j                  dd      |j                  d      | j
                  || j                        }|j                  d||j                  d      xs | j                         |j                  d	d      
      }	 | j                  r|ni }| j                  r | j                  |fd|i|}n | j                  |fi |}|j                  |       |S # t        $ r}	|j                  |	        d}	~	ww xY w)a  Invoke the retriever to get relevant documents.

        Main entry point for synchronous retriever invocations.

        Args:
            input: The query string.
            config: Configuration for the retriever. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:

        .. code-block:: python

            retriever.invoke("query")

        r4   	callbacksNverboseFr2   r_   inheritable_tags
local_tagsinheritable_metadatalocal_metadatarun_namerun_idnamerf   r9   r'   )r   rJ   r\   r   	configurer2   r4   on_retriever_startrV   popr0   r/   r<   on_retriever_end	Exceptionon_retriever_error
r=   inputconfigrO   rc   callback_managerr9   kwargs_resultes
             r)   invokezBaseRetriever.invoke   sk   . v& 
zz*%+ 
!d!!+F+ 
 +44JJ{#JJy%0#ZZ/yy!5==
 '99J':4==?::h-	 : 
	 $ 8 8fbG&&555'26= 655eGwG
 (( M  	**1-	s   AD2 2	E;EEc           	       K   t        |      }i |j                  d      xs i  | j                  di |}t        j                  |j                  d      d|j                  dd      |j                  d      | j
                  || j                        }|j                  d||j                  d      xs | j                         |j                  d	d      
       d{   }	 | j                  r|ni }| j                  r | j                  |fd|i| d{   }n | j                  |fi | d{   }|j                  |       d{    |S 7 u7 =7 #7 # t        $ r }	|j                  |	       d{  7    d}	~	ww xY ww)a  Asynchronously invoke the retriever to get relevant documents.

        Main entry point for asynchronous retriever invocations.

        Args:
            input: The query string.
            config: Configuration for the retriever. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.

        Examples:

        .. code-block:: python

            await retriever.ainvoke("query")

        r4   r^   Nr_   Fr2   r`   re   rf   rg   r9   r'   )r   rJ   r\   r   ri   r2   r4   rj   rV   rk   r0   r/   r?   rl   rm   rn   ro   s
             r)   ainvokezBaseRetriever.ainvoke  s    4 v& 
zz*%+ 
!d!!+F+ 
 099JJ{#JJy%0#ZZ/yy!5==
 -??J':4==?::h-	 @ 
 
	 $ 8 8fbG&&<t<< '2 6=    =t<<UNgNN
 ..   M+
 O
	  	00333	sx   CFEF$4E EE 4E5E 9FEFE E F	F%F 9E<:F  FFc                    y)zGet documents relevant to a query.

        Args:
            query: String to find relevant documents for.
            run_manager: The callback handler to use.

        Returns:
            List of relevant documents.
        Nr'   r=   r>   r9   s      r)   r<   z%BaseRetriever._get_relevant_documentsT  s    r(   c               l   K   t        d| j                  ||j                                d{   S 7 w)zAsynchronously get documents relevant to a query.

        Args:
            query: String to find relevant documents for
            run_manager: The callback handler to use

        Returns:
            List of relevant documents
        N)r9   )r   r<   get_syncrz   s      r)   r?   z&BaseRetriever._aget_relevant_documentsb  s:      %((#,,.	
 
 	
 
s   +424z0.1.46rv   z1.0)sincealternativeremoval)r^   r2   r4   re   c               f    i }|r||d<   |r||d<   |r||d<   |r||d<    | j                   ||fi |S )a  Retrieve documents relevant to a query.

        Users should favor using `.invoke` or `.batch` rather than
        `get_relevant_documents directly`.

        Args:
            query: string to find relevant documents for.
            callbacks: Callback manager or list of callbacks. Defaults to None.
            tags: Optional list of tags associated with the retriever.
                These tags will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            metadata: Optional metadata associated with the retriever.
                This metadata will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            run_name: Optional name for the run. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.
        r^   r2   r4   re   )rv   r=   r>   r^   r2   r4   re   rO   rq   s           r)   rD   z$BaseRetriever.get_relevant_documentsu  sU    B "$"+F;!F6N!)F:!)F:t{{5&3F33r(   rx   c                  K   i }|r||d<   |r||d<   |r||d<   |r||d<    | j                   ||fi | d{   S 7 w)a  Asynchronously get documents relevant to a query.

        Users should favor using `.ainvoke` or `.abatch` rather than
        `aget_relevant_documents directly`.

        Args:
            query: string to find relevant documents for.
            callbacks: Callback manager or list of callbacks.
            tags: Optional list of tags associated with the retriever.
                These tags will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            metadata: Optional metadata associated with the retriever.
                This metadata will be associated with each call to this retriever,
                and passed as arguments to the handlers defined in `callbacks`.
                Defaults to None.
            run_name: Optional name for the run. Defaults to None.
            kwargs: Additional arguments to pass to the retriever.

        Returns:
            List of relevant documents.
        r^   r2   r4   re   N)rx   r   s           r)   r8   z%BaseRetriever.aget_relevant_documents  s_     B "$"+F;!F6N!)F:!)F:!T\\%:6::::s   6?=?)rO   r   r@   None)rZ   r   r@   r   r;   )rp   r   rq   zOptional[RunnableConfig]rO   r   r@   rA   )r>   r   r9   r   r@   rA   )r>   r   r9   r   r@   rA   )r>   r   r^   r   r2   r1   r4   r3   re   r   rO   r   r@   rA   )r"   r#   r$   r%   r
   model_configr/   r&   r0   r2   r4   r   rC   r\   rv   rx   r   r<   r?   r   rD   r8   __classcell__)rR   s   @r)   r,   r,   E   s   >@  $L  %$ %% $D
$ *.H&- 0
 0
d	R =A99":9MP9	9 9v  ,0<< )< 	<
 
< <| *H	 

*M
	
& hHeD
  $$(-1"&)4)4 	)4
 ")4 +)4  )4 )4 
)4 E)4V hIuE
  $$(-1"&);); 	);
 "); +);  ); ); 
); F);r(   r,   )-r%   
__future__r   rE   abcr   r   inspectr   typingr   r   r	   pydanticr
   typing_extensionsr   r   r   langchain_core._apir   langchain_core.callbacksr    langchain_core.callbacks.managerr   r   langchain_core.documentsr   langchain_core.runnablesr   r   r   r   langchain_core.runnables.configr   r   r   r   RetrieverInputlistRetrieverOutputRetrieverLikeRetrieverOutputLiker   r,   r'   r(   r)   <module>r      s   * #  #  / /  7 7 * . R -  <
 x.89sO34 
y 
F;()HI3 F;r(   