§
    šŠtjØ  ã                  ó0  — d dl mZ d dlZd dlZd dl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 m!Z! d d
l"m#Z# d dl$m%Z%m&Z&  ej'        e(¦  «        Z)ddd„Z*dd„Z+ G d„ de¦  «        Z,dS )é    )ÚannotationsN)ÚPath)
ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSequenceÚSizedÚTupleÚUnion©ÚDocument)Ú
Embeddings)Úrun_in_executor)ÚVectorStore)ÚAddableMixinÚDocstore)ÚInMemoryDocstore)ÚDistanceStrategyÚmaximal_marginal_relevanceÚno_avx2úOptional[bool]Úreturnr   c                óÀ   — | €/dt           j        v r!t          t          j        d¦  «        ¦  «        } 	 | rddlm} nddl}n# t          $ r t          d¦  «        ‚w xY w|S )aM  
    Import faiss if available, otherwise raise error.
    If FAISS_NO_AVX2 environment variable is set, it will be considered
    to load FAISS with no AVX2 optimization.

    Args:
        no_avx2: Load FAISS strictly with no AVX2 optimization
            so that the vectorstore is portable and compatible with other devices.
    NÚFAISS_NO_AVX2r   )Ú	swigfaissz¨Could not import faiss python package. Please install it with `pip install faiss-gpu` (for CUDA supported GPU) or `pip install faiss-cpu` (depending on Python version).)ÚosÚenvironÚboolÚgetenvÚfaissr   ÚImportError)r   r#   s     úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/faiss.pyÚdependable_faiss_importr&   '   s’   € ð €˜?­b¬jÐ8Ð8Ý•r”y Ñ1Ô1Ñ2Ô2ˆð

Øð 	Ø0Ð0Ð0Ð0Ð0Ð0Ð0àˆLˆLˆLøøÝð 
ð 
ð 
ÝðHñ
ô 
ð 	
ð
øøøð €Ls   ³A ÁAÚxÚyÚx_nameÚstrÚy_nameÚNonec                ó  — t          | t          ¦  «        rot          |t          ¦  «        rZt          | ¦  «        t          |¦  «        k    r:t          |› d|› d|› dt          | ¦  «        › d|› dt          |¦  «        › �¦  «        ‚d S )Nz and z% expected to be equal length but len(z)=z	 and len()Ú
isinstancer   ÚlenÚ
ValueError)r'   r(   r)   r+   s       r%   Ú_len_check_if_sizedr1   B   s¹   € Ý�!•UÑÔð 
¥
¨1­eÑ 4Ô 4ð 
½¸Q¹¼Å3ÀqÁ6Ä6Ò9IÐ9IÝØð Að A˜Fð Að AØðAð AÝ  ™VœVðAð AØ.4ðAð AÝ8;¸A¹¼ðAð Añ
ô 
ð 	
ð €Fó    c                  óÞ  — e Zd ZdZddej        fdod„Zedpd„¦   «         Zdqd„Z	dqd„Z
drd„Zdrd„Z	 	 dsdtd'„Z	 	 dsdud*„Z	 	 dsdud+„Z	 	 dsdvd.„Z	 	 	 dwdxd8„Z	 	 	 dwdxd9„Z	 	 	 dwdyd;„Z	 	 	 dwdyd<„Z	 	 	 dwdzd?„Z	 	 	 dwd{d@„Z	 	 	 dwd|dA„Z	 	 	 dwd|dB„Zd/d0dCddDœd}dG„Zd/d0dCddDœd}dH„Z	 	 	 	 d~ddI„Z	 	 	 	 d~ddJ„Z	 	 	 	 d~d€dK„Z	 	 	 	 d~d€dL„Zd�d‚dN„ZdƒdQ„Z e!dddej        fd„dS„¦   «         Z"e!	 	 dsd…dT„¦   «         Z#e!	 	 dsd†dV„¦   «         Z$e!	 	 dsd‡dW„¦   «         Z%e!	 	 dsd‡dX„¦   «         Z&dˆd‰d[„Z'e!	 dˆdd\d]œdŠd`„¦   «         Z(d‹db„Z)e!ddcœdŒde„¦   «         Z*d�dg„Z+	 	 	 dwdydh„Z,	 	 	 dwdydi„Z-e.dŽdk„¦   «         Z/d�dn„Z0dS )�ÚFAISSuÇ  FAISS vector store integration.

    See [The FAISS Library](https://arxiv.org/pdf/2401.08281) paper.

    Setup:
        Install ``langchain_community`` and ``faiss-cpu`` python packages.

        .. code-block:: bash

            pip install -qU langchain_community faiss-cpu

    Key init args â€” indexing params:
        embedding_function: Embeddings
            Embedding function to use.

    Key init args â€” client params:
        index: Any
            FAISS index to use.
        docstore: Docstore
            Docstore to use.
        index_to_docstore_id: Dict[int, str]
            Mapping of index to docstore id.

    Instantiate:
        .. code-block:: python

            import faiss
            from langchain_community.vectorstores import FAISS
            from langchain_community.docstore.in_memory import InMemoryDocstore
            from langchain_openai import OpenAIEmbeddings

            index = faiss.IndexFlatL2(len(OpenAIEmbeddings().embed_query("hello world")))

            vector_store = FAISS(
                embedding_function=OpenAIEmbeddings(),
                index=index,
                docstore= InMemoryDocstore(),
                index_to_docstore_id={}
            )

    Add Documents:
        .. code-block:: python

            from langchain_core.documents import Document

            document_1 = Document(page_content="foo", metadata={"baz": "bar"})
            document_2 = Document(page_content="thud", metadata={"bar": "baz"})
            document_3 = Document(page_content="i will be deleted :(")

            documents = [document_1, document_2, document_3]
            ids = ["1", "2", "3"]
            vector_store.add_documents(documents=documents, ids=ids)

    Delete Documents:
        .. code-block:: python

            vector_store.delete(ids=["3"])

    Search:
        .. code-block:: python

            results = vector_store.similarity_search(query="thud",k=1)
            for doc in results:
                print(f"* {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * thud [{'bar': 'baz'}]

    Search with filter:
        .. code-block:: python

            results = vector_store.similarity_search(query="thud",k=1,filter={"bar": "baz"})
            for doc in results:
                print(f"* {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * thud [{'bar': 'baz'}]

    Search with score:
        .. code-block:: python

            results = vector_store.similarity_search_with_score(query="qux",k=1)
            for doc, score in results:
                print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * [SIM=0.335304] foo [{'baz': 'bar'}]

    Async:
        .. code-block:: python

            # add documents
            # await vector_store.aadd_documents(documents=documents, ids=ids)

            # delete documents
            # await vector_store.adelete(ids=["3"])

            # search
            # results = vector_store.asimilarity_search(query="thud",k=1)

            # search with score
            results = await vector_store.asimilarity_search_with_score(query="qux",k=1)
            for doc,score in results:
                print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")

        .. code-block:: python

            * [SIM=0.335304] foo [{'baz': 'bar'}]

    Use as Retriever:
        .. code-block:: python

            retriever = vector_store.as_retriever(
                search_type="mmr",
                search_kwargs={"k": 1, "fetch_k": 2, "lambda_mult": 0.5},
            )
            retriever.invoke("thud")

        .. code-block:: python

            [Document(metadata={'bar': 'baz'}, page_content='thud')]

    NFÚembedding_functionú/Union[Callable[[str], List[float]], Embeddings]Úindexr   Údocstorer   Úindex_to_docstore_idúDict[int, str]Úrelevance_score_fnú"Optional[Callable[[float], float]]Únormalize_L2r!   Údistance_strategyr   c                ó>  — t          |t          ¦  «        st                               d¦  «         || _        || _        || _        || _        || _        || _	        || _
        | j        t          j        k    r%| j
        r t          j        d| j        › �¦  «         dS dS dS )z%Initialize with necessary components.út`embedding_function` is expected to be an Embeddings object, support for passing in a function will soon be removed.z2Normalizing L2 is not applicable for metric type: N)r.   r   ÚloggerÚwarningr5   r7   r8   r9   r>   Úoverride_relevance_score_fnÚ_normalize_L2r   ÚEUCLIDEAN_DISTANCEÚwarningsÚwarn)Úselfr5   r7   r8   r9   r;   r=   r>   s           r%   Ú__init__zFAISS.__init__Ë   sÍ   € õ Ð,­jÑ9Ô9ð 	Ý�NŠNðBñô ð ð #5ˆÔØˆŒ
Ø ˆŒØ$8ˆÔ!Ø!2ˆÔØ+=ˆÔ(Ø)ˆÔàÔ"Õ&6Ô&IÒIÐIØÔ"ð Jõ ŒMð9Ø $Ô 6ð9ð 9ñô ð ð ð ð JÐIÐIÐIr2   r   úOptional[Embeddings]c                óH   — t          | j        t          ¦  «        r| j        nd S ©N)r.   r5   r   ©rH   s    r%   Ú
embeddingszFAISS.embeddingsî   s)   € õ ˜$Ô1µ:Ñ>Ô>ðˆDÔ#Ð#àð	
r2   Útextsú	List[str]úList[List[float]]c                óˆ   ‡ — t          ‰ j        t          ¦  «        r‰ j                             |¦  «        S ˆ fd„|D ¦   «         S )Nc                ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )r5   )Ú.0ÚtextrH   s     €r%   ú
<listcomp>z*FAISS._embed_documents.<locals>.<listcomp>ú   s'   ø€ ÐDÐDÐD°d�D×+Ò+¨DÑ1Ô1ÐDÐDÐDr2   )r.   r5   r   Úembed_documents©rH   rO   s   ` r%   Ú_embed_documentszFAISS._embed_documentsö   sJ   ø€ Ý�dÔ-­zÑ:Ô:ð 	EØÔ*×:Ò:¸5ÑAÔAÐAàDÐDÐDÐD¸eÐDÑDÔDÐDr2   c              ƒ  ó˜   K  — t          | j        t          ¦  «        r | j                             |¦  «        ƒ d {V —†S t	          d¦  «        ‚©Nr@   )r.   r5   r   Úaembed_documentsÚ	ExceptionrY   s     r%   Ú_aembed_documentszFAISS._aembed_documentsü   s^   è è € Ý�dÔ-­zÑ:Ô:ð 		ØÔ0×AÒAÀ%ÑHÔHÐHÐHÐHÐHÐHÐHÐHõ
 ðBñô ð r2   rV   r*   úList[float]c                ó”   — t          | j        t          ¦  «        r| j                             |¦  «        S |                      |¦  «        S rL   )r.   r5   r   Úembed_query©rH   rV   s     r%   Ú_embed_queryzFAISS._embed_query  sB   € Ý�dÔ-­zÑ:Ô:ð 	1ØÔ*×6Ò6°tÑ<Ô<Ð<à×*Ò*¨4Ñ0Ô0Ð0r2   c              ƒ  ó˜   K  — t          | j        t          ¦  «        r | j                             |¦  «        ƒ d {V —†S t	          d¦  «        ‚r\   )r.   r5   r   Úaembed_queryr^   rc   s     r%   Ú_aembed_queryzFAISS._aembed_query  s^   è è € Ý�dÔ-­zÑ:Ô:ð 	ØÔ0×=Ò=¸dÑCÔCÐCÐCÐCÐCÐCÐCÐCõ ðBñô ð r2   úIterable[str]rN   úIterable[List[float]]Ú	metadatasúOptional[Iterable[dict]]ÚidsúOptional[List[str]]c                ó€  ‡
— t          ¦   «         }t          | j        t          ¦  «        st	          d| j        › d�¦  «        ‚t          ||dd¦  «         |pd„ |D ¦   «         }t          ||dd¦  «         |pd„ |D ¦   «         }d„ t          |||¦  «        D ¦   «         }t          ||d	d
¦  «         |r<t          |¦  «        t          t          |¦  «        ¦  «        k    rt	          d¦  «        ‚t          j
        |t          j        ¬¦  «        }| j        r|                     |¦  «         | j                             |¦  «         | j                             d„ t          ||¦  «        D ¦   «         ¦  «         t          | j        ¦  «        Š
ˆ
fd„t#          |¦  «        D ¦   «         }	| j                             |	¦  «         |S )NzSIf trying to add texts, the underlying docstore should support adding items, which z	 does notrO   rj   c                óN   — g | ]"}t          t          j        ¦   «         ¦  «        ‘Œ#S rT   )r*   ÚuuidÚuuid4©rU   Ú_s     r%   rW   zFAISS.__add.<locals>.<listcomp>(  s&   € Ð7Ð7Ð7¨A•c�$œ*™,œ,Ñ'Ô'Ð7Ð7Ð7r2   rl   c              3  ó   K  — | ]}i V — Œd S rL   rT   rr   s     r%   ú	<genexpr>zFAISS.__add.<locals>.<genexpr>+  s"   è è € Ð"5Ð"5¨! 2Ð"5Ð"5Ð"5Ð"5Ð"5Ð"5r2   c                ó:   — g | ]\  }}}t          |||¬ ¦  «        ‘ŒS ))ÚidÚpage_contentÚmetadatar   )rU   Úid_ÚtÚms       r%   rW   zFAISS.__add.<locals>.<listcomp>,  s=   € ð 
ð 
ð 
á��Q˜õ ˜¨!°aÐ8Ñ8Ô8ð
ð 
ð 
r2   Ú	documentsrN   z$Duplicate ids found in the ids list.©Údtypec                ó   — i | ]\  }}||“Œ	S rT   rT   )rU   rz   Údocs      r%   ú
<dictcomp>zFAISS.__add.<locals>.<dictcomp><  s   € ÐHÐHÐH©¨¨S˜3 ÐHÐHÐHr2   c                ó"   •— i | ]\  }}‰|z   |“ŒS rT   rT   )rU   Újrz   Ústarting_lens      €r%   r‚   zFAISS.__add.<locals>.<dictcomp>>  s$   ø€ ÐJÐJÐJ±°°C�| aÑ'¨ÐJÐJÐJr2   )r&   r.   r8   r   r0   r1   Úzipr/   ÚsetÚnpÚarrayÚfloat32rD   r=   r7   Úaddr9   Ú	enumerateÚupdate)rH   rO   rN   rj   rl   r#   Ú
_metadatasr}   ÚvectorÚindex_to_idr…   s             @r%   Ú__addzFAISS.__add  sè  ø€ õ (Ñ)Ô)ˆÝ˜$œ-­Ñ6Ô6ð 	Ýð@Ø'+¤}ð@ð @ð @ñô ð õ
 	˜E 9¨g°{ÑCÔCÐCàÐ7Ð7Ð7°Ð7Ñ7Ô7ˆÝ˜E 3¨°Ñ7Ô7Ð7àÐ5Ð"5Ð"5¨uÐ"5Ñ"5Ô"5ˆ
ð
ð 
å   e¨ZÑ8Ô8ð
ñ 
ô 
ˆ	õ
 	˜I z°;ÀÑMÔMÐMàð 	E•3�s‘8”8�s¥3 s¡8¤8™}œ}Ò,Ð,ÝÐCÑDÔDÐDå”˜*­B¬JÐ7Ñ7Ô7ˆØÔð 	'Ø×Ò˜vÑ&Ô&Ð&ØŒ
�Š�vÑÔÐð 	Œ×ÒÐHÐHµC¸¸YÑ4GÔ4GÐHÑHÔHÑIÔIÐIÝ˜4Ô4Ñ5Ô5ˆØJÐJÐJÐJ½9ÀS¹>¼>ÐJÑJÔJˆØÔ!×(Ò(¨Ñ5Ô5Ð5Øˆ
r2   úOptional[List[dict]]Úkwargsc                ó|   — t          |¦  «        }|                      |¦  «        }|                      ||||¬¦  «        S )al  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        ©rj   rl   )ÚlistrZ   Ú_FAISS__add©rH   rO   rj   rl   r“   rN   s         r%   Ú	add_textszFAISS.add_textsB  s<   € õ" �U‘”ˆØ×*Ò*¨5Ñ1Ô1ˆ
Ø�zŠz˜% °yÀcˆzÑJÔJÐJr2   c              ‹  óŒ   K  — t          |¦  «        }|                      |¦  «        ƒ d{V —†}|                      ||||¬¦  «        S )a‡  Run more texts through the embeddings and add to the vectorstore
            asynchronously.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        Nr•   )r–   r_   r—   r˜   s         r%   Ú
aadd_textszFAISS.aadd_textsW  sR   è è € õ$ �U‘”ˆØ×1Ò1°%Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆ
Ø�zŠz˜% °yÀcˆzÑJÔJÐJr2   Útext_embeddingsú!Iterable[Tuple[str, List[float]]]c                óL   — t          |Ž \  }}|                      ||||¬¦  «        S )aŽ  Add the given texts and embeddings to the vectorstore.

        Args:
            text_embeddings: Iterable pairs of string and embedding to
                add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            ids: Optional list of unique IDs.

        Returns:
            List of ids from adding the texts into the vectorstore.
        r•   )r†   r—   )rH   rœ   rj   rl   r“   rO   rN   s          r%   Úadd_embeddingszFAISS.add_embeddingsm  s-   € õ&   Ð1ÑˆˆzØ�zŠz˜% °yÀcˆzÑJÔJÐJr2   é   é   Ú	embeddingÚkÚintÚfilterú)Optional[Union[Callable, Dict[str, Any]]]Úfetch_kúList[Tuple[Document, float]]c                óx  ‡‡— t          ¦   «         }t          j        |gt          j        ¬¦  «        }| j        r|                     |¦  «         | j                             ||€|n|¦  «        \  }}	g }
|�|                      |¦  «        }t          |	d         ¦  «        D ]¶\  }}|dk    rŒ| j
        |         }| j                             |¦  «        }t          |t          ¦  «        st          d|› d|› �¦  «        ‚|�4 ||j        ¦  «        r#|
                     ||d         |         f¦  «         Œ“|
                     ||d         |         f¦  «         Œ·|                     d¦  «        Š‰�F| j        t&          j        t&          j        fv rt,          j        nt,          j        Šˆˆfd„|
D ¦   «         }
|
d|…         S )	aœ  Return docs most similar to query.

        Args:
            embedding: Embedding vector to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Union[Callable, Dict[str, Any]]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.
            **kwargs: kwargs to be passed to similarity search. Can include:
                score_threshold: Optional, a floating point value between 0 to 1 to
                    filter the resulting set of retrieved docs

        Returns:
            List of documents most similar to the query text and L2 distance
            in float for each. Lower score represents more similarity.
        r~   Nr   éÿÿÿÿúCould not find document for id ú, got Úscore_thresholdc                ó6   •— g | ]\  }} ‰|‰¦  «        ¯||f‘ŒS rT   rT   )rU   r�   Ú
similarityÚcmpr­   s      €€r%   rW   z@FAISS.similarity_search_with_score_by_vector.<locals>.<listcomp>½  sD   ø€ ð ð ð á#�C˜Ø�3�z ?Ñ3Ô3ðØ�jÐ!ðð ð r2   )r&   rˆ   r‰   rŠ   rD   r=   r7   ÚsearchÚ_create_filter_funcrŒ   r9   r8   r.   r   r0   ry   ÚappendÚgetr>   r   ÚMAX_INNER_PRODUCTÚJACCARDÚoperatorÚgeÚle)rH   r¢   r£   r¥   r§   r“   r#   r�   ÚscoresÚindicesÚdocsÚfilter_funcr„   ÚiÚ_idr�   r°   r­   s                   @@r%   Ú&similarity_search_with_score_by_vectorz,FAISS.similarity_search_with_score_by_vectorƒ  sð  øø€ õ4 (Ñ)Ô)ˆÝ”˜9˜+­R¬ZÐ8Ñ8Ô8ˆØÔð 	'Ø×Ò˜vÑ&Ô&Ð&Øœ*×+Ò+¨F¸¸°A°AÈWÑUÔU‰ˆ�ØˆàÐØ×2Ò2°6Ñ:Ô:ˆKå˜g aœjÑ)Ô)ð 	1ð 	1‰DˆAˆqØ�BŠwˆwàØÔ+¨AÔ.ˆCØ”-×&Ò& sÑ+Ô+ˆCÝ˜c¥8Ñ,Ô,ð UÝ Ð!SÀ3Ð!SÐ!SÈcÐ!SÐ!SÑTÔTÐTØÐ!Ø�;˜sœ|Ñ,Ô,ð 5Ø—K’K  f¨Q¤i°¤lÐ 3Ñ4Ô4Ð4øà—’˜S &¨¤)¨A¤,Ð/Ñ0Ô0Ð0Ð0à Ÿ*š*Ð%6Ñ7Ô7ˆØÐ&ð Ô)Ý$Ô6Õ8HÔ8PÐQðRð Rõ ”�õ ”[ð	 ðð ð ð ð à'+ðñ ô ˆDð
 �B�Q�BŒxˆr2   c              ‹  óB   K  — t          d| j        |f|||dœ|¤Žƒ d{V —†S )a›  Return docs most similar to query asynchronously.

        Args:
            embedding: Embedding vector to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, Any]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.
            **kwargs: kwargs to be passed to similarity search. Can include:
                score_threshold: Optional, a floating point value between 0 to 1 to
                    filter the resulting set of retrieved docs

        Returns:
            List of documents most similar to the query text and L2 distance
            in float for each. Lower score represents more similarity.
        N©r£   r¥   r§   )r   rÀ   )rH   r¢   r£   r¥   r§   r“   s         r%   Ú'asimilarity_search_with_score_by_vectorz-FAISS.asimilarity_search_with_score_by_vectorÄ  sc   è è € õ: %ØØÔ7Øð
ð ØØð
ð 
ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r2   Úqueryc                óT   — |                       |¦  «        } | j        ||f||dœ|¤Ž}|S )a”  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of documents most similar to the query text with
            L2 distance in float. Lower score represents more similarity.
        ©r¥   r§   )rd   rÀ   ©rH   rÄ   r£   r¥   r§   r“   r¢   r¼   s           r%   Úsimilarity_search_with_scorez"FAISS.similarity_search_with_scoreë  sT   € ð0 ×%Ò% eÑ,Ô,ˆ	Ø:ˆtÔ:ØØð
ð Øð	
ð 
ð
 ð
ð 
ˆð ˆr2   c              ‹  óp   K  — |                       |¦  «        ƒ d{V —†} | j        ||f||dœ|¤Žƒ d{V —†}|S )a£  Return docs most similar to query asynchronously.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of documents most similar to the query text with
            L2 distance in float. Lower score represents more similarity.
        NrÆ   )rg   rÃ   rÇ   s           r%   Úasimilarity_search_with_scorez#FAISS.asimilarity_search_with_score  sˆ   è è € ð0 ×,Ò,¨UÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆ	ØA�TÔAØØð
ð Øð	
ð 
ð
 ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ˆr2   úOptional[Dict[str, Any]]úList[Document]c                ó>   —  | j         ||f||dœ|¤Ž}d„ |D ¦   «         S )aY  Return docs most similar to embedding vector.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the embedding.
        rÆ   c                ó   — g | ]\  }}|‘ŒS rT   rT   ©rU   r�   rs   s      r%   rW   z5FAISS.similarity_search_by_vector.<locals>.<listcomp>M  ó   € Ð2Ð2Ð2™˜˜Q�Ð2Ð2Ð2r2   )rÀ   ©rH   r¢   r£   r¥   r§   r“   Údocs_and_scoress          r%   Úsimilarity_search_by_vectorz!FAISS.similarity_search_by_vector/  sQ   € ð. F˜$ÔEØØð
ð Øð	
ð 
ð
 ð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   c              ‹  óN   K  —  | j         ||f||dœ|¤Žƒ d{V —†}d„ |D ¦   «         S )ah  Return docs most similar to embedding vector asynchronously.

        Args:
            embedding: Embedding to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter (Optional[Dict[str, str]]): Filter by metadata.
                Defaults to None. If a callable, it must take as input the
                metadata dict of Document and return a bool.

            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the embedding.
        rÆ   Nc                ó   — g | ]\  }}|‘ŒS rT   rT   rÏ   s      r%   rW   z6FAISS.asimilarity_search_by_vector.<locals>.<listcomp>m  rÐ   r2   )rÃ   rÑ   s          r%   Úasimilarity_search_by_vectorz"FAISS.asimilarity_search_by_vectorO  ss   è è € ð. !M Ô LØØð!
ð Øð	!
ð !
ð
 ð!
ð !
ð 
ð 
ð 
ð 
ð 
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   c                ó>   —  | j         ||f||dœ|¤Ž}d„ |D ¦   «         S )aË  Return docs most similar to query.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter: (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the query.
        rÆ   c                ó   — g | ]\  }}|‘ŒS rT   rT   rÏ   s      r%   rW   z+FAISS.similarity_search.<locals>.<listcomp>†  rÐ   r2   )rÈ   ©rH   rÄ   r£   r¥   r§   r“   rÒ   s          r%   Úsimilarity_searchzFAISS.similarity_searcho  sJ   € ð( <˜$Ô;Ø�1ð
Ø#¨Wð
ð 
Ø8>ð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   c              ‹  óN   K  —  | j         ||f||dœ|¤Žƒ d{V —†}d„ |D ¦   «         S )aÚ  Return docs most similar to query asynchronously.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 4.
            filter: (Optional[Dict[str, str]]): Filter by metadata. Defaults to None.
            fetch_k: (Optional[int]) Number of Documents to fetch before filtering.
                      Defaults to 20.

        Returns:
            List of Documents most similar to the query.
        rÆ   Nc                ó   — g | ]\  }}|‘ŒS rT   rT   rÏ   s      r%   rW   z,FAISS.asimilarity_search.<locals>.<listcomp>Ÿ  rÐ   r2   )rÊ   rÙ   s          r%   Úasimilarity_searchzFAISS.asimilarity_searchˆ  sm   è è € ð( !C Ô BØ�1ð!
Ø#¨Wð!
ð !
Ø8>ð!
ð !
ð 
ð 
ð 
ð 
ð 
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   ç      à?©r£   r§   Úlambda_multr¥   rà   Úfloatc               ó¼  ‡ — ‰ j                              t          j        |gt          j        ¬¦  «        |€|n|dz  ¦  «        \  }}|�´‰                      |¦  «        }g }	|d         D ]}
|
dk    rŒ	‰ j        |
         }‰ j                             |¦  «        }t          |t          ¦  «        st          d|› d|› �¦  «        ‚ ||j        ¦  «        r|	                     |
¦  «         Œ€t          j        |	g¦  «        }ˆ fd„|d         D ¦   «         }t          t          j        |gt          j        ¬¦  «        |||¬	¦  «        }g }|D ]•}
|d         |
         dk    rŒ‰ j        |d         |
                  }‰ j                             |¦  «        }t          |t          ¦  «        st          d|› d|› �¦  «        ‚|                     ||d         |
         f¦  «         Œ–|S )
az  Return docs and their similarity scores 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 before filtering 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.
        Returns:
            List of Documents and similarity scores selected by maximal marginal
                relevance and score for each.
        r~   Né   r   rª   r«   r¬   c                ój   •— g | ]/}|d k    ¯‰j                              t          |¦  «        ¦  «        ‘Œ0S )rª   )r7   Úreconstructr¤   )rU   r¾   rH   s     €r%   rW   zLFAISS.max_marginal_relevance_search_with_score_by_vector.<locals>.<listcomp>Ð  s5   ø€ ÐTÐTÐT¸ÈAÐQSÊGÈG�d”j×,Ò,­S°©V¬VÑ4Ô4ÈGÈGÈGr2   )r£   rà   )r7   r±   rˆ   r‰   rŠ   r²   r9   r8   r.   r   r0   ry   r³   r   )rH   r¢   r£   r§   rà   r¥   rº   r»   r½   Úfiltered_indicesr¾   r¿   r�   rN   Úmmr_selectedrÒ   s   `               r%   Ú2max_marginal_relevance_search_with_score_by_vectorz8FAISS.max_marginal_relevance_search_with_score_by_vector¡  s  ø€ ð8 œ*×+Ò+ÝŒH�i�[­¬
Ð3Ñ3Ô3Ø�~ˆGˆG¨7°Q©;ñ
ô 
‰ˆ�ð ÐØ×2Ò2°6Ñ:Ô:ˆKØ!ÐØ˜Q”Zð 	/ð 	/�Ø˜’7�7àØÔ/°Ô2�Ø”m×*Ò*¨3Ñ/Ô/�Ý! #¥xÑ0Ô0ð YÝ$Ð%WÀsÐ%WÐ%WÐRUÐ%WÐ%WÑXÔXÐXØ�;˜sœ|Ñ,Ô,ð /Ø$×+Ò+¨AÑ.Ô.Ð.øÝ”hÐ 0Ð1Ñ2Ô2ˆGàTÐTÐTÐT¸gÀa¼jÐTÑTÔTˆ
Ý1ÝŒH�i�[­¬
Ð3Ñ3Ô3ØØØ#ð	
ñ 
ô 
ˆð ˆØð 	8ð 	8ˆAØ�qŒz˜!Œ} Ò"Ð"àØÔ+¨G°A¬J°q¬MÔ:ˆCØ”-×&Ò& sÑ+Ô+ˆCÝ˜c¥8Ñ,Ô,ð UÝ Ð!SÀ3Ð!SÐ!SÈcÐ!SÐ!SÑTÔTÐTØ×"Ò" C¨°¬°1¬Ð#6Ñ7Ô7Ð7Ð7àÐr2   c          	   ƒ  óH   K  — t          d| j        |||||¬¦  «        ƒ d{V —†S )a‰  Return docs and their similarity scores selected using the maximal marginal
            relevance asynchronously.

        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 before filtering 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.
        Returns:
            List of Documents and similarity scores selected by maximal marginal
                relevance and score for each.
        Nrß   )r   rè   )rH   r¢   r£   r§   rà   r¥   s         r%   Ú3amax_marginal_relevance_search_with_score_by_vectorz9FAISS.amax_marginal_relevance_search_with_score_by_vectorå  sU   è è € õ: %ØØÔCØØØØ#Øð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r2   c                óN   — |                       |||||¬¦  «        }d„ |D ¦   «         S )a  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 before filtering 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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        rß   c                ó   — g | ]\  }}|‘ŒS rT   rT   rÏ   s      r%   rW   zAFAISS.max_marginal_relevance_search_by_vector.<locals>.<listcomp>)  rÐ   r2   )rè   ©rH   r¢   r£   r§   rà   r¥   r“   rÒ   s           r%   Ú'max_marginal_relevance_search_by_vectorz-FAISS.max_marginal_relevance_search_by_vector  s@   € ð4 ×QÒQØ˜ G¸ÈVð Rñ 
ô 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r2   c              ‹  ó^   K  — |                       |||||¬¦  «        ƒ d{V —†}d„ |D ¦   «         S )a(  Return docs selected using the maximal marginal relevance asynchronously.

        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 before filtering 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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        rß   Nc                ó   — g | ]\  }}|‘ŒS rT   rT   rÏ   s      r%   rW   zBFAISS.amax_marginal_relevance_search_by_vector.<locals>.<listcomp>J  rÐ   r2   )rê   rí   s           r%   Ú(amax_marginal_relevance_search_by_vectorz.FAISS.amax_marginal_relevance_search_by_vector+  sf   è è € ð6 ×JÒJØ˜Q¨¸[ÐQWð Kñ ô ð ð ð ð ð ð ð 	ð
 3Ð2 /Ð2Ñ2Ô2Ð2r2   c                óV   — |                       |¦  «        } | j        |f||||dœ|¤Ž}|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 before filtering (if needed) 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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        rß   )rd   rî   ©	rH   rÄ   r£   r§   rà   r¥   r“   r¢   r¼   s	            r%   Úmax_marginal_relevance_searchz#FAISS.max_marginal_relevance_searchL  sU   € ð4 ×%Ò% eÑ,Ô,ˆ	Ø;ˆtÔ;Øð
àØØ#Øð
ð 
ð ð
ð 
ˆð ˆr2   c              ‹  ór   K  — |                       |¦  «        ƒ d{V —†} | j        |f||||dœ|¤Žƒ d{V —†}|S )a+  Return docs selected using the maximal marginal relevance asynchronously.

        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 before filtering (if needed) 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.
        Returns:
            List of Documents selected by maximal marginal relevance.
        Nrß   )rg   rñ   ró   s	            r%   Úamax_marginal_relevance_searchz$FAISS.amax_marginal_relevance_searchq  s‰   è è € ð4 ×,Ò,¨UÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆ	ØB�TÔBØð
àØØ#Øð
ð 
ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ˆr2   r   c                ól  ‡‡— |€t          d¦  «        ‚t          |¦  «                             | j                             ¦   «         ¦  «        }|rt          d|› �¦  «        ‚d„ | j                             ¦   «         D ¦   «         Šˆfd„|D ¦   «         Š| j                             t          j	        ‰t          j
        ¬¦  «        ¦  «         | j                             |¦  «         ˆfd„t          | j                             ¦   «         ¦  «        D ¦   «         }d„ t          |¦  «        D ¦   «         | _        d	S )
z÷Delete by ID. These are the IDs in the vectorstore.

        Args:
            ids: List of ids to delete.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        NzNo ids provided to delete.zESome specified ids do not exist in the current store. Ids not found: c                ó   — i | ]\  }}||“Œ	S rT   rT   )rU   Úidxrz   s      r%   r‚   z FAISS.delete.<locals>.<dictcomp>©  s   € ÐUÐUÐU¡x s¨C˜#˜sÐUÐUÐUr2   c                ó    •— h | ]
}‰|         ’ŒS rT   rT   )rU   rz   Úreversed_indexs     €r%   ú	<setcomp>zFAISS.delete.<locals>.<setcomp>ª  s   ø€ Ð>Ð>Ð>°3˜>¨#Ô.Ð>Ð>Ð>r2   r~   c                ó"   •— g | ]\  }}|‰v¯	|‘ŒS rT   rT   )rU   r¾   rz   Úindex_to_deletes      €r%   rW   z FAISS.delete.<locals>.<listcomp>¯  s2   ø€ ð 
ð 
ð 
á��3Ø˜Ð'Ð'ð à'Ð'Ð'r2   c                ó   — i | ]\  }}||“Œ	S rT   rT   )rU   r¾   rz   s      r%   r‚   z FAISS.delete.<locals>.<dictcomp>´  s   € Ð$SÐ$SÐ$S±°°3 Q¨Ð$SÐ$SÐ$Sr2   T)r0   r‡   Ú
differencer9   ÚvaluesÚitemsr7   Ú
remove_idsrˆ   ÚfromiterÚint64r8   ÚdeleteÚsortedrŒ   )rH   rl   r“   Úmissing_idsÚremaining_idsrþ   rû   s        @@r%   r  zFAISS.delete–  sN  øø€ ð ˆ;ÝÐ9Ñ:Ô:Ð:Ý˜#‘h”h×)Ò)¨$Ô*C×*JÒ*JÑ*LÔ*LÑMÔMˆØð 	Ýð!Øð!ð !ñô ð ð
 VÐU°4Ô3L×3RÒ3RÑ3TÔ3TÐUÑUÔUˆØ>Ð>Ð>Ð>¸#Ð>Ñ>Ô>ˆàŒ
×Ò�bœk¨/ÅÄÐJÑJÔJÑKÔKÐKØŒ×Ò˜SÑ!Ô!Ð!ð
ð 
ð 
ð 
å  Ô!:×!@Ò!@Ñ!BÔ!BÑCÔCð
ñ 
ô 
ˆð
 %TÐ$S½)ÀMÑ:RÔ:RÐ$SÑ$SÔ$SˆÔ!àˆtr2   Útargetr,   c                óF  — t          | j        t          ¦  «        st          d¦  «        ‚t	          | j        ¦  «        }| j                             |j        ¦  «         g }|j                             ¦   «         D ]^\  }}|j         	                    |¦  «        }t          |t          ¦  «        st          d¦  «        ‚|                     ||z   ||f¦  «         Œ_| j                             d„ |D ¦   «         ¦  «         d„ |D ¦   «         }| j                             |¦  «         dS )zæMerge another FAISS object with the current one.

        Add the target FAISS to the current one.

        Args:
            target: FAISS object you wish to merge into the current one

        Returns:
            None.
        z'Cannot merge with this type of docstorezDocument should be returnedc                ó   — i | ]	\  }}}||“Œ
S rT   rT   )rU   rs   r¿   r�   s       r%   r‚   z$FAISS.merge_from.<locals>.<dictcomp>Ô  s    € ÐAÐAÐA©¨¨3°˜3 ÐAÐAÐAr2   c                ó   — i | ]	\  }}}||“Œ
S rT   rT   )rU   r7   r¿   rs   s       r%   r‚   z$FAISS.merge_from.<locals>.<dictcomp>Õ  s    € ÐAÐAÐA¡m e¨S°!�u˜cÐAÐAÐAr2   N)r.   r8   r   r0   r/   r9   r7   Ú
merge_fromr  r±   r   r³   r‹   r�   )rH   r
  r…   Ú	full_infor¾   Ú	target_idr�   r�   s           r%   r  zFAISS.merge_from¸  s.  € õ ˜$œ-­Ñ6Ô6ð 	HÝÐFÑGÔGÐGå˜4Ô4Ñ5Ô5ˆð 	Œ
×Ò˜fœlÑ+Ô+Ð+ð ˆ	Ø"Ô7×=Ò=Ñ?Ô?ð 	Að 	A‰LˆAˆyØ”/×(Ò(¨Ñ3Ô3ˆCÝ˜c¥8Ñ,Ô,ð @Ý Ð!>Ñ?Ô?Ð?Ø×Ò˜l¨QÑ.°	¸3Ð?Ñ@Ô@Ð@Ð@ð 	Œ×ÒÐAÐA°yÐAÑAÔAÑBÔBÐBØAÐA°yÐAÑAÔAˆØÔ!×(Ò(¨Ñ5Ô5Ð5Ð5Ð5r2   r   c                ó¤  — t          ¦   «         }	|t          j        k    r)|	                     t	          |d         ¦  «        ¦  «        }
n(|	                     t	          |d         ¦  «        ¦  «        }
|                     dt          ¦   «         ¦  «        }|                     di ¦  «        } | ||
||f||dœ|¤Ž}|                     ||||¬¦  «         |S )Nr   r8   r9   )r=   r>   r•   )	r&   r   rµ   ÚIndexFlatIPr/   ÚIndexFlatL2Úpopr   r—   )ÚclsrO   rN   r¢   rj   rl   r=   r>   r“   r#   r7   r8   r9   Úvecstores                 r%   Ú__fromzFAISS.__fromØ  sé   € õ (Ñ)Ô)ˆØÕ 0Ô BÒBÐBØ×%Ò%¥c¨*°Q¬-Ñ&8Ô&8Ñ9Ô9ˆEˆEð ×%Ò%¥c¨*°Q¬-Ñ&8Ô&8Ñ9Ô9ˆEØ—:’:˜jÕ*:Ñ*<Ô*<Ñ=Ô=ˆØ%ŸzšzÐ*@À"ÑEÔEÐØ�3ØØØØ ð	
ð
 &Ø/ð
ð 
ð ð
ð 
ˆð 	�Š�u˜j°IÀ3ˆÑGÔGÐGØˆr2   c                óR   — |                      |¦  «        } | j        |||f||dœ|¤ŽS )aO  Construct FAISS wrapper from raw documents.

        This is a user friendly interface that:
            1. Embeds documents.
            2. Creates an in memory docstore
            3. Initializes the FAISS database

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                faiss = FAISS.from_texts(texts, embeddings)
        r•   )rX   Ú_FAISS__from©r  rO   r¢   rj   rl   r“   rN   s          r%   Ú
from_textszFAISS.from_textsø  sR   € ð6 ×.Ò.¨uÑ5Ô5ˆ
ØˆsŒzØØØð
ð  Øð
ð 
ð ð
ð 
ð 	
r2   ú	list[str]c              ‹  ób   K  — |                      |¦  «        ƒ d{V —†} | j        |||f||dœ|¤ŽS )ae  Construct FAISS wrapper from raw documents asynchronously.

        This is a user friendly interface that:
            1. Embeds documents.
            2. Creates an in memory docstore
            3. Initializes the FAISS database

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                faiss = await FAISS.afrom_texts(texts, embeddings)
        Nr•   )r]   r  r  s          r%   Úafrom_textszFAISS.afrom_texts  sh   è è € ð6 %×5Ò5°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<ˆ
ØˆsŒzØØØð
ð  Øð
ð 
ð ð
ð 
ð 	
r2   c                ót   — t          |Ž \  }} | j        t          |¦  «        t          |¦  «        |f||dœ|¤ŽS )aê  Construct FAISS wrapper from raw documents.

        This is a user friendly interface that:
            1. Embeds documents.
            2. Creates an in memory docstore
            3. Initializes the FAISS database

        This is intended to be a quick way to get started.

        Example:
            .. code-block:: python

                from langchain_community.vectorstores import FAISS
                from langchain_community.embeddings import OpenAIEmbeddings

                embeddings = OpenAIEmbeddings()
                text_embeddings = embeddings.embed_documents(texts)
                text_embedding_pairs = zip(texts, text_embeddings)
                faiss = FAISS.from_embeddings(text_embedding_pairs, embeddings)
        r•   )r†   r  r–   )r  rœ   r¢   rj   rl   r“   rO   rN   s           r%   Úfrom_embeddingszFAISS.from_embeddingsB  s\   € õ:   Ð1ÑˆˆzØˆsŒzÝ�‰KŒKÝ�ÑÔØð
ð  Øð
ð 
ð ð
ð 
ð 	
r2   c              ‹  ó*   K  —  | j         ||f||dœ|¤ŽS )z:Construct FAISS wrapper from raw documents asynchronously.r•   )r   )r  rœ   r¢   rj   rl   r“   s         r%   Úafrom_embeddingszFAISS.afrom_embeddingsi  sA   è è € ð #ˆsÔ"ØØð
ð  Øð	
ð 
ð
 ð
ð 
ð 	
r2   Úfolder_pathÚ
index_namec                ój  — t          |¦  «        }|                     dd¬¦  «         t          ¦   «         }|                     | j        t          ||› d�z  ¦  «        ¦  «         t          ||› d�z  d¦  «        5 }t          j        | j	        | j
        f|¦  «         ddd¦  «         dS # 1 swxY w Y   dS )a  Save FAISS index, docstore, and index_to_docstore_id to disk.

        Args:
            folder_path: folder path to save index, docstore,
                and index_to_docstore_id to.
            index_name: for saving with a specific index file name
        T)Úexist_okÚparentsú.faissú.pklÚwbN)r   Úmkdirr&   Úwrite_indexr7   r*   ÚopenÚpickleÚdumpr8   r9   )rH   r#  r$  Úpathr#   Úfs         r%   Ú
save_localzFAISS.save_local{  s  € õ �KÑ Ô ˆØ�
Š
˜D¨$ˆ
Ñ/Ô/Ð/õ (Ñ)Ô)ˆØ×Ò˜$œ*¥c¨$°JÐ1FÐ1FÐ1FÑ*FÑ&GÔ&GÑHÔHÐHõ �$˜JÐ,Ð,Ð,Ñ,¨dÑ3Ô3ð 	G°qÝŒK˜œ¨Ô(AÐBÀAÑFÔFÐFð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs   Á9"B(Â(B,Â/B,r   )Úallow_dangerous_deserializationÚio_flagsr3  r4  c               óR  — |st          d¦  «        ‚t          |¦  «        }t          ¦   «         }|                     t	          ||› d�z  ¦  «        |¦  «        }	t          ||› d�z  d¦  «        5 }
t          j        |
¦  «        \  }}ddd¦  «         n# 1 swxY w Y    | ||	||fi |¤ŽS )a×  Load FAISS index, docstore, and index_to_docstore_id from disk.

        Args:
            folder_path: folder path to load index, docstore,
                and index_to_docstore_id from.
            embeddings: Embeddings to use when generating queries
            index_name: for saving with a specific index file name
            allow_dangerous_deserialization: whether to allow deserialization
                of the data which involves loading a pickle file.
                Pickle files can be modified by malicious actors to deliver a
                malicious payload that results in execution of
                arbitrary code on your machine.
            io_flags: Flags to use when opening the pickle file.
        áB  The de-serialization relies loading a pickle file. Pickle files can be modified to deliver a malicious payload that results in execution of arbitrary code on your machine.You will need to set `allow_dangerous_deserialization` to `True` to enable deserialization. If you do this, make sure that you trust the source of the data. For example, if you are loading a file that you created, and know that no one else has modified the file, then this is safe to do. Do not set this to `True` if you are loading a file from an untrusted source (e.g., some random site on the internet.).r(  r)  ÚrbN)r0   r   r&   Ú
read_indexr*   r-  r.  Úload)r  r#  rN   r$  r3  r4  r“   r0  r#   r7   r1  r8   r9   s                r%   Ú
load_localzFAISS.load_localŽ  s  € ð2 /ð 	Ýð	"ñô ð õ �KÑ Ô ˆå'Ñ)Ô)ˆØ× Ò ¥ T¨zÐ,AÐ,AÐ,AÑ%AÑ!BÔ!BÀHÑMÔMˆõ �$˜JÐ,Ð,Ð,Ñ,¨dÑ3Ô3ð 	°qõ ”Øñô ñØØ$ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ˆs�:˜u hÐ0DÐOÐOÈÐOÐOÐOs   Á.BÂBÂBÚbytesc                óN   — t          j        | j        | j        | j        f¦  «        S )zCSerialize FAISS index, docstore, and index_to_docstore_id to bytes.)r.  Údumpsr7   r8   r9   rM   s    r%   Úserialize_to_byteszFAISS.serialize_to_bytesÄ  s    € åŒ|˜TœZ¨¬¸Ô8QÐRÑSÔSÐSr2   )r3  Ú
serializedc               ól   — |st          d¦  «        ‚t          j        |¦  «        \  }}} | ||||fi |¤ŽS )zGDeserialize FAISS index, docstore, and index_to_docstore_id from bytes.r6  )r0   r.  Úloads)r  r?  rN   r3  r“   r7   r8   r9   s           r%   Údeserialize_from_byteszFAISS.deserialize_from_bytesÈ  sf   € ð /ð 	Ýð	"ñô ð õ  ŒLØñ
ô 
ñ		
ØØØ ð ˆs�:˜u hÐ0DÐOÐOÈÐOÐOÐOr2   úCallable[[float], float]c                óä   — | j         �| j         S | j        t          j        k    r| j        S | j        t          j        k    r| j        S | j        t          j        k    r| j        S t          d¦  «        ‚)a8  
        The 'correct' relevance function
        may differ depending on a few things, including:
        - the distance / similarity metric used by the VectorStore
        - the scale of your embeddings (OpenAI's are unit normed. Many others are not!)
        - embedding dimensionality
        - etc.
        NzJUnknown distance strategy, must be cosine, max_inner_product, or euclidean)
rC   r>   r   rµ   Ú%_max_inner_product_relevance_score_fnrE   Ú_euclidean_relevance_score_fnÚCOSINEÚ_cosine_relevance_score_fnr0   rM   s    r%   Ú_select_relevance_score_fnz FAISS._select_relevance_score_fnè  s€   € ð Ô+Ð7ØÔ3Ð3ð Ô!Õ%5Ô%GÒGÐGØÔ=Ð=ØÔ#Õ'7Ô'JÒJÐJàÔ5Ð5ØÔ#Õ'7Ô'>Ò>Ð>ØÔ2Ð2åð ñô ð r2   c                ó’   ‡— |                       ¦   «         Š‰€t          d¦  «        ‚ | j        |f|||dœ|¤Ž}ˆfd„|D ¦   «         }|S )ú?Return docs and their similarity scores on a scale from 0 to 1.NúLrelevance_score_fn must be provided to FAISS constructor to normalize scoresrÂ   c                ó0   •— g | ]\  }}| ‰|¦  «        f‘ŒS rT   rT   ©rU   r�   Úscorer;   s      €r%   rW   zBFAISS._similarity_search_with_relevance_scores.<locals>.<listcomp>  ó;   ø€ ð 
ð 
ð 
Ù1;°°eˆSÐ$Ð$ UÑ+Ô+Ð,ð
ð 
ð 
r2   )rI  r0   rÈ   ©	rH   rÄ   r£   r¥   r§   r“   rÒ   Údocs_and_rel_scoresr;   s	           @r%   Ú(_similarity_search_with_relevance_scoresz.FAISS._similarity_search_with_relevance_scores  s›   ø€ ð "×<Ò<Ñ>Ô>ÐØÐ%Ýð9ñô ð ð <˜$Ô;Øð
àØØð	
ð 
ð
 ð
ð 
ˆð
ð 
ð 
ð 
Ø?Nð
ñ 
ô 
Ðð #Ð"r2   c              ‹  ó¢   ‡K  — |                       ¦   «         Š‰€t          d¦  «        ‚ | j        |f|||dœ|¤Žƒ d{V —†}ˆfd„|D ¦   «         }|S )rK  NrL  rÂ   c                ó0   •— g | ]\  }}| ‰|¦  «        f‘ŒS rT   rT   rN  s      €r%   rW   zCFAISS._asimilarity_search_with_relevance_scores.<locals>.<listcomp>8  rP  r2   )rI  r0   rÊ   rQ  s	           @r%   Ú)_asimilarity_search_with_relevance_scoresz/FAISS._asimilarity_search_with_relevance_scores   s¾   øè è € ð "×<Ò<Ñ>Ô>ÐØÐ%Ýð9ñô ð ð !C Ô BØð!
àØØð	!
ð !
ð
 ð!
ð !
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
ð 
ð 
ð 
Ø?Nð
ñ 
ô 
Ðð #Ð"r2   ú Callable[[Dict[str, Any]], bool]c                óº  ‡‡‡‡— t          | ¦  «        r| S t          | t          ¦  «        st          dt	          | ¦  «        › �¦  «        ‚ddlm}m}m}m	}m
}m} ||||||dœ}d„ d„ dœ}||z  Št          t          ‰¦  «        g d¢z   ¦  «        }	d	Š| D ]/}
|
r+|
                     d
¦  «        r|
|	vrt          d|
› �¦  «        ‚Œ0dˆˆfd„Šdˆˆfd„Š ‰| ¦  «        S )aÆ  
        Create a filter function based on the provided filter.

        Args:
            filter: A callable or a dictionary representing the filter
            conditions for documents.

        Returns:
            A function that takes Document's metadata and returns True if it
            satisfies the filter conditions, otherwise False.

        Raises:
            ValueError: If the filter is invalid or contains unsupported operators.
        z5filter must be a dict of metadata or a callable, not r   )Úeqr¸   Úgtr¹   ÚltÚne)z$eqz$neqz$gtz$ltz$gtez$ltec                ó
   — | |v S rL   rT   ©ÚaÚbs     r%   ú<lambda>z+FAISS._create_filter_func.<locals>.<lambda>b  s
   €   Q € r2   c                ó
   — | |vS rL   rT   r^  s     r%   ra  z+FAISS._create_filter_func.<locals>.<lambda>c  s
   €  ¨! € r2   )z$inz$nin)ú$andú$orú$noté
   ú$ú&filter contains unsupported operator: Úfieldr*   Ú	conditionú%Union[Dict[str, Any], List[Any], Any]r   rW  c                óx  •‡ ‡‡‡— t          ‰t          ¦  «        rXg Š‰                     ¦   «         D ]8\  }}|‰vrt          d|› �¦  «        ‚‰                     ‰|         |f¦  «         Œ9d
ˆ ˆfd„}|S t          ‰t
          ¦  «        r.t          ‰¦  «        ‰k    rt          ‰¦  «        Šˆˆ fd„S ˆˆ fd„S ˆˆ fd	„S )a„  
            Creates a filter function based on field and condition.

            Args:
                field: The document field to filter on
                condition: Filter condition (dict for operators, list for in,
                           or direct value for equality)

            Returns:
                A filter function that takes a document and returns boolean
            rh  r�   úDict[str, Any]r   r!   c                óf   •‡— |                       ‰¦  «        Št          ˆfd„‰D ¦   «         ¦  «        S )aW  
                    Evaluates a document against a set of predefined operators
                    and their values. This function applies multiple
                    comparison/sequence operators to a specific field value
                    from the document. All conditions must be satisfied for the
                    function to return True.

                    Args:
                        doc (Dict[str, Any]): The document to evaluate, containing
                        key-value pairs where keys are field names and values
                        are the field values. The document must contain the field
                        being filtered.

                    Returns:
                        bool: True if the document's field value satisfies all
                            operator conditions, False otherwise.
                    c              3  ó6   •K  — | ]\  }} |‰|¦  «        V — Œd S rL   rT   )rU   ÚopÚvalueÚ	doc_values      €r%   ru   zYFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.filter_fn.<locals>.<genexpr>–  s3   øè è € ÐOÐO¹	¸¸E˜r˜r )¨UÑ3Ô3ÐOÐOÐOÐOÐOÐOr2   )r´   Úall)r�   rr  ri  Ú	operatorss    @€€r%   Ú	filter_fnzFFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.filter_fnƒ  s8   øø€ ð$ &)§W¢W¨U¡^¤^�IÝÐOÐOÐOÐOÀYÐOÑOÔOÑOÔOÐOr2   c                ó2   •— |                       ‰¦  «        ‰v S rL   ©r´   )r�   Úcondition_setri  s    €€r%   ra  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>�  s   ø€  s§w¢w¨u¡~¤~¸Ð'F€ r2   c                ó2   •— |                       ‰¦  «        ‰v S rL   rw  ©r�   rj  ri  s    €€r%   ra  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>ž  s   ø€  3§7¢7¨5¡>¤>°YÐ#>€ r2   c                ó6   •— |                       ‰¦  «        ‰k    S rL   rw  rz  s    €€r%   ra  zEFAISS._create_filter_func.<locals>.filter_func_cond.<locals>.<lambda>   s   ø€ ˜sŸwšw u™~œ~°Ò:€ r2   )r�   rm  r   r!   )r.   Údictr  r0   r³   r–   r/   Ú	frozenset)	ri  rj  rp  rq  ru  rx  rt  Ú
OPERATIONSÚSET_CONVERT_THRESHOLDs	   ``   @@€€r%   Úfilter_func_condz3FAISS._create_filter_func.<locals>.filter_func_condn  s  øøøøø€ õ ˜)¥TÑ*Ô*ð !Ø�	Ø!*§¢Ñ!2Ô!2ð >ð >‘I�B˜Ø Ð+Ð+Ý(Ð)VÐRTÐ)VÐ)VÑWÔWÐWØ×$Ò$ j°¤n°eÐ%<Ñ=Ô=Ð=Ð=ðPð Pð Pð Pð Pð Pð Pð* !Ð å˜)¥TÑ*Ô*ð ?Ý�y‘>”>Ð$9Ò9Ð9Ý$-¨iÑ$8Ô$8�MØFÐFÐFÐFÐFÐFØ>Ð>Ð>Ð>Ð>Ð>à:Ð:Ð:Ð:Ð:Ð:r2   r¥   rm  c                óü   •‡‡‡— d| v rˆfd„| d         D ¦   «         Šˆfd„S d| v rˆfd„| d         D ¦   «         Šˆfd„S d| v r ‰| d         ¦  «        Šˆfd„S ˆfd	„|                       ¦   «         D ¦   «         Šˆfd
„S )aÆ  
            Creates a filter function that evaluates documents against specified
            filter conditions.

            This function processes a dictionary of filter conditions and returns
            a callable that can evaluate documents against these conditions. It
            supports logical operators ($and, $or, $not) and field-level filtering.

            Args:
                `dict` containing filter conditions.
                    Can include:
                        - Logical operators ($and, $or, $not) with lists of sub-filters
                        - Field-level conditions with comparison or sequence operators
                        - Direct field-value mappings for equality comparison

            Returns:
                Callable[[Dict[str, Any]], bool]: A function that takes a document
                (as a dictionary) and returns True if the document matches all
                filter conditions, False otherwise.
            rc  c                ó&   •— g | ]} ‰|¦  «        ‘ŒS rT   rT   ©rU   Ú
sub_filterr½   s     €r%   rW   zBFAISS._create_filter_func.<locals>.filter_func.<locals>.<listcomp>¸  s#   ø€ ÐTÐTÐT°z˜;˜; zÑ2Ô2ÐTÐTÐTr2   c                ó<   •‡ — t          ˆ fd„‰D ¦   «         ¦  «        S )Nc              3  ó.   •K  — | ]} |‰¦  «        V — Œd S rL   rT   ©rU   r1  r�   s     €r%   ru   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>¹  ó+   øè è € Ð&?Ð&?°! q q¨¡v¤vÐ&?Ð&?Ð&?Ð&?Ð&?Ð&?r2   ©rs  ©r�   Úfilterss   `€r%   ra  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>¹  ó%   øø€ ¥3Ð&?Ð&?Ð&?Ð&?°wÐ&?Ñ&?Ô&?Ñ#?Ô#?€ r2   rd  c                ó&   •— g | ]} ‰|¦  «        ‘ŒS rT   rT   rƒ  s     €r%   rW   zBFAISS._create_filter_func.<locals>.filter_func.<locals>.<listcomp>¼  s#   ø€ ÐSÐSÐS°z˜;˜; zÑ2Ô2ÐSÐSÐSr2   c                ó<   •‡ — t          ˆ fd„‰D ¦   «         ¦  «        S )Nc              3  ó.   •K  — | ]} |‰¦  «        V — Œd S rL   rT   r‡  s     €r%   ru   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>½  rˆ  r2   )ÚanyrŠ  s   `€r%   ra  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>½  rŒ  r2   re  c                ó   •—  ‰| ¦  «         S rL   rT   )r�   Úconds    €r%   ra  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>Á  s   ø€  t t¨C¡y¤y =€ r2   c                ó.   •— g | ]\  }} ‰||¦  «        ‘ŒS rT   rT   )rU   ri  rj  r€  s      €r%   rW   zBFAISS._create_filter_func.<locals>.filter_func.<locals>.<listcomp>Ã  s:   ø€ ð ð ð á$�E˜9ð !Ð  ¨	Ñ2Ô2ðð ð r2   c                ó<   •‡ — t          ˆ fd„‰D ¦   «         ¦  «        S )Nc              3  ó.   •K  — | ]} |‰¦  «        V — Œd S rL   rT   )rU   rj  r�   s     €r%   ru   zSFAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>.<locals>.<genexpr>Ç  s+   øè è € Ð"NÐ"N°i 9 9¨S¡>¤>Ð"NÐ"NÐ"NÐ"NÐ"NÐ"Nr2   r‰  )r�   Ú
conditionss   `€r%   ra  z@FAISS._create_filter_func.<locals>.filter_func.<locals>.<lambda>Ç  s%   øø€ �sÐ"NÐ"NÐ"NÐ"NÀ:Ð"NÑ"NÔ"NÑNÔN€ r2   )r  )r¥   r’  r–  r‹  r½   r€  s    @@@€€r%   r½   z.FAISS._create_filter_func.<locals>.filter_func¢  sã   øøøø€ ð* ˜ÐÐØTÐTÐTÐTÀVÈFÄ^ÐTÑTÔT�Ø?Ð?Ð?Ð?Ð?à˜ˆˆØSÐSÐSÐSÀVÈEÄ]ÐSÑSÔS�Ø?Ð?Ð?Ð?Ð?à˜ÐÐØ"�{ 6¨&¤>Ñ2Ô2�Ø0Ð0Ð0Ð0Ð0ðð ð ð à(.¯ª©¬ðñ ô ˆJð OÐNÐNÐNÐNr2   )ri  r*   rj  rk  r   rW  )r¥   rm  r   rW  )Úcallabler.   r|  r0   Útyper·   rY  r¸   rZ  r¹   r[  r\  r}  r–   Ú
startswith)r¥   rY  r¸   rZ  r¹   r[  r\  ÚCOMPARISON_OPERATORSÚSEQUENCE_OPERATORSÚVALID_OPERATORSrp  r~  r  r½   r€  s              @@@@r%   r²   zFAISS._create_filter_func=  s§  øøøø€ õ$ �FÑÔð 	ØˆMå˜&¥$Ñ'Ô'ð 	ÝØVÍÈVÉÌÐVÐVñô ð ð 	4Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð ØØØØØð 
ð  
Ðð 'Ð&Ø+Ð+ð
ð 
Ðð *Ð,>Ñ>ˆ
Ý#¥D¨Ñ$4Ô$4Ð7NÐ7NÐ7NÑ$NÑOÔOˆØ "Ðð ð 	Pð 	PˆBØð P�b—m’m CÑ(Ô(ð P¨R°Ð-FÐ-FÝ Ð!NÈ"Ð!NÐ!NÑOÔOÐOøð2	;ð 2	;ð 2	;ð 2	;ð 2	;ð 2	;ð 2	;ðh%	Oð %	Oð %	Oð %	Oð %	Oð %	Oð %	OðN ˆ{˜6Ñ"Ô"Ð"r2   úSequence[str]úlist[Document]c               ó8   ‡ — ˆ fd„|D ¦   «         }d„ |D ¦   «         S )Nc                óD   •— g | ]}‰j                              |¦  «        ‘ŒS rT   )r8   r±   )rU   rz   rH   s     €r%   rW   z$FAISS.get_by_ids.<locals>.<listcomp>Ì  s)   ø€ Ð9Ð9Ð9¨c�”×$Ò$ SÑ)Ô)Ð9Ð9Ð9r2   c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS rT   )r.   r   )rU   r�   s     r%   rW   z$FAISS.get_by_ids.<locals>.<listcomp>Í  s'   € ÐAÐAÐA˜¥z°#µxÑ'@Ô'@ÐA�ÐAÐAÐAr2   rT   )rH   rl   r¼   s   `  r%   Ú
get_by_idszFAISS.get_by_idsË  s0   ø€ Ø9Ð9Ð9Ð9°SÐ9Ñ9Ô9ˆØAÐA˜tÐAÑAÔAÐAr2   )r5   r6   r7   r   r8   r   r9   r:   r;   r<   r=   r!   r>   r   )r   rJ   )rO   rP   r   rQ   )rV   r*   r   r`   )NN)
rO   rh   rN   ri   rj   rk   rl   rm   r   rP   )
rO   rh   rj   r’   rl   rm   r“   r   r   rP   )
rœ   r�   rj   r’   rl   rm   r“   r   r   rP   )r    Nr¡   )r¢   r`   r£   r¤   r¥   r¦   r§   r¤   r“   r   r   r¨   )rÄ   r*   r£   r¤   r¥   r¦   r§   r¤   r“   r   r   r¨   )r¢   r`   r£   r¤   r¥   rË   r§   r¤   r“   r   r   rÌ   )r¢   r`   r£   r¤   r¥   r¦   r§   r¤   r“   r   r   rÌ   )rÄ   r*   r£   r¤   r¥   r¦   r§   r¤   r“   r   r   rÌ   )r¢   r`   r£   r¤   r§   r¤   rà   rá   r¥   r¦   r   r¨   )r    r¡   rÞ   N)r¢   r`   r£   r¤   r§   r¤   rà   rá   r¥   r¦   r“   r   r   rÌ   )rÄ   r*   r£   r¤   r§   r¤   rà   rá   r¥   r¦   r“   r   r   rÌ   rL   )rl   rm   r“   r   r   r   )r
  r4   r   r,   )rO   rh   rN   rQ   r¢   r   rj   rk   rl   rm   r=   r!   r>   r   r“   r   r   r4   )rO   rP   r¢   r   rj   r’   rl   rm   r“   r   r   r4   )rO   r  r¢   r   rj   r’   rl   rm   r“   r   r   r4   )rœ   r�   r¢   r   rj   rk   rl   rm   r“   r   r   r4   )r7   )r#  r*   r$  r*   r   r,   )r#  r*   rN   r   r$  r*   r3  r!   r4  r¤   r“   r   r   r4   )r   r;  )
r?  r;  rN   r   r3  r!   r“   r   r   r4   )r   rC  )r¥   r¦   r   rW  )rl   r�  r   rž  )1Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rE   rI   ÚpropertyrN   rZ   r_   rd   rg   r—   r™   r›   rŸ   rÀ   rÃ   rÈ   rÊ   rÓ   rÖ   rÚ   rÝ   rè   rê   rî   rñ   rô   rö   r  r  Úclassmethodr  r  r  r   r"  r2  r:  r>  rB  rI  rS  rV  Ústaticmethodr²   r¢  rT   r2   r%   r4   r4   K   sà  € € € € € ð}ð }ðP BFØ"Ø.>Ô.Qð!ð !ð !ð !ð !ðF ð
ð 
ð 
ñ „Xð
ðEð Eð Eð Eð
ð 
ð 
ð 
ð1ð 1ð 1ð 1ðð ð ð ð /3Ø#'ð(ð (ð (ð (ð (ðZ +/Ø#'ð	Kð Kð Kð Kð Kð0 +/Ø#'ð	Kð Kð Kð Kð Kð2 +/Ø#'ð	Kð Kð Kð Kð Kð2 Ø<@Øð?ð ?ð ?ð ?ð ?ðH Ø<@Øð%
ð %
ð %
ð %
ð %
ðT Ø<@Øð ð  ð  ð  ð  ðJ Ø<@Øð ð  ð  ð  ð  ðJ Ø+/Øð3ð 3ð 3ð 3ð 3ðF Ø<@Øð3ð 3ð 3ð 3ð 3ðF Ø<@Øð3ð 3ð 3ð 3ð 3ð8 Ø<@Øð3ð 3ð 3ð 3ð 3ð: ØØ Ø<@ðBð Bð Bð Bð Bð BðP ØØ Ø<@ð%
ð %
ð %
ð %
ð %
ð %
ðT ØØ Ø<@ð3ð 3ð 3ð 3ð 3ðD ØØ Ø<@ð3ð 3ð 3ð 3ð 3ðH ØØ Ø<@ð#ð #ð #ð #ð #ðP ØØ Ø<@ð#ð #ð #ð #ð #ðJ ð  ð  ð  ð  ðD6ð 6ð 6ð 6ð@ ð /3Ø#'Ø"Ø.>Ô.Qðð ð ð ñ „[ðð> ð
 +/Ø#'ð"
ð "
ð "
ð "
ñ „[ð"
ðH ð
 +/Ø#'ð"
ð "
ð "
ð "
ñ „[ð"
ðH ð
 /3Ø#'ð$
ð $
ð $
ð $
ñ „[ð$
ðL ð
 /3Ø#'ð
ð 
ð 
ð 
ñ „[ð
ð"Gð Gð Gð Gð Gð& ð
 "ð	3Pð 16Øð3Pð 3Pð 3Pð 3Pð 3Pñ „[ð3PðjTð Tð Tð Tð ð 16ðPð Pð Pð Pð Pñ „[ðPð>ð ð ð ð< Ø<@Øð#ð #ð #ð #ð #ð@ Ø<@Øð#ð #ð #ð #ð #ð: ðK#ð K#ð K#ñ „\ðK#ðZBð Bð Bð Bð Bð Br2   r4   rL   )r   r   r   r   )
r'   r   r(   r   r)   r*   r+   r*   r   r,   )-Ú
__future__r   Úloggingr·   r   r.  rp   rF   Úpathlibr   Útypingr   r   r   r   r	   r
   r   r   r   r   Únumpyrˆ   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.runnables.configr   Úlangchain_core.vectorstoresr   Ú!langchain_community.docstore.baser   r   Ú&langchain_community.docstore.in_memoryr   Ú&langchain_community.vectorstores.utilsr   r   Ú	getLoggerr£  rA   r&   r1   r4   rT   r2   r%   ú<module>r·     s  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ CÐ CÐ CÐ CÐ CÐ Cðð ð ð ð ð ð ð ð
 
ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð ð6ð ð ð ðBBð BBð BBð BBð BBˆKñ BBô BBð BBð BBð BBr2   