o
    Ag                     @  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   i/var/www/html/development/chatbot/venv/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)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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)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!   )r0   rownormalized_similaritiesselfr   r   
<listcomp>`   s    
z8KNNRetriever._get_relevant_documents.<locals>.<listcomp>r   )r   r   r   r   r   sqrtsumdotargsortmaxminr$   )	r?   r5   r7   query_embedsindex_embedssimilarities	sorted_ixdenominator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   )r5   r6   r7   r   r   r8   )__name__
__module____qualname____doc____annotations__r   r!   r$   r%   r   model_configclassmethodr)   r4   rM   r   r   r   r   r   !   s.   
 r   )r   r   r   r	   r   r   )rQ   
__future__r   concurrent.futuresr   typingr   r   r   r   numpyr   langchain_core.callbacksr   langchain_core.documentsr   langchain_core.embeddingsr	   langchain_core.retrieversr
   pydanticr   r   r   r   r   r   r   <module>   s    
