§
    šŠtj;  ã                  óÊ   — d dl mZ d dl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 d dlmZ d dlmZ d dlmZ erd dlZ ej        e¦  «        Zdd„Z G d„ de¦  «        ZdS )é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚIterableÚListÚOptionalÚTupleÚType)ÚDocument)Ú
Embeddings)ÚVectorStoreÚvectorúList[float]ÚreturnÚbytesc                óF   — t          j        dt          | ¦  «        z  g| ¢R Ž S )zÈSerializes a list of floats into a compact "raw bytes" format

    Source: https://github.com/asg017/sqlite-vec/blob/21c5a14fc71c83f135f5b00c84115139fd12c492/examples/simple-python/demo.py#L8-L10
    z%sf)ÚstructÚpackÚlen)r   s    úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/sqlitevec.pyÚserialize_f32r      s'   € õ
 Œ;�u�s 6™{œ{Ñ*Ð4¨VÐ4Ð4Ð4Ð4ó    c                  ó¢   — e Zd ZdZ	 d)d*d
„Zd+d„Z	 d,d-d„Z	 d.d/d„Z	 d.d0d„Z	 d.d1d „Z		 d.d2d!„Z
e	 	 	 d3d4d%„¦   «         Zed5d'„¦   «         Zd6d(„ZdS )7Ú	SQLiteVecaL  SQLite with Vec extension as a vector database.

    To use, you should have the ``sqlite-vec`` python package installed.
    Example:
        .. code-block:: python
            from langchain_community.vectorstores import SQLiteVec
            from langchain_community.embeddings.openai import OpenAIEmbeddings
            ...
    úvec.dbÚtableÚstrÚ
connectionúOptional[sqlite3.Connection]Ú	embeddingr   Údb_filec                ó  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|s|                      |¦  «        }t          |t          ¦  «        st          j        d¦  «         || _        || _        || _	        |  
                    ¦   «          dS )z1Initialize with sqlite client with vss extension.r   Nz\Could not import sqlite-vec python package. Please install it with `pip install sqlite-vec`.z+embeddings input must be Embeddings object.)Ú
sqlite_vecÚImportErrorÚcreate_connectionÚ
isinstancer   ÚwarningsÚwarnÚ_connectionÚ_tableÚ
_embeddingÚcreate_table_if_not_exists)Úselfr   r   r    r!   r#   s         r   Ú__init__zSQLiteVec.__init__.   s¸   € ð	ØÐÐÐÐøÝð 	ð 	ð 	ÝðCñô ð ð	øøøð ð 	9Ø×/Ò/°Ñ8Ô8ˆJå˜)¥ZÑ0Ô0ð 	IÝŒMÐGÑHÔHÐHà%ˆÔØˆŒØ#ˆŒà×'Ò'Ñ)Ô)Ð)Ð)Ð)s   ‚ ‡!r   ÚNonec           	     óT  — | j                              d| j        › d�¦  «         | j                              d| j        › d|                      ¦   «         › d�¦  «         | j                              d| j        › d| j        › d| j        › d	�¦  «         | j                              ¦   «          d S )
Nz(
            CREATE TABLE IF NOT EXISTS zÎ
            (
                rowid INTEGER PRIMARY KEY AUTOINCREMENT,
                text TEXT,
                metadata BLOB,
                text_embedding BLOB
            )
            ;
            z0
            CREATE VIRTUAL TABLE IF NOT EXISTS za_vec USING vec0(
                rowid INTEGER PRIMARY KEY,
                text_embedding float[z*]
            )
            ;
            z.
                CREATE TRIGGER IF NOT EXISTS z-_embed_text 
                AFTER INSERT ON z7
                BEGIN
                    INSERT INTO z�_vec(rowid, text_embedding)
                    VALUES (new.rowid, new.text_embedding) 
                    ;
                END;
            )r)   Úexecuter*   Úget_dimensionalityÚcommit)r-   s    r   r,   z$SQLiteVec.create_table_if_not_existsJ   sú   € ØÔ× Ò ð	Ø(,¬ð	ð 	ð 	ñ	
ô 	
ð 	
ð 	Ô× Ò ðØ04´ðð ð '+×&=Ò&=Ñ&?Ô&?ðð ð ñ	
ô 	
ð 	
ð 	Ô× Ò ðØ.2¬kðð à!%¤ðð ð "&¤ð	ð ð ñ
	
ô 
	
ð 
	
ð 	Ô×ÒÑ!Ô!Ð!Ð!Ð!r   NÚtextsúIterable[str]Ú	metadatasúOptional[List[dict]]Úkwargsr   ú	List[str]c                óú  — | j                              d| j        › �¦  «                             ¦   «         d         }|€d}| j                             t          |¦  «        ¦  «        }|sd„ |D ¦   «         }d„ t          |||¦  «        D ¦   «         }| j                              d| j        › d�|¦  «         | j          	                    ¦   «          | j                              d	| j        › d
|› �¦  «        }d„ |D ¦   «         S )a  Add more texts to the vectorstore index.
        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            kwargs: vectorstore specific parameters
        z SELECT max(rowid) as rowid FROM ÚrowidNr   c                ó   — g | ]}i ‘ŒS © r=   )Ú.0Ú_s     r   ú
<listcomp>z'SQLiteVec.add_texts.<locals>.<listcomp>�   s   € Ð+Ð+Ð+ ˜Ð+Ð+Ð+r   c                ó^   — g | ]*\  }}}|t          j        |¦  «        t          |¦  «        f‘Œ+S r=   )ÚjsonÚdumpsr   )r>   ÚtextÚmetadataÚembeds       r   r@   z'SQLiteVec.add_texts.<locals>.<listcomp>‚   sG   € ð 
ð 
ð 
á%��h ð •4”:˜hÑ'Ô'­°uÑ)=Ô)=Ð>ð
ð 
ð 
r   zINSERT INTO z/(text, metadata, text_embedding) VALUES (?,?,?)zSELECT rowid FROM z WHERE rowid > c                ó   — g | ]
}|d          ‘ŒS )r;   r=   )r>   Úrows     r   r@   z'SQLiteVec.add_texts.<locals>.<listcomp>�   s   € Ð0Ð0Ð0 ��G”Ð0Ð0Ð0r   )
r)   r1   r*   Úfetchoner+   Úembed_documentsÚlistÚzipÚexecutemanyr3   )r-   r4   r6   r8   Úmax_idÚembedsÚ
data_inputÚresultss           r   Ú	add_textszSQLiteVec.add_textsm   s/  € ð Ô!×)Ò)Ø<¨t¬{Ð<Ð<ñ
ô 
ç
Š(‰*Œ*�Wôˆð ˆ>ØˆFà”×0Ò0µ°e±´Ñ=Ô=ˆØð 	,Ø+Ð+ UÐ+Ñ+Ô+ˆIð
ð 
å),¨U°I¸vÑ)FÔ)Fð
ñ 
ô 
ˆ
ð 	Ô×$Ò$ØW˜4œ;ÐWÐWÐWØñ	
ô 	
ð 	
ð 	Ô×ÒÑ!Ô!Ð!àÔ"×*Ò*ØE ¤ÐEÐE¸VÐEÐEñ
ô 
ˆð 1Ð0¨Ð0Ñ0Ô0Ð0r   é   r   ÚkÚintúList[Tuple[Document, float]]c                ó~  — d| j         › d| j         › d�}| j                             ¦   «         }|                     |t	          |¦  «        |g¦  «         |                     ¦   «         }g }|D ]R}t          j        |d         ¦  «        pi }	t          |d         |	¬¦  «        }
| 	                    |
|d         f¦  «         ŒS|S )Nzo
            SELECT 
                text,
                metadata,
                distance
            FROM z AS e
            INNER JOIN zœ_vec AS v on v.rowid = e.rowid  
            WHERE
                v.text_embedding MATCH ?
                AND k = ?
            ORDER BY distance
        rE   rD   )Úpage_contentrE   Údistance)
r*   r)   Úcursorr1   r   ÚfetchallrB   Úloadsr   Úappend)r-   r    rT   r8   Ú	sql_queryrZ   rQ   Ú	documentsrH   rE   Údocs              r   Ú&similarity_search_with_score_by_vectorz0SQLiteVec.similarity_search_with_score_by_vector‘   sè   € ðð
 ”+ðð ð œðð ð ˆ	ð Ô!×(Ò(Ñ*Ô*ˆØ�ŠØÝ˜9Ñ%Ô% qÐ)ñ	
ô 	
ð 	
ð —/’/Ñ#Ô#ˆàˆ	Øð 	5ð 	5ˆCÝ”z # j¤/Ñ2Ô2Ð8°bˆHÝ¨¨F¬¸hÐGÑGÔGˆCØ×Ò˜c 3 z¤?Ð3Ñ4Ô4Ð4Ð4àÐr   ÚqueryúList[Document]c                ó|   — | j                              |¦  «        }|                      ||¬¦  «        }d„ |D ¦   «         S )ú"Return docs most similar to query.©r    rT   c                ó   — g | ]\  }}|‘ŒS r=   r=   ©r>   r`   r?   s      r   r@   z/SQLiteVec.similarity_search.<locals>.<listcomp>·   ó   € Ð,Ð,Ð,™˜˜Q�Ð,Ð,Ð,r   ©r+   Úembed_queryra   ©r-   rb   rT   r8   r    r_   s         r   Úsimilarity_searchzSQLiteVec.similarity_search¯   sO   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r   c                óh   — | j                              |¦  «        }|                      ||¬¦  «        }|S )re   rf   rj   rl   s         r   Úsimilarity_search_with_scorez&SQLiteVec.similarity_search_with_score¹   sA   € ð ”O×/Ò/°Ñ6Ô6ˆ	Ø×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð Ðr   c                óH   — |                       ||¬¦  «        }d„ |D ¦   «         S )Nrf   c                ó   — g | ]\  }}|‘ŒS r=   r=   rh   s      r   r@   z9SQLiteVec.similarity_search_by_vector.<locals>.<listcomp>É   ri   r   )ra   )r-   r    rT   r8   r_   s        r   Úsimilarity_search_by_vectorz%SQLiteVec.similarity_search_by_vectorÃ   s:   € ð ×?Ò?Ø 1ð @ñ 
ô 
ˆ	ð -Ð, )Ð,Ñ,Ô,Ð,r   Ú	langchainÚclsúType[SQLiteVec]c                ó|   — |                       |¦  «        } | ||||¬¦  «        }|                     ||¬¦  «         |S )z9Return VectorStore initialized from texts and embeddings.)r   r   r!   r    )r4   r6   )r%   rR   )	rt   r4   r    r6   r   r!   r8   r   Úvecs	            r   Ú
from_textszSQLiteVec.from_textsË   sS   € ð ×*Ò*¨7Ñ3Ô3ˆ
ØˆcØ J¸È9ð
ñ 
ô 
ˆð 	�Š˜E¨YˆÑ7Ô7Ð7Øˆ
r   úsqlite3.Connectionc                óÌ   — dd l }dd l} |j        | ¦  «        }|j        |_        |                     d¦  «         |                     |¦  «         |                     d¦  «         |S )Nr   TF)Úsqlite3r#   ÚconnectÚRowÚrow_factoryÚenable_load_extensionÚload)r!   r{   r#   r   s       r   r%   zSQLiteVec.create_connectionÝ   sr   € àˆˆˆàÐÐÐà$�W”_ WÑ-Ô-ˆ
Ø!(¤ˆ
ÔØ×(Ò(¨Ñ.Ô.Ð.Ø�Š˜
Ñ#Ô#Ð#Ø×(Ò(¨Ñ/Ô/Ð/ØÐr   c                óX   — d}| j                              |¦  «        }t          |¦  «        S )z£
        Function that does a dummy embedding to figure out how many dimensions
        this embedding function returns. Needed for the virtual table DDL.
        zThis is a dummy text)r+   rk   r   )r-   Ú
dummy_textÚdummy_embeddings      r   r2   zSQLiteVec.get_dimensionalityê   s,   € ð
 ,ˆ
Øœ/×5Ò5°jÑAÔAˆÝ�?Ñ#Ô#Ð#r   )r   )r   r   r   r   r    r   r!   r   )r   r/   )N)r4   r5   r6   r7   r8   r   r   r9   )rS   )r    r   rT   rU   r8   r   r   rV   )rb   r   rT   rU   r8   r   r   rc   )rb   r   rT   rU   r8   r   r   rV   )r    r   rT   rU   r8   r   r   rc   )Nrs   r   )rt   ru   r4   r9   r    r   r6   r7   r   r   r!   r   r8   r   r   r   )r!   r   r   ry   )r   rU   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   r,   rR   ra   rm   ro   rr   Úclassmethodrx   Ústaticmethodr%   r2   r=   r   r   r   r   #   sL  € € € € € ðð ð  ð*ð *ð *ð *ð *ð8!"ð !"ð !"ð !"ðL +/ð"1ð "1ð "1ð "1ð "1ðJ 01ðð ð ð ð ð> $%ð-ð -ð -ð -ð -ð $%ðð ð ð ð ð 01ð-ð -ð -ð -ð -ð ð
 +/Ø Øðð ð ð ñ „[ðð" ð
ð 
ð 
ñ „\ð
ð$ð $ð $ð $ð $ð $r   r   )r   r   r   r   )Ú
__future__r   rB   Úloggingr   r'   Útypingr   r   r   r   r   r	   r
   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.vectorstoresr   r{   Ú	getLoggerr„   Úloggerr   r   r=   r   r   ú<module>r’      sB  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3àð Ø€N€N€Nà	ˆÔ	˜8Ñ	$Ô	$€ð5ð 5ð 5ð 5ðN$ð N$ð N$ð N$ð N$�ñ N$ô N$ð N$ð N$ð N$r   