§
    šŠtjm#  ã                  óª   — 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        úd/var/www/html/CA-Chatbot/venv/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#   € å�d”o¥zÑ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Ð2 q�—’ Ñ"Ô"Ð2Ð2Ð2r"   )r    r   r
   Úembed_documentsÚlist)r   r#   s   ` r   Ú_embed_documentszKDBAI._embed_documents:   sN   ø€ Ý�d”o¥zÑ2Ô2ð 	@Ø”?×2Ò2µ4¸±;´;Ñ?Ô?Ð?Ø2Ð2Ð2Ð2¨EÐ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>   € Ý�d”o¥zÑ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Ð7¨A�a—h’h˜wÑ'Ô'Ð7Ð7Ð7r"   r/   c                ó>   •— g | ]}‰                      |d ¬¦  «        ‘ŒS )Úfloat32)Údtype)Úarray)r)   ÚeÚnps     €r   r+   z!KDBAI._insert.<locals>.<listcomp>^   s)   ø€ ÐIÐIÐI¸Q˜BŸHšH Q¨i˜HÑ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Ô2ˆBØŒ×Ò˜2 EÐÑ*Ô*Ð*Ð*Ð*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ÐJ°1�S¥¤¡¤Ñ.Ô.Ð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�ØˆÝ˜‘J”J ‘N zÑ1°AÑ5ˆÝ�x‘”ð 	*ð 	*ˆAØ˜‘^ˆFØ˜‘E˜ZÑ'ˆDØ˜& ˜+Ô&ˆEØð KØ  t Ô,�	�	àJÐJ½½cÀ%¹j¼jÑ8IÔ8IÐJÑJÔJ�	ØÐ!Ø#œ[¨°¨Ô5×AÒAÀtÐAÑLÔL�
�
à!�
Ø�LŠL˜ 	¨:Ñ6Ô6Ð6Ø 	Ñ)ˆGˆGØˆ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Ð3 A�”Ð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Ð ?Ñ ?Ô ?Ñ@Ô@ˆØ�~Š~˜e¨hÀ:ˆ~Ñ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Ð!N©4¨1¨aÀ!À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Ø$�$”+Ô$ÐW¨i¨[¸AÀfÐWÐWÐPVÐWÐWˆØˆÝ�g�tÑ$Ô$ð 	Ø˜a”jˆGˆGàˆKØ—?’?¨)�?Ñ4Ô4ð 	ð 	ˆCØ—7’7˜6‘?”?ˆDØ—G’G˜OÑ,Ô,ˆEØ�KŠKåØ%)Ø!NÐ!N°3·9²9±;´;Ð!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"   