a
    bg                     @  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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	List[str]r	   z
np.ndarray)contexts
embeddingsreturnc                 C  sF   t j (}tt||j| W  d   S 1 s80    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   p/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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	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   Nr   indexr   textszOptional[List[dict]]	metadatas   intkzOptional[float]relevancy_thresholdT)Zarbitrary_types_allowed)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_texts5   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>M       z.KNNRetriever.from_documents.<locals>.<genexpr>)r   r   r   )zipr&   )r%   r'   r   r$   r   r   r   r   r   from_documentsF   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 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"   )	r7   r1   r2   Zquery_embedsZindex_embedsZsimilaritiesZ	sorted_ixdenominatorZtop_k_resultsr   r6   r   _get_relevant_documentsR   s     
z$KNNRetriever._get_relevant_documents)N)__name__
__module____qualname____doc____annotations__r   r   r"   r#   r   Zmodel_configclassmethodr&   r/   r?   r   r   r   r   r   !   s    
 r   )rC   
__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   