
    Ng.                       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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.dS )7Chain for question-answering against a vector database.    )annotationsN)abstractmethod)AnyDictList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.0zThis 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                     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.

        :meta private:
        )r%   selfs    ^/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/retrieval_qa/base.py
input_keyszBaseRetrievalQA.input_keys8   s         c                0    | j         g}| j        r|dgz   }|S )z-Output keys.

        :meta private:
        source_documents)r'   r)   )r2   _output_keyss     r3   output_keyszBaseRetrievalQA.output_keys@   s-     (' 	?'+=*>>Lr5   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;   r=   page_contentzContext:
{page_content})input_variablestemplatecontext)	llm_chaindocument_variable_namedocument_promptr=   )r"   r=    )r   
get_promptr   r   r   )
clsr:   r;   r=   r>   r@   _promptrF   rH   r"   s
             r3   from_llmzBaseRetrievalQA.from_llmK   s     ;O6s;; 
Gy
 
=M=SQS
 
	 )+,7Q
 
 
 #6#,+	#
 #
 #
 s 
$;
 
 
 
 	
r5   stuff
chain_typechain_type_kwargsc                <    |pi }t          |fd|i|} | dd|i|S )zLoad chain from chain type.rO   r"   rI   r   )rK   r:   rO   rP   r@   _chain_type_kwargsr"   s          r3   from_chain_typezBaseRetrievalQA.from_chain_typei   sU     /4""/#
 #
&#
*<#
 #
 sMM+BMfMMMr5   questionrun_managerr   List[Document]c                   dS z,Get documents to do question answering over.NrI   r2   rT   rU   s      r3   	_get_docszBaseRetrievalQA._get_docsx   s      r5   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']
        rU   rU   input_documentsrT   r=   r7   )r   get_noop_managerr%   inspect	signaturerZ   
parametersr"   run	get_childr)   r'   r2   r[   rU   _run_managerrT   accepts_run_managerdocsanswers           r3   _callzBaseRetrievalQA._call   s      #S&@&Q&S&S$.)W.t~>>II 	  	,>>(>EEDD>>(++D-11 8|?U?U?W?W 2 
 
 ' 	-OV-?FFOV,,r5   r   c               
   K   dS rX   rI   rY   s      r3   
_aget_docszBaseRetrievalQA._aget_docs   s
        r5   )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 )r_   rU   r`   Nra   r7   )r   rc   r%   rd   re   rp   rf   r"   arunrh   r)   r'   ri   s           r3   _acallzBaseRetrievalQA._acall   s       #X&E&V&X&X$.)W.t??JJ 	  	3|LLLLLLLLDD22222222D388 8|?U?U?W?W 9 
 
 
 
 
 
 
 
 ' 	-OV-?FFOV,,r5   )r.   r/   )NNN)r:   r   r;   r<   r=   r   r>   r?   r@   r   r.   r!   )rN   N)
r:   r   rO   r$   rP   r?   r@   r   r.   r!   rT   r$   rU   r   r.   rV   )N)r[   r\   rU   r]   r.   r\   rT   r$   rU   r   r.   rV   )r[   r\   rU   rq   r.   r\   )__name__
__module____qualname____doc____annotations__r%   r'   r)   r   model_configpropertyr4   r9   classmethodrM   rS   r   rZ   rn   rp   rt   rI   r5   r3   r!   r!      s         4366660IJ$)))))-: $  L       X     X  ,0#+/
 
 
 
 [
:  ",0	N N N N [N ; ; ; ^; =A -  -  -  -  -D ; ; ; ^; BF -  -  -  -  -  -  -r5   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`:

        .. 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   	retrieverrT   r$   rU   r   r.   rV   c               b    | j                             |d|                                i          S )	Get docs.r=   config)r   invokerh   rY   s      r3   rZ   zRetrievalQA._get_docs  s9     ~$$k;+@+@+B+BC % 
 
 	
r5   r   c               r   K   | j                             |d|                                i           d{V S )r   r=   r   N)r   ainvokerh   rY   s      r3   rp   zRetrievalQA._aget_docs  s[       ^++k;+@+@+B+BC , 
 
 
 
 
 
 
 
 	
r5   c                    dS )Return the chain type.retrieval_qarI   r1   s    r3   _chain_typezRetrievalQA._chain_type  	     ~r5   Nru   rv   r.   r$   )rw   rx   ry   rz   r   r   r{   rZ   rp   r}   r   rI   r5   r3   r   r      s         + +Z  %uT222I2222	
 	
 	
 	
	
 	
 	
 	
    X  r5   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          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before)modevaluesr   r.   r   c                .    t          j        d           |S )NzR`VectorDBQA` is deprecated - please use `from langchain.chains import RetrievalQA`)warningswarn)rK   r   s     r3   raise_deprecationzVectorDBQA.raise_deprecation9  s%     	D	
 	
 	
 r5   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)rK   r   r   s      r3   validate_search_typezVectorDBQA.validate_search_typeB  sD     F"" /K"777 !M;!M!M!MNNNr5   rT   rU   r   rV   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   )r2   rT   rU   rl   s       r3   rZ   zVectorDBQA._get_docsL  s     |++54#5  F&*&8 DD &&A4#A  F&*&8 DD Nt/?NNNOOOr5   r   c               $   K   t          d          )r   z!VectorDBQA does not support async)NotImplementedErrorrY   s      r3   rp   zVectorDBQA._aget_docs_  s       ""EFFFr5   c                    dS )r   vector_db_qarI   r1   s    r3   r   zVectorDBQA._chain_typeh  r   r5   N)r   r   r.   r   ru   rv   r   )rw   rx   ry   rz   r   r   r{   r   r   dictr   r   r~   r   r   rZ   rp   r}   r   rI   r5   r3   r   r   $  sA         BA$uTGGGKGGGG(AJJJJ+#K####E$)E$$?$?$?M????_(###   [ $# _(###   [ $#   &G G G G    X  r5   r   )/rz   
__future__r   rd   r   abcr   typingr   r   r   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!   r   r   rI   r5   r3   <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 ' ' ' ' ' ' M M M M M M H H H H H H ) ) ) ) ) ) = = = = = = L L L L L L 
	T	  d- d- d- d- d-e d- d- d-N 
	T	  I I I I I/ I I IX 
	T	  > > > > > > > > > >r5   