
    3fiR                    b   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZ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d
lmZ ddlm Z   ejB                  e"      Z#dZ$dZ%dZ&dZ'e$e%e&e'gZ( G d d      Z) G d d      Z* G d de      Z+	 d	 	 	 	 	 ddZ, G d de      Z-y)z+Wrapper around the Tencent vector database.    )annotationsN)Enum)
AnyCallableDictIterableListOptionalSequenceTupleUnioncast)Document)
Embeddings)guard_import)VectorStore)	BaseModel)maximal_marginal_relevanceuint64stringarrayvectorc                      e Zd ZdZdddZy)ConnectionParamsa  Tencent vector DB Connection params.

    See the following documentation for details:
    https://cloud.tencent.com/document/product/1709/95820

    Attribute:
        url (str) : The access address of the vector database server
            that the client needs to connect to.
        key (str): API key for client to access the vector database server,
            which is used for authentication.
        username (str) : Account for client to access the vector database server.
        timeout (int) : Request Timeout.
    c                <    || _         || _        || _        || _        y N)urlkeyusernametimeout)selfr   r   r   r    s        n/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/tencentvectordb.py__init__zConnectionParams.__init__>   s         N)root
   )r   strr   r'   r   r'   r    int__name__
__module____qualname____doc__r#    r$   r"   r   r   /   s    r$   r   c                  :    e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZy)IndexParamszTencent vector DB Index params.

    See the following documentation for details:
    https://cloud.tencent.com/document/product/1709/95826
    Nc                X    || _         || _        || _        || _        || _        || _        y r   )	dimensionshardreplicas
index_typemetric_typeparams)r!   r2   r3   r4   r5   r6   r7   s          r"   r#   zIndexParams.__init__L   s/     #
 $&r$   )      HNSWL2N)r2   r(   r3   r(   r4   r(   r5   r'   r6   r'   r7   zOptional[Dict]r)   r.   r$   r"   r0   r0   E   sW      !%  	
   r$   r0   c                  R     e Zd ZU dZded<   ded<   ded<   dZd	ed
<   d fdZ xZS )	MetaFieldz%MetaData Field for Tencent vector DB.r'   nameOptional[str]descriptionzUnion[str, Enum]	data_typeFboolindexc                   t        |   di | t        d      }t        | j                  t
              r| j                  t        vrt        d| j                         |j                  D cg c]9  }|j                  j                         | j                  j                         k(  r|; }}|r|d   | _        y t        d| j                         | j                  |j                  vrt        d| j                         y c c}w )Ntcvectordb.model.enumzunsupported data_type r   r.   )superr#   r   
isinstancerA   r'   META_FIELD_TYPES
ValueError	FieldTypevaluelower)r!   dataenumfetarget	__class__s        r"   r#   zMetaField.__init__e   s     4 34dnnc*~~%55 #9$..9I!JKK ..88>>#t~~';';'== F 
 !' #9$..9I!JKK~~T^^3 #9$..9I!JKK 4s   .>D)rM   r   returnNone)r*   r+   r,   r-   __annotations__rC   r#   __classcell__)rQ   s   @r"   r=   r=   ]   s-    /
IE4L Lr$   r=   c                    ddl m} ddlm} ddlm} ddlm}  ||      }t        t        |    ||j                  |j                  |      j                  |             } ||      }|r|j                  |      S dS )zTranslate LangChain filter to Tencent VectorDB filter.

    Args:
        lc_filter (str): LangChain filter.
        allowed_fields (Optional[Sequence[str]]): Allowed fields for filter.

    Returns:
        str: Translated filter.
    r   )fix_filter_directive)
get_parser)TencentVectorDBTranslator)FilterDirective)allowed_comparatorsallowed_operatorsallowed_attributes )/langchain_classic.chains.query_constructor.baserW   1langchain_classic.chains.query_constructor.parserrX   7langchain_classic.retrievers.self_query.tencentvectordbrY   langchain_core.structured_queryrZ   r   r
   r[   r\   parseaccept)	lc_filterallowed_fieldsrW   rX   rY   rZ   tvdb_visitorflts           r"   translate_filterri   y   s}     UL @,^<L
! , @ @*<<-	
 %	
C s
#C'*3::l#22r$   c                     e Zd ZU dZdZded<   dZded<   dZded<   d	Zded
<    e	d      ddddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d dZ
d!dZed"d       Z	 	 d#	 	 	 	 	 	 	 d$dZe	 	 	 	 	 	 	 	 	 d%	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d&d       Z	 	 	 	 d'	 	 	 	 	 	 	 	 	 	 	 	 	 d(dZ	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d*dZ	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZ	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 d,dZ	 	 	 	 	 	 d-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZ	 	 	 	 	 	 d/	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0dZd1dZ	 	 	 	 	 	 	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3dZd4dZy)5TencentVectorDBzTencent VectorDB as a vector store.

    In order to use this you need to have a database instance.
    See the following documentation for details:
    https://cloud.tencent.com/document/product/1709/104489
    idr'   field_idr   field_vectortext
field_textmetadatafield_metadatai   LangChainDatabaseLangChainCollectionFCollection for LangChainNbge-base-zhc
           	     B   t        d      | _        t        d      }
t        d      }t        d      }d | _        ||	r|j                  D cg c]  }|	|j                  k(  r| }}t        |      s3t        d|	 d|j                  D cg c]  }|j                   c}       |j                  dd|d	   
      | _        || _        || _	        || _
        |
j                  |j                  |j                  |j                  |j                        | _        || _        | j                   j%                         }d}|D ]  }||j&                  k(  sd} n |r!| j                   j)                  |      | _        n | j                   j+                  |      | _        	 | j(                  j-                  |      | _        |r-| j(                  j1                  |       | j3                  |       y y c c}w c c}w # |
j4                  j6                  $ r | j3                  |       Y y w xY w)Nztcvectordb.model.document
tcvectordbztcvectordb.model.collectionrE   embedding model `` is invalid. choices: r   ro   r   )vector_fieldfieldmodel)r   r   r   r    FT)r   documentembedding_modelEmbeddingModel
model_nameanyrI   	Embeddingembedding_funcindex_paramscollection_descriptionVectorDBClientr   r   r   r    
vdb_clientmeta_fieldslist_databasesdatabase_namedatabasecreate_databasedescribe_collection
collectiondrop_collection_create_collection
exceptionsVectorDBException)r!   	embeddingconnection_paramsr   r   collection_namedrop_oldr   r   t_vdb_embeddingrx   tcollectionrN   r}   r   memberdb_listdb_existdbs                      r"   r#   zTencentVectorDB.__init__   s'    %%@A!,/
"#@A34# "00"e&6&66 O 
 ' ''8 9 AEATAT Uv!2!2 UVX  $/#8#8%V?1;M $9 $D  ((&<#$33!%%&//!%%%--	 4 
 '//002 	B 0 00	  OO44]CDM OO;;MJDM	5"mm??PDO--o>''8 G !V< $$66 	5##O4	5s   G'G,AG1 1*HHc           
     $   t        d      }t        d      }|j                  j                  j                  | j                  j
                        }|t        d      |j                  j                  j                  | j                  j                        }|t        d      |j                  | j                  j                  xs i j                  dd      | j                  j                  xs i j                  dd      	      }|j                  |j                  | j                  |j                  j                  |j                  j                         |j#                  | j$                  | j                  j&                  |||      |j                  | j(                  |j                  j                  |j                  j*                              }| j,                  z| j,                  D cg c]  }|j.                  s| }	}|	D ]N  }|j                  |j0                  |j2                  |j                  j*                        }
|j5                  |
       P nT|j5                  |j                  | j6                  |j                  j                  |j                  j*                               | j8                  j;                  || j                  j<                  | j                  j>                  | j@                  || jB                  
      | _"        y c c}w )NrE   ztcvectordb.model.indexzunsupported index_typezunsupported metric_typeM   efConstruction   )mefconstruction)r>   r3   r4   r@   rC   r   )#r   	IndexType__members__getr   r5   rI   
MetricTyper6   
HNSWParamsr7   IndexFilterIndexrm   rJ   StringPRIMARY_KEYVectorIndexrn   r2   rp   FILTERr   rC   r>   rA   addrr   r   create_collectionr3   r4   r   r   r   )r!   r   rN   	vdb_indexr5   r6   r7   rC   r|   index_meta_fieldsft_indexs              r"   r   z"TencentVectorDB._create_collection   s   34 !9:	^^//33D4E4E4P4PQ
566oo1155d6G6G6S6ST677%%  ''-2223; --44:??@PRUV & 

 !!t~~44dnn6P6P !!!!!!++ !!!6!68M8M
  '484D4D T5 T T* $$00JJ1F1F 		(#	$ II%%'')>)>@U@U
 --99 ##))&&//33** : 
 !Us   *L<Lc                    | j                   S r   )r   )r!   s    r"   
embeddingszTencentVectorDB.embeddings  s    """r$   c                    i }|r||d<   |r| j                   j                  |      |d<    | j                  j                  di | y)z%Delete documents from the collection.idsfilterTr.   )r~   Filterr   delete)r!   r   filter_exprkwargsdelete_attrss        r"   r   zTencentVectorDB.delete  sL     "%L%)]]%9%9+%FL"..r$   c                B   t        |      dk(  rt        d      |t        d      t        d      }||t        d      |r#|j                  |dd       }t        |d         }nu|j                  D cg c]  }||j
                  k(  r| }}t        |      s3t        d| d|j                  D cg c]  }|j
                   c}       |d   j                  }|t        |	      }n||_	         | |||||||	|
|
	      }|j                  ||       |S c c}w c c}w )z;Create a collection, indexes it with HNSW, and insert data.r   ztexts is emptyzconnection_params is emptyrE   z1embedding and t_vdb_embedding cannot be both Noner8   ry   rz   )r2   )	r   r   r   r   r   r   r   r   r   )texts	metadatas)lenrI   r   embed_documentsr   r   r   _EmbeddingModel__dimensionsr0   r2   	add_texts)clsr   r   r   r   r   r   r   r   r   r   r   r   rN   r   r2   r}   r   r   	vector_dbs                       r"   
from_textszTencentVectorDB.from_texts)  se   " u:?-..$9::34!8PQQ"2251:>JJqM*I "00"e&6&66 O 
 ' ''8 9 AEATAT Uv!2!2 UVX  (*FFI&;L%.L"/%'+#9#+

	 	%9=7 !Vs   4D0Dc           
        t        |      }t        |      dk(  rt        j                  d       g S | j                  r| j                  j                  |      }ng }g }t        |      }	t        d|	|      D ]  }
g }t        |
|z   |	      }t        |
|d      D ]  }|r||   r| j                  ||         ni }|r||   nd}d|xs1 dj                  t        j                         t        ||         |      i}|r||   |d<   ||   |d<   |j                  |        | j                  j                  d	i |}|j!                  |       |j!                  |d           | j"                  j%                  ||        |S )
z&Insert text data into TencentVectorDB.r   zNothing to insert, skipping.r8   Nrl   z{}-{}-{}r   ro   r.   )listr   loggerdebugr   r   rangemin	_get_metaformattimetime_nshashupdater~   r   appendr   upsert)r!   r   r   r    
batch_sizer   r   r   pkstotal_countstartdocsendrl   rq   doc_id	doc_attrsdocs                     r"   r   zTencentVectorDB.add_textsb  s    Uu:?LL78I,,<<UCJJ%j1k:6 	2EDej(+6CE3* ,5>9R=DNN9R=1VX  %(RT& N!((eBi"M-	 *4R.Ih'$)"I	&!  *,dmm,,9y9C 

9T?+,  OO""41)	2* 
r$   c           	     h     | j                   d|||||d|}|D 	cg c]  \  }}	|	 c}	}S c c}	}w )5Perform a similarity search against the query string.querykparamexprr    r.   )similarity_search_with_score)
r!   r   r   r   r   r    r   resr   _s
             r"   similarity_searchz!TencentVectorDB.similarity_search  sH     0d// 
1Eg
IO
 #&&Q&&&   .c           
         | j                   r3| j                   j                  |      } | j                  d|||||d|S  | j                  dg |||||d|S )APerform a search on a query string and return results with score.r   r   r   r   r    )r   r   r   r   r    r   r.   )r   embed_query&similarity_search_with_score_by_vector)r!   r   r   r   r   r    r   r   s           r"   r   z,TencentVectorDB.similarity_search_with_score  s     ++77>I>4>> #   ;t:: 

 
 	
r$   c           	     h     | j                   d|||||d|}|D 	cg c]  \  }}	|	 c}	}S c c}	}w )r   r   r.   )r   )
r!   r   r   r   r   r    r   r   r   r   s
             r"   similarity_search_by_vectorz+TencentVectorDB.similarity_search_by_vector  sH     ;t:: 
1Eg
QW
 #''Q'''r   c                   |rA|s?t        || j                  xs g D 	cg c]  }	|	j                  s|	j                   c}	      }|r| j                  j                  |      nd| j                  j                  |xs i j                  dd            d||d}
|r2|g|
d<    | j                  j                  di |
j                  d      }n"|g|
d	<    | j                  j                  di |
}g }|t        |      d
k(  r|S |d
   D ]^  }| j                  |      }t        |j                  | j                        |      }||j                  dd      f}|j                  |       ` |S c c}	w )r   Nefr&   r   F)r   r7   retrieve_vectorlimitr    embeddingItems	documentsvectorsr   page_contentrq   scoreg        r.   )ri   r   rC   r>   r~   r   HNSWSearchParamsr   r   searchByTextsearchr   r   r   rp   r   )r!   r   r   r   r   r   r    r   r   fsearch_argsr   retresultmetar   pairs                    r"   r   z6TencentVectorDB.similarity_search_with_score_by_vector  sh    $#$*:*:*@bMAQWWMD 59dmm**40dmm44"8I8I$PR8S4T$
 -2GK()$@DOO$@$@$O;$O$S$S%C '0[K	"($//((7;7C,.;#c(a-J!f 	F>>&)D

4??(CdSCGS12DJJt		
 
5 Ns
   E)
E)
c                    | j                   r5| j                   j                  |      }	 | j                  d|	||||||d|S  | j                  d|||||d|}
|
D cg c]  \  }}|	 c}}S c c}}w )>Perform a search and return results that are reordered by MMR.)r   r   fetch_klambda_multr   r   r    r   r.   )r   r   'max_marginal_relevance_search_by_vectorr   )r!   r   r   r	  r
  r   r   r    r   r   r   r   r   s                r"   max_marginal_relevance_searchz-TencentVectorDB.max_marginal_relevance_search  s     ++77>I?4?? 	#'	 	 	 1t00 
7%dG
OU
 #''Q'''s   A/c                ^   | j                   r>| j                   D ci c](  }|j                  |j                  |j                        * c}S |j                  | j                        rB|j                  | j                        }|r%t	        |t
              rt        j                  |      S i S c c}w )zGet metadata from the result.)r   r>   r   rr   rG   r'   jsonloads)r!   r  r|   raw_metas       r"   r   zTencentVectorDB._get_meta  s     DHDTDTU5EJJ

5:: 66UUZZ++,zz$"5"56HJx5zz(++	 Vs   -B*c	           
        |rA|s?t        || j                  xs g D 
cg c]  }
|
j                  s|
j                   c}
      }| j                  j                  |g|r| j                  j                  |      nd| j                  j                  |xs i j                  dd            d||      }g }g }|d   D ]t  }| j                  |      }t        |j                  | j                        |      }|j                  |       |j                  |j                  | j                               v t        t!        j"                  |      |||	      }|D cg c]  }|d
k7  s	||    c}S c c}
w c c}w )r  Nr   r&   r   T)r   r   r7   r   r   r    r   r   )r   r
  )ri   r   rC   r>   r   r   r~   r   r   r   r   r   rp   r   rn   r   npr   )r!   r   r   r	  r
  r   r   r   r    r   r  r   r   ordered_result_embeddingsr  r  r   new_orderingxs                      r"   r  z7TencentVectorDB.max_marginal_relevance_search_by_vector  sX    $#$*:*:*@bMAQWWMD !% 6 6K154==''-4==11ekr5F5FtR5P1Q  !7 !
 	$&!!f 	LF>>&)D

4??(CdSCS!%,,VZZ8I8I-JK		L 2HHY!:a[
 '3>a2g	!>>/ N. ?s   E,
E,

E1"E1c                    | j                   j                  }|dk(  r| j                  S |dk(  r| j                  S |dk(  r| j                  S t        d| d      )NCOSINEr;   IPzANo supported normalization function for distance metric of type: .)r   r6   _cosine_relevance_score_fn_euclidean_relevance_score_fn%_max_inner_product_relevance_score_fnrI   )r!   r6   s     r"   _select_relevance_score_fnz*TencentVectorDB._select_relevance_score_fnE  sn    ''33("222D 555D ===11<Q@ r$   )r   r   r   r   r   r0   r   r'   r   r'   r   Optional[bool]r   r?   r   Optional[List[MetaField]]r   r?   )r   r'   rR   rS   )rR   r   )NN)r   Optional[List[str]]r   r?   r   r   rR   r  )	NNNrs   rt   Fru   Nrv   )r   	List[str]r   r   r   Optional[List[dict]]r   zOptional[ConnectionParams]r   zOptional[IndexParams]r   r'   r   r'   r   r  r   r?   r   r   r   r?   r   r   rR   rk   )NNi  N)r   zIterable[str]r   r#  r    Optional[int]r   r(   r   r!  r   r   rR   r"  )   NNN)r   r'   r   r(   r   Optional[dict]r   r?   r    r$  r   r   rR   List[Document])r   r'   r   r(   r   r&  r   r?   r    r$  r   r   rR   List[Tuple[Document, float]])r   List[float]r   r(   r   r&  r   r?   r    r$  r   r   rR   r'  )r%  NNNNN)r   r)  r   r(   r   r&  r   r?   r   r?   r    r$  r   r?   r   r   rR   r(  )r%           ?NNN)r   r'   r   r(   r	  r(   r
  floatr   r&  r   r?   r    r$  r   r   rR   r'  )r  r   rR   r   )r%  r*  r+  NNNN)r   zlist[float]r   r(   r	  r(   r
  r,  r   r&  r   r?   r   r?   r    r$  r   r   rR   r'  )rR   zCallable[[float], float])r*   r+   r,   r-   rm   rT   rn   rp   rr   r0   r#   r   propertyr   r   classmethodr   r   r   r   r   r   r  r   r  r  r.   r$   r"   rk   rk      st    Hc L# J$NC$ %0$404#(0J15)69595 ,95 "	95
 95 95 !95 !.95 /95 '95v3
j # #
 $(%)  # 	
 
 
 +/8<.204#(0J15)666 6 (	6
 66 ,6 6 6 !6 !.6 /6 '6 6 
6 6v +/!%#')) () 	)
 ) !) ) 
)\  $"!%'' ' 	'
 ' ' ' 
'$  $"!%

 
 	

 
 
 
 
&
D  $"!%(( ( 	(
 ( ( ( 
($  $" $!%#(( ( 	(
 ( ( ( ( ( 
&(Z   $"!%(( ( 	(
 ( ( ( ( ( 
(<	   $" $!%&?&? &? 	&?
 &? &? &? &? &? &? 
&?Pr$   rk   r   )re   r'   rf   zOptional[Sequence[str]]rR   r'   ).r-   
__future__r   r  loggingr   rN   r   typingr   r   r   r   r	   r
   r   r   r   r   numpyr  langchain_core.documentsr   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   pydanticr   &langchain_community.vectorstores.utilsr   	getLoggerr*   r   META_FIELD_TYPE_UINT64META_FIELD_TYPE_STRINGMETA_FIELD_TYPE_ARRAYMETA_FIELD_TYPE_VECTORrH   r   r0   r=   ri   rk   r.   r$   r"   <module>r>     s    1 "        - 0 - 3  M			8	$ " !  !  	  , 0L	 L: ?C33$;33@xk xr$   