o
    Zh                     @  s   d Z ddlmZ ddl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 ddlmZ dd	lmZ dddZG dd deZdS )zbKNN Retriever.
Largely based on
https://github.com/karpathy/randomfun/blob/master/knn_vs_svm.ipynb    )annotationsN)AnyIterableListOptional)CallbackManagerForRetrieverRun)Document)
Embeddings)BaseRetriever)
ConfigDictcontexts	List[str]
embeddingsr	   return
np.ndarrayc                 C  sF   t j }tt||j| W  d   S 1 sw   Y  dS )z
    Create an index of embeddings for a list of contexts.

    Args:
        contexts: List of contexts to embed.
        embeddings: Embeddings model to use.

    Returns:
        Index of embeddings.
    N)
concurrentfuturesThreadPoolExecutornparraylistmapembed_query)r   r   executor r   Y/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/retrievers/knn.pycreate_index   s   $r   c                   @  s   e Zd ZU dZded< 	 dZded< 	 ded< 	 dZd	ed
< 	 dZded< 	 dZded< 	 e	ddZ
e	d!d"ddZed#ddZd$dd ZdS )%KNNRetrieverz`KNN` retriever.r	   r   Nr   indexr   textsOptional[List[dict]]	metadatas   intkzOptional[float]relevancy_thresholdT)Zarbitrary_types_allowedkwargsr   c                 K  s"   t ||}| d||||d|S )N)r   r   r   r!   r   )r   )clsr   r   r!   r&   r   r   r   r   
from_texts5   s   
zKNNRetriever.from_texts	documentsIterable[Document]c                 K  s.   t dd |D  \}}| jd|||d|S )Nc                 s  s    | ]	}|j |jfV  qd S NZpage_contentmetadata).0dr   r   r   	<genexpr>M   s    z.KNNRetriever.from_documents.<locals>.<genexpr>)r   r   r!   r   )zipr(   )r'   r)   r   r&   r   r!   r   r   r   from_documentsF   s   zKNNRetriever.from_documentsquerystrrun_managerr   List[Document]c          	        s   t j|}jt jd jddd }|t |d   }||}t | }t 	|t 
| d }|t 
| |   fdd|dj D }|S )	N      T)Zkeepdimsgư>c                   sF   g | ]}j d u s | j krtj| jrj| ni dqS )Nr,   )r%   r   r   r!   )r.   rowZnormalized_similaritiesselfr   r   
<listcomp>`   s    
z8KNNRetriever._get_relevant_documents.<locals>.<listcomp>r   )r   r   r   r   r   sqrtsumdotZargsortmaxminr$   )	r;   r3   r5   Zquery_embedsZindex_embedsZsimilaritiesZ	sorted_ixdenominatorZtop_k_resultsr   r:   r   _get_relevant_documentsR   s    
z$KNNRetriever._get_relevant_documentsr+   )
r   r   r   r	   r!   r    r&   r   r   r   )r)   r*   r   r	   r&   r   r   r   )r3   r4   r5   r   r   r6   )__name__
__module____qualname____doc____annotations__r   r!   r$   r%   r   Zmodel_configclassmethodr(   r2   rC   r   r   r   r   r   !   s.   
 r   )r   r   r   r	   r   r   )rG   
__future__r   concurrent.futuresr   typingr   r   r   r   numpyr   Zlangchain_core.callbacksr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.retrieversr
   Zpydanticr   r   r   r   r   r   r   <module>   s    
