
    Ah.                    t   S r SSKJr  SSKrSSKJr  SSKJrJr  SSK	J
r
  SSKJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJrJrJr  SSKJr  SSKJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&  SSK'J(r(  \
" SSSS9 " S S\5      5       r)\
" SSSS9 " S S\)5      5       r*\
" SSSS9 " S S\)5      5       r+g)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                  `   \ rS rSr% SrS\S'    SrS\S'   SrS\S	'   S
rS\S'    \	" SSSS9r
\SS j5       r\SS j5       r\   S           SS jj5       r\  S         SS jj5       r\      SS j5       r S      S!S jjr\      S"S j5       r S      S#S jjrSrg)$BaseRetrievalQA   z)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                    U R                   /$ )zInput keys.

:meta private:
)r$   selfs    Z/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/chains/retrieval_qa/base.py
input_keysBaseRetrievalQA.input_keys7   s         c                N    U R                   /nU R                  (       a  / UQSPnU$ )zOutput keys.

:meta private:
source_documents)r&   r(   )r/   _output_keyss     r0   output_keysBaseRetrievalQA.output_keys?   s/     (''>\>+=>Lr3   Nc                    U=(       d    [         R                  " U5      n[        SUUUS.U=(       d    0 D6n[        S/SS9n[	        USUUS9n	U " SU	US.UD6$ )	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   )
clsr:   r;   r<   llm_chain_kwargskwargs_promptrA   rC   r!   s
             r0   from_llmBaseRetrievalQA.from_llmJ   s     ;O66s; 

  %2	
	 )+,/
 #6#,+	#
  
$;
 
 	
r3   c                H    U=(       d    0 n[        U4SU0UD6nU " SSU0UD6$ )zLoad chain from chain type.
chain_typer!   rD   r   )rF   r:   rM   chain_type_kwargsrH   _chain_type_kwargsr!   s          r0   from_chain_typeBaseRetrievalQA.from_chain_typel   sE     /4""/#
!#
 !#

 M+BMfMMr3   c                   gz,Get documents to do question answering over.NrD   r/   questionrun_managers      r0   	_get_docsBaseRetrievalQA._get_docs}   s    r3   c                   U=(       d    [         R                  " 5       nXR                     nS[        R                  " U R
                  5      R                  ;   nU(       a  U R                  XCS9nOU R                  U5      nU R                  R                  UUUR                  5       S9nU R                  (       a  U R                  USU0$ U R                  U0$ )0  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']
rV   rV   input_documentsrU   r<   r5   )r
   get_noop_managerr$   inspect	signaturerW   
parametersr!   run	get_childr(   r&   r/   inputsrV   _run_managerrU   accepts_run_managerdocsanswers           r0   _callBaseRetrievalQA._call   s      #S&@&Q&Q&S..)W..t~~>III 	 >>(>ED>>(+D--11 ",,. 2 
 ''OOV-?FF((r3   c                  #    g7frS   rD   rT   s      r0   
_aget_docsBaseRetrievalQA._aget_docs   s     s   c                  #    U=(       d    [         R                  " 5       nXR                     nS[        R                  " U R
                  5      R                  ;   nU(       a  U R                  XCS9I Sh  vN nOU R                  U5      I Sh  vN nU R                  R                  UUUR                  5       S9I Sh  vN nU R                  (       a  U R                  USU0$ U R                  U0$  N~ Nf N77f)rZ   rV   r[   Nr\   r5   )r	   r^   r$   r_   r`   rm   ra   r!   arunrc   r(   r&   rd   s           r0   _acall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   A3C:5C46C:C60C: C84C:6C:8C:rD   )returnz	list[str])NNN)r:   r   r;   zOptional[PromptTemplate]r<   r   rG   Optional[dict]rH   r   rs   r   )stuffN)
r:   r   rM   r#   rN   rt   rH   r   rs   r   rU   r#   rV   r
   rs   list[Document])N)re   dict[str, Any]rV   z$Optional[CallbackManagerForChainRun]rs   rx   rU   r#   rV   r	   rs   rw   )re   rx   rV   z)Optional[AsyncCallbackManagerForChainRun]rs   rx   )__name__
__module____qualname____firstlineno____doc____annotations__r$   r&   r(   r   model_configpropertyr1   r7   classmethodrJ   rP   r   rW   rj   rm   rq   __static_attributes__rD   r3   r0   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!)!) ?!) 
	!) !)r3   r   z0.1.17c                  p    \ rS rSr% Sr\" SS9rS\S'         SS jr      SS jr	\
SS	 j5       rS
rg)RetrievalQA   a  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               V    U R                   R                  USUR                  5       0S9$ )	Get docs.r<   config)r   invokerc   rT   s      r0   rW   RetrievalQA._get_docs  s4     ~~$$!6!6!89 % 
 	
r3   c               r   #    U R                   R                  USUR                  5       0S9I Sh  vN $  N7f)r   r<   r   N)r   ainvokerc   rT   s      r0   rm   RetrievalQA._aget_docs  sA      ^^++!6!6!89 , 
 
 	
 
s   .757c                    g)Return the chain type.retrieval_qarD   r.   s    r0   _chain_typeRetrievalQA._chain_type'       r3   rD   Nrv   ry   rs   r#   )rz   r{   r|   r}   r~   r   r   r   rW   rm   r   r   r   rD   r3   r0   r   r      so    +Z  %T2I}2



 0	


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

 


  r3   r   c                      \ rS rSr% Sr\" SSS9rS\S'    SrS\S	'    S
r	S\S'    \" \
S9rS\S'    \" SS9\SS j5       5       r      SS jr      SS jr\SS j5       rSrg)
VectorDBQAi-  r   Tvectorstore)r   aliasr      intk
similarityr#   search_type)default_factoryrx   search_kwargsbefore)modec                J    SU;   a  US   nUS;  a  SU S3n[        U5      eU$ )zValidate search type.r   )r   mmrsearch_type of  not allowed.)
ValueError)rF   valuesr   msgs       r0   validate_search_typeVectorDBQA.validate_search_typeB  s<     F" /K"77'}MB o%r3   c               L   U R                   S:X  a5  U R                  R                  " U4SU R                  0U R                  D6nU$ U R                   S:X  a5  U R                  R
                  " U4SU R                  0U R                  D6nU$ SU R                    S3n[        U5      e)r   r   r   r   r   r   )r   r   similarity_searchr   r   max_marginal_relevance_searchr   )r/   rU   rV   rh   r   s        r0   rW   VectorDBQA._get_docsM  s     |+##55&& $$D  &##AA&& $$D  $D$4$4#5]CCS/!r3   c               $   #    Sn[        U5      e7f)r   z!VectorDBQA does not support async)NotImplementedError)r/   rU   rV   r   s       r0   rm   VectorDBQA._aget_docse  s      2!#&&s   c                    g)r   vector_db_qarD   r.   s    r0   r   VectorDBQA._chain_typeo  r   r3   rD   N)r   dictrs   r   rv   ry   r   )rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   rW   rm   r   r   r   rD   r3   r0   r   r   -  s     B$TGKG(AsJ+#K#E$)$$?M>?(#  $ 0	
 
0'' 5	'
 
'  r3   r   ),r~   
__future__r   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   r   r   rD   r3   r0   <module>r      s    = "     * 
 . < 1 3 3 7 7 ' M H ) = L 
	T	l)e l)l)^ 
	T	K/ KK\ 
	T	< <<r3   