
    h.                       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.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                  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    `/var/www/html/eduruby.in/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6s; 

  %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Mf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 	 >>(>ED>>(+D--11 ",,. 2 
 ''OOV-?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LD22D3388 ",,. 9 
 
 ''OOV-?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Is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2I}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     |+54##55&& $$D  &A4##AA&& $$D  $D$4$4#5]CC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GKG(AsJ+#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   