o
    Zhm#                     @  s   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eZG dd	 d	eZdS )
    )annotationsN)AnyIterableListOptionalTuple)Document)
Embeddings)VectorStore)DistanceStrategyc                   @  s   e Zd ZdZejfd=dd	Zed>ddZd?ddZ	d@ddZ
	dAdBdd Z			!dCdDd'd(Z	!dEdFd+d,Zd-g fdGd3d4Zd-g d5dHd6d7Zd-g fdId8d9Ze	dAdJd;d<ZdS )K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                 C  s:   zdd l }W n ty   td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    r   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/kdbai.py__init__!   s   
zKDBAI.__init__returnOptional[Embeddings]c                 C  s   t | jtr	| jS d S N)
isinstancer   r	   r   r   r   r   
embeddings4   s   zKDBAI.embeddingstextsIterable[str]List[List[float]]c                   s.   t  jtr jt|S  fdd|D S )Nc                   s   g | ]}  |qS r   )r   .0tr   r   r   
<listcomp>=       z*KDBAI._embed_documents.<locals>.<listcomp>)r   r   r	   embed_documentslist)r   r   r   r   r   _embed_documents:   s   zKDBAI._embed_documentstextstrList[float]c                 C  s"   t | jtr| j|S | |S r   )r   r   r	   Zembed_query)r   r*   r   r   r   _embed_query?   s   
zKDBAI._embed_queryN	List[str]idsOptional[List[str]]metadataOptional[Any]Nonec                   s   zdd l  W n ty   tdw zdd l}W n ty#   tdw | j|}| }||d< dd |D |d<  fdd|D |d	< |d urS|j||gd
d}| jj|d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                 S  s   g | ]}| d qS )zutf-8)encoder"   r   r   r   r%   ]   r&   z!KDBAI._insert.<locals>.<listcomp>r*   c                   s   g | ]	} j |d dqS )Zfloat32)Zdtype)array)r#   enpr   r   r%   ^   s    r      )ZaxisF)warn)	numpyr   pandasr   r'   	DataFrameconcatr   insert)r   r   r/   r1   pdZembedsdfr   r9   r   _insertD   s,   zKDBAI._insert    	metadatasOptional[List[dict]]
batch_sizeintkwargsc                 K  s   zddl }W n ty   tdw t|}d}|dur*t||jr%|}n||}g }t|d | d }	t|	D ]C}
|
| }|
d | }||| }|rU||| }ndd tt|D }|durp|j|| jdd}nd}| 	||| || }q:|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   Nr4   r;   c                 S  s   g | ]}t t qS r   )r+   uuiduuid4)r#   _r   r   r   r%      s    z#KDBAI.add_texts.<locals>.<listcomp>T)Zdrop)
r>   r   r(   r   r?   lenrangeZilocZreset_indexrD   )r   r   rF   r/   rH   rJ   rB   ZmetadfZout_idsZnbatchesiistartZiendbatchZ	batch_idsZ
batch_metar   r   r   	add_textsc   s8   

zKDBAI.add_texts	documentsList[Document]c                 K  sV   zddl }W n ty   tdw dd |D }|dd |D }| j|||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   Nr4   c                 S     g | ]}|j qS r   )page_contentr#   xr   r   r   r%          z'KDBAI.add_documents.<locals>.<listcomp>c                 S  rV   r   )r1   rX   r   r   r   r%      rZ   )r1   rH   )r>   r   r?   rS   )r   rT   rH   rJ   rB   r   r1   r   r   r   add_documents   s   zKDBAI.add_documentsr;   querykfilterOptional[List]List[Tuple[Document, float]]c                 K  s   | 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.
        r]   r^   )&similarity_search_by_vector_with_scorer-   )r   r\   r]   r^   rJ   r   r   r   similarity_search_with_score   s   z"KDBAI.similarity_search_with_scorera   c          
      K  s   d|v r	| d}| jjd|g||d|}g }t|tr#|d }n|S |jddD ]}| d}| d}	|t|dd	 | D d
|	f q+|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)Zvectorsrd   r^   r   records)Zorientr*   Z__nn_distancec                 S  s   i | ]\}}|d kr||qS )r*   r   )r#   r]   vr   r   r   
<dictcomp>   s    z@KDBAI.similarity_search_by_vector_with_score.<locals>.<dictcomp>)rW   r1   Nr   )	popr   searchr   r(   to_dictappendr   items)
r   r   r]   r^   rJ   matchesdocsrowr*   Zscorer   r   r   rb      s&   




	z,KDBAI.similarity_search_by_vector_with_scorec                 K  s&   | j |f||d|}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.
        ra   c                 S  s   g | ]\}}|qS r   r   )r#   docrM   r   r   r   r%     s    z+KDBAI.similarity_search.<locals>.<listcomp>)rc   )r   r\   r]   r^   rJ   Zdocs_and_scoresr   r   r   similarity_search   s   zKDBAI.similarity_searchclsc                 K  s   t d )zNot implemented.)	Exception)rr   r   r   rF   rJ   r   r   r   
from_texts  s   	zKDBAI.from_texts)r   r   r   r	   r   r   )r   r   )r   r    r   r!   )r*   r+   r   r,   r   )r   r.   r/   r0   r1   r2   r   r3   )NNrE   )r   r    rF   rG   r/   r0   rH   rI   rJ   r   r   r.   )rE   )rT   rU   rH   rI   rJ   r   r   r.   )
r\   r+   r]   rI   r^   r_   rJ   r   r   r`   )
r   r,   r]   rI   r^   r_   rJ   r   r   r`   )
r\   r+   r]   rI   r^   r_   rJ   r   r   rU   )rr   r   r   r.   r   r	   rF   rG   rJ   r   r   r   )__name__
__module____qualname____doc__r   ZEUCLIDEAN_DISTANCEr   propertyr   r)   r-   rD   rS   r[   rc   rb   rq   classmethodrt   r   r   r   r   r      s8    

	"8+r   )
__future__r   loggingrK   typingr   r   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr	   Zlangchain_core.vectorstoresr
   Z&langchain_community.vectorstores.utilsr   	getLoggerru   loggerr   r   r   r   r   <module>   s    
