a
    ~g.                     @  sZ  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dG dd de!Z,eddddG dd de,Z-eddddG dd de,Z.dS )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                	   @  s   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dZ	e
ddddZe
ddddZed2dddddd dddZed3ddddd dd d!Zedd"d#d$d%d&Zd4d'd(d'd)d*d+Zedd,d#d$d-d.Zd5d'd/d'd)d0d1ZdS )6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extraz	List[str]returnc                 C  s   | j gS )z,Input keys.

        :meta private:
        )r#   self r0   g/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/retrieval_qa/base.py
input_keys8   s    zBaseRetrievalQA.input_keysc                 C  s   | j g}| jr|dg }|S )z-Output keys.

        :meta private:
        source_documents)r%   r'   )r/   _output_keysr0   r0   r1   output_keys@   s    
zBaseRetrievalQA.output_keysNr   zOptional[PromptTemplate]r   zOptional[dict]r   )llmprompt	callbacksllm_chain_kwargskwargsr-   c           
      K  sZ   |pt |}tf |||d|p"i }tdgdd}t|d||d}	| f |	|d|S )zInitialize from LLM.)r6   r7   r8   page_contentzContext:
{page_content})input_variablestemplatecontext)	llm_chaindocument_variable_namedocument_promptr8   )r    r8   )r   
get_promptr   r   r   )
clsr6   r7   r8   r9   r:   _promptr?   rA   r    r0   r0   r1   from_llmK   s*    
zBaseRetrievalQA.from_llmstuff)r6   
chain_typechain_type_kwargsr:   r-   c                 K  s.   |pi }t |fd|i|}| f d|i|S )zLoad chain from chain type.rG   r    r   )rC   r6   rG   rH   r:   Z_chain_type_kwargsr    r0   r0   r1   from_chain_typei   s    	zBaseRetrievalQA.from_chain_typer   List[Document]questionrun_managerr-   c                C  s   dS z,Get documents to do question answering over.Nr0   r/   rL   rM   r0   r0   r1   	_get_docsx   s    zBaseRetrievalQA._get_docsDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrM   r-   c                 C  s~   |p
t  }|| j }dt| jjv }|r<| j||d}n
| |}| jj|||	 d}| j
rp| j|d|iS | j|iS d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']
        rM   rM   input_documentsrL   r8   r3   N)r   get_noop_managerr#   inspect	signaturerP   
parametersr    run	get_childr'   r%   r/   rR   rM   _run_managerrL   accepts_run_managerdocsanswerr0   r0   r1   _call   s    


zBaseRetrievalQA._callr
   c                  s   dS rN   r0   rO   r0   r0   r1   
_aget_docs   s    zBaseRetrievalQA._aget_docsz)Optional[AsyncCallbackManagerForChainRun]c                   s   |p
t  }|| j }dt| jjv }|rB| j||dI dH }n| |I dH }| jj|||	 dI dH }| j
r| j|d|iS | j|iS dS )rS   rM   rT   NrU   r3   )r
   rW   r#   rX   rY   rc   rZ   r    arunr\   r'   r%   r]   r0   r0   r1   _acall   s    

zBaseRetrievalQA._acall)NNN)rF   N)N)N)__name__
__module____qualname____doc____annotations__r#   r%   r'   r   model_configpropertyr2   r5   classmethodrE   rI   r   rP   rb   rc   re   r0   r0   r0   r1   r      s>   


      " r   z0.1.17c                   @  sZ   e Zd ZU dZeddZded< dddd	d
dZdddd	ddZe	ddddZ
dS )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   	retrieverr"   r   rJ   rK   c                C  s   | j j|d| idS )	Get docs.r8   config)rp   invoker\   rO   r0   r0   r1   rP     s    zRetrievalQA._get_docsr
   c                  s   | j j|d| idI dH S )rq   r8   rr   N)rp   ainvoker\   rO   r0   r0   r1   rc     s    zRetrievalQA._aget_docsr,   c                 C  s   dS )Return the chain type.retrieval_qar0   r.   r0   r0   r1   _chain_type  s    zRetrievalQA._chain_typeN)rf   rg   rh   ri   r   rp   rj   rP   rc   rl   rx   r0   r0   r0   r1   rn      s   

-rn   c                   @  s   e Zd ZU dZedddZded< dZded< d	Zd
ed< ee	dZ
ded< eddedddddZeddedddddZd
dddddZd
dddddZed
d d!d"Zd#S )$
VectorDBQAr   Tvectorstore)ro   aliasr      intk
similarityr"   search_type)default_factoryrQ   search_kwargsbefore)moder   r   )valuesr-   c                 C  s   t d |S )NzR`VectorDBQA` is deprecated - please use `from langchain.chains import RetrievalQA`)warningswarn)rC   r   r0   r0   r1   raise_deprecation9  s    zVectorDBQA.raise_deprecationc                 C  s,   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   r0   r0   r1   validate_search_typeB  s
    zVectorDBQA.validate_search_typer   rJ   rK   c                C  sf   | j dkr(| jj|fd| ji| j}n:| j dkrP| jj|fd| ji| j}ntd| j  d|S )rq   r   r~   r   r   r   )r   rz   similarity_searchr~   r   max_marginal_relevance_searchr   )r/   rL   rM   r`   r0   r0   r1   rP   L  s$    

zVectorDBQA._get_docsr
   c                  s   t ddS )rq   z!VectorDBQA does not support asyncN)NotImplementedErrorrO   r0   r0   r1   rc   _  s    zVectorDBQA._aget_docsr,   c                 C  s   dS )rv   vector_db_qar0   r.   r0   r0   r1   rx   h  s    zVectorDBQA._chain_typeN)rf   rg   rh   ri   r   rz   rj   r~   r   dictr   r   rm   r   r   rP   rc   rl   rx   r0   r0   r0   r1   ry   $  s   

	ry   )/ri   
__future__r   rX   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   Z#langchain.chains.question_answeringr   Z0langchain.chains.question_answering.stuff_promptr   r   rn   ry   r0   r0   r0   r1   <module>   sL   	 (	L	