
    Ngm#                        d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ  ej        e          Z G d d	e          ZdS )
    )annotationsN)AnyIterableListOptionalTuple)Document)
Embeddings)VectorStore)DistanceStrategyc                      e Zd ZdZej        fd2dZed3d            Zd4dZ	d5dZ
	 d6d7dZ	 	 	 d8d9d"Z	 d:d;d%Zd&g fd<d,Zd&g d-d=d.Zd&g fd>d/Ze	 d6d?d1            ZdS )@KDBAIaT  `KDB.AI` vector store.

    See https://kdb.ai.

    To use, you should have the `kdbai_client` python package installed.

    Args:
        table: kdbai_client.Table object to use as storage,
        embedding: Any embedding function implementing
            `langchain.embeddings.base.Embeddings` interface,
        distance_strategy: One option from DistanceStrategy.EUCLIDEAN_DISTANCE,
            DistanceStrategy.DOT_PRODUCT or DistanceStrategy.COSINE.

    See the example [notebook](https://github.com/KxSystems/langchain/blob/KDB.AI/docs/docs/integrations/vectorstores/kdbai.ipynb).
    tabler   	embeddingr
   distance_strategyOptional[DistanceStrategy]c                v    	 dd l }n# t          $ r t          d          w xY w|| _        || _        || _        d S )Nr   z`Could not import kdbai_client python package. Please install it with `pip install kdbai_client`.)kdbai_clientImportError_table
_embeddingr   )selfr   r   r   r   s        b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/kdbai.py__init__zKDBAI.__init__!   sg    	 	 	 	E  	
 #!2    !returnOptional[Embeddings]c                H    t          | j        t                    r| j        S d S N)
isinstancer   r
   )r   s    r   
embeddingszKDBAI.embeddings4   s#    doz22 	#?"t    textsIterable[str]List[List[float]]c                     t           j        t                    r' j                            t	          |                    S  fd|D             S )Nc                :    g | ]}                     |          S  )r   ).0tr   s     r   
<listcomp>z*KDBAI._embed_documents.<locals>.<listcomp>=   s%    222q""222r"   )r    r   r
   embed_documentslist)r   r#   s   ` r   _embed_documentszKDBAI._embed_documents:   sN    doz22 	@?224;;???2222E2222r"   textstrList[float]c                    t          | j        t                    r| j                            |          S |                     |          S r   )r    r   r
   embed_query)r   r/   s     r   _embed_queryzKDBAI._embed_query?   s>    doz22 	5?..t444t$$$r"   N	List[str]idsOptional[List[str]]metadataOptional[Any]Nonec                   	 dd l n# t          $ r t          d          w xY w	 dd l}n# t          $ r t          d          w xY w| j                            |          }|                                }||d<   d |D             |d<   fd|D             |d<   ||                    ||gd	
          }| j                            |d           d S )Nr   zRCould not import numpy python package. Please install it with `pip install numpy`.TCould not import pandas python package. Please install it with `pip install pandas`.idc                8    g | ]}|                     d           S )zutf-8)encode)r)   r*   s     r   r+   z!KDBAI._insert.<locals>.<listcomp>]   s$    777Aahhw''777r"   r/   c                >    g | ]}                     |d           S )float32)dtype)array)r)   enps     r   r+   z!KDBAI._insert.<locals>.<listcomp>^   s)    IIIQBHHQiH88IIIr"   r!      )axisF)warn)	numpyr   pandasr   r,   	DataFrameconcatr   insert)r   r#   r6   r8   pdembedsdfrE   s          @r   _insertzKDBAI._insertD   s1   	 	 	 	>  		 	 	 	?  	 0077\\^^4777776
IIII&III<B>22B2E*****s    "+ A    	metadatasOptional[List[dict]]
batch_sizeintkwargsc                @   	 ddl }n# t          $ r t          d          w xY wt          |          }d}|-t          ||j                  r|}n|                    |          }g }t          |          dz
  |z  dz   }	t          |	          D ]}
|
|z  }|
dz   |z  }|||         }|r|||         }n&d t          t          |                    D             }|$|j        ||                             d          }nd}| 	                    |||           ||z   }|S )a  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts (Iterable[str]): Texts to add to the vectorstore.
            metadatas (Optional[List[dict]]): List of metadata corresponding to each
                chunk of text.
            ids (Optional[List[str]]): List of IDs corresponding to each chunk of text.
            batch_size (Optional[int]): Size of batch of chunks of text to insert at
                once.

        Returns:
            List[str]: List of IDs of the added texts.
        r   Nr<   rF   c                N    g | ]"}t          t          j                              #S r(   )r0   uuiduuid4)r)   _s     r   r+   z#KDBAI.add_texts.<locals>.<listcomp>   s&    JJJ1S..JJJr"   T)drop)
rJ   r   r-   r    rK   lenrangeilocreset_indexrQ   )r   r#   rS   r6   rU   rW   rN   metadfout_idsnbatchesiistartiendbatch	batch_ids
batch_metas                   r   	add_textszKDBAI.add_textsc   ss   ,	 	 	 	?  	 U# )R\22 1"i00JJNz1A5x 	* 	*A^FEZ'D&+&E Kt,		JJc%jj8I8IJJJ	!#[5AAtALL

!
LL	:666	)GGr   	documentsList[Document]c                    	 ddl }n# t          $ r t          d          w xY wd |D             }|                    d |D                       }|                     |||          S )aH  Run more documents through the embeddings and add to the vectorstore.

        Args:
            documents (List[Document]: Documents to add to the vectorstore.
            batch_size (Optional[int]): Size of batch of documents to insert at once.

        Returns:
            List[str]: List of IDs of the added texts.
        r   Nr<   c                    g | ]	}|j         
S r(   )page_contentr)   xs     r   r+   z'KDBAI.add_documents.<locals>.<listcomp>   s    333A333r"   c                    g | ]	}|j         
S r(   )r8   rq   s     r   r+   z'KDBAI.add_documents.<locals>.<listcomp>   s     ? ? ? ? ? ?r"   )r8   rU   )rJ   r   rK   rk   )r   rl   rU   rW   rN   r#   r8   s          r   add_documentszKDBAI.add_documents   s    	 	 	 	?  	 43333<< ? ?Y ? ? ?@@~~eh:~NNNr   rF   querykfilterOptional[List]List[Tuple[Document, float]]c                J     | j         |                     |          f||d|S )an  Run similarity search with distance from a query string.

        Args:
            query (str): Query string.
            k (Optional[int]): number of neighbors to retrieve.
            filter (Optional[List]): KDB.AI metadata filter clause: https://code.kx.com/kdbai/use/filter.html

        Returns:
            List[Document]: List of similar documents.
        rv   rw   )&similarity_search_by_vector_with_scorer4   )r   ru   rv   rw   rW   s        r   similarity_search_with_scorez"KDBAI.similarity_search_with_score   sC    " ;t:e$$
()&
 
<B
 
 	
r"   r{   c          	        d|v r|                     d          } | j        j        d
|g||d|}g }t          |t                    r	|d         }n|S |                    d          D ]n}|                     d          }|                     d          }	|                    t          |d |                                D             	          |	f           o|S )a  Return documents most similar to embedding, along with scores.

        Args:
            embedding (List[float]): query vector.
            k (Optional[int]): number of neighbors to retrieve.
            filter (Optional[List]): KDB.AI metadata filter clause: https://code.kx.com/kdbai/use/filter.html

        Returns:
            List[Document]: List of similar documents.
        n)vectorsr   rw   r   records)orientr/   __nn_distancec                &    i | ]\  }}|d k    ||S )r/   r(   )r)   rv   vs      r   
<dictcomp>z@KDBAI.similarity_search_by_vector_with_score.<locals>.<dictcomp>   s#    !N!N!N41a!v++!Q+++r"   )rp   r8   r(   )	popr   searchr    r-   to_dictappendr	   items)
r   r   rv   rw   rW   matchesdocsrowr/   scores
             r   r|   z,KDBAI.similarity_search_by_vector_with_score   s    $ &==

3A$$+$Wi[AfWWPVWWgt$$ 	ajGGK??)?44 	 	C776??DGGO,,EKK%)!N!N399;;!N!N!N       r"   c                <     | j         |f||d|}d |D             S )a`  Run similarity search from a query string.

        Args:
            query (str): Query string.
            k (Optional[int]): number of neighbors to retrieve.
            filter (Optional[List]): KDB.AI metadata filter clause: https://code.kx.com/kdbai/use/filter.html

        Returns:
            List[Document]: List of similar documents.
        r{   c                    g | ]\  }}|S r(   r(   )r)   docr\   s      r   r+   z+KDBAI.similarity_search.<locals>.<listcomp>  s    222Q222r"   )r}   )r   ru   rv   rw   rW   docs_and_scoress         r   similarity_searchzKDBAI.similarity_search   sH    " <$;
v
 
)/
 
 32/2222r"   clsc                     t          d           )zNot implemented.)	Exception)r   r#   r   rS   rW   s        r   
from_textszKDBAI.from_texts  s     *+++r"   )r   r   r   r
   r   r   )r   r   )r#   r$   r   r%   )r/   r0   r   r1   r   )r#   r5   r6   r7   r8   r9   r   r:   )NNrR   )r#   r$   rS   rT   r6   r7   rU   rV   rW   r   r   r5   )rR   )rl   rm   rU   rV   rW   r   r   r5   )
ru   r0   rv   rV   rw   rx   rW   r   r   ry   )
r   r1   rv   rV   rw   rx   rW   r   r   ry   )
ru   r0   rv   rV   rw   rx   rW   r   r   rm   )r   r   r#   r5   r   r
   rS   rT   rW   r   r   r   )__name__
__module____qualname____doc__r   EUCLIDEAN_DISTANCEr   propertyr!   r.   r4   rQ   rk   rt   r}   r|   r   classmethodr   r(   r"   r   r   r      s        , /3 3 3 3 3&    X
3 3 3 3
% % % % #'	+ + + + +D +/#'5 5 5 5 5p <>O O O O O8 !#	
 
 
 
 
2 !#& & & & & &V !#	3 3 3 3 3, 
 +/	, , , , [, , ,r"   r   )
__future__r   loggingrZ   typingr   r   r   r   r   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   	getLoggerr   loggerr   r(   r"   r   <module>r      s    " " " " " "   7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3 C C C C C C		8	$	$, , , , ,K , , , , ,r"   