Ë
    ´Œj¶.  ã                  ó†  — d Z ddlmZ ddl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mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(  e
ddd¬«       G d„ de«      «       Z) e
ddd¬«       G d„ de)«      «       Z* e
ddd¬«       G d„ de)«      «       Z+y)ú7Chain for question-answering against a vector database.é    )ÚannotationsN)Úabstractmethod)ÚAnyÚOptional)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRunÚ	Callbacks)ÚDocument)ÚBaseLanguageModel)ÚPromptTemplate)ÚBaseRetriever)ÚVectorStore)Ú
ConfigDictÚFieldÚmodel_validator)ÚChain)ÚBaseCombineDocumentsChain)ÚStuffDocumentsChain)ÚLLMChain©Úload_qa_chain)ÚPROMPT_SELECTORz0.2.13z1.0z³This class is deprecated. Use the `create_retrieval_chain` constructor instead. See migration guide here: https://python.langchain.com/docs/versions/migrating_chains/retrieval_qa/)ÚsinceÚremovalÚmessagec                  óF  — e Zd ZU dZded<   	 dZded<   dZded<   d	Zd
ed<   	  eddd¬«      Z	e
dd„«       Ze
dd„«       Ze	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„«       Ze	 	 d	 	 	 	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 dd„«       Z	 d	 	 	 	 	 dd„Ze	 	 	 	 	 	 d d„«       Z	 d	 	 	 	 	 d!d„Zy)"ÚBaseRetrievalQAz)Base class for question-answering chains.r   Úcombine_documents_chainÚqueryÚstrÚ	input_keyÚresultÚ
output_keyFÚboolÚreturn_source_documentsTÚforbid)Úpopulate_by_nameÚarbitrary_types_allowedÚextrac                ó   — | j                   gS )z,Input keys.

        :meta private:
        )r#   ©Úselfs    úl/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/retrieval_qa/base.pyÚ
input_keyszBaseRetrievalQA.input_keys7   s   € ð —‘ÐÐó    c                óD   — | j                   g}| j                  rg |¢d‘}|S )z-Output keys.

        :meta private:
        Úsource_documents)r%   r'   )r.   Ú_output_keyss     r/   Úoutput_keyszBaseRetrievalQA.output_keys?   s/   € ð Ÿ™Ð(ˆØ×'Ò'Ø>˜\Ð>Ð+=Ð>ˆLØÐr1   Nc                óª   — |xs t        j                  |«      }t        d|||dœ|xs i ¤Ž}t        dgd¬«      }t	        |d||¬«      }	 | d|	|dœ|¤ŽS )	zInitialize from LLM.)ÚllmÚpromptÚ	callbacksÚpage_contentzContext:
{page_content})Úinput_variablesÚtemplateÚcontext)Ú	llm_chainÚdocument_variable_nameÚdocument_promptr9   )r    r9   © )r   Ú
get_promptr   r   r   )
Úclsr7   r8   r9   Úllm_chain_kwargsÚkwargsÚ_promptr>   r@   r    s
             r/   Úfrom_llmzBaseRetrievalQA.from_llmJ   s’   € ð Ò;œO×6Ñ6°sÓ;ˆÜð 
ØØØñ
ð  Ò% 2ñ	
ˆ	ô )Ø+Ð,Ø/ô
ˆô #6ØØ#,Ø+Øô	#
Ðñ ð 
Ø$;Øñ
ð ñ
ð 	
r1   c                ó>   — |xs i }t        |fd|i|¤Ž} | dd|i|¤ŽS )zLoad chain from chain type.Ú
chain_typer    rA   r   )rC   r7   rI   Úchain_type_kwargsrE   Ú_chain_type_kwargsr    s          r/   Úfrom_chain_typezBaseRetrievalQA.from_chain_typel   sE   € ð /Ò4°"ÐÜ"/Øñ#
à!ð#
ð !ñ#
Ðñ
 ÑMÐ+BÐMÀfÑMÐMr1   c                ó   — y©z,Get documents to do question answering over.NrA   ©r.   ÚquestionÚrun_managers      r/   Ú	_get_docszBaseRetrievalQA._get_docs}   s   � r1   c                ó   — |xs t        j                  «       }|| j                     }dt        j                  | j
                  «      j                  v }|r| j                  ||¬«      }n| j                  |«      }| j                  j                  |||j                  «       ¬«      }| j                  r| j                  |d|iS | j                  |iS )áh  Run get_relevant_text and llm on input query.

        If chain has 'return_source_documents' as 'True', returns
        the retrieved documents as well under the key 'source_documents'.

        Example:
        .. code-block:: python

        res = indexqa({'query': 'This is my query'})
        answer, docs = res['result'], res['source_documents']
        rQ   ©rQ   ©Úinput_documentsrP   r9   r3   )r
   Úget_noop_managerr#   ÚinspectÚ	signaturerR   Ú
parametersr    ÚrunÚ	get_childr'   r%   ©r.   ÚinputsrQ   Ú_run_managerrP   Úaccepts_run_managerÚdocsÚanswers           r/   Ú_callzBaseRetrievalQA._call†   sÈ   € ð  #ÒSÔ&@×&QÑ&QÓ&SˆØ˜$Ÿ.™.Ñ)ˆàœW×.Ñ.¨t¯~©~Ó>×IÑIÐIð 	ñ Ø—>‘> (¸�>ÓE‰Dà—>‘> (Ó+ˆDØ×-Ñ-×1Ñ1Ø ØØ"×,Ñ,Ó.ð 2ó 
ˆð ×'Ò'Ø—O‘O VÐ-?ÀÐFÐFØ—‘ Ð(Ð(r1   c             ƒ  ó   K  — y­wrN   rA   rO   s      r/   Ú
_aget_docszBaseRetrievalQA._aget_docs©   s   è ø� ùs   ‚c              ƒ  óä  K  — |xs t        j                  «       }|| j                     }dt        j                  | j
                  «      j                  v }|r| j                  ||¬«      ƒ d{  –—† }n| j                  |«      ƒ d{  –—† }| j                  j                  |||j                  «       ¬«      ƒ d{  –—† }| j                  r| j                  |d|iS | j                  |iS 7 Œ|7 Œd7 Œ2­w)rT   rQ   rU   NrV   r3   )r	   rX   r#   rY   rZ   rf   r[   r    Úarunr]   r'   r%   r^   s           r/   Ú_acallzBaseRetrievalQA._acall²   sç   è ø€ ð  #ÒXÔ&E×&VÑ&VÓ&XˆØ˜$Ÿ.™.Ñ)ˆàœW×.Ñ.¨t¯©Ó?×JÑJÐJð 	ñ ØŸ™¨¸|˜ÓL×L‰DàŸ™¨Ó2×2ˆDØ×3Ñ3×8Ñ8Ø ØØ"×,Ñ,Ó.ð 9ó 
÷ 
ˆð ×'Ò'Ø—O‘O VÐ-?ÀÐFÐFØ—‘ Ð(Ð(ð Møà2øð
ús6   ‚A+C0Á-C*Á.C0ÂC,Â3C0Â;C.Â</C0Ã,C0Ã.C0)Úreturnz	list[str])NNN)r7   r   r8   zOptional[PromptTemplate]r9   r   rD   úOptional[dict]rE   r   rj   r   )ÚstuffN)
r7   r   rI   r"   rJ   rk   rE   r   rj   r   ©rP   r"   rQ   r
   rj   úlist[Document])N)r_   údict[str, Any]rQ   z$Optional[CallbackManagerForChainRun]rj   ro   ©rP   r"   rQ   r	   rj   rn   )r_   ro   rQ   z)Optional[AsyncCallbackManagerForChainRun]rj   ro   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r#   r%   r'   r   Úmodel_configÚpropertyr0   r5   ÚclassmethodrG   rL   r   rR   rd   rf   ri   rA   r1   r/   r   r      sÊ  … ñ 4à6Ó6Ø0Ø€IˆsÓØ€J�ÓØ$)Ð˜TÓ)Ø-áØØ $Øô€Lð ò ó ð ð òó ðð ð ,0Ø#Ø+/ð
àð
ð )ð
ð ð	
ð
 )ð
ð ð
ð 
ò
ó ð
ðB ð "Ø,0ð	NàðNð ðNð *ð	Nð
 ðNð 
òNó ðNð  ð;àð;ð 0ð	;ð
 
ò;ó ð;ð =Að!)àð!)ð :ð!)ð 
ó	!)ðF ð;àð;ð 5ð	;ð
 
ò;ó ð;ð BFð!)àð!)ð ?ð!)ð 
ô	!)r1   r   z0.1.17c                  óh   — e Zd ZU dZ ed¬«      Zded<   	 	 	 	 	 	 d
d„Z	 	 	 	 	 	 dd„Ze	dd„«       Z
y	)ÚRetrievalQAaƒ  Chain for question-answering against an index.

    This class is deprecated. See below for an example implementation using
    `create_retrieval_chain`:

        .. code-block:: python

            from langchain.chains import create_retrieval_chain
            from langchain.chains.combine_documents import create_stuff_documents_chain
            from langchain_core.prompts import ChatPromptTemplate
            from langchain_openai import ChatOpenAI


            retriever = ...  # Your retriever
            llm = ChatOpenAI()

            system_prompt = (
                "Use the given context to answer the question. "
                "If you don't know the answer, say you don't know. "
                "Use three sentence maximum and keep the answer concise. "
                "Context: {context}"
            )
            prompt = ChatPromptTemplate.from_messages(
                [
                    ("system", system_prompt),
                    ("human", "{input}"),
                ]
            )
            question_answer_chain = create_stuff_documents_chain(llm, prompt)
            chain = create_retrieval_chain(retriever, question_answer_chain)

            chain.invoke({"input": query})

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import RetrievalQA
            from langchain_community.vectorstores import FAISS
            from langchain_core.vectorstores import VectorStoreRetriever
            retriever = VectorStoreRetriever(vectorstore=FAISS(...))
            retrievalQA = RetrievalQA.from_llm(llm=OpenAI(), retriever=retriever)

    T)Úexcluder   Ú	retrieverc               ó\   — | j                   j                  |d|j                  «       i¬«      S )ú	Get docs.r9   ©Úconfig)r|   Úinvoker]   rO   s      r/   rR   zRetrievalQA._get_docs  s4   € ð �~‰~×$Ñ$ØØ ×!6Ñ!6Ó!8Ð9ð %ó 
ð 	
r1   c             ƒ  óx   K  — | j                   j                  |d|j                  «       i¬«      ƒ d{  –—† S 7 Œ­w)r~   r9   r   N)r|   Úainvoker]   rO   s      r/   rf   zRetrievalQA._aget_docs  sB   è ø€ ð —^‘^×+Ñ+ØØ ×!6Ñ!6Ó!8Ð9ð ,ó 
÷ 
ð 	
ð 
ús   ‚1:³8´:c                 ó   — y)úReturn the chain type.Úretrieval_qarA   r-   s    r/   Ú_chain_typezRetrievalQA._chain_type'  ó   € ð r1   Nrm   rp   ©rj   r"   )rq   rr   rs   rt   r   r|   ru   rR   rf   rw   r‡   rA   r1   r/   rz   rz   Ö   so   … ñ+ñZ  %¨TÔ2€Iˆ}Ó2ð

àð

ð 0ð	

ð
 
ó

ð

àð

ð 5ð	

ð
 
ó

ð òó ñr1   rz   c                  óÔ   — e Zd ZU dZ edd¬«      Zded<   	 dZded<   	 d	Zd
ed<   	  ee	¬«      Z
ded<   	  ed¬«      edd„«       «       Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zedd„«       Zy)Ú
VectorDBQAr   TÚvectorstore)r{   Úaliasr   é   ÚintÚkÚ
similarityr"   Úsearch_type)Údefault_factoryro   Úsearch_kwargsÚbefore)Úmodec                óB   — d|v r|d   }|dvrd|› d�}t        |«      ‚|S )zValidate search type.r’   )r‘   Úmmrúsearch_type of ú not allowed.)Ú
ValueError)rC   Úvaluesr’   Úmsgs       r/   Úvalidate_search_typezVectorDBQA.validate_search_typeB  s<   € ð ˜FÑ"Ø  Ñ/ˆKØÐ"7Ñ7Ø'¨ }°MÐB�Ü  “oÐ%Øˆr1   c               óH  — | j                   dk(  r5 | j                  j                  |fd| j                  i| j                  ¤Ž}|S | j                   dk(  r5 | j                  j
                  |fd| j                  i| j                  ¤Ž}|S d| j                   › d�}t        |«      ‚)r~   r‘   r�   r˜   r™   rš   )r’   rŒ   Úsimilarity_searchr�   r”   Úmax_marginal_relevance_searchr›   )r.   rP   rQ   rb   r�   s        r/   rR   zVectorDBQA._get_docsM  s¿   € ð ×Ñ˜|Ò+Ø5�4×#Ñ#×5Ñ5Øñà—&‘&ðð ×$Ñ$ñˆDð ˆð ×Ñ Ò&ØA�4×#Ñ#×AÑAØñà—&‘&ðð ×$Ñ$ñˆDð ˆð $ D×$4Ñ$4Ð#5°]ÐCˆCÜ˜S“/Ð!r1   c             ƒ  ó$   K  — d}t        |«      ‚­w)r~   z!VectorDBQA does not support async)ÚNotImplementedError)r.   rP   rQ   r�   s       r/   rf   zVectorDBQA._aget_docse  s   è ø€ ð 2ˆÜ! #Ó&Ð&ùs   ‚c                 ó   — y)r…   Úvector_db_qarA   r-   s    r/   r‡   zVectorDBQA._chain_typeo  rˆ   r1   N)rœ   Údictrj   r   rm   rp   r‰   )rq   rr   rs   rt   r   rŒ   ru   r�   r’   r¦   r”   r   rx   rž   rR   rf   rw   r‡   rA   r1   r/   r‹   r‹   -  s¼   … ñ Bá$¨T¸ÔG€K�ÓGØ(Ø€A€sƒJØ+Ø#€K�Ó#ØEÙ$)¸$Ô$?€M�>Ó?Øá˜(Ô#Øòó ó $ððàðð 0ð	ð
 
óð0'àð'ð 5ð	'ð
 
ó'ð òó ñr1   r‹   ),rt   Ú
__future__r   rY   Úabcr   Útypingr   r   Úlangchain_core._apir   Úlangchain_core.callbacksr	   r
   r   Úlangchain_core.documentsr   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr   Úlangchain_core.retrieversr   Úlangchain_core.vectorstoresr   Úpydanticr   r   r   Úlangchain.chains.baser   Ú'langchain.chains.combine_documents.baser   Ú(langchain.chains.combine_documents.stuffr   Úlangchain.chains.llmr   Ú#langchain.chains.question_answeringr   Ú0langchain.chains.question_answering.stuff_promptr   r   rz   r‹   rA   r1   r/   Ú<module>r¸      sÖ   ðÙ =å "ã Ý ß  å *÷ñ õ
 .Ý <Ý 1Ý 3Ý 3ß 7Ñ 7å 'Ý MÝ HÝ )Ý =Ý Lñ Ø
Øð	Tô	ôl)�eó l)óðl)ñ^ Ø
Øð	Tô	ôK�/ó KóðKñ\ Ø
Øð	Tô	ô<�ó <óñ<r1   