§
    è˜ºhò   ã                   ó²  — d dl Z d dlZd dl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mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z&  e j'        e(¦  «        Z) G d„ de¦  «        Z* edgd¬¦  «        Z+ edgd¬¦  «        Z, G d„ de¦  «        Z- G d„ de#¦  «        Z. G d„ de¦  «        Z/dS )é    N)ÚListÚOptional)ÚAsyncHtmlLoader)ÚHtml2TextTransformer)ÚLlamaCpp)ÚGoogleSearchAPIWrapper)ÚDocument)ÚBaseLLM)ÚBasePromptTemplateÚPromptTemplate)Ú	BaseModelÚField)ÚBaseRetriever)ÚVectorStore)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚLLMChain)ÚConditionalPromptSelector)ÚPydanticOutputParser)ÚRecursiveCharacterTextSplitterÚTextSplitterc                   óD   — e Zd ZU dZ edd¬¦  «        Zee         ed<   dS )ÚSearchQueriesz/Search queries to research for the user's goal..z+List of search queries to look up on Google©ÚdescriptionÚqueriesN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ÚstrÚ__annotations__© ó    úi/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain/retrievers/web_research.pyr   r      sM   € € € € € € Ø9Ð9à˜ØÐFðñ ô €GˆT�#ŒYð ð ñ ð ð r$   r   Úquestiona!  <<SYS>> 
 You are an assistant tasked with improving Google search results. 
 <</SYS>> 

 [INST] Generate THREE Google search queries that are similar to this question. The output should be a numbered list of questions and each should have a question mark at the end: 

 {question} [/INST])Úinput_variablesÚtemplatez÷You are an assistant tasked with improving Google search results. Generate THREE Google search queries that are similar to this question. The output should be a numbered list of questions and each should have a question mark at the end: {question}c                   óB   — e Zd ZU dZ ed¬¦  «        Zee         ed<   dS )ÚLineListzList of questions.Ú	Questionsr   ÚlinesN)	r   r   r   r    r   r,   r   r!   r"   r#   r$   r%   r*   r*   5   s9   € € € € € € ØÐà�u¨Ð5Ñ5Ô5€Eˆ4�Œ9Ð5Ð5Ñ5Ð5Ð5r$   r*   c                   ó4   ‡ — e Zd ZdZdˆ fd„Zdedefd„Zˆ xZS )ÚQuestionListOutputParserz/Output parser for a list of numbered questions.ÚreturnNc                 óV   •— t          ¦   «                              t          ¬¦  «         d S )N)Úpydantic_object)ÚsuperÚ__init__r*   )ÚselfÚ	__class__s    €r%   r3   z!QuestionListOutputParser.__init__>   s$   ø€ Ý‰Œ×Ò­ÐÑ2Ô2Ð2Ð2Ð2r$   Útextc                 óL   — t          j        d|¦  «        }t          |¬¦  «        S )Nz\d+\..*?(?:\n|$))r,   )ÚreÚfindallr*   )r4   r6   r,   s      r%   ÚparsezQuestionListOutputParser.parseA   s%   € Ý”
Ð.°Ñ5Ô5ˆÝ˜eÐ$Ñ$Ô$Ð$r$   )r/   N)	r   r   r   r    r3   r!   r*   r:   Ú__classcell__)r5   s   @r%   r.   r.   ;   se   ø€ € € € € Ø9Ð9ð3ð 3ð 3ð 3ð 3ð 3ð%˜#ð % (ð %ð %ð %ð %ð %ð %ð %ð %r$   r.   c                   óÄ  — e Zd ZU dZ edd¬¦  «        Zeed<   eed<    edd¬¦  «        Z	e
ed<    ed	d
¬¦  «        Zeed<    e edd¬¦  «        d¬¦  «        Zeed<    eed¬¦  «        Zee         ed<   edd	 edd¬¦  «        fdedede
dee         dededd fd„¦   «         Zdedefd„Zd dededee         fd„Zdededee         fd„Zdededee         fd„Z dS )!ÚWebResearchRetrieverz`Google Search API` retriever..z"Vector store for storing web pagesr   ÚvectorstoreÚ	llm_chainzGoogle Search API WrapperÚsearché   z!Number of pages per Google searchÚnum_search_resultsiÜ  é2   )Ú
chunk_sizeÚchunk_overlapz1Text splitter for splitting web pages into chunksÚtext_splitterzList of processed URLs)Údefault_factoryr   Úurl_databaseNé–   ÚllmÚpromptr/   c                 óÊ   — |s4t          t          d„ t          fg¬¦  «        }|                     |¦  «        }t	          ||t          ¦   «         ¬¦  «        } | |||||¬¦  «        S )aÚ  Initialize from llm using default template.

        Args:
            vectorstore: Vector store for storing web pages
            llm: llm for search question generation
            search: GoogleSearchAPIWrapper
            prompt: prompt to generating search questions
            num_search_results: Number of pages per Google search
            text_splitter: Text splitter for splitting web pages into chunks

        Returns:
            WebResearchRetriever
        c                 ó,   — t          | t          ¦  «        S ©N)Ú
isinstancer   )rJ   s    r%   ú<lambda>z/WebResearchRetriever.from_llm.<locals>.<lambda>v   s   € ¥¨CµÑ!:Ô!:€ r$   )Údefault_promptÚconditionals)rJ   rK   Úoutput_parser)r>   r?   r@   rB   rF   )r   ÚDEFAULT_SEARCH_PROMPTÚDEFAULT_LLAMA_SEARCH_PROMPTÚ
get_promptr   r.   )	Úclsr>   rJ   r@   rK   rB   rF   ÚQUESTION_PROMPT_SELECTORr?   s	            r%   Úfrom_llmzWebResearchRetriever.from_llmX   s™   € ð4 ð 	>Ý'@Ý4à:Ð:Õ<WÐXðð(ñ (ô (Ð$ð .×8Ò8¸Ñ=Ô=ˆFõ ØØÝ2Ñ4Ô4ð
ñ 
ô 
ˆ	ð ˆsØ#ØØØ1Ø'ð
ñ 
ô 
ð 	
r$   Úqueryc                 óì   — |d                               ¦   «         rG|                     d¦  «        }|dk    r,||dz   d …         }|                     d¦  «        r
|d d…         }|                     ¦   «         S )Nr   ú"éÿÿÿÿrA   )ÚisdigitÚfindÚendswithÚstrip)r4   rZ   Úfirst_quote_poss      r%   Úclean_search_queryz'WebResearchRetriever.clean_search_queryŠ   sz   € ð
 �Œ8×ÒÑÔð 	'à#Ÿjšj¨™oœoˆOØ "Ò$Ð$à˜o°Ñ1Ð3Ð3Ô4�à—>’> #Ñ&Ô&ð 'Ø! # 2 #œJ�EØ�{Š{‰}Œ}Ðr$   c                 óf   — |                       |¦  «        }| j                             ||¦  «        }|S )z3Returns num_search_results pages per Google search.)rc   r@   Úresults)r4   rZ   rB   Úquery_cleanÚresults        r%   Úsearch_toolz WebResearchRetriever.search_toolš   s2   € à×-Ò-¨eÑ4Ô4ˆØ”×$Ò$ [Ð2DÑEÔEˆØˆr$   Úrun_managerc                óv  — t                                d¦  «         |                      d|i¦  «        }t                                d|› �¦  «         t          |d         dg ¦  «        }t                                d|› �¦  «         t                                d¦  «         g }|D ]Š}|                      || j        ¦  «        }t                                d¦  «         t                                d|› �¦  «         |D ]3}|                     d	d
¦  «        r|                     |d	         ¦  «         Œ4Œ‹t          |¦  «        }t          | 
                    | j        ¦  «        ¦  «        }	t                                d|	› �¦  «         |	r½t          |	d¬¦  «        }
t          ¦   «         }t                                d¦  «         |
                     ¦   «         }t          |                     |¦  «        ¦  «        }| j                             |¦  «        }| j                             |¦  «         | j                             |	¦  «         t                                d¦  «         g }|D ]/}|                     | j                             |¦  «        ¦  «         Œ0d„ |D ¦   «         }t          |                     ¦   «         ¦  «        }|S )zµSearch Google for documents related to the query input.

        Args:
            query: user query

        Returns:
            Relevant documents from all various urls.
        z*Generating questions for Google Search ...r&   z#Questions for Google Search (raw): r6   r,   zQuestions for Google Search: zSearching for relevant urls...zSearch results: ÚlinkNzNew URLs to load: T)Úignore_load_errorszIndexing new urls...z*Grabbing most relevant splits from urls...c           	      ó„   — i | ]=}|j         t          t          |j                             ¦   «         ¦  «        ¦  «        f|“Œ>S r#   )Úpage_contentÚtupleÚsortedÚmetadataÚitems)Ú.0Údocs     r%   ú
<dictcomp>z@WebResearchRetriever._get_relevant_documents.<locals>.<dictcomp>Ü   sM   € ð !
ð !
ð !
ØMPˆSÔ�u¥V¨C¬L×,>Ò,>Ñ,@Ô,@Ñ%AÔ%AÑBÔBÐCÀSð!
ð !
ð !
r$   )ÚloggerÚinfor?   Úgetattrrh   rB   ÚgetÚappendÚsetÚlistÚ
differencerH   r   r   ÚloadÚtransform_documentsrF   Úsplit_documentsr>   Úadd_documentsÚextendÚsimilarity_searchÚvalues)r4   rZ   ri   rg   Ú	questionsÚurls_to_lookÚsearch_resultsÚresÚurlsÚnew_urlsÚloaderÚ	html2textÚdocsÚunique_documents_dictÚunique_documentss                  r%   Ú_get_relevant_documentsz,WebResearchRetriever._get_relevant_documents    s©  € õ  	�ŠÐ@ÑAÔAÐAØ—’ ¨UÐ 3Ñ4Ô4ˆÝ�ŠÐB¸&ÐBÐBÑCÔCÐCÝ˜F 6œN¨G°RÑ8Ô8ˆ	Ý�ŠÐ?°IÐ?Ð?Ñ@Ô@Ð@õ 	�ŠÐ4Ñ5Ô5Ð5ØˆØð 	5ð 	5ˆEà!×-Ò-¨e°TÔ5LÑMÔMˆNÝ�KŠKÐ8Ñ9Ô9Ð9Ý�KŠKÐ;¨>Ð;Ð;Ñ<Ô<Ð<Ø%ð 5ð 5�Ø—7’7˜6 4Ñ(Ô(ð 5Ø ×'Ò'¨¨F¬Ñ4Ô4Ð4øð5õ
 �<Ñ Ô ˆõ ˜Ÿš¨Ô(9Ñ:Ô:Ñ;Ô;ˆå�ŠÐ3¨Ð3Ð3Ñ4Ô4Ð4àð 	/Ý$ XÀ$ÐGÑGÔGˆFÝ,Ñ.Ô.ˆIÝ�KŠKÐ.Ñ/Ô/Ð/Ø—;’;‘=”=ˆDÝ˜	×5Ò5°dÑ;Ô;Ñ<Ô<ˆDØÔ%×5Ò5°dÑ;Ô;ˆDØÔ×*Ò*¨4Ñ0Ô0Ð0ØÔ×$Ò$ XÑ.Ô.Ð.õ 	�ŠÐ@ÑAÔAÐAØˆØð 	Cð 	CˆEØ�KŠK˜Ô(×:Ò:¸5ÑAÔAÑBÔBÐBÐBð!
ð !
ØTXð!
ñ !
ô !
Ðõ  Ð 5× <Ò <Ñ >Ô >Ñ?Ô?ÐØÐr$   c             ƒ   ó   K  — t           ‚rN   )ÚNotImplementedError)r4   rZ   ri   s      r%   Ú_aget_relevant_documentsz-WebResearchRetriever._aget_relevant_documentsâ   s   è è € õ "Ð!r$   )rA   )!r   r   r   r    r   r>   r   r"   r   r@   r   rB   Úintr   rF   r   r|   rH   r   r!   Úclassmethodr
   r   r   rY   rc   Údictrh   r   r	   r�   r   r“   r#   r$   r%   r=   r=   F   sa  € € € € € € Ø(Ð(ð  %˜uØÐ=ð ñ  ô  €K�ð ð ñ ð ÐÐÑØ%* U¨3Ð<WÐ%XÑ%XÔ%X€FÐ"ÐXÐXÑXØ#˜e AÐ3VÐWÑWÔWÐ˜ÐWÐWÑWØ"' %Ø&Ð&°$ÀbÐIÑIÔIØGð#ñ #ô #€M�<ð ð ñ ð $˜eØÐ*Bðñ ô €L�$�s”)ð ð ñ ð ð 04Ø"#Ø8VÐ8VØ¨3ð9
ñ 9
ô 9
ð/
ð /
à ð/
ð ð/
ð 'ð	/
ð
 Ð+Ô,ð/
ð  ð/
ð 6ð/
ð 
 ð/
ð /
ð /
ñ „[ð/
ðb¨ð °ð ð ð ð ð ð  ð ¸#ð ÀdÈ4Äjð ð ð ð ð@ àð@ ð 4ð	@ ð
 
ˆhŒð@ ð @ ð @ ð @ ðD"àð"ð 9ð	"ð
 
ˆhŒð"ð "ð "ð "ð "ð "r$   r=   )0Úloggingr8   Útypingr   r   Ú$langchain_community.document_loadersr   Ú)langchain_community.document_transformersr   Úlangchain_community.llmsr   Úlangchain_community.utilitiesr   Úlangchain_core.documentsr	   Úlangchain_core.language_modelsr
   Úlangchain_core.promptsr   r   Úlangchain_core.pydantic_v1r   r   Úlangchain_core.retrieversr   Úlangchain_core.vectorstoresr   Úlangchain.callbacks.managerr   r   Úlangchain.chainsr   Ú langchain.chains.prompt_selectorr   Ú!langchain.output_parsers.pydanticr   Úlangchain.text_splitterr   r   Ú	getLoggerr   rv   r   rU   rT   r*   r.   r=   r#   r$   r%   ú<module>r©      s}  ðØ €€€Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à @Ð @Ð @Ð @Ð @Ð @Ø JÐ JÐ JÐ JÐ JÐ JØ -Ð -Ð -Ð -Ð -Ð -Ø @Ð @Ð @Ð @Ð @Ð @Ø -Ð -Ð -Ð -Ð -Ð -Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð &Ð %Ð %Ð %Ð %Ð %Ø FÐ FÐ FÐ FÐ FÐ FØ BÐ BÐ BÐ BÐ BÐ BØ PÐ PÐ PÐ PÐ PÐ PÐ PÐ Pà	ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð �Iñ ô ð ð -˜nØ�LðLðñ ô Ð ð '˜Ø�Lð6ðñ ô Ð ð6ð 6ð 6ð 6ð 6ˆyñ 6ô 6ð 6ð%ð %ð %ð %ð %Ð3ñ %ô %ð %ðb"ð b"ð b"ð b"ð b"˜=ñ b"ô b"ð b"ð b"ð b"r$   