
    Ng]                         d dl Z d dlmZmZ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Z G d d	e          ZdS )
    N)AnyDictIterableListOptionalTuple)Document)
Embeddings)VectorStore)maximal_marginal_relevance   c                      e Zd ZdZdededdfdZd)dZede	e         fd            Z
	 d*d	ee         d
e	ee                  dedee         fdZ	 d*d	ee         d
e	ee                  dedee         fdZ	 d*de	ee                  dede	e         fdZ	 d*de	ee                  dede	e         fdZefdddee         dede	eeef                  dedeeeeef                  f
dZefdddedede	eeef                  dedeeeef                  f
dZefdddedede	eeef                  dedeeeef                  f
dZefdddedede	eeef                  dedeeeef                  f
dZefdddedede	eeef                  dedeeeef                  f
dZefdddee         dede	eeef                  dedee         f
dZefdddee         dede	eeef                  dedee         f
dZ efdddedede	eeef                  dedee         f
dZ!efdddedede	eeef                  dedee         f
dZ"eddfdddee         ded ed!ede	eeef                  dedee         fd"Z#eddfdddee         ded ed!ede	eeef                  dedee         fd#Z$	 	 	 d+dddeded ed!ede	eeef                  dedee         fd%Z%eddfdddeded ed!ede	eeef                  dedee         fd&Z&e'	 d*d	ee         ded
e	ee                  dedd f
d'            Z(e'	 d*d	ee         ded
e	ee                  dedd f
d(            Z)dS ),SurrealDBStorea/  
    SurrealDB as Vector Store.

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

    Args:
        embedding_function: Embedding function to use.
        dburl: SurrealDB connection url
        ns: surrealdb namespace for the vector store. (default: "langchain")
        db: surrealdb database for the vector store. (default: "database")
        collection: surrealdb collection for the vector store.
            (default: "documents")

        (optional) db_user and db_pass: surrealdb credentials

    Example:
        .. code-block:: python

            from langchain_community.vectorstores.surrealdb import SurrealDBStore
            from langchain_community.embeddings import HuggingFaceEmbeddings

            model_name = "sentence-transformers/all-mpnet-base-v2"
            embedding_function = HuggingFaceEmbeddings(model_name=model_name)
            dburl = "ws://localhost:8000/rpc"
            ns = "langchain"
            db = "docstore"
            collection = "documents"
            db_user = "root"
            db_pass = "root"

            sdb = SurrealDBStore.from_texts(
                    texts=texts,
                    embedding=embedding_function,
                    dburl,
                    ns, db, collection,
                    db_user=db_user, db_pass=db_pass)
    embedding_functionkwargsreturnNc                    	 ddl m} n"# t          $ r}t          d          |d }~ww xY w|                    dd          | _        | j        dd         dk    r || j                  | _        nt          d          |                    d	d
          | _        |                    dd          | _        |                    dd          | _	        || _
        || _        d S )Nr   )SurrealzZCannot import from surrealdb.
                please install with `pip install surrealdb`.dburlzws://localhost:8000/rpc   wsz6Only websocket connections are supported at this time.ns	langchaindbdatabase
collection	documents)	surrealdbr   ImportErrorpopr   sdb
ValueErrorr   r   r   r   r   )selfr   r   r   es        f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/vectorstores/surrealdb.py__init__zSurrealDBStore.__init__5   s    
	))))))) 	 	 	@  	 ZZ)BCC
:ac?d""wtz**DHHUVVV**T;//**T:.. **\;??"4s   	 
(#(c                 p  K   | j                                          d{V  d| j        v r`d| j        v rW| j                            d          }| j                            d          }| j                             ||d           d{V  | j                             | j        | j                   d{V  dS )zr
        Initialize connection to surrealdb database
        and authenticate if credentials are provided
        Ndb_userdb_pass)userpass)r!   connectr   getsigninuser   r   )r#   r*   passwords      r%   
initializezSurrealDBStore.initializeO   s      
 h         ##	T[(@(@;??9--D{y11H(//4"B"BCCCCCCCCChll47DG,,,,,,,,,,,    c                 H    t          | j        t                    r| j        nd S N)
isinstancer   r
   )r#   s    r%   
embeddingszSurrealDBStore.embeddings[   s)     $1:>>D##	
r2   texts	metadatasc                 v  K   | j                             t          |                    }g }t          |          D ]}\  }}|||         d}||t	          |          k     r||         |d<   ng |d<   | j                            | j        |           d{V }	|                    |	d         d                    ~|S )zAdd list of text along with embeddings to the vector store asynchronously

        Args:
            texts (Iterable[str]): collection of text to add to the database

        Returns:
            List of ids for the newly inserted documents
        )text	embeddingNmetadatar   id)	r   embed_documentslist	enumeratelenr!   creater   append)
r#   r7   r8   r   r6   idsidxr:   datarecords
             r%   
aadd_textszSurrealDBStore.aadd_textsc   s       ,<<T%[[II
"5)) 
	( 
	(IC z#??D$s9~~)=)=#,S>Z  #%Z 8??       F JJvay''''
r2   c           
           	 ddt           t                   dt          t          t                            dt
          dt          t                   f fd}t          j         |||fi |          S )zAdd list of text along with embeddings to the vector store

        Args:
            texts (Iterable[str]): collection of text to add to the database

        Returns:
            List of ids for the newly inserted documents
        Nr7   r8   r   r   c                 f   K                                     d {V   j        | |fi | d {V S r4   r1   rH   )r7   r8   r   r#   s      r%   
_add_textsz,SurrealDBStore.add_texts.<locals>._add_texts   sY      
 //#########(	DDVDDDDDDDDDr2   r4   )r   strr   r   dictr   asynciorun)r#   r7   r8   r   rL   s   `    r%   	add_textszSurrealDBStore.add_texts   s    " /3	E 	EC=	ET
+	E 	E #Y		E 	E 	E 	E 	E 	E {::eYAA&AABBBr2   rD   c                 H   K   |' j                              j                   d{V  dS t          |t                    r" j                             |           d{V  dS t          |t
                    r)t          |          dk    r fd|D              d{V }dS dS )a  Delete by document ID asynchronously.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise.
        NTr   c                 T   K   g | ]"}j                             |           d {V #S r4   )r!   delete).0r=   r#   s     r%   
<listcomp>z*SurrealDBStore.adelete.<locals>.<listcomp>   s=      AAArtxr22222222AAAr2   F)r!   rT   r   r5   rM   r?   rA   )r#   rD   r   _s   `   r%   adeletezSurrealDBStore.adelete   s        ;(//$/2222222224#s##  hooc*********tc4((  SXX\\AAAASAAAAAAAAAA4ur2   c                      dt           t          t                            dt          dt           t                   f fd}t          j         ||fi |          S )a
  Delete by document ID.

        Args:
            ids: List of ids to delete.
            **kwargs: Other keyword arguments that subclasses might use.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise.
        rD   r   r   c                 f   K                                     d {V   j        dd| i| d {V S )NrD    )r1   rX   )rD   r   r#   s     r%   _deletez&SurrealDBStore.delete.<locals>._delete   sX      //#########%88#8888888888r2   )r   r   rM   r   boolrO   rP   )r#   rD   r   r\   s   `   r%   rT   zSurrealDBStore.delete   sg     	9xS	2 	9c 	9htn 	9 	9 	9 	9 	9 	9 {77311&11222r2   )filterr;   kr^   c                  K   | j         |||                    dd          d}d}|rJ|D ]G}t          ||                   t          t          fv rd||          d}n	||          }|d| d| dz  }Hd	|d
          d| d}	| j                            |	|           d{V }
t          |
          dk    rg S |
d         }|d         dk    r'ddlm	} |                    dd          } ||          d |d         D             S )a  Run similarity search for query embedding asynchronously
        and return documents and scores

        Args:
            embedding (List[float]): Query embedding.
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with scores
        score_thresholdr   )r   r;   r_   ra    'zand metadata.z =  u   
        select
            id,
            text,
            metadata,
            embedding,
            vector::similarity::cosine(embedding, $embedding) as similarity
        from ⟨r   ub   ⟩
        where vector::similarity::cosine(embedding, $embedding) >= $score_threshold
          z4
        order by similarity desc LIMIT $k;
        NstatusOK)SurrealExceptionresultzUnknown Errorc           	          g | ]G}t          |d          d|d         i|                    d          pi           |d         |d         fHS )r:   r=   r<   )page_contentr<   
similarityr;   )r	   r-   )rU   docs     r%   rV   zKSurrealDBStore._asimilarity_search_by_vector_with_score.<locals>.<listcomp>  sy     

 

 

  !$V"CIM#''*2E2E2KM   L!K 

 

 

r2   )
r   r-   typerM   r]   r!   queryrA   surrealdb.wsrg   )r#   r;   r_   r^   r   argscustom_filterkeyfilter_valuern   resultsrh   rg   errs                 r%   (_asimilarity_search_by_vector_with_scorez7SurrealDBStore._asimilarity_search_by_vector_with_score   s     ( /"%zz*;Q??	
 
  	I I Is$$d33#5vc{#5#5#5LL&,Sk#3L!H!H!H!H!H!HH l#     ud33333333w<<1I(t##555555**X77C""3'''

 

 h'

 

 

 
	
r2   rn   c                |   K   | j                             |          }d  | j        ||fd|i| d{V D             S )af  Run similarity search asynchronously and return relevance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance scores
        c                     g | ]
\  }}}||fS r[   r[   rU   documentrk   rW   s       r%   rV   zKSurrealDBStore.asimilarity_search_with_relevance_scores.<locals>.<listcomp>*  3     
 
 
'*a z"
 
 
r2   r^   Nr   embed_queryrv   r#   rn   r_   r^   r   query_embeddings         r%   (asimilarity_search_with_relevance_scoresz7SurrealDBStore.asimilarity_search_with_relevance_scores        $ 1==eDD
 
 DdC#Q /59?       
 
 
 	
r2   c                     dt           t          t          t          f                  f fd}t	          j         |                      S )ae  Run similarity search synchronously and return relevance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance scores
        r   c                  j   K                                     d {V   j        fd i d {V S Nr^   )r1   r   r^   r_   r   rn   r#   s   r%   (_similarity_search_with_relevance_scoreszhSurrealDBStore.similarity_search_with_relevance_scores.<locals>._similarity_search_with_relevance_scoresF  sz       //#########FFq !'+1        r2   r   r   r	   floatrO   rP   )r#   rn   r_   r^   r   r   s   ````` r%   'similarity_search_with_relevance_scoresz6SurrealDBStore.similarity_search_with_relevance_scores3  sk    &	x'(	 	 	 	 	 	 	 	 	 	 {CCEEFFFr2   c                |   K   | j                             |          }d  | j        ||fd|i| d{V D             S )an  Run similarity search asynchronously and return distance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance distance scores
        c                     g | ]
\  }}}||fS r[   r[   ry   s       r%   rV   z@SurrealDBStore.asimilarity_search_with_score.<locals>.<listcomp>c  r{   r2   r^   Nr|   r~   s         r%   asimilarity_search_with_scorez,SurrealDBStore.asimilarity_search_with_scoreP  r   r2   c                     dt           t          t          t          f                  f fd}t	          j         |                      S )am  Run similarity search synchronously and return distance scores

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar along with relevance distance scores
        r   c                  j   K                                     d {V   j        fd i d {V S r   )r1   r   r   s   r%   _similarity_search_with_scorezRSurrealDBStore.similarity_search_with_score.<locals>._similarity_search_with_score  sx      //#########;;q !'+1        r2   r   )r#   rn   r_   r^   r   r   s   ````` r%   similarity_search_with_scorez+SurrealDBStore.similarity_search_with_scorel  sj    &	T%%:P5Q 	 	 	 	 	 	 	 	 	 	 {88::;;;r2   c                H   K   d  | j         ||fd|i| d{V D             S )ad  Run similarity search on query embedding asynchronously

        Args:
            embedding (List[float]): Query embedding
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        c                     g | ]\  }}}|	S r[   r[   )rU   rz   rW   s      r%   rV   z?SurrealDBStore.asimilarity_search_by_vector.<locals>.<listcomp>  s.     
 
 
!Q 
 
 
r2   r^   N)rv   )r#   r;   r_   r^   r   s        r%   asimilarity_search_by_vectorz+SurrealDBStore.asimilarity_search_by_vector  sn      $
 
(U(U1) )%+)/5) ) # # # # # #
 
 
 	
r2   c                |     dt           t                   f fd}t          j         |                      S )aU  Run similarity search on query embedding

        Args:
            embedding (List[float]): Query embedding
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r   c                  j   K                                     d {V   j         fdi d {V S r   )r1   r   )r;   r^   r_   r   r#   s   r%   _similarity_search_by_vectorzPSurrealDBStore.similarity_search_by_vector.<locals>._similarity_search_by_vector  sx      //#########::1 %+/5        r2   r   r	   rO   rP   )r#   r;   r_   r^   r   r   s   ````` r%   similarity_search_by_vectorz*SurrealDBStore.similarity_search_by_vector  s`    &	DN 	 	 	 	 	 	 	 	 	 	 {7799:::r2   c                h   K   | j                             |          } | j        ||fd|i| d{V S )aD  Run similarity search on query asynchronously

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r^   N)r   r}   r   r~   s         r%   asimilarity_searchz!SurrealDBStore.asimilarity_search  sm      $ 1==eDD6T6Q
 
'-
17
 
 
 
 
 
 
 
 	
r2   c                |     dt           t                   f fd}t          j         |                      S )a5  Run similarity search on query

        Args:
            query (str): Query
            k (int): Number of results to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents most similar to the query
        r   c                  j   K                                     d {V   j        fd i d {V S r   )r1   r   r   s   r%   _similarity_searchz<SurrealDBStore.similarity_search.<locals>._similarity_search  s]      //#########00SS&SFSSSSSSSSSr2   r   )r#   rn   r_   r^   r   r   s   ````` r%   similarity_searchz SurrealDBStore.similarity_search  sk    &	T$x. 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T {--//000r2            ?fetch_klambda_multc                   
K    | j         ||fd|i| d{V }d |D             
d |D             }t          t          j        |t          j                  |||          }	
fd|	D             S )aH  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r^   Nc                     g | ]
}|d          S )r   r[   rU   subs     r%   rV   zKSurrealDBStore.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    )))3A)))r2   c                     g | ]
}|d          S )r[   r   s     r%   rV   zKSurrealDBStore.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    000#c"g000r2   )dtype)r_   r   c                      g | ]
}|         S r[   r[   )rU   idocss     r%   rV   zKSurrealDBStore.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>  s    ...AQ...r2   )rv   r   nparrayfloat32)r#   r;   r_   r   r   r^   r   rh   r6   mmr_selectedr   s             @r%   (amax_marginal_relevance_search_by_vectorz7SurrealDBStore.amax_marginal_relevance_search_by_vector  s      8 EtDw
 
'-
17
 
 
 
 
 
 
 

 *)&)))00000
1HYbj111#	
 
 
 /.......r2   c                     dt           t                   f fd}t          j         |                      S )aI  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r   c                  n   K                                     d {V   j         fdi d {V S r   )r1   r   )r;   r   r^   r_   r   r   r#   s   r%   (_max_marginal_relevance_search_by_vectorzhSurrealDBStore.max_marginal_relevance_search_by_vector.<locals>._max_marginal_relevance_search_by_vector6  s|      //#########FF1g{ ;AEK        r2   r   )r#   r;   r_   r   r   r^   r   r   s   ``````` r%   'max_marginal_relevance_search_by_vectorz6SurrealDBStore.max_marginal_relevance_search_by_vector  sl    :	X 	 	 	 	 	 	 	 	 	 	 	 	 {CCEEFFFr2   r   c                p   K   | j                             |          } | j        ||||fd|i| d{V }|S )a@  Return docs selected using the maximal marginal relevance.

        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r^   N)r   r}   r   )	r#   rn   r_   r   r   r^   r   r;   r   s	            r%   amax_marginal_relevance_searchz-SurrealDBStore.amax_marginal_relevance_search>  su      : +77>>	BTBq';
 
7=
AG
 
 
 
 
 
 
 
 r2   c                     dt           t                   f fd}t          j         |                      S )a?  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            filter (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.

        Returns:
            List of Documents selected by maximal marginal relevance.
        r   c                  n   K                                     d {V   j         fdi d {V S r   )r1   r   )r   r^   r_   r   r   rn   r#   s   r%   _max_marginal_relevance_searchzTSurrealDBStore.max_marginal_relevance_search.<locals>._max_marginal_relevance_search}  s|      //#########<<q'; 7=AG        r2   r   )r#   rn   r_   r   r   r^   r   r   s   ``````` r%   max_marginal_relevance_searchz,SurrealDBStore.max_marginal_relevance_searcha  sl    8	d8n 	 	 	 	 	 	 	 	 	 	 	 	 {99;;<<<r2   c                 z   K    | |fi |}|                                  d{V   |j        ||fi | d{V  |S )a  Create SurrealDBStore from list of text asynchronously

        Args:
            texts (List[str]): list of text to vectorize and store
            embedding (Optional[Embeddings]): Embedding function.
            dburl (str): SurrealDB connection url
                (default: "ws://localhost:8000/rpc")
            ns (str): surrealdb namespace for the vector store.
                (default: "langchain")
            db (str): surrealdb database for the vector store.
                (default: "database")
            collection (str): surrealdb collection for the vector store.
                (default: "documents")

            (optional) db_user and db_pass: surrealdb credentials

        Returns:
            SurrealDBStore object initialized and ready for use.NrK   clsr7   r;   r8   r   r!   s         r%   afrom_textszSurrealDBStore.afrom_texts  st      6 c)&&v&&nncnUI88888888888
r2   c                 J    t          j         | j        |||fi |          }|S )a  Create SurrealDBStore from list of text

        Args:
            texts (List[str]): list of text to vectorize and store
            embedding (Optional[Embeddings]): Embedding function.
            dburl (str): SurrealDB connection url
            ns (str): surrealdb namespace for the vector store.
                (default: "langchain")
            db (str): surrealdb database for the vector store.
                (default: "database")
            collection (str): surrealdb collection for the vector store.
                (default: "documents")

            (optional) db_user and db_pass: surrealdb credentials

        Returns:
            SurrealDBStore object initialized and ready for use.)rO   rP   r   r   s         r%   
from_textszSurrealDBStore.from_texts  s0    2 k/#/%IPPPPQQ
r2   )r   Nr4   )r   r   r   )*__name__
__module____qualname____doc__r
   r   r&   r1   propertyr   r6   r   rM   r   rN   rH   rQ   r]   rX   rT   	DEFAULT_Kr   intr   r   r	   rv   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r[   r2   r%   r   r      s	       $ $L&  
	   4
- 
- 
- 
- 
HZ0 
 
 
 X
 +/ } DJ' 	
 
c   @ +/C C}C DJ'C 	C
 
cC C C C6 $( d3i   
$	   > $(3 3d3i 3 3 
$	3 3 3 32 I

 ,0I
 I
 I
;I
 I

 c3h(I
 I
 
eHeS()	*I
 I
 I
 I
\ 

 ,0
 
 

 

 c3h(
 
 
eHeO$	%
 
 
 
> G
 ,0G G GG G
 c3h(G G 
eHeO$	%G G G G@ 

 ,0
 
 

 

 c3h(
 
 
eHeO$	%
 
 
 
> <
 ,0< < << <
 c3h(< < 
eHeO$	%< < < << 

 ,0
 
 
;
 

 c3h(
 
 
h
 
 
 
8 ;
 ,0; ; ;;; ;
 c3h(; ; 
h; ; ; ;< 

 ,0
 
 

 

 c3h(
 
 
h
 
 
 
4 1
 ,01 1 11 1
 c3h(1 1 
h1 1 1 18  ,/ ,0,/ ,/ ,/;,/ ,/ 	,/
 ,/ c3h(,/ ,/ 
h,/ ,/ ,/ ,/b  #G ,0#G #G #G;#G #G 	#G
 #G c3h(#G #G 
h#G #G #G #GP  ! ,0! ! !! ! 	!
 ! c3h(! ! 
h! ! ! !L  "= ,0"= "= "="= "= 	"=
 "= c3h("= "= 
h"= "= "= "=H 
 +/	 Cy  DJ'	
  
   [> 
 +/	 Cy  DJ'	
  
   [  r2   r   )rO   typingr   r   r   r   r   r   numpyr   langchain_core.documentsr	   langchain_core.embeddingsr
   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   r   r   r[   r2   r%   <module>r      s     = = = = = = = = = = = = = = = =     - - - - - - 0 0 0 0 0 0 3 3 3 3 3 3 M M M M M M	q
 q
 q
 q
 q
[ q
 q
 q
 q
 q
r2   