a
    ~g:A                     @  s  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 dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZ e
rddlmZmZm Z  e!Z"e#e Z$ee"e$f Z%eee$f Z&G dd deddZ'G dd dee"e$f eZ(dS )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)
deprecated)Document)RunnableRunnableConfigRunnableSerializableensure_config)run_in_executor)#AsyncCallbackManagerForRetrieverRunCallbackManagerForRetrieverRun	Callbacksc                   @  s2   e Zd ZU dZded< ded< ded< ded< dS )	LangSmithRetrieverParamsz!LangSmith parameters for tracing.strls_retriever_nameOptional[str]ls_vector_store_providerls_embedding_providerZls_embedding_modelN)__name__
__module____qualname____doc____annotations__ r!   r!   ^/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langchain_core/retrievers.pyr   7   s   
r   F)totalc                
      s0  e Zd ZU dZeddZdZded< dZded< dZ	d	ed
< dZ
ded< ddd fddZdddddZd1dddddddZd2dddddddZedddddd Zdd!ddd"d#Zed$d%d&d'ddddd(dd)d	dd*ddd+d,d-Zed$d.d&d'ddddd(dd)d	dd*ddd+d/d0Z  ZS )3BaseRetrievera?	  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
            from typing import List

            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_argsNzOptional[list[str]]tagszOptional[dict[str, Any]]metadatar   None)kwargsreturnc                   s   t  jf i | | jtjkrBtjdtdd | j}tj| _|| _t| dr|| j	tj	kr|tjdtdd | j	}tj	| _	|| _
t| jj}|dd u| _| js| j
tj
krddd	d
dd}|| _
tt| h d dk| _d S )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_managerr
   r   list[Document])selfqueryr-   c                   s   t d | j|I d H S )N)r   _get_relevant_documents)r3   r4   r!   r!   r"   _aget_relevant_documents   s    zABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents>   r1   r4   r3   r   )super__init_subclass__get_relevant_documentsr$   warningswarnDeprecationWarningr5   hasattrr0   r6   r   
parametersgetr'   lensetkeysr(   )clsr,   ZswapZaswapr>   r6   	__class__r!   r"   r8      sD    

zBaseRetriever.__init_subclass__r   c                 K  sL   |   }|dr |dd }n|dr6|dd }| }t|d}|S )z Get standard params for tracing.	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r3   r,   Zdefault_retriever_name	ls_paramsr!   r!   r"   _get_ls_params   s    


zBaseRetriever._get_ls_paramsr   zOptional[RunnableConfig]r2   )inputconfigr,   r-   c              
   K  s  ddl m} t|}i |dp"i | jf i |}|j|dd|dd|d| j|| jd	}|jd||d
p~| 	 |
ddd}zB| jr|ni }| jr| j|fd|i|}	n| j|fi |}	W n2 ty }
 z||
  W Y d}
~
nd}
~
0 0 ||	 |	S dS )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")
        r   )CallbackManagerr*   	callbacksNverboseFr)   rR   inheritable_tags
local_tagsinheritable_metadatalocal_metadatarun_namerun_idnamerY   r1   ) langchain_core.callbacks.managerrP   r   r?   rM   	configurer)   r*   on_retriever_startrH   popr(   r'   r5   	Exceptionon_retriever_erroron_retriever_end)r3   rN   rO   r,   rP   rV   callback_managerr1   _kwargsresulter!   r!   r"   invoke   sP    
	

zBaseRetriever.invokec              
     s4  ddl m} t|}i |dp"i | jf i |}|j|dd|dd|d| j|| jd	}|jd||d
p~| 	 |
dddI dH }zN| jr|ni }| jr| j|fd|i|I dH }	n| j|fi |I dH }	W n8 ty }
 z||
I dH   W Y d}
~
nd}
~
0 0 ||	I dH  |	S dS )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")
        r   )AsyncCallbackManagerr*   rQ   NrR   Fr)   rS   rX   rY   rZ   r1   )r\   rh   r   r?   rM   r]   r)   r*   r^   rH   r_   r(   r'   r6   r`   ra   rb   )r3   rN   rO   r,   rh   rV   rc   r1   rd   re   rf   r!   r!   r"   ainvoke  sP    
	

zBaseRetriever.ainvoker   )r4   r1   r-   c                C  s   dS )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!   r3   r4   r1   r!   r!   r"   r5   P  s    z%BaseRetriever._get_relevant_documentsr   c                  s   t d| j|| dI dH S )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)r1   )r   r5   get_syncrj   r!   r!   r"   r6   ^  s    z&BaseRetriever._aget_relevant_documentsz0.1.46rg   z1.0)sincealternativeremoval)rQ   r)   r*   rX   r   r   )r4   rQ   r)   r*   rX   r,   r-   c                K  sH   i }|r||d< |r||d< |r(||d< |r4||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.
        rQ   r)   r*   rX   )rg   r3   r4   rQ   r)   r*   rX   r,   rO   r!   r!   r"   r9   p  s    !z$BaseRetriever.get_relevant_documentsri   c                  sN   i }|r||d< |r||d< |r(||d< |r4||d< | j ||fi |I dH S )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.
        rQ   r)   r*   rX   N)ri   ro   r!   r!   r"   r0     s    !z%BaseRetriever.aget_relevant_documents)N)N)r   r   r   r   r	   model_configr'   r    r(   r)   r*   r8   rM   rg   ri   r   r5   r6   r   r9   r0   __classcell__r!   r!   rD   r"   r$   D   s:   
=2 ? ? +r$   ))r   
__future__r   r:   abcr   r   inspectr   typingr   r   r   pydanticr	   typing_extensionsr
   r   langchain_core._apir   langchain_core.documentsr   langchain_core.runnablesr   r   r   r   langchain_core.runnables.configr   r\   r   r   r   r   RetrieverInputlistZRetrieverOutputZRetrieverLikeZRetrieverOutputLiker   r$   r!   r!   r!   r"   <module>   s&   