§
    è˜ºhÈ  ã                   ó¢   — d Z ddlmZ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mZ dd
lmZ  G d„ de¦  «        ZdS )zMChain for applying constitutional principles to the outputs of another chain.é    )ÚAnyÚDictÚListÚOptional)ÚBaseLanguageModel)ÚBasePromptTemplate)ÚCallbackManagerForChainRun)ÚChain)ÚConstitutionalPrinciple©Ú
PRINCIPLES)ÚCRITIQUE_PROMPTÚREVISION_PROMPT©ÚLLMChainc                   óˆ  — e Zd ZU dZeed<   ee         ed<   eed<   eed<   dZe	ed<   e
	 dd	eee                  d
ee         fd„¦   «         Ze
eefdededededed
d fd„¦   «         Zed
ee         fd„¦   «         Zed
ee         fd„¦   «         Z	 ddeeef         dee         d
eeef         fd„Zeded
efd„¦   «         ZdS )ÚConstitutionalChaina  Chain for applying constitutional principles.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import LLMChain, ConstitutionalChain
            from langchain.chains.constitutional_ai.models                 import ConstitutionalPrinciple

            llm = OpenAI()

            qa_prompt = PromptTemplate(
                template="Q: {question} A:",
                input_variables=["question"],
            )
            qa_chain = LLMChain(llm=llm, prompt=qa_prompt)

            constitutional_chain = ConstitutionalChain.from_llm(
                llm=llm,
                chain=qa_chain,
                constitutional_principles=[
                    ConstitutionalPrinciple(
                        critique_request="Tell if this answer is good.",
                        revision_request="Give a better answer.",
                    )
                ],
            )

            constitutional_chain.run(question="What is the meaning of life?")
    ÚchainÚconstitutional_principlesÚcritique_chainÚrevision_chainFÚreturn_intermediate_stepsNÚnamesÚreturnc                 ó^   — |€ t          t          j        ¦   «         ¦  «        S d„ |D ¦   «         S )Nc                 ó(   — g | ]}t           |         ‘ŒS © r   )Ú.0Únames     úo/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/chains/constitutional_ai/base.pyú
<listcomp>z6ConstitutionalChain.get_principles.<locals>.<listcomp>=   s   € Ð7Ð7Ð7¨•J˜tÔ$Ð7Ð7Ð7ó    )Úlistr   Úvalues)Úclsr   s     r    Úget_principlesz"ConstitutionalChain.get_principles6   s4   € ð ˆ=Ý�
Ô)Ñ+Ô+Ñ,Ô,Ð,à7Ð7°Ð7Ñ7Ô7Ð7r"   ÚllmÚcritique_promptÚrevision_promptÚkwargsc                 ó^   — t          ||¬¦  «        }t          ||¬¦  «        } | d|||dœ|¤ŽS )zCreate a chain from an LLM.)r'   Úprompt)r   r   r   r   r   )r%   r'   r   r(   r)   r*   r   r   s           r    Úfrom_llmzConstitutionalChain.from_llm?   sY   € õ " c°/ÐBÑBÔBˆÝ! c°/ÐBÑBÔBˆØˆsð 
ØØ)Ø)ð
ð 
ð ð	
ð 
ð 	
r"   c                 ó   — | j         j        S )zInput keys.)r   Ú
input_keys©Úselfs    r    r/   zConstitutionalChain.input_keysR   s   € ð ŒzÔ$Ð$r"   c                 ó   — | j         rg d¢S dgS )zOutput keys.)ÚoutputÚcritiques_and_revisionsÚinitial_outputr3   )r   r0   s    r    Úoutput_keyszConstitutionalChain.output_keysW   s$   € ð Ô)ð 	KØJÐJÐJÐJØˆzÐr"   ÚinputsÚrun_managerc                 ó  — |pt          j        ¦   «         } | j        j        di |¤d|                     d¦  «        i¤Ž}|} | j        j        j        di |¤Ž}|                     d|z   dz   | j        d¬¦  «         g }| j	        D �]f}| j
                             |||j        |                     d¦  «        ¬¦  «        }	|                      |	¬	¦  «                             ¦   «         }
d
|
                     ¦   «         v r|                     |
df¦  «         Œ�| j                             |||j        |
|j        |                     d¦  «        ¬¦  «                             ¦   «         }|}|                     |
|f¦  «         |                     d|j        › d�dz   | j        d¬¦  «         |                     d|
z   dz   | j        d¬¦  «         |                     d|z   dz   | j        d¬¦  «         �Œhd|i}| j        r
||d<   ||d<   |S )NÚ	callbacksÚoriginalzInitial response: ú

Úyellow)ÚtextÚverboseÚcolorÚcritique)Úinput_promptÚoutput_from_modelÚcritique_requestr:   ©Úoutput_stringzno critique neededÚ Úrevision)rB   rC   rD   rA   Úrevision_requestr:   z	Applying z...Úgreenz
Critique: ÚbluezUpdated response: r3   r5   r4   r   )r	   Úget_noop_managerr   ÚrunÚ	get_childr,   ÚformatÚon_textr?   r   r   rD   Ú_parse_critiqueÚstripÚlowerÚappendr   rI   r   r   )r1   r7   r8   Ú_run_managerÚresponseÚinitial_responserB   r4   Úconstitutional_principleÚraw_critiquerA   rH   Úfinal_outputs                r    Ú_callzConstitutionalChain._call^   sµ  € ð
 #ÐSÕ&@Ô&QÑ&SÔ&SˆØ!�4”:”>ð 
ð 
Øð
ð 
à"×,Ò,¨ZÑ8Ô8ð
ð 
ð 
ˆð $ÐØ/�t”zÔ(Ô/Ð9Ð9°&Ð9Ð9ˆà×ÒØ%¨Ñ0°6Ñ9Ø”LØð 	ñ 	
ô 	
ð 	
ð
 #%ÐØ(,Ô(Fð 1	ñ 1	Ð$ð  Ô.×2Ò2Ø)Ø"*Ø!9Ô!JØ&×0Ò0°Ñ<Ô<ð	 3ñ ô ˆLð ×+Ò+Ø*ð ,ñ ô çŠe‰gŒgð ð $ x§~¢~Ñ'7Ô'7Ð7Ð7Ø'×.Ò.°¸"¨~Ñ>Ô>Ð>Øð Ô*×.Ò.Ø)Ø"*Ø!9Ô!JØ!Ø!9Ô!JØ&×0Ò0°Ñ<Ô<ð /ñ ô ÷ Še‰gŒgð ð  ˆHØ#×*Ò*¨H°hÐ+?Ñ@Ô@Ð@à× Ò ØCÐ!9Ô!>ÐCÐCÐCÀfÑLØœØð !ñ ô ð ð × Ò Ø! HÑ,¨vÑ5ØœØð !ñ ô ð ð × Ò Ø)¨HÑ4°vÑ=ØœØð !ñ ô ð ñ ð )1°(Ð';ˆØÔ)ð 	NØ-=ˆLÐ)Ñ*Ø6MˆLÐ2Ñ3ØÐr"   rF   c                 ó†   — d| vr| S |                       d¦  «        d         } d| v r|                       d¦  «        d         } | S )NzRevision request:r   r<   )ÚsplitrE   s    r    rQ   z#ConstitutionalChain._parse_critiqueª   sU   € à mÐ3Ð3Ø Ð Ø%×+Ò+Ð,?Ñ@Ô@ÀÔCˆØ�]Ð"Ð"Ø)×/Ò/°Ñ7Ô7¸Ô:ˆMØÐr"   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   ÚboolÚclassmethodr   Ústrr&   r   r   r   r   r   r-   Úpropertyr/   r6   r   r	   r[   ÚstaticmethodrQ   r   r"   r    r   r      sñ  € € € € € € ðð ð@ €O€O�OØ#Ð$;Ô<Ð<Ð<Ñ<ØÐÐÑØÐÐÑØ&+Ð˜tÐ+Ð+Ñ+àà*.ð8ð 8Ø˜T #œYÔ'ð8à	Ð%Ô	&ð8ð 8ð 8ñ „[ð8ð ð
 />Ø.=ð
ð 
àð
ð ð
ð ,ð	
ð
 ,ð
ð ð
ð 
ð
ð 
ð 
ñ „[ð
ð$ ð%˜D œIð %ð %ð %ñ „Xð%ð ð˜T #œYð ð ð ñ „Xðð =AðJð Jà�S˜#�X”ðJð Ð8Ô9ðJð 
ˆc�3ˆhŒð	Jð Jð Jð JðX ð sð ¨sð ð ð ñ „\ðð ð r"   r   N)ra   Útypingr   r   r   r   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr   Úlangchain.callbacks.managerr	   Úlangchain.chains.baser
   Ú)langchain.chains.constitutional_ai.modelsr   Ú-langchain.chains.constitutional_ai.principlesr   Ú*langchain.chains.constitutional_ai.promptsr   r   Úlangchain.chains.llmr   r   r   r"   r    ú<module>rq      s  ðØ SÐ SØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5à BÐ BÐ BÐ BÐ BÐ BØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø MÐ MÐ MÐ MÐ MÐ MØ DÐ DÐ DÐ DÐ DÐ DØ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ )Ð )Ð )Ð )Ð )Ð )ðbð bð bð bð b˜%ñ bô bð bð bð br"   