
    Ng                        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Z G 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           	         t           j                                        5 }t          j        t          |                    |j        |                               cddd           S # 1 swxY 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   executors      ^/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/retrievers/knn.pycreate_indexr      s     
		.	.	0	0 NHxX\\**@(KKLLMMN N N N N N N N N N N N N N N N N Ns   :A&&A*-A*c                      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          Z
e	 ddd            Zed d            Z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                <    t          ||          } | d||||d|S )N)r   r    r!   r#    )r   )clsr!   r   r#   r)   r    s         r   
from_textszKNNRetriever.from_texts5   sG     UJ//s 
!	
 

 
 
 	
    	documentsIterable[Document]c                P    t          d |D              \  }} | j        d|||d|S )Nc              3  2   K   | ]}|j         |j        fV  d S Npage_contentmetadata).0ds     r   	<genexpr>z.KNNRetriever.from_documents.<locals>.<genexpr>M   s+       Q Q!!.!*!= Q Q Q Q Q Qr.   )r!   r   r#   r+   )zipr-   )r,   r/   r   r)   r!   r#   s         r   from_documentszKNNRetriever.from_documentsF   sQ      Q Qy Q Q QRys~ 
J)
 
GM
 
 	
r.   querystrrun_managerr   List[Document]c               D   	 t          j         j                            |                    } j        t          j         j        dz                      dd                    z  }|t          j        |dz                                            z  }|                    |          }t          j        |           }t          j	        |          t          j
        |          z
  dz   }|t          j
        |          z
  |z  		 fd|d j                 D             }|S )N      T)keepdimsgư>c                    g | ]J}j         |         j         k    t          j        |         j        rj        |         ni           KS )Nr4   )r'   r	   r!   r#   )r7   rownormalized_similaritiesselfs     r   
<listcomp>z8KNNRetriever._get_relevant_documents.<locals>.<listcomp>`   sr     

 

 


 (0*3/43KKK !Z_04F,,B   LKKr.   r   )r   r   r   r   r    sqrtsumdotargsortmaxminr&   )
rG   r<   r>   query_embedsindex_embedssimilarities	sorted_ixdenominatortop_k_resultsrF   s
   `        @r   _get_relevant_documentsz$KNNRetriever._get_relevant_documentsR   s    x ; ;E B BCCzBGTZ],?,?D,?,Q,Q$R$RR#bg|Q.C.C.E.E&F&FF#''55J}--	f\**RVL-A-AADH#/"&2F2F#F+"U

 

 

 

 


 !TV,

 

 

 r.   r3   )
r!   r   r   r
   r#   r"   r)   r   r   r   )r/   r0   r   r
   r)   r   r   r   )r<   r=   r>   r   r   r?   )__name__
__module____qualname____doc____annotations__r    r#   r&   r'   r   model_configclassmethodr-   r;   rU   r+   r.   r   r   r   !   s         "E!&*I****9AJJJJ&+/////": $  L 
 +/	
 
 
 
 [
  	
 	
 	
 [	
     r.   r   )r   r   r   r
   r   r   )rY   
__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   <module>rf      s  F F # " " " " "     0 0 0 0 0 0 0 0 0 0 0 0     C C C C C C - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3      N N N NJ J J J J= J J J J Jr.   