o
    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
r\d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                   @  s8   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_providerls_embedding_modelN)__name__
__module____qualname____doc____annotations__ r"   r"   U/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain_core/retrievers.pyr   7   s   
 r   F)totalc                      s   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< 	 d5 fddZd6ddZ	d7d8ddZ	d7d8ddZed9d"d#Zd:d%d&Zed'd(d)d*ddddd+d;d0d1Zed'd2d)d*ddddd+d;d3d4Z  ZS )<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_argsNOptional[list[str]]tagsOptional[dict[str, Any]]metadatakwargsr   returnNonec                   s   t  jdi | | jtjkr!t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r]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_managerselfr
   queryr   r/   list[Document]c                   s   t d | j|I d H S N)r   _get_relevant_documents)r5   r6   r"   r"   r#   _aget_relevant_documents   s   zABaseRetriever.__init_subclass__.<locals>._aget_relevant_documents>   r5   r6   r4   r   r"   )r5   r
   r6   r   r/   r7   )super__init_subclass__get_relevant_documentsr%   warningswarnDeprecationWarningr9   hasattrr3   r:   r   
parametersgetr(   lensetkeysr)   )clsr.   swapaswaprB   r:   	__class__r"   r#   r<      s@   
zBaseRetriever.__init_subclass__r   c                 K  sL   |   }|dr|dd }n|dr|dd }| }t|d}|S )z Get standard params for tracing.	Retriever	   Ni)r   )get_name
startswithendswithlowerr   )r5   r.   default_retriever_name	ls_paramsr"   r"   r#   _get_ls_params   s   


zBaseRetriever._get_ls_paramsinputr   configOptional[RunnableConfig]r7   c              
   K  s  ddl m} t|}i |dpi | jdi |}|j|dd|dd|d| j|| jd	}|jd||d
p?| 	 |
ddd}z!| jrM|ni }| jr^| j|fd|i|}	n	| j|fi |}	W n tyz }
 z||
  d}
~
ww ||	 |	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+   rZ   inheritable_tags
local_tagsinheritable_metadatalocal_metadatarun_namerun_idnamera   r4   r"   ) langchain_core.callbacks.managerrX   r   rC   rT   	configurer+   r-   on_retriever_startrN   popr)   r(   r9   	Exceptionon_retriever_erroron_retriever_end)r5   rU   rV   r.   rX   r^   callback_managerr4   _kwargsresulter"   r"   r#   invoke   sV   
	

zBaseRetriever.invokec              
     s$  ddl m} t|}i |dpi | jdi |}|j|dd|dd|d| j|| jd	}|jd||d
p@| 	 |
dddI dH }z'| jrQ|ni }| jre| j|fd|i|I dH }	n| j|fi |I dH }	W n ty }
 z	||
I dH   d}
~
ww ||	I dH  |	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-   rY   NrZ   Fr+   r[   r`   ra   rb   r4   r"   )rd   rp   r   rC   rT   re   r+   r-   rf   rN   rg   r)   r(   r:   rh   ri   rj   )r5   rU   rV   r.   rp   r^   rk   r4   rl   rm   rn   r"   r"   r#   ainvoke  sX   
	

zBaseRetriever.ainvoker6   r4   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"   r5   r6   r4   r"   r"   r#   r9   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)r4   )r   r9   get_syncrr   r"   r"   r#   r:   ^  s   z&BaseRetriever._aget_relevant_documentsz0.1.46ro   z1.0)sincealternativeremoval)rY   r+   r-   r`   rY   r   r`   r   c                K  sH   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.
        rY   r+   r-   r`   )ro   r5   r6   rY   r+   r-   r`   r.   rV   r"   r"   r#   r=   p  s   !z$BaseRetriever.get_relevant_documentsrq   c                  sP   i }|r	||d< |r||d< |r||d< |r||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.
        rY   r+   r-   r`   N)rq   rw   r"   r"   r#   r3     s   !z%BaseRetriever.aget_relevant_documents)r.   r   r/   r0   )r.   r   r/   r   r8   )rU   r   rV   rW   r.   r   r/   r7   )r6   r   r4   r   r/   r7   )r6   r   r4   r   r/   r7   )r6   r   rY   r   r+   r*   r-   r,   r`   r   r.   r   r/   r7   )r   r   r   r    r	   model_configr(   r!   r)   r+   r-   r<   rT   ro   rq   r   r9   r:   r   r=   r3   __classcell__r"   r"   rJ   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   rd   r   r   r   r   RetrieverInputlistRetrieverOutputRetrieverLikeRetrieverOutputLiker   r%   r"   r"   r"   r#   <module>   s(    