
    @'h.                       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	 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    i/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/langchain/chains/retrieval_qa/base.py
input_keyszBaseRetrievalQA.input_keys8   s         c                D    | j                   g}| j                  r|dgz   }|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_llmK   s     ;O66s; 
Gy
=M=SQS
	 )+,7Q
 #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_typei   sC     /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_docsx   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 8|?U?U?W 2 
 ''OOV-?FFOOV,,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 8|?U?U?W 9 
 
 ''OOV-?FFOOV,, 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#+/

 )
 	

 )
 
 

 
:  ",0	NN N *	N
 N 
N N ;; 0	;
 
; ; =A - - : - 
	 -D ;; 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  s3     ~~$$k;+@+@+BC % 
 	
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  sA      ^^++k;+@+@+BC , 
 
 	
 
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 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                0    t        j                  d       |S )NzR`VectorDBQA` is deprecated - please use `from langchain.chains import RetrievalQA`)warningswarn)rC   valuess     r/   raise_deprecationzVectorDBQA.raise_deprecation9  s     	D	
 r1   c                >    d|v r|d   }|dvrt        d| d      |S )zValidate search type.r   )r   mmrsearch_type of  not allowed.)
ValueError)rC   r   r   s      r/   validate_search_typezVectorDBQA.validate_search_typeB  s8     F" /K"77 ?;-}!MNNr1   c               D   | j                   dk(  r5 | j                  j                  |fd| j                  i| j                  }|S | j                   dk(  r5 | j                  j
                  |fd| j                  i| j                  }|S t        d| j                    d      )r~   r   r   r   r   r   )r   r   similarity_searchr   r   max_marginal_relevance_searchr   )r.   rP   rQ   rb   s       r/   rR   zVectorDBQA._get_docsL  s     |+54##55 FF&*&8&8D  &A4##AA FF&*&8&8D
  t/?/?.@NOOr1   c                   K   t        d      w)r~   z!VectorDBQA does not support async)NotImplementedErrorrO   s      r/   rf   zVectorDBQA._aget_docs_  s      ""EFFs   c                     y)r   vector_db_qarA   r-   s    r/   r   zVectorDBQA._chain_typeh  r   r1   N)r   dictrj   r   rm   rp   r   )rq   rr   rs   rt   r   r   ru   r   r   r   r   r   rx   r   r   rR   rf   rw   r   rA   r1   r/   r   r   $  s     B$TGKG(AsJ+#K#E$)$$?M>?(#  $ (#  $ 0	
 
&GG 5	G
 
G  r1   r   )-rt   
__future__r   rY   r   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	d-e d-d-N 
	T	I/ IIX 
	T	> >>r1   