§
    è˜ºhã&  ã                  óJ  — d Z ddlm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 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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)  G d„ de¦  «        Z* G d„ de*¦  «        Z+ G d„ de*¦  «        Z,dS )ú7Chain for question-answering against a vector database.é    )ÚannotationsN)Úabstractmethod)ÚAnyÚDictÚListÚOptional)ÚDocument)ÚBaseLanguageModel)ÚPromptTemplate)ÚExtraÚFieldÚroot_validator)ÚBaseRetriever)ÚVectorStore)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRunÚ	Callbacks)ÚChain)ÚBaseCombineDocumentsChain)ÚStuffDocumentsChain)ÚLLMChain©Úload_qa_chain)ÚPROMPT_SELECTORc                  ó  — 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<   	  G d„ d¦  «        Ze	d/d„¦   «         Z
e	d/d„¦   «         Ze	 	 	 d0d1d„¦   «         Ze	 	 d2d3d!„¦   «         Zed4d&„¦   «         Z	 d5d6d*„Zed7d,„¦   «         Z	 d5d8d.„ZdS )9ÚBaseRetrievalQAz)Base class for question-answering chains.r   Úcombine_documents_chainÚqueryÚstrÚ	input_keyÚresultÚ
output_keyFÚboolÚreturn_source_documentsc                  ó(   — e Zd ZdZej        ZdZdZdS )úBaseRetrievalQA.Configz'Configuration for this pydantic object.TN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚforbidÚextraÚarbitrary_types_allowedÚallow_population_by_field_name© ó    új/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/chains/retrieval_qa/base.pyÚConfigr'   '   s)   € € € € € Ø5Ð5à”ˆØ"&ÐØ)-Ð&Ð&Ð&r1   r3   Úreturnú	List[str]c                ó   — | j         gS )z,Input keys.

        :meta private:
        )r!   ©Úselfs    r2   Ú
input_keyszBaseRetrievalQA.input_keys.   s   € ð ”ÐÐr1   c                ó0   — | j         g}| j        r|dgz   }|S )z-Output keys.

        :meta private:
        Úsource_documents)r#   r%   )r8   Ú_output_keyss     r2   Úoutput_keyszBaseRetrievalQA.output_keys6   s-   € ð œÐ(ˆØÔ'ð 	?Ø'Ð+=Ð*>Ñ>ˆLØÐr1   NÚllmr   ÚpromptúOptional[PromptTemplate]Ú	callbacksr   Úllm_chain_kwargsúOptional[dict]Úkwargsr   c                ó²   — |pt          j        |¦  «        }t          d|||dœ|pi ¤Ž}t          dgd¬¦  «        }t	          |d||¬¦  «        }	 | d|	|dœ|¤ŽS )	zInitialize from LLM.)r>   r?   rA   Úpage_contentzContext:
{page_content})Úinput_variablesÚtemplateÚcontext)Ú	llm_chainÚdocument_variable_nameÚdocument_promptrA   )r   rA   r0   )r   Ú
get_promptr   r   r   )
Úclsr>   r?   rA   rB   rD   Ú_promptrJ   rL   r   s
             r2   Úfrom_llmzBaseRetrievalQA.from_llmA   s¹   € ð Ð;�OÔ6°sÑ;Ô;ˆÝð 
Ø˜G¨yð
ð 
Ø=MÐ=SÐQSð
ð 
ˆ	õ )Ø+Ð,Ð7Qð
ñ 
ô 
ˆõ #6ØØ#,Ø+Øð	#
ñ #
ô #
Ðð ˆsð 
Ø$;Øð
ð 
ð ð
ð 
ð 	
r1   ÚstuffÚ
chain_typeÚchain_type_kwargsc                ó<   — |pi }t          |fd|i|¤Ž} | dd|i|¤ŽS )zLoad chain from chain type.rR   r   r0   r   )rN   r>   rR   rS   rD   Ú_chain_type_kwargsr   s          r2   Úfrom_chain_typezBaseRetrievalQA.from_chain_type_   sU   € ð /Ð4°"ÐÝ"/Øð#
ð #
Ø&ð#
Ø*<ð#
ð #
Ðð ˆsÐMÐMÐ+BÐMÀfÐMÐMÐMr1   ÚquestionÚrun_managerr   úList[Document]c               ó   — dS ©z,Get documents to do question answering over.Nr0   ©r8   rW   rX   s      r2   Ú	_get_docszBaseRetrievalQA._get_docsn   s   € € € r1   ÚinputsúDict[str, Any]ú$Optional[CallbackManagerForChainRun]c                óx  — |pt          j        ¦   «         }|| j                 }dt          j        | j        ¦  «        j        v }|r|                      ||¬¦  «        }n|                      |¦  «        }| 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']
        rX   ©rX   ©Úinput_documentsrW   rA   r;   )r   Úget_noop_managerr!   ÚinspectÚ	signaturer]   Ú
parametersr   ÚrunÚ	get_childr%   r#   ©r8   r^   rX   Ú_run_managerrW   Úaccepts_run_managerÚdocsÚanswers           r2   Ú_callzBaseRetrievalQA._callw   sÏ   € ð  #ÐSÕ&@Ô&QÑ&SÔ&SˆØ˜$œ.Ô)ˆà�WÔ.¨t¬~Ñ>Ô>ÔIÐIð 	ð ð 	,Ø—>’> (¸�>ÑEÔEˆDˆDà—>’> (Ñ+Ô+ˆDØÔ-×1Ò1Ø ¨8¸|×?UÒ?UÑ?WÔ?Wð 2ñ 
ô 
ˆð Ô'ð 	-Ø”O VÐ-?ÀÐFÐFà”O VÐ,Ð,r1   r   c             ƒ  ó
   K  — dS r[   r0   r\   s      r2   Ú
_aget_docszBaseRetrievalQA._aget_docs™   s
   è è € € € r1   ú)Optional[AsyncCallbackManagerForChainRun]c              ƒ  ó   K  — |pt          j        ¦   «         }|| j                 }dt          j        | j        ¦  «        j        v }|r|                      ||¬¦  «        ƒ d{V —†}n|                      |¦  «        ƒ d{V —†}| j                             ||| 	                    ¦   «         ¬¦  «        ƒ d{V —†}| j
        r| j        |d|iS | j        |iS )rb   rX   rc   Nrd   r;   )r   rf   r!   rg   rh   rs   ri   r   Úarunrk   r%   r#   rl   s           r2   Ú_acallzBaseRetrievalQA._acall¢   s  è è € ð  #ÐXÕ&EÔ&VÑ&XÔ&XˆØ˜$œ.Ô)ˆà�WÔ.¨t¬Ñ?Ô?ÔJÐJð 	ð ð 	3ØŸš¨¸|˜ÑLÔLÐLÐLÐLÐLÐLÐLˆDˆDàŸš¨Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2ˆDØÔ3×8Ò8Ø ¨8¸|×?UÒ?UÑ?WÔ?Wð 9ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð Ô'ð 	-Ø”O VÐ-?ÀÐFÐFà”O VÐ,Ð,r1   )r4   r5   )NNN)r>   r   r?   r@   rA   r   rB   rC   rD   r   r4   r   )rQ   N)
r>   r   rR   r    rS   rC   rD   r   r4   r   ©rW   r    rX   r   r4   rY   )N)r^   r_   rX   r`   r4   r_   ©rW   r    rX   r   r4   rY   )r^   r_   rX   rt   r4   r_   )r(   r)   r*   r+   Ú__annotations__r!   r#   r%   r3   Úpropertyr9   r=   ÚclassmethodrP   rV   r   r]   rq   rs   rw   r0   r1   r2   r   r      s¬  € € € € € € Ø3Ð3à6Ð6Ð6Ñ6Ø0Ø€IÐÐÐÑØ€JÐÐÐÑØ$)ÐÐ)Ð)Ð)Ñ)Ø-ð.ð .ð .ð .ð .ñ .ô .ð .ð ð ð  ð  ñ „Xð ð ðð ð ñ „Xðð ð ,0Ø#Ø+/ð
ð 
ð 
ð 
ñ „[ð
ð: ð "Ø,0ð	Nð Nð Nð Nñ „[ðNð ð;ð ;ð ;ñ „^ð;ð =Að -ð  -ð  -ð  -ð  -ðD ð;ð ;ð ;ñ „^ð;ð BFð -ð  -ð  -ð  -ð  -ð  -ð  -r1   r   c                  ó^   — e Zd ZU dZ ed¬¦  «        Zded<   dd„Zdd„Ze	dd„¦   «         Z
dS )ÚRetrievalQAaî  Chain for question-answering against an index.

    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   Ú	retrieverrW   r    rX   r   r4   rY   c               ó^   — | j                              ||                     ¦   «         ¬¦  «        S )ú	Get docs.©rA   )r€   Úget_relevant_documentsrk   r\   s      r2   r]   zRetrievalQA._get_docsÖ   s4   € ð Œ~×4Ò4Ø × 5Ò 5Ñ 7Ô 7ð 5ñ 
ô 
ð 	
r1   r   c             ƒ  ón   K  — | j                              ||                     ¦   «         ¬¦  «        ƒ d{V —†S )r‚   rƒ   N)r€   Úaget_relevant_documentsrk   r\   s      r2   rs   zRetrievalQA._aget_docsá   sV   è è € ð ”^×;Ò;Ø × 5Ò 5Ñ 7Ô 7ð <ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r1   c                ó   — dS )úReturn the chain type.Úretrieval_qar0   r7   s    r2   Ú_chain_typezRetrievalQA._chain_typeì   ó	   € ð ˆ~r1   Nrx   ry   ©r4   r    )r(   r)   r*   r+   r   r€   rz   r]   rs   r{   rŠ   r0   r1   r2   r~   r~   Å   sˆ   € € € € € € ðð ð  %˜u¨TÐ2Ñ2Ô2€IÐ2Ð2Ð2Ñ2ð	
ð 	
ð 	
ð 	
ð	
ð 	
ð 	
ð 	
ð ðð ð ñ „Xðð ð r1   r~   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d„¦   «         Z e¦   «         dd„¦   «         Zdd„Zdd„Zed d„¦   «         ZdS )!Ú
VectorDBQAr   TÚvectorstore)r   Úaliasr   é   ÚintÚkÚ
similarityr    Úsearch_type)Údefault_factoryr_   Úsearch_kwargsÚvaluesr   r4   c                ó.   — t          j        d¦  «         |S )NzR`VectorDBQA` is deprecated - please use `from langchain.chains import RetrievalQA`)ÚwarningsÚwarn)rN   r˜   s     r2   Úraise_deprecationzVectorDBQA.raise_deprecationþ   s#   € åŒðDñ	
ô 	
ð 	
ð ˆr1   c                óL   — d|v r|d         }|dvrt          d|› d�¦  «        ‚|S )zValidate search type.r•   )r”   Úmmrúsearch_type of ú not allowed.)Ú
ValueError)rN   r˜   r•   s      r2   Úvalidate_search_typezVectorDBQA.validate_search_type  sD   € ð ˜FÐ"Ð"Ø  Ô/ˆKØÐ"7Ð7Ð7Ý Ð!M°;Ð!MÐ!MÐ!MÑNÔNÐNØˆr1   rW   rX   r   rY   c               óâ   — | j         dk    r  | j        j        |fd| j        i| j        ¤Ž}nC| j         dk    r  | j        j        |fd| j        i| j        ¤Ž}nt          d| j         › d�¦  «        ‚|S )r‚   r”   r“   rž   rŸ   r    )r•   r�   Úsimilarity_searchr“   r—   Úmax_marginal_relevance_searchr¡   )r8   rW   rX   ro   s       r2   r]   zVectorDBQA._get_docs  s²   € ð Ô˜|Ò+Ð+Ø5�4Ô#Ô5Øðð Ø œFðØ&*Ô&8ðð ˆDˆDð Ô Ò&Ð&ØA�4Ô#ÔAØðð Ø œFðØ&*Ô&8ðð ˆDˆDõ ÐN¨tÔ/?ÐNÐNÐNÑOÔOÐOØˆr1   r   c             ƒ  ó$   K  — t          d¦  «        ‚)r‚   z!VectorDBQA does not support async)ÚNotImplementedErrorr\   s      r2   rs   zVectorDBQA._aget_docs"  s   è è € õ "Ð"EÑFÔFÐFr1   c                ó   — dS )rˆ   Úvector_db_qar0   r7   s    r2   rŠ   zVectorDBQA._chain_type+  r‹   r1   N)r˜   r   r4   r   rx   ry   rŒ   )r(   r)   r*   r+   r   r�   rz   r“   r•   Údictr—   r   rœ   r¢   r]   rs   r{   rŠ   r0   r1   r2   rŽ   rŽ   ò   s   € € € € € € ØAÐAà$˜u¨T¸ÐGÑGÔG€KÐGÐGÐGÑGØ(Ø€A€J€J€J�JØ+Ø#€KÐ#Ð#Ð#Ñ#ØEØ$) E¸$Ð$?Ñ$?Ô$?€MÐ?Ð?Ð?Ñ?Øà€^ÑÔðð ð ñ Ôðð €^ÑÔðð ð ñ Ôððð ð ð ð&Gð Gð Gð Gð ðð ð ñ „Xðð ð r1   rŽ   )-r+   Ú
__future__r   rg   rš   Úabcr   Útypingr   r   r   r	   Úlangchain_core.documentsr
   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr   Úlangchain_core.pydantic_v1r   r   r   Úlangchain_core.retrieversr   Úlangchain_core.vectorstoresr   Úlangchain.callbacks.managerr   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   r~   rŽ   r0   r1   r2   ú<module>r»      s  ðØ =Ð =Ø "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à -Ð -Ð -Ð -Ð -Ð -Ø <Ð <Ð <Ð <Ð <Ð <Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð
 (Ð 'Ð 'Ð 'Ð 'Ð 'Ø MÐ MÐ MÐ MÐ MÐ MØ HÐ HÐ HÐ HÐ HÐ HØ )Ð )Ð )Ð )Ð )Ð )Ø =Ð =Ð =Ð =Ð =Ð =Ø LÐ LÐ LÐ LÐ LÐ Lðe-ð e-ð e-ð e-ð e-�eñ e-ô e-ð e-ðP*ð *ð *ð *ð *�/ñ *ô *ð *ðZ<ð <ð <ð <ð <�ñ <ô <ð <ð <ð <r1   