
    i^                         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
Z
 e
j                  e      Z G d d	      Z e       Zy)
uR   
GraphRAG Retriever para consultas sobre productos retail y políticas de tienda.
    )ListDictAnyOptional   )neo4j_client)embeddings_service)settingsNc                       e Zd ZdZd ZdedefdZ	 	 ddedeeee	f      dee
   deeee	f      fd	Zdd
eeee	f      dedefdZdeee	f   defdZdeee	f   defdZddedeeee	f      deee	f   fdZy)GraphRAGRetrieverzRetriever GraphRAG para Retail.c                 Z    t         | _        t        | _        t        j
                  | _        y N)r   neo4jr	   
embeddingsr
   GRAPHRAG_MAX_RESULTSmax_results)selfs    ?/opt/lhia/marcimex/agent/app/rag_service/graph_rag_retriever.py__init__zGraphRAGRetriever.__init__   s    !
,#88    queryreturnc                     |j                         g d}g d}t        fd|D              }t        fd|D              }|dkD  ry|dkD  ryy)	uP   
        Determina el tipo de consulta: producto, política, o general.
        )u	   garantíagarantiau   devolucióncambio	reembolsou	   políticau   envíou   costo de envíou   servicio técnicou   instalaciónmanualhorariotiendau
   ubicaciónu   crédito	intereses)preciocuestavaleu   característicasespecificacionespulgadaslitrosmarcamodelocoloru   tamaño
diferenciacompararmejorbaratoofertac              3   ,   K   | ]  }|v sd   ywr   N .0kwquery_lowers     r   	<genexpr>z:GraphRAGRetriever._determine_query_type.<locals>.<genexpr>(   s     L":K1L   	c              3   ,   K   | ]  }|v sd   ywr0   r1   r2   s     r   r6   z:GraphRAGRetriever._determine_query_type.<locals>.<genexpr>)   s     N"B+<MANr7   r   store_policyproduct_infogeneral)lowersum)r   r   policy_keywordsproduct_keywordspolicy_scoreproduct_scorer5   s         @r   _determine_query_typez'GraphRAGRetriever._determine_query_type   s[     kkm

 LLLN(8NN!!Q!r   Nfilterstop_kc                    	 | j                   j                         st        j                  d       g S |xs i }|xs | j                  }| j                  |      }t        j                  d|        g }|dk(  r| j                   j                  ||      }nh|dk(  s|dk(  r^| j                   j                  ||      }|j                  d      }|r/| j                   j                  |      }|r|j                  d|       t        j                  dt        |       d	       |S # t        $ r$}	t        j                  d
|	        g cY d}	~	S d}	~	ww xY w)uB   
        Recupera información relevante del grafo Neo4j.
        u   ❌ No se pudo conectar a Neo4ju   🎯 Tipo de query RAG: r9   r:   r;   
product_idr   u   ✅ Recuperados z resultados de Neo4ju   ❌ Error en retrieve: N)r   connectloggererrorr   rB   infosearch_policiesfulltext_search_productsgetget_product_contextinsertlen	Exception)
r   r   rC   rD   limit
query_typeresultsrF   contextes
             r   retrievezGraphRAGRetriever.retrieve2   s0    	::%%'>?	mG-T--E33E:JKK2:,?@G^+ **44UEB~-y1H**==eUK %[[6
#zz==jIW7!;KK*3w<.8LMNN 	LL21#67I	s#   0D" C.D" "	E+E
E
ErT   rS   c                 v   |syg }t        |d      D ]  \  }}d|v r!|j                  | j                  |             +d|v r(|j                  d|d   j                  dd              Wd|v r!|j                  | j	                  |             ||j                  t        |              d	j                  |      S )
z<
        Formatea resultados del grafo para el LLM.
        u7   No se encontró información relevante en el catálogo.r   ppolicyu   📜 POLÍTICA: text namez
---
)	enumerateappend_format_product_contextrM   _format_product_basicstrjoin)r   rT   rS   context_partsidxresults         r   format_contextz GraphRAGRetriever.format_context]   s     L$Wa0 	2KCf}$$T%A%A&%IJV#%%(89I9M9MfVX9Y8Z&[\6!%%d&@&@&HI$$S[1	2 ~~m,,r   rU   c           
         |j                  di       }|j                  di       }|j                  di       }d|j                  dd       dd|j                  d	d
       d|j                  dd       d|j                  dd       d|j                  dd       g}|j                  dg       }|rJ|j                  d       |D ]4  }|sd|v s|j                  d|d    d|j                  dd              6 dj                  |      S )NrY   cbu   📦 **r]   Productoz**u   💰 Precio: $pricezN/Au   🏷️ Categoría: Generalu   🏭 Marca: u	   Genéricau   📝 Descripción: descriptionr\   featuresu   
**Características:**z- z: valueu   Sí
)rM   r_   rc   )r   rU   rY   ri   rj   partsro   fs           r   r`   z)GraphRAGRetriever._format_product_contextr   s!   KKR KKR KKR  aeeFJ/03QUU7E234"155#;"<=155567!!%%r":!;<
 ;;z2.LL23 ^1ellR&	{"QUU7TYEZD[3\&]^ yyr   rY   c           	      |    d|j                  d       d|j                  d       d|j                  dd      d d  d	S )
Nu   📦 r]   z - $rl   z - rn   r\   d   z...)rM   )r   rY   s     r   ra   z'GraphRAGRetriever._format_product_basic   sE    quuV}oT!%%.)9QUU=RT=UVZWZ=[<\\_``r   c                 |    | j                  |      }| j                  ||      }| j                  ||      }||||dS )N)r   rC   )r   rT   rU   rS   )rB   rW   rg   )r   r   rC   rS   rT   rU   s         r   r   zGraphRAGRetriever.query   sL    //6
--eW-=%%gz:$	
 	
r   )NN)r;   r   )__name__
__module____qualname____doc__r   rb   rB   r   r   r   intr   rW   rg   r`   ra   r   r1   r   r   r   r      s   )9
3 3 > -1#	)) $sCx.)) }	)
 
d38n	)V-d4S>&: - -\_ -* tCH~  #  *atCH~ a# a	
3 	
$sCx.)A 	
TRUWZRZ^ 	
r   r   )rz   typingr   r   r   r   r   r	   config.settingsr
   logging	getLoggerrw   rH   r   graph_rag_retrieverr1   r   r   <module>r      sH    - , & 2 $ 			8	$E
 E
N () r   