§
    ™Štj.  ã                  óÌ  — d Z ddl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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' ddl(m)Z)  e	dddd¬¦  «         G d„ de¦  «        ¦   «         Z* e	dddd¬¦  «         G d„ de*¦  «        ¦   «         Z+ e	dddd¬¦  «         G d„ d e*¦  «        ¦   «         Z,dS )!ú7Chain for question-answering against a vector database.é    )ÚannotationsN)Úabstractmethod)ÚAny)Ú
deprecated)ÚAsyncCallbackManagerForChainRunÚCallbackManagerForChainRunÚ	Callbacks)ÚDocument)ÚBaseLanguageModel)ÚPromptTemplate)ÚBaseRetriever)ÚVectorStore)Ú
ConfigDictÚFieldÚmodel_validator)Úoverride)ÚChain)ÚBaseCombineDocumentsChain)ÚStuffDocumentsChain)ÚLLMChain©Úload_qa_chain)ÚPROMPT_SELECTORz0.2.13z2.0.0zlangchain.agents.create_agentzuBuild new RAG flows with `create_agent` and a retrieval tool. See https://docs.langchain.com/oss/python/langchain/rag)ÚsinceÚremovalÚalternativeÚaddendumc                  ó  — 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
d0d„¦   «         Ze
d0d„¦   «         Ze	 	 	 d1d2d„¦   «         Ze	 	 d3d4d"„¦   «         Zed5d'„¦   «         Z	 d6d7d+„Zed8d-„¦   «         Z	 d6d9d/„ZdS ):Ú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ÚextraÚreturnú	list[str]c                ó   — | j         gS )zInput keys.)r$   ©Úselfs    úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_classic/chains/retrieval_qa/base.pyÚ
input_keyszBaseRetrievalQA.input_keys8   s   € ð ”ÐÐó    c                ó0   — | j         g}| j        rg |¢d‘}|S )zOutput keys.Úsource_documents)r&   r(   )r1   Ú_output_keyss     r2   Úoutput_keyszBaseRetrievalQA.output_keys=   s/   € ð œÐ(ˆØÔ'ð 	?Ø>˜\Ð>Ð+=Ð>ˆLØÐr4   NÚllmr   ÚpromptúPromptTemplate | NoneÚ	callbacksr
   Úllm_chain_kwargsúdict | NoneÚkwargsr   c                ó²   — |pt          j        |¦  «        }t          d|||dœ|pi ¤Ž}t          dgd¬¦  «        }t	          |d||¬¦  «        }	 | d|	|dœ|¤ŽS )	zInitialize from LLM.)r9   r:   r<   Úpage_contentzContext:
{page_content})Úinput_variablesÚtemplateÚcontext)Ú	llm_chainÚdocument_variable_nameÚdocument_promptr<   )r!   r<   © )r   Ú
get_promptr   r   r   )
Úclsr9   r:   r<   r=   r?   Ú_promptrE   rG   r!   s
             r2   Úfrom_llmzBaseRetrievalQA.from_llmE   s¼   € ð Ð;�OÔ6°sÑ;Ô;ˆÝð 
ØØØð
ð 
ð  Ð% 2ð	
ð 
ˆ	õ )Ø+Ð,Ø/ð
ñ 
ô 
ˆõ #6ØØ#,Ø+Øð	#
ñ #
ô #
Ðð ˆsð 
Ø$;Øð
ð 
ð ð
ð 
ð 	
r4   ÚstuffÚ
chain_typeÚchain_type_kwargsc                ó<   — |pi }t          |fd|i|¤Ž} | dd|i|¤ŽS )zLoad chain from chain type.rN   r!   rH   r   )rJ   r9   rN   rO   r?   Ú_chain_type_kwargsr!   s          r2   Úfrom_chain_typezBaseRetrievalQA.from_chain_typeg   sW   € ð /Ð4°"ÐÝ"/Øð#
ð #
à!ð#
ð !ð#
ð #
Ðð
 ˆsÐMÐMÐ+BÐMÀfÐMÐMÐMr4   ÚquestionÚrun_managerr	   úlist[Document]c               ó   — dS ©z,Get documents to do question answering over.NrH   ©r1   rS   rT   s      r2   Ú	_get_docszBaseRetrievalQA._get_docsx   s   € € € r4   Úinputsúdict[str, Any]ú!CallbackManagerForChainRun | Nonec                óx  — |pt          j        ¦   «         }|| j                 }dt          j        | j        ¦  «        j        v }|r|                      ||¬¦  «        }n|                      |¦  «        }| j                             ||| 	                    ¦   «         ¬¦  «        }| j
        r| j        |d|iS | j        |iS )áf  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:
        ```python
        res = indexqa({"query": "This is my query"})
        answer, docs = res["result"], res["source_documents"]
        ```
        rT   ©rT   ©Úinput_documentsrS   r<   r6   )r	   Úget_noop_managerr$   ÚinspectÚ	signaturerY   Ú
parametersr!   ÚrunÚ	get_childr(   r&   ©r1   rZ   rT   Ú_run_managerrS   Úaccepts_run_managerÚdocsÚanswers           r2   Ú_callzBaseRetrievalQA._call�   sÒ   € ð  #ÐSÕ&@Ô&QÑ&SÔ&SˆØ˜$œ.Ô)ˆà�WÔ.¨t¬~Ñ>Ô>ÔIÐIð 	ð ð 	,Ø—>’> (¸�>ÑEÔEˆDˆDà—>’> (Ñ+Ô+ˆDØÔ-×1Ò1Ø ØØ"×,Ò,Ñ.Ô.ð 2ñ 
ô 
ˆð Ô'ð 	GØ”O VÐ-?ÀÐFÐFØ” Ð(Ð(r4   r   c             ƒ  ó
   K  — dS rW   rH   rX   s      r2   Ú
_aget_docszBaseRetrievalQA._aget_docs¤   s
   è è € € € r4   ú&AsyncCallbackManagerForChainRun | Nonec              ƒ  ó   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 )r^   rT   r_   Nr`   r6   )r   rb   r$   rc   rd   ro   re   r!   Úarunrg   r(   r&   rh   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Ø ØØ"×,Ò,Ñ.Ô.ð 9ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð Ô'ð 	GØ”O VÐ-?ÀÐFÐFØ” Ð(Ð(r4   )r-   r.   )NNN)r9   r   r:   r;   r<   r
   r=   r>   r?   r   r-   r    )rM   N)
r9   r   rN   r#   rO   r>   r?   r   r-   r    ©rS   r#   rT   r	   r-   rU   )N)rZ   r[   rT   r\   r-   r[   ©rS   r#   rT   r   r-   rU   )rZ   r[   rT   rp   r-   r[   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r$   r&   r(   r   Úmodel_configÚpropertyr3   r8   ÚclassmethodrL   rR   r   rY   rm   ro   rs   rH   r4   r2   r    r       s¤  € € € € € € ð 4Ð3à6Ð6Ð6Ñ6Ø0Ø€IÐÐÐÑØ€JÐÐÐÑØ$)ÐÐ)Ð)Ð)Ñ)Ø-à�:ØØ $Øðñ ô €Lð ð ð  ð  ñ „Xð ð ðð ð ñ „Xðð ð )-Ø#Ø(,ð
ð 
ð 
ð 
ñ „[ð
ðB ð "Ø)-ð	Nð Nð Nð Nñ „[ðNð  ð;ð ;ð ;ñ „^ð;ð :>ð!)ð !)ð !)ð !)ð !)ðF ð;ð ;ð ;ñ „^ð;ð ?Cð!)ð !)ð !)ð !)ð !)ð !)ð !)r4   r    z0.1.17c                  ó^   — 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.

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

        ```python
        from langchain_classic.chains import create_retrieval_chain
        from langchain_classic.chains.combine_documents import (
            create_stuff_documents_chain,
        )
        from langchain_core.prompts import ChatPromptTemplate
        from langchain_openai import ChatOpenAI


        retriever = ...  # Your retriever
        model = 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(model, prompt)
        chain = create_retrieval_chain(retriever, question_answer_chain)

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

    Example:
        ```python
        from langchain_openai import OpenAI
        from langchain_classic.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   Ú	retrieverrS   r#   rT   r	   r-   rU   c               ób   — | j                              |d|                     ¦   «         i¬¦  «        S )ú	Get docs.r<   ©Úconfig)r�   Úinvokerg   rX   s      r2   rY   zRetrievalQA._get_docs  s:   € ð Œ~×$Ò$ØØ ×!6Ò!6Ñ!8Ô!8Ð9ð %ñ 
ô 
ð 	
r4   r   c             ƒ  ór   K  — | j                              |d|                     ¦   «         i¬¦  «        ƒ d{V —†S )rƒ   r<   r„   N)r�   Úainvokerg   rX   s      r2   ro   zRetrievalQA._aget_docs  s\   è è € ð ”^×+Ò+ØØ ×!6Ò!6Ñ!8Ô!8Ð9ð ,ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r4   c                ó   — dS )úReturn the chain type.Úretrieval_qarH   r0   s    r2   Ú_chain_typezRetrievalQA._chain_type$  ó	   € ð ˆ~r4   Nrt   ru   ©r-   r#   )rv   rw   rx   ry   r   r�   rz   rY   ro   r|   rŒ   rH   r4   r2   r   r   Ñ   s‰   € € € € € € ð-ð -ð^  %˜u¨TÐ2Ñ2Ô2€IÐ2Ð2Ð2Ñ2ð

ð 

ð 

ð 

ð

ð 

ð 

ð 

ð ðð ð ñ „Xðð ð r4   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¬¦  «        edd„¦   «         ¦   «         Ze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Úbefore)ÚmodeÚvaluesÚdictr-   r   c                óP   — d|v r!|d         }|dvrd|› d�}t          |¦  «        ‚|S )zValidate search type.r—   )r–   Úmmrúsearch_type of ú not allowed.)Ú
ValueError)rJ   rœ   r—   Úmsgs       r2   Úvalidate_search_typezVectorDBQA.validate_search_type?  sF   € ð ˜FÐ"Ð"Ø  Ô/ˆKØÐ"7Ð7Ð7ØB¨ÐBÐBÐB�Ý  ‘o”oÐ%Øˆr4   rS   rT   r	   rU   c               óæ   — | j         dk    r  | j        j        |fd| j        i| j        ¤Ž}nE| j         dk    r  | j        j        |fd| j        i| j        ¤Ž}nd| j         › d�}t          |¦  «        ‚|S )rƒ   r–   r•   rŸ   r    r¡   )r—   r‘   Úsimilarity_searchr•   r™   Úmax_marginal_relevance_searchr¢   )r1   rS   rT   rk   r£   s        r2   rY   zVectorDBQA._get_docsJ  s¹   € ð Ô˜|Ò+Ð+Ø5�4Ô#Ô5Øðð à”&ðð Ô$ðð ˆDˆDð
 Ô Ò&Ð&ØA�4Ô#ÔAØðð à”&ðð Ô$ðð ˆDˆDð D DÔ$4ÐCÐCÐCˆCÝ˜S‘/”/Ð!Øˆr4   r   c             ƒ  ó(   K  — d}t          |¦  «        ‚)rƒ   z!VectorDBQA does not support async)ÚNotImplementedError)r1   rS   rT   r£   s       r2   ro   zVectorDBQA._aget_docsc  s   è è € ð 2ˆÝ! #Ñ&Ô&Ð&r4   c                ó   — dS )rŠ   Úvector_db_qarH   r0   s    r2   rŒ   zVectorDBQA._chain_typem  r�   r4   N)rœ   r�   r-   r   rt   ru   rŽ   )rv   rw   rx   ry   r   r‘   rz   r•   r—   r�   r™   r   r}   r¤   r   rY   ro   r|   rŒ   rH   r4   r2   r�   r�   *  s  € € € € € € ð BÐAà$˜u¨T¸ÐGÑGÔG€KÐGÐGÐGÑGØ(Ø€A€J€J€J�JØ+Ø#€KÐ#Ð#Ð#Ñ#ØEØ$) E¸$Ð$?Ñ$?Ô$?€MÐ?Ð?Ð?Ñ?Øà€_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð ðð ð ñ „Xðð0'ð 'ð 'ð 'ð ðð ð ñ „Xðð ð r4   r�   )-ry   Ú
__future__r   rc   Úabcr   Útypingr   Ú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   Útyping_extensionsr   Úlangchain_classic.chains.baser   Ú/langchain_classic.chains.combine_documents.baser   Ú0langchain_classic.chains.combine_documents.stuffr   Úlangchain_classic.chains.llmr   Ú+langchain_classic.chains.question_answeringr   Ú8langchain_classic.chains.question_answering.stuff_promptr   r    r   r�   rH   r4   r2   ú<module>r¾      sª  ðØ =Ð =à "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð
 .Ð -Ð -Ð -Ð -Ð -Ø <Ð <Ð <Ð <Ð <Ð <Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø &Ð &Ð &Ð &Ð &Ð &à /Ð /Ð /Ð /Ð /Ð /Ø UÐ UÐ UÐ UÐ UÐ UØ PÐ PÐ PÐ PÐ PÐ PØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø EÐ EÐ EÐ EÐ EÐ EØ TÐ TÐ TÐ TÐ TÐ Tð €Ø
ØØ/ð	>ðñ ô ðf)ð f)ð f)ð f)ð f)�eñ f)ô f)ñô ðf)ðR €Ø
ØØ/ð	>ðñ ô ðMð Mð Mð Mð M�/ñ Mô Mñô ðMð` €Ø
ØØ/ð	>ðñ ô ð=ð =ð =ð =ð =�ñ =ô =ñô ð=ð =ð =r4   