
    ih.                       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.y)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                  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/dev/engine/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)   )r0   _output_keyss     r1   output_keyszBaseRetrievalQA.output_keys@   s-     ('''+=*>>Lr3   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_promptr;   )r"   r;    )r   
get_promptr   r   r   )
clsr9   r:   r;   llm_chain_kwargskwargs_promptr@   rB   r"   s
             r1   from_llmzBaseRetrievalQA.from_llmK   s     ;O66s; 
Gy
=M=SQS
	 )+,7Q
 #6#,+	#
  
$;
 
 	
r3   c                >    |xs i }t        |fd|i|} | dd|i|S )zLoad chain from chain type.
chain_typer"   rC   r   )rE   r9   rK   chain_type_kwargsrG   _chain_type_kwargsr"   s          r1   from_chain_typezBaseRetrievalQA.from_chain_typei   sC     /4""/#
&#
*<#
 M+BMfMMr3   c                    yz,Get documents to do question answering over.NrC   r0   questionrun_managers      r1   	_get_docszBaseRetrievalQA._get_docsx   s    r3   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']
        rS   rS   input_documentsrR   r;   r5   )r   get_noop_managerr%   inspect	signaturerT   
parametersr"   run	get_childr)   r'   r0   inputsrS   _run_managerrR   accepts_run_managerdocsanswers           r1   _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,,r3   c                  K   ywrP   rC   rQ   s      r1   
_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)rV   rS   rW   NrX   r5   )r   rZ   r%   r[   r\   rh   r]   r"   arunr_   r)   r'   r`   s           r1   _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)r9   r   r:   zOptional[PromptTemplate]r;   r   rF   Optional[dict]rG   r   rl   r!   )stuffN)
r9   r   rK   r$   rL   rm   rG   r   rl   r!   rR   r$   rS   r   rl   List[Document])N)ra   Dict[str, Any]rS   z$Optional[CallbackManagerForChainRun]rl   rq   rR   r$   rS   r   rl   rp   )ra   rq   rS   z)Optional[AsyncCallbackManagerForChainRun]rl   rq   )__name__
__module____qualname____doc____annotations__r%   r'   r)   r   model_configpropertyr2   r7   classmethodrI   rN   r   rT   rf   rh   rk   rC   r3   r1   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 - - ? - 
	 -r3   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.r;   config)r~   invoker_   rQ   s      r1   rT   zRetrievalQA._get_docs  s3     ~~$$k;+@+@+BC % 
 	
r3   c               x   K   | j                   j                  |d|j                         i       d{   S 7 w)r   r;   r   N)r~   ainvoker_   rQ   s      r1   rh   zRetrievalQA._aget_docs  sA      ^^++k;+@+@+BC , 
 
 	
 
s   1:8:c                     y)Return the chain type.retrieval_qarC   r/   s    r1   _chain_typezRetrievalQA._chain_type       r3   Nro   rr   rl   r$   )rs   rt   ru   rv   r   r~   rw   rT   rh   ry   r   rC   r3   r1   r|   r|      so    +Z  %T2I}2	
	
 0		

 
	
	
	
 5		

 
	
  r3   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y)
VectorDBQAr   Tvectorstore)r}   aliasr      intk
similarityr$   search_type)default_factoryrq   search_kwargsbefore)modec                0    t        j                  d       |S )NzR`VectorDBQA` is deprecated - please use `from langchain.chains import RetrievalQA`)warningswarn)rE   valuess     r1   raise_deprecationzVectorDBQA.raise_deprecation9  s     	D	
 r3   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)rE   r   r   s      r1   validate_search_typezVectorDBQA.validate_search_typeB  s8     F" /K"77 ?;-}!MNNr3   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   )r0   rR   rS   rd   s       r1   rT   zVectorDBQA._get_docsL  s     |+54##55 FF&*&8&8D  &A4##AA FF&*&8&8D
  t/?/?.@NOOr3   c                   K   t        d      w)r   z!VectorDBQA does not support async)NotImplementedErrorrQ   s      r1   rh   zVectorDBQA._aget_docs_  s      ""EFFs   c                     y)r   vector_db_qarC   r/   s    r1   r   zVectorDBQA._chain_typeh  r   r3   N)r   r   rl   r   ro   rr   r   )rs   rt   ru   rv   r   r   rw   r   r   dictr   r   rz   r   r   rT   rh   ry   r   rC   r3   r1   r   r   $  s     B$TGKG(AsJ+#K#E$)$$?M>?(#  $ (#  $ 0	
 
&GG 5	G
 
G  r3   r   )/rv   
__future__r   r[   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   rC   r3   r1   <module>r      s    = "    , , * 
 . < 1 3 3 7 7 ' M H ) = L 
	T	d-e d-d-N 
	T	I/ IIX 
	T	> >>r3   