
    3fi;                        d Z ddlmZ ddlZddlZ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d	lmZ  ej2                  e      Z G d
 d      Z G d d      Z G d de      Zy)z)Wrapper around the Baidu vector database.    )annotationsN)AnyDictIterableListOptionalTuple)Document)
Embeddings)guard_import)VectorStore)maximal_marginal_relevancec                  ,    e Zd ZdZ	 	 d	 	 	 	 	 	 	 ddZy)ConnectionParamsa  Baidu VectorDB Connection params.

    See the following documentation for details:
    https://cloud.baidu.com/doc/VDB/s/6lrsob0wy

    Attribute:
        endpoint (str) : The access address of the vector database server
            that the client needs to connect to.
        api_key (str): API key for client to access the vector database server,
            which is used for authentication.
        account (str) : Account for client to access the vector database server.
        connection_timeout_in_mills (int) : Request Timeout.
    c                <    || _         || _        || _        || _        y N)endpointapi_keyaccountconnection_timeout_in_mills)selfr   r   r   r   s        l/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_community/vectorstores/baiduvectordb.py__init__zConnectionParams.__init__$   s!     !+F(    N)rootiP  )r   strr   r   r   r   r   int__name__
__module____qualname____doc__r    r   r   r   r      s?    $ +4
G
G 
G 	
G
 &)
Gr   r   c                  :    e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZy)TableParamszBaidu VectorDB table params.

    See the following documentation for details:
    https://cloud.baidu.com/doc/VDB/s/mlrsob0p6
    Nc                X    || _         || _        || _        || _        || _        || _        y r   )	dimensionreplication	partition
index_typemetric_typeparams)r   r'   r(   r)   r*   r+   r,   s          r   r   zTableParams.__init__8   s0     #&"$&r   )      HNSWL2N)r'   r   r(   r   r)   r   r*   r   r+   r   r,   zOptional[Dict]r   r#   r   r   r%   r%   1   sW      !%  	
   r   r%   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
<   dZ	ded<    e
d      dddf	 	 	 	 	 	 	 	 	 	 	 ddZddZe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)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*dZ	 	 	 	 	 d)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+dZy),BaiduVectorDBzBaidu 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.baidu.com/doc/VDB/index.html
    idr   field_idvectorfield_vectortext
field_textmetadatafield_metadata
vector_idxindex_vector   LangChainDatabaseLangChainTableFc                X   t        d      }t        d      }t        d      }	t        d      | _        t        d      | _        || _        || _        |j                  |	j                  |j                  |j                        |j                  |j                        }
|j                  |
      | _        | j                  j                         }d}|D ]  }||j                  k(  sd} n |r!| j                  j                  |      | _        n | j                  j!                  |      | _        	 | j                  j#                  |      | _        |r-| j                  j'                  |       | j)                  |       y y # |j*                  j,                  $ r | j)                  |       Y y w xY w)	Npymochowzpymochow.configurationzpymochow.auth.bce_credentialszpymochow.model.tablezpymochow.model.enum)credentialsr   r   FT)r   mochowtable
mochowenumembedding_functable_paramsConfigurationBceCredentialsr   r   r   r   MochowClient
vdb_clientlist_databasesdatabase_namedatabasecreate_databasedescribe_tabletable
drop_table_create_table	exceptionServerError)r   	embeddingconnection_paramsrF   rL   
table_namedrop_oldrA   configurationauthconfigdb_listdb_existdbs                 r   r   zBaiduVectorDB.__init__X   s     
+$%=>;<'(>?&'<='(,,++!))+<+D+D '//(9(U(U - 
 #//7//002 	B 0 00	  OO44]CDM OO;;MJDM	+55jADJ((4"":.  !!-- 	+z*	+s   ,AE< <*F)(F)c           
     N   t        d      }d }| j                  j                  j                  j	                         D ]!  \  }}|| j
                  j                  k(  s |}# |t        d      d }| j                  j                  j                  j	                         D ]!  \  }}|| j
                  j                  k(  s |}# |t        d      | j
                  j                  |j                  dd      }n[|j                  | j
                  j                  j                  dd      | j
                  j                  j                  dd            }g }|j                  |j                  | j                  | j                  j                   j"                  d	d	d
d	             |j                  |j                  | j$                  | j                  j                   j&                  | j
                  j(                  d	             |j                  |j                  | j*                  | j                  j                   j"                               |j                  |j                  | j,                  | j                  j                   j"                               g }	|	j                  |j/                  | j0                  || j$                  ||             | j2                  j5                  || j
                  j6                  | j8                  j;                  | j
                  j<                        |j?                  ||	            | _         	 tC        jD                  d       | j2                  jG                  |      }
|
jH                  | j                  jJ                  jL                  k(  ry _)Nzpymochow.model.schemazunsupported index_typezunsupported metric_type      )mefconstructionMefConstructionTF)primary_keypartition_keyauto_incrementnot_null)r'   ri   )
index_namer*   fieldr+   r,   )partition_num)fieldsindexes)rW   r(   r)   schemar.   )'r   rD   	IndexType__members__itemsrF   r*   
ValueError
MetricTyper+   r,   
HNSWParamsgetappendFieldr4   	FieldTypeSTRINGr6   FLOAT_VECTORr'   r8   r:   VectorIndexr<   rM   create_tabler(   rC   	Partitionr)   SchemarP   timesleeprO   state
TableStateNORMAL)r   rW   ro   r*   kvr+   r,   rm   rn   rP   s              r   rR   zBaiduVectorDB._create_table   s$   56
OO--99??A 	DAqD%%000
	 566OO..::@@B 	 DAqD%%111	  677##+&&C&@F&&##**..sB7#0077;;<LcR ' F LL))00 "$  		
 	LL!!))66++55	  	
 	fll4??DOO4M4M4T4TUVLL,,doo.G.G.N.NO	
 ,,%'''  	
 ]]//!))55&&00"//99 1  ===@ 0 

 JJqMMM00<E{{doo88???	 r   c                    | j                   S r   )rE   )r   s    r   
embeddingszBaiduVectorDB.embeddings   s    """r   Nc	                N   t        |      dk(  rt        d      |t        d      	 |j                  |dd       }
t        |
d         }|t        |      }n||_         | ||||||      }|j                  ||       |S # t        $ r |j	                  |d         g}
Y gw xY w)z6Create a table, indexes it with HNSW, and insert data.r   ztexts is emptyzconnection_params is emptyr.   )r'   )rU   rV   rF   rL   rW   rX   )texts	metadatas)lenrs   embed_documentsNotImplementedErrorembed_queryr%   r'   	add_texts)clsr   rU   r   rV   rF   rL   rW   rX   kwargsr   r'   	vector_dbs                r   
from_textszBaiduVectorDB.from_texts   s     u:?-..$9::	;"2251:>J 
1&	&;L%.L"/%'!
	 	%9=! # 	;#//a9:J	;s   B B$#B$c                b   t        |      }	 | j                  j                  |      }t        |      dk(  rt        j                  d       g S g }t        |      }t        d||      D ]  }	g }
t        |	|z   |      }t        |	|d      D ]  }d}|t        j                  ||         }| j                  j                  dj                  t        j                          t#        ||         |      ||   D cg c]  }t%        |       c}||   |      }|
j'                  |       |j'                  t)        |              | j*                  j-                  |
        | j*                  j/                  | j0                         	 t        j2                  d       | j*                  j5                  | j0                        }|j6                  | j8                  j:                  j<                  k(  r	 |S k# t        $ r2 |D cg c]  }| j                  j	                  |       nc c}w }}Y  w xY wc c}w )	z%Insert text data into Baidu VectorDB.r   zNothing to insert, skipping.r.   z{}z{}-{}-{})r3   r5   r7   r9   )rows   )listrE   r   r   r   r   loggerdebugrangeminjsondumpsrC   Rowformatr   time_nshashfloatrw   r   rP   upsertrebuild_indexr<   r   describe_indexr   rD   
IndexStater   )r   r   r   
batch_sizer   r   xpkstotal_countstartr   endr3   r9   numrowindexs                    r   r   zBaiduVectorDB.add_texts   s    U	M,,<<UCJ z?aLL78I*o1k:6 	)EDej(+6CE3* $(#zz)B-8H&&**!((eBi"M2<R.A3E#JAr%	 +  C 

3r7#$ JJ4(!	)$ 	

  !2!23JJqMJJ--d.?.?@E{{doo88???
 5 # 	MFKL$--99!<LLJL	M" Bs#   G. 3H,.H);"HH)(H)c                f     | j                   d||||d|}|D cg c]  \  }}|	 c}}S c c}}w )5Perform a similarity search against the query string.)queryr   paramexprr#   )similarity_search_with_score)	r   r   r   r   r   r   resdoc_s	            r   similarity_searchzBaiduVectorDB.similarity_search  sF     0d// 
1E
8>
 #&&Q&&&   -c                j    | j                   j                  |      } | j                  d||||d|}|S )APerform a search on a query string and return results with score.rU   r   r   r   r#   )rE   r   _similarity_search_with_score)r   r   r   r   r   r   rU   r   s           r   r   z*BaiduVectorDB.similarity_search_with_score,  sI     ''33E:	0d00 
1E
@F
 
r   c                f     | j                   d||||d|}|D cg c]  \  }}|	 c}}S c c}}w )r   r   r#   )r   )	r   rU   r   r   r   r   r   r   r   s	            r   similarity_search_by_vectorz)BaiduVectorDB.similarity_search_by_vector<  sF     1d00 
1E
@F
 #&&Q&&&r   c           	        |dn|j                  dd      }| j                  j                  | j                  |D cg c]  }t	        |       c}| j                  j                  ||      |      }| j                  j                  |      }	|	j                  D 
cg c]  }
|
g }}
g }|t        |      dk(  r|S |D ]  }|D ]  }|j                  di       }|j                  | j                        }|t        j                  |      }t        |j                  | j                        |      }||j                  d	d
      f}|j                  |         |S c c}w c c}
w )r   
   efr   limitvector_fieldvector_floatsr,   filter)annsr   r   page_contentr9   scoreg        )rv   rC   	AnnSearchr6   r   HNSWSearchParamsrP   searchr   r   r:   r   loadsr
   r8   rw   )r   rU   r   r   r   r   r   r   r   r   itemr   retr   resultrow_datametar   pairs                      r   r   z+BaiduVectorDB._similarity_search_with_scoreJ  s]    =Reiib&9))**1:;#5:;##44!4D	 * 
 jjT*#&88,4,,,.<3t9>J 
	!C 	!!::eR0||D$7$78#::d+D!)doo!> VZZ56

4 	!
	! 
- < -s   E

E c           
     j    | j                   j                  |      } | j                  d||||||d|S )>Perform a search and return results that are reordered by MMR.)rU   r   fetch_klambda_multr   r   r#   )rE   r   _max_marginal_relevance_search)	r   r   r   r   r   r   r   r   rU   s	            r   max_marginal_relevance_searchz+BaiduVectorDB.max_marginal_relevance_searcho  sP     ''33E:	2t22 
#
 
 	
r   c           	        |dn|j                  dd      }| j                  j                  | j                  |D 	cg c]  }	t	        |	       c}	| j                  j                  ||      |      }
| j                  j                  |
d      }g }g }|j                  D cg c]  }|g }}|t        |      dk(  r|S |D ]  }|D ]  }|j                  di       }|j                  | j                        }|t        j                  |      }t        |j                  | j                        |	      }|j                  |       |j                  |j                  | j                                 t!        t#        j$                  |      |||
      }g }|D ]  }|dk(  r |S |j                  ||            |S c c}	w c c}w )r   r   r   r   r   T)r   retrieve_vectorr   r   r   )r   r   )rv   rC   r   r6   r   r   rP   r   r   r   r:   r   r   r
   r8   rw   r   nparray)r   rU   r   r   r   r   r   r   r   r   r   r   	documentsordered_result_embeddingsr   r   r   r   r   r   r   new_orderingr   r   s                           r   r   z,BaiduVectorDB._max_marginal_relevance_search  s    =Reiib&9))**1:;#5:;##44!4D	 * 
 jjT4@ %'	$&!#&88,4,,<3t9> 
	RC 	R!::eR0||D$7$78#::d+D!)doo!>   %)00d>O>O1PQ	R
	R 2HHY!:a[
  	)ABw 
 

9Q<(	) 
G < -s   F;
!
G )rU   r   rV   r   rF   r%   rL   r   rW   r   rX   Optional[bool])rW   r   returnNone)r   r   )NNNr>   r?   F)r   	List[str]rU   r   r   Optional[List[dict]]rV   zOptional[ConnectionParams]rF   zOptional[TableParams]rL   r   rW   r   rX   r   r   r   r   r2   )Ni  )
r   zIterable[str]r   r   r   r   r   r   r   r   )   NN)r   r   r   r   r   Optional[dict]r   Optional[str]r   r   r   List[Document])r   r   r   r   r   r   r   r   r   r   r   List[Tuple[Document, float]])rU   List[float]r   r   r   r   r   r   r   r   r   r   )rU   r   r   r   r   r   r   r   r   r   r   r   )r      g      ?NN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rU   zlist[float]r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r    r!   r"   r4   __annotations__r6   r8   r:   r<   r%   r   rR   propertyr   classmethodr   r   r   r   r   r   r   r   r#   r   r   r2   r2   I   sc    Hc L# J$NC$$L#$ %0$40*#((+(+ ,(+ "	(+
 (+ (+ !(+TDL # # 
 +/8<.20*#(## # (	#
 6# ,# # # !# # 
# #P +/	** (* 	*
 * 
*^  $"'' ' 	'
 ' ' 
'"  $"  	
   
&&  $"'' ' 	'
 ' ' 
'"  $"## # 	#
 # # 
&#P   $"

 
 	

 
 
 
 
 

2   $"11 1 	1
 1 1 1 1 
1r   r2   )r"   
__future__r   r   loggingr   typingr   r   r   r   r   r	   numpyr   langchain_core.documentsr
   langchain_core.embeddingsr   langchain_core.utilsr   langchain_core.vectorstoresr   &langchain_community.vectorstores.utilsr   	getLoggerr   r   r   r%   r2   r#   r   r   <module>r      sb    / "    = =  - 0 - 3 M			8	$G G8 0mK mr   