a
    ag.                     @  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/)ZsinceZ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_documentsTZforbid)Zpopulate_by_nameZarbitrary_types_allowedextraz	List[str]returnc                 C  s   | j gS )z,Input keys.

        :meta private:
        )r!   self r+   p/var/www/html/cobodadashboardai.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*   Z_output_keysr+   r+   r,   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.)r0   r1   r2   Zpage_contentzContext:
{page_content})Zinput_variablestemplatecontext)	llm_chainZdocument_variable_namedocument_promptr2   )r   r2   )r   Z
get_promptr   r   r   )
clsr0   r1   r2   r3   r4   Z_promptr7   r8   r   r+   r+   r,   from_llmK   s*    
zBaseRetrievalQA.from_llmstuff)r0   
chain_typechain_type_kwargsr4   r(   c                 K  s.   |pi }t |fd|i|}| f d|i|S )zLoad chain from chain type.r<   r   r   )r9   r0   r<   r=   r4   Z_chain_type_kwargsr   r+   r+   r,   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.Nr+   r*   rA   rB   r+   r+   r,   	_get_docsx   s    zBaseRetrievalQA._get_docsDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrB   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']
        rB   rB   Zinput_documentsrA   r2   r.   N)r   get_noop_managerr!   inspect	signaturerE   
parametersr   run	get_childr%   r#   r*   rG   rB   Z_run_managerrA   Zaccepts_run_managerdocsZanswerr+   r+   r,   _call   s    


zBaseRetrievalQA._callr
   c                  s   dS rC   r+   rD   r+   r+   r,   
_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 )rH   rB   rI   NrJ   r.   )r
   rK   r!   rL   rM   rT   rN   r   ZarunrP   r%   r#   rQ   r+   r+   r,   _acall   s    

zBaseRetrievalQA._acall)NNN)r;   N)N)N)__name__
__module____qualname____doc____annotations__r!   r#   r%   r   Zmodel_configpropertyr-   r/   classmethodr:   r>   r   rE   rS   rT   rU   r+   r+   r+   r,   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   r?   r@   c                C  s   | j j|d| idS )	Get docs.r2   config)r_   ZinvokerP   rD   r+   r+   r,   rE     s    zRetrievalQA._get_docsr
   c                  s   | j j|d| idI dH S )r`   r2   ra   N)r_   ZainvokerP   rD   r+   r+   r,   rT     s    zRetrievalQA._aget_docsr'   c                 C  s   dS )Return the chain type.Zretrieval_qar+   r)   r+   r+   r,   _chain_type  s    zRetrievalQA._chain_typeN)rV   rW   rX   rY   r   r_   rZ   rE   rT   r[   rd   r+   r+   r+   r,   r]      s   

-r]   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)r^   aliasr      intk
similarityr    search_type)default_factoryrF   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)r9   rq   r+   r+   r,   raise_deprecation9  s    zVectorDBQA.raise_deprecationc                 C  s,   d|v r(|d }|dvr(t d| d|S )zValidate search type.rl   )rk   mmrsearch_type of  not allowed.)
ValueError)r9   rq   rl   r+   r+   r,   validate_search_typeB  s
    zVectorDBQA.validate_search_typer   r?   r@   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 )r`   rk   rj   ru   rv   rw   )rl   rf   Zsimilarity_searchrj   rn   Zmax_marginal_relevance_searchrx   )r*   rA   rB   rR   r+   r+   r,   rE   L  s$    

zVectorDBQA._get_docsr
   c                  s   t ddS )r`   z!VectorDBQA does not support asyncN)NotImplementedErrorrD   r+   r+   r,   rT   _  s    zVectorDBQA._aget_docsr'   c                 C  s   dS )rc   Zvector_db_qar+   r)   r+   r+   r,   rd   h  s    zVectorDBQA._chain_typeN)rV   rW   rX   rY   r   rf   rZ   rj   rl   dictrn   r   r\   rt   ry   rE   rT   r[   rd   r+   r+   r+   r,   re   $  s   

	re   )/rY   
__future__r   rL   rr   abcr   typingr   r   r   r   Zlangchain_core._apir	   Zlangchain_core.callbacksr
   r   r   Zlangchain_core.documentsr   Zlangchain_core.language_modelsr   Zlangchain_core.promptsr   Zlangchain_core.retrieversr   Zlangchain_core.vectorstoresr   Zpydanticr   r   r   Zlangchain.chains.baser   Z'langchain.chains.combine_documents.baser   Z(langchain.chains.combine_documents.stuffr   Zlangchain.chains.llmr   Z#langchain.chains.question_answeringr   Z0langchain.chains.question_answering.stuff_promptr   r   r]   re   r+   r+   r+   r,   <module>   sL   	 (	L	