U
    h                     @  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
d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	List[str]r	   z
np.ndarray)contexts
embeddingsreturnc              
   C  s:   t j &}tt||j| W  5 Q R  S Q R X 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)
concurrentZfuturesZThreadPoolExecutornparraylistmapembed_query)r   r   executor r   F/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/retrievers/knn.pycreate_index   s    r   c                   @  s   e Zd ZU dZded< ded< ded< dZd	ed
< dZded< dZded< G dd dZe	dddd	dd dddZ
e	dddd dddZddddddZdS ) KNNRetrieverz`KNN` retriever.r	   r   r   indexr   textsNzOptional[List[dict]]	metadatas   intkzOptional[float]relevancy_thresholdc                   @  s   e Zd ZdZdS )zKNNRetriever.ConfigTN)__name__
__module____qualname__Zarbitrary_types_allowedr   r   r   r   Config0   s   r$   )r   r   r   kwargsr   c                 K  s"   t ||}| f ||||d|S )N)r   r   r   r   )r   )clsr   r   r   r%   r   r   r   r   
from_texts3   s    
zKNNRetriever.from_textszIterable[Document])	documentsr   r%   r   c                 K  s.   t dd |D  \}}| jf |||d|S )Nc                 s  s   | ]}|j |jfV  qd S )NZpage_contentmetadata).0dr   r   r   	<genexpr>K   s     z.KNNRetriever.from_documents.<locals>.<genexpr>)r   r   r   )zipr'   )r&   r(   r   r%   r   r   r   r   r   from_documentsD   s      zKNNRetriever.from_documentsstrr   zList[Document])queryrun_managerr   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 k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   )	r7   r1   r2   Zquery_embedsZindex_embedsZsimilaritiesZ	sorted_ixdenominatorZtop_k_resultsr   r6   r   _get_relevant_documentsP   s     
z$KNNRetriever._get_relevant_documents)N)r!   r"   r#   __doc____annotations__r   r   r    r$   classmethodr'   r/   r?   r   r   r   r   r       s   
 r   )r@   
__future__r   concurrent.futuresr   typingr   r   r   r   Znumpyr   Zlangchain_core.callbacksr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.retrieversr
   r   r   r   r   r   r   <module>   s   