
    Xj                         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 d dlmZ  ee          Z G d	 d
          ZdedededefdZdS )    )Any)Session)settings)get_graph_query_service)get_graph_reranker)get_embedding_factory)get_vector_store)
get_loggerc                      e Zd ZdededefdZ	 	 	 	 	 	 dd
ededededz  dedee         dz  de	dee
eef                  fdZd
ededededz  dee
eef                  f
dZdee         dedee         dz  dee
eef                  fdZdee
eef                  dee
eef                  dee
eef                  fdZd
edee
eef                  dedz  dee
eef                  fdZdS )GraphEnhancedRetrievaldbknowledge_base_id	tenant_idc                     || _         || _        || _        t          ||          | _        t                      | _        t                      | _        t                      | _
        d S N)r   r   r   r	   vector_storer   embedding_factoryr   graph_query_servicer   graph_reranker)selfr   r   r   s       Q/lsinfo/ai/hellotax_ai/base_platform/app/services/rag/graph_enhanced_retrieval.py__init__zGraphEnhancedRetrieval.__init__   s[    !2",R1BCC!6!8!8#:#<#< 022       ffffff?N   Tqueryk	thresholdmodel_idexpand_depthrelation_typesenable_rerankreturnc                    	 |                      ||||          }|st                              d           g S t          d |D                       }	t                              dt	          |	           d           |                     |	||          }
t                              dt	          |
           d           |                     ||
          }|r*t	          |          |k    r|                     |||          }|d |         S # t          $ r?}t          	                    d|            |                      ||||          cY d }~S d }~ww xY w)NzNo vector results foundc                     h | ]
}|d          S )document_id ).0rs     r   	<setcomp>z2GraphEnhancedRetrieval.retrieve.<locals>.<setcomp>+   s    EEEAm,EEEr   zVector recall returned z unique documentszGraph expansion added z neighbor documentsz!Graph-enhanced retrieval failed: )
_vector_recallloggerinfolistlen_graph_expansion_merge_results_rerank	Exceptionerror)r   r   r   r   r    r!   r"   r#   vector_resultsdoc_idsexpanded_docsall_resultses                r   retrievezGraphEnhancedRetrieval.retrieve   sx   	F!009hOON! 5666	EEnEEEFFGKKQ#g,,QQQRRR 11'<XXMKKX]1C1CXXXYYY--nmLLK I[!1!1A!5!5"ll5+xHHrr?" 	F 	F 	FLL@Q@@AAA&&uaHEEEEEEEE	Fs#   5D
 CD
 

E4EEEc                 p   | j                             || j        |          }|sg S | j                            ||dz  |          }g }|D ]j\  }}	|                    |d         |d         |d         |d         |d         |	d	|                    d
          |                    d          dd           k|S )N)textr   r       )query_embeddingr   r   idr'   titler=   chunk_indexvectorcategory_id
model_name)rD   rE   )r@   r'   rA   r=   rB   scoresourcemetadata)r   generate_embeddingr   r   similarity_searchappendget)
r   r   r   r   r    r?   resultsformatted_resultsdocrF   s
             r   r,   z%GraphEnhancedRetrieval._vector_recall7   s     0CC47X D 
 
  	I#55+q1u	 6 
 
 ! 	 	JC$$d)#&}#5 \K#&}#5"&'*ww}'='=&)ggl&;&;! !     ! r   r7   depthc                    t           j        sg S 	 | j                            || j        | j        t          |t           j                  |d          }g }|D ]g}|                    |d         |d         |	                    dd          |	                    dd          d	|	                    d
d          i d           h|S # t          $ r)}t                              d|            g cY d }~S d }~ww xY w)N   )document_idsr   kb_idrP   r"   limitr@   rA   summary rF   g      ?graphrelation_typeunknown)r'   rA   r=   rF   rG   rY   rH   zGraph expansion failed: )r   ENABLE_KNOWLEDGE_GRAPHr   expand_neighborsr   r   minGRAPH_EXPAND_DEPTHrK   rL   r4   r-   r5   )r   r7   rP   r"   	neighborsformatted_neighborsneighborr:   s           r   r1   z'GraphEnhancedRetrieval._graph_expansionU   s2    . 	I	0AA$.,%!<==- B  I #%%  #**'/~!)'!2 (Y ; ;!)gs!;!;"))1oy)Q)Q$& 
 
 
 
 '& 	 	 	LL7A77888IIIIII	s   B/C   
C3
C.(C3.C3r6   graph_resultsc                     i }|D ]}|d         }|||<   |D ]}|d         }||vr|||<   t          |                                          }|                    d d           |S )Nr'   c                     | d         S NrF   r(   xs    r   <lambda>z7GraphEnhancedRetrieval._merge_results.<locals>.<lambda>   s
    !G* r   Tkeyreverse)r/   valuessort)r   r6   rb   
result_mapresultdoc_idmerged_resultss          r   r2   z%GraphEnhancedRetrieval._merge_resultsu   s     
$ 	( 	(FM*F!'Jv# 	, 	,FM*FZ''%+
6"j//1122 4 4dCCCr   rM   c                 t   	 | j                             ||| j        | j        | j                  }|S # t
          $ r{}t                              d|            |D ]7}|                    d          dk    rt          |d         dz  d          |d<   8|
                    d d	
           |cY d }~S d }~ww xY w)N)rM   r   r   rT   r   zGraph reranking failed: rG   rX   rF   g?g      ?c                     | d         S re   r(   rf   s    r   rh   z0GraphEnhancedRetrieval._rerank.<locals>.<lambda>   s
    qz r   Tri   )r   rerankr   r   r   r4   r-   r5   rL   r]   rm   )r   r   rM   r    rerankedr:   ro   s          r   r3   zGraphEnhancedRetrieval._rerank   s    	*11.,7 2  H O 	 	 	LL7A77888! F F::h''722&)&/C*?&E&EF7OLL114L@@@NNNNNN	s   /2 
B7A0B2,B72B7)r   r   Nr   NT)__name__
__module____qualname__r   intr   strfloatr/   booldictr   r;   r,   r1   r2   r3   r(   r   r   r   r      s!       37 3s 3s 3 3 3 3 #+/"F FF F 	F
 *F F S	D(F F 
d38n	F F F F6!! !-2!>ADj!	d38n	! ! ! !<Cy),>B3i$>N	d38n	   @"4S>2CGSRUXCW	d38n	   #'S#X#7CF:	d38n	     r   r   r   r   r   r$   c                 $    t          | ||          S r   )r   )r   r   r   s      r   get_graph_enhanced_retrievalr      s     ""&7CCCr   N)typingr   sqlalchemy.ormr   
app.configr   app.services.graph.graph_queryr   !app.services.graph.graph_rerankerr   3app.services.llm.backends.embedding_backend_factoryr   )app.services.storage.vector_store_factoryr	   common_loggingr
   rv   r-   r   ry   r   r(   r   r   <module>r      s         " " " " " "       B B B B B B @ @ @ @ @ @ U U U U U U F F F F F F % % % % % %	H		E E E E E E E EPDD$'D47DD D D D D Dr   