o
    ZhM                     @  s   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mZmZ d dlZd dlmZ d dlmZ d dlmZ erBd dlZdZG dd	 d	eZdS )
    )annotationsN)TYPE_CHECKINGAnyDictIterableListOptionalTupleType)Document)
Embeddings)VectorStore   c                   @  s  e Zd ZdZdZdZdeeefdKddZedLddZe	deeefdMddZ
e	ddeeefdNd"d#Zd$d%d
d&d'd
d&gfdOd+d,Z	$dPdQd-d.Z	dRdSd0d1ZdTd2d3Ze	deeefdUd4d5ZefdVd8d9ZefdWd;d<ZefdXd>d?Z	@dYdXdAdBZ	dRdZdFdGZ	dRd[dIdJZdS )\VearchZlangchain_vearchZcluster_client_db   Nembedding_functionr   path_or_urlOptional[str]
table_namestrdb_nameflagintkwargsr   returnNonec                 K  s:  z|rddl }nddl}W n ty   tdw |rF|du r#td|s9| j}|d7 }|tt dd 7 }|| _	|| _
||| _n6|du rSt dd	}	n|}	tj|	s`t|	 tj|	d
}
tj|
srt|
 ||	|
| _|	| _|s| j}|d7 }|tt dd 7 }|| _|| _|| _dS )zSInitialize vearch vector store
        flag 1 for cluster,0 for standalone
        r   NzhCould not import suitable python package. Please install it with `pip install vearch or vearch_cluster`.zPlease input url of cluster_-\/log)vearch_clustervearchImportError
ValueError_DEFAULT_CLUSTER_DB_NAMEr   uuiduuid4splitusing_db_nameurlZVearchClusterosgetcwdreplacepathisdirmakedirsjoinZEngineusing_metapath_DEFAULT_TABLE_NAMEusing_table_nameembedding_funcr   )selfr   r   r   r   r   r   r"   r#   Zmetadata_pathlog_path r9   ^/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/vectorstores/vearch.py__init__   sJ   



zVearch.__init__Optional[Embeddings]c                 C  s   | j S N)r6   r7   r9   r9   r:   
embeddingsN   s   zVearch.embeddingsclsType[Vearch]	documentsList[Document]	embeddingc           
   
   K  s<   dd |D }dd |D }	| j d|||	||||d|S )Return Vearch VectorStorec                 S     g | ]}|j qS r9   )page_content.0dr9   r9   r:   
<listcomp>_       z)Vearch.from_documents.<locals>.<listcomp>c                 S  rF   r9   )metadatarH   r9   r9   r:   rK   `   rL   )textsrD   	metadatasr   r   r   r   Nr9   )
from_texts)
r@   rB   rD   r   r   r   r   r   rN   rO   r9   r9   r:   from_documentsR   s   zVearch.from_documentsrN   	List[str]rO   Optional[List[dict]]c           
      K  s&   | ||||||d}	|	j ||d |	S )rE   )r   rD   r   r   r   r   )rN   rO   )	add_texts)
r@   rN   rD   rO   r   r   r   r   r   	vearch_dbr9   r9   r:   rP   m   s   zVearch.from_texts   textfieldtyperM   dim
field_list
List[dict]c              
     sr   t jjt jjd dddddd} fdd	|D }t jd
t jjd|ddddidd}| j j|| j||d}|S )z
        Create VectorStore Table
        Args:
            dim:dimension of vector
            fields_list: the field you want to store
        Return:
            code,0 for success,1 for failed
        )r   r   i'  ZIVFPQi       )Z
ncentroidsZ
nsubvector)
index_sizeretrieval_typeretrieval_paramc                   s$   g | ]}t |d   |d  qS rX   )r#   ZGammaFieldInfo)rI   fiZ	type_dictr9   r:   rK      s    z(Vearch._create_table.<locals>.<listcomp>text_embeddingT 
MemoryOnlyZ
cache_sizeF)namerZ   Zis_index	dimensionZmodel_id
store_typeZstore_paramZ
has_source)rg   fieldsvector_field)r#   ZdataTypeINTSTRINGZGammaVectorInfoZVECTORZcreate_tabler5   )r7   r[   r\   Zengine_inforj   rk   response_coder9   rc   r:   _create_table   s2   

zVearch._create_tablec                 C  sN   | j dddddddidddiddid	d
|dddd}| j| j|}|S )z
        Create VectorStore space
        Args:
            dim:dimension of vector
        Return:
            code,0 failed for ,1 for success
        r   gammaZFLATmetric_typeZL2)rg   r_   r`   ra   rZ   stringvectorTrf   )rZ   indexrh   ri   )rW   rM   rd   )rg   Zpartition_numZreplica_numZengine
properties)r5   r#   Zcreate_spacer*   )r7   r[   Zspace_configrn   r9   r9   r:   _create_space   s,   
zVearch._create_spaceIterable[str]c                 K  sl  d}| j dur| j t|}|du rtd| jr| j }| j|vr1| j| j}|s1td| j	| j}| j
|vrL| t|d }|sLtdg }	|dur|durt|||D ]M\}
}}i }|
|d< |d |d< t|}d	|tj|  i|d
< | j| j| j
|}|d dkr|	|d  q\| j| j| j
|}|	|d  q\|	S tj| j| j
d }tj|st|d }| |}|rtd|dur4|dur4g }t|||D ]%\}
}}i }|
|d< |d |d< t|}|tj| |d
< || q| j|}	d}t|	t|kr/td |dkr"n|d7 }t|	t|ks| j  |	S )z^
        Returns:
            List of ids from adding the texts into the vectorstore.
        Nzembeddings is Nonezcreate db failed!!!r   zcreate space failed!!!rW   sourcerM   featurerd   status   _id.schemazcreate table failed!!!g      ?   r   )r6   Zembed_documentslistr%   r   r#   Zlist_dbsr*   Z	create_dbZlist_spacesr5   rv   lenzipnparraylinalgnormtolistZ
insert_oneappendr,   r/   r2   r3   existsro   addtimesleepdump)r7   rN   rO   r   r?   Zdbs_listZcreate_db_codeZ
space_listZcreate_space_codeZdocidrW   rM   embedZprofilesZembed_npZ
insert_resZretry_insert
table_pathr[   rn   Z	doc_itemsZ
profiles_vZt_timer9   r9   r:   rT      s   












zVearch.add_textsc                 C  s   | j   dS )z:
        load vearch engine for standalone vearch
        N)r#   loadr>   r9   r9   r:   _load*  s   zVearch._loadc           	      K  s\   |st d|st dtj||d }tj|st d| |||||d}|  |S )zLoad the local specified table of standalone vearch.
        Returns:
            Success or failure of loading the local specified table
        zNo metadata path!!!zNo table name!!!r}   z$vearch vectorbase table not exist!!!)r   r   r   r   r   )r%   r,   r/   r2   r   r   )	r@   rD   r   r   r   r   r   r   rU   r9   r9   r:   
load_local0  s    zVearch.load_localquerykc                 K  s.   | j du r	td| j |}| ||}|S )z5
        Return docs most similar to query.

        Nembedding_func is None!!!)r6   r%   embed_querysimilarity_search_by_vector)r7   r   r   r   r?   docsr9   r9   r:   similarity_searchP  s
   

zVearch.similarity_searchList[float]c                 K  s  t |}| jr/dd|t j|  dgi|ddgd}| j| j| j	|}|d d }n!d|t j| dgg dd	d
d|d}| j|}|d d }g }|D ]/}	d}
i }| jra|	d }	|	D ]}|dkrn|	| }
qc|dkry|	| |d< qcqc|
t|
|d qT|S )  The most k similar documents and scores of the specified query.
        Args:
            embeddings: embedding vector of the query.
            k: The k most similar documents to the text query.
            min_score: the score of similar documents to the text query
        Returns:
            The k most similar documents to the specified text query.
            0 is dissimilar, 1 is the most similar.
        sumrd   rY   ry   rW   rM   r   sizerj   hitsr   InnerProduct   rq   Znprobers   rj   Zis_brute_searchra   Ztopnr   result_itemsre   _sourcerx   rG   rM   )r   r   r   r   r   r   r#   searchr*   r5   r   r   )r7   rD   r   r   r   
query_dataquery_resultresr   itemcontent	meta_dataitem_keyr9   r9   r:   r   `  sT   

z"Vearch.similarity_search_by_vectorList[Tuple[Document, float]]c                 K  sV  | j du r	td| j |}t|}| jr>dd|tj|  dgi|g dd}| j	
| j| j|}|d d }n!d|tj| dgg d	d
dd|d}| j	
|}|d d }g }	|D ]E}
d}i }| jrt|
d }|
d }
|
D ]$}|dkr|
| }qv|dkr|
| |d< qv| jd	kr|dkr|
| }qvqvt||d|f}|	| qc|	S )r   Nr   r   rd   r   )rd   rW   rM   r   r   r   r   r   r   r   r   r   re   Z_scorer   rW   rM   rx   scorer   )r6   r%   r   r   r   r   r   r   r   r#   r   r*   r5   r   r   )r7   r   r   r   r?   r   r   r   r   resultsr   r   r   r   r   tmp_resr9   r9   r:   similarity_search_with_score  sd   


z#Vearch.similarity_search_with_scorer   c                 K  s   | j ||fi |S r=   )r   )r7   r   r   r   r9   r9   r:   (_similarity_search_with_relevance_scores  s   z/Vearch._similarity_search_with_relevance_scoresidsOptional[List[str]]Optional[bool]c                 K  sr   d}g }|du s|  dkr|S |D ]}| jr"| j| j| j|}n| j|}|| qtdd |D }|S )aI  Delete the documents which have the specified ids.

        Args:
            ids: The ids of the embedding vectors.
            **kwargs: Other keyword arguments that subclasses might use.
        Returns:
            Optional[bool]: True if deletion is successful.
            False otherwise, None if not implemented.
        Nr   c                 s  s    | ]}|d kV  qdS )r   Nr9   )rI   ir9   r9   r:   	<genexpr>	  s    z Vearch.delete.<locals>.<genexpr>)	__len__r   r#   deleter*   r5   Zdel_docr   all)r7   r   r   retr   r|   r9   r9   r:   r     s   zVearch.deleteDict[str, Document]c                 K  s*  i }|du s|  dkr|S | jr\dd|ii}| j| j| j|}|D ]6}|d du r,q#d}i }|d D ]}	|	d	krA|d |	 }q4|	d
krN|d |	 |d< q4q4t||d||d < q#|S |D ]4}
| j|
}|i krkq^d}i }|D ]}	|	d	kr|||	 }qq|	d
kr||	 |d< qqqqt||d||d < q^|S )zReturn docs according ids.

        Args:
            ids: The ids of the embedding vectors.
        Returns:
            Documents which satisfy the input conditions.
        Nr   r   r   foundFre   r   rW   rM   rx   r   r|   )r   r   r#   Zmget_by_idsr*   r5   r   Zget_doc_by_id)r7   r   r   r   r   Zdocs_detailrecordr   Z	meta_inforY   idr9   r9   r:   get  sV   
z
Vearch.get)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r<   )r@   rA   rB   rC   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   )r@   rA   rN   rR   rD   r   rO   rS   r   r   r   r   r   r   r   r   r   r   r   r   )r[   r   r\   r]   r   r   )rV   )r[   r   r   r   r=   )rN   rw   rO   rS   r   r   r   rR   )r   r   )rD   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rC   )rD   r   r   r   r   r   r   rC   )r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   )r   r   r   r   r   r   )__name__
__module____qualname__r4   r&   Z_DEFAULT_VERSIONr;   propertyr?   classmethodrQ   rP   ro   rv   rT   r   r   DEFAULT_TOPNr   r   r   r   r   r   r9   r9   r9   r:   r      sh    6/-
M"CK
r   )
__future__r   r,   r   r'   typingr   r   r   r   r   r   r	   r
   numpyr   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   r#   r   r   r9   r9   r9   r:   <module>   s    (