
    3fiS.                       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       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)
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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.)r#   selfs    h/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/chains/retrieval_qa/base.py
input_keyszBaseRetrievalQA.input_keys8   s         c                D    | j                   g}| j                  rg |d}|S )zOutput keys.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_llmE   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_typeg   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_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 )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"]
        ```
        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PromptTemplate | Noner9   r
   rD   dict | NonerE   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!CallbackManagerForChainRun | Nonerj   ro   rP   r"   rQ   r   rj   rn   )r_   ro   rQ   z&AsyncCallbackManagerForChainRun | Nonerj   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        )-#(,

 &
 	

 &
 
 

 
B  ")-	NN N '	N
 N 
N N  ;; 0	;
 
; ; :>!)!) 7!) 
	!)F ;; 5	;
 
; ; ?C!)!) <!) 
	!)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`:

        ```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   	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    -^  %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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_type?  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_docsJ  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_docsc  s      2!#&&s   c                     y)r   vector_db_qarA   r-   s    r/   r   zVectorDBQA._chain_typem  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	
 
 0'' 5	'
 
'  r1   r   )-rt   
__future__r   rY   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   rz   r   rA   r1   r/   <module>r      s    = "    * 
 . < 1 3 3 7 7 & / U P 1 E T 
	T	f)e f)f)R 
	T	M/ MM` 
	T	= ==r1   