
    Xj4                        d dl m Z  d dlmZmZ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 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 d dlmZ d dlmZ  ee          Z edg          Z  G d de          Z! G d de          Z"e #                    de"          e #                    de"           ee           e ed                    fde$de!dede
def
d                        Z%e &                    d          d ee           e ed                    fde$ded e$de
def
d!            Z'e #                    d"          d# ee           e ed                    fde$de!ded$e(de
defd%            Z)e &                    d&           ee           e ed                    fde$dede
defd'            Z*d(S ))    )datetime)	APIRouterDependsHTTPExceptionRequest)	BaseModelField)Session)get_db)require_read)settings)KnowledgeBaseNotFoundError)get_translator)KnowledgeBaseUser)get_graph_enhanced_retrieval)get_retrieval_service)
get_loggerzknowledge-recall)tagsc                   @   e Zd ZU  edd          Zeed<    edd          Zeed<    ed	d
dd          Ze	ed<    edddd          Z
eed<    edd          Ze	dz  ed<    edddd          Zedz  ed<    edddd          Zedz  ed<    edd          Zeed<    ed
d
dd           Ze	ed!<    edd"          Zee         dz  ed#<    ed$d%          Zeed&<    ed$d'          Zeed(<    ed$d%          Zeed&<    ed$d'          Zeed(<   dS ))RecallTestRequest.u   查询文本)descriptionquerysemanticu7   检索模式: semantic, keyword, hybrid, graph_enhanced)defaultr   mode      2   u   返回结果数量)r   geler   top_kgffffff?g        g      ?u   相似度阈值	thresholdNu   向量模型IDmodel_idg333333?u!   关键词权重（混合模式）keyword_weightu   语义权重（混合模式）semantic_weightFu   启用图增强检索enable_graph   u   图扩展深度（1-2跳）graph_expand_depthu   图关系类型过滤graph_relation_typesTu-   启用父块扩展（提供完整上下文）enable_parent_expansionu0   启用引用扩展（自动关联引用条款）enable_reference_expansion)__name__
__module____qualname__r	   r   str__annotations__r   r"   intr#   floatr$   r%   r&   r'   boolr)   r*   listr+   r,        C/lsinfo/ai/hellotax_ai/base_platform/app/api/v1/knowledge/recall.pyr   r      sk        s777E3777(a  D#    qQ2;OPPPE3PPPuSSSFWXXXIuXXX 5;KLLLHcDjLLL#(51T$ $ $NEDL    %*E1Q% % %OUT\    u:QRRRL$RRR#eA!Gdeeeeee-2U4Md-e-e-e$s)d*eee$)E"Q% % %T    (-u"T( ( (    %*E"Q% % %T    (-u"T( ( (     r7   r   c                   z    e Zd ZU eed<   eed<   eed<   ee         ed<   eed<    eej	                  Z
eed<   dS )	RecallTestResponser   r   paramsresults
statistics)default_factory	timestampN)r-   r.   r/   r0   r1   dictr5   r	   r   nowr?   r6   r7   r8   r:   r:   6   sh         JJJ
IIILLL$Z%===Ix=====r7   r:   z/{base_id}/test)response_modelz/{base_id}/recall-testknowledge_basesbase_idtest_requestrequestdbcurrent_userc                 
   t          |          }|                    t                                        t          j        | k                                              }|st          |           ddlm}  |            }|r*t          |d          r|j
        |k    rt          |           	 |j        dk    s|j        rt          j        st          dd          t!          || |j
                  }	dd l}
|
                                }|	                    |j        |j        |j        |j        |j        |j        	          }|
                                }||z
  }d
 |D             }|rt1          |          t3          |          z  nd}|rt5          |          nd}|rt7          |          nd}|j        d|j        |j        |j        |j        |j        |j        |j        d|t3          |          ||||t1          d |D                       t1          d |D                       t1          d |D                       ddS |j        s|j        r0ddlm}  ||| |j
                  }dd l}
|
                                }|                    |j        |j        |j        |j        d          }|
                                }||z
  }d |D             }|rt1          |          t3          |          z  nd}|rt5          |          nd}|rt7          |          nd}|j        d|j        |j        |j        d|t3          |          ||||t1          d |D                       t1          d |D                       ddS tA          ||           }|j        }|s|j!        rddl"m#} |j!        $                                rV|                    |                              |j        tK          |j!                  k                                              }nH|                    |                              |j!        |j!        k                                              }|r-|j        }tL          '                    d|j!         d| d           |(                    |j        |j        |j        |j        ||j)        |j*                  }|S # tV          $ r}dd l,}tL          -                    dt]          |                      tL          -                    d |/                                            t          d!|0                    d"           d#t]          |                     d d }~ww xY w)$Nr   )get_current_tenant_id	tenant_idgraph_enhancedi  zLKnowledge graph is not enabled. Set ENABLE_KNOWLEDGE_GRAPH=true in settings.status_codedetail)rG   knowledge_base_idrK   )r   kr#   r$   expand_depthrelation_typesc                     g | ]
}|d          S )scorer6   .0rs     r8   
<listcomp>zrecall_test.<locals>.<listcomp>i   s    222Qaj222r7   )rQ   r#   r$   r)   r*   r+   r,   c              3   D   K   | ]}|                     d           dV  dS is_expandedr   NgetrV   s     r8   	<genexpr>zrecall_test.<locals>.<genexpr>   3      0\0\qquu]G[G[0\0\0\0\0\0\0\r7   c              3   D   K   | ]}|                     d           dV  dS is_reference_expandedr   Nr]   rV   s     r8   r_   zrecall_test.<locals>.<genexpr>   H       4 4aee4K.L.L44 4 4 4 4 4r7   c              3   D   K   | ]}|                     d           dV  dS )is_graph_expandedr   Nr]   rV   s     r8   r_   zrecall_test.<locals>.<genexpr>   s4      /a/aaaeeL_F`F`/a/a/a/a/a/a/ar7   )total_results	avg_score	max_score	min_scoreelapsed_timeparent_expanded_countreference_expanded_countgraph_expanded_count)r   r   r;   r<   r=   )get_hybrid_retrieverT)r   rQ   expand_graphexpand_parentrerankc                 :    g | ]}|                     d d          S )rU   r   r]   rV   s     r8   rY   zrecall_test.<locals>.<listcomp>   s&    999AaeeGQ''999r7   hybrid_with_parent_child)rQ   r+   r,   c              3   D   K   | ]}|                     d           dV  dS r[   r]   rV   s     r8   r_   zrecall_test.<locals>.<genexpr>   r`   r7   c              3   D   K   | ]}|                     d           dV  dS rb   r]   rV   s     r8   r_   zrecall_test.<locals>.<genexpr>   rd   r7   )rg   rh   ri   rj   rk   rl   rm   )Modelz$Using knowledge base default model: z (ID: )r   r   rQ   r#   r$   r%   r&   zRecall test error: zTraceback:   zrecall.test_failed: )1r   r   r   filteridfirstr   app.core.tenant_contextrJ   hasattrrK   r   r'   r   ENABLE_KNOWLEDGE_GRAPHr   r   timeretriever"   r#   r$   r)   r*   sumlenmaxminr+   r,   !app.services.rag.hybrid_retrievalro   r   code
app.modelsrw   isdigitr2   loggerinforecall_testr%   r&   	Exception	tracebackerrorr0   
format_exct)rD   rE   rF   rG   rH   r   kbrJ   rK   graph_retrievalr   
start_timer<   end_timerk   scoresrh   ri   rj   ro   hybrid_retrieverretrieval_servicer$   rw   vector_modelresulter   s                               r8   r   r   ?   sG    	wA	-	 	 	'	'(8G(C	D	D	J	J	L	LB 2(111======%%''I 62{## 	6	(A(A,W555{h 000L4M02 # #i    ;L<R  O KKKJ%.."($&0%.)<+@ /  G yy{{H#j0L22'222F5;BFc&kk11I'-4F1I'-4F1I%+(%+!-!7 , 5*6*I,8,M/;/S2>2Y  #%(\\!*!*!*$0-00\0\G0\0\0\-\-\03 4 4#*4 4 4 1 1 -0/a/a7/a/a/a,a,a   4 / *	<3Z *	NNNNNN33L<R      KKKJ&//"($)D*B 0  G yy{{H#j0L99999F5;BFc&kk11I'-4F1I'-4F1I%+2%+/;/S2>2Y 
 #%(\\!*!*!*$0-00\0\G0\0\0\-\-\03 4 4#*4 4 4 1 1
 
  * 2"g>>( 		_BG 		_((((((w   U!xx55eh#bg,,6NOOUUWW!xx55ejBG6KLLRRTT _'?]27]]RZ]]]^^^"..$" ",'6(8 / 
 
  h h h33q6633444;9#7#7#9#9;;<<<qss;O7P7P4\4\TWXYTZTZ4\4\]]]cgghs(   +FS D>S ES 
U.BU))U.z/{base_id}/recall-history
   limitc                     t          |           |                    t                                        t          j        | k                                              }|st          |           g ddS )Nr   )historytotal)r   r   r   r|   r}   r~   r   )rD   rF   r   rG   rH   r   s         r8   get_recall_historyr      si     7	-	 	 	'	'(8G(C	D	D	J	J	L	LB 2(111A&&&r7   z/{base_id}/recall-test/exportjsonformatc           
         t          |          }|                    t                                        t          j        | k                                              }|st          |           	 t          ||           }|                    |j        |j	        |j
        |j        |j        |j        |j                  }	|dk    rdd l}
dd l}|                                }|
                    |          }|                    g d           |	d         D ]L}|                    |d         |d         |d         |d	         d d
         dz   |d         |d         g           Md|                                dS d|	dS # t*          $ r<}t-          d|                    d           dt1          |                     d d }~ww xY w)Nry   csvr   )IDzDocument IDTitleTextScorezChunk Indexr<   r}   document_idtitletextd   z...rU   chunk_index)r   datar   rz   zrecall.export_failedr{   rM   )r   r   r   r|   r}   r~   r   r   r   r   r"   r#   r$   r%   r&   r   ioStringIOwriterwriterowgetvaluer   r   r   r0   )rD   rE   rF   r   rG   rH   r   r   r   r   r   r   outputr   itemr   s                   r8   export_recall_resultsr      s    	wA	-	 	 	'	'(8G(C	D	D	J	J	L	LB 2(111!j1"g>>"..$" ",!*'6(8 / 
 
 U??JJJIII[[]]FZZ''FOOZZZ[[[y) 
 
T
]+WVTcT*U2W]+	 	 	 	 $V__->->???$f555 j j jqss;Q7R7R4^4^VYZ[V\V\4^4^___eiijs   /DE= 8E= =
G7F>>Gz/{base_id}/statisticsc           
         t          |           |                    t                                        t          j        | k                                              }|st          |           ddlm} ddl	m
}m}m} |                    |                    |j                                                |j        | k                                              }	|                    |j                                      |j        | k                                              }
d |
D             }
|
s| |j        ddddd|j        |j        d	S |                    |                    |j                                      d          |                    |                    |j        d                                        d                                        |j                            |
                                                    }|j        pd}|j        pd}|                    |                    |j                                                ||j        |j        k                                  |j                            |
                                                    pd}| |j        |	||||dk    r||z  d	z  nd|j        |j        d	S )
Nr   )func)DocumentVectorKnowledgeCategoryKnowledgeDocumentc                     g | ]
}|d          S )r   r6   )rW   cat_ids     r8   rY   z1get_knowledge_base_statistics.<locals>.<listcomp>'  s    999&F1I999r7   )	rP   knowledge_base_namecategory_countdocument_countvector_countvectorized_document_countvectorization_rateqa_countentity_countr   F
vectorizedr   )r   r   r   r|   r}   r~   r   
sqlalchemyr   r   r   r   r   countrP   scalarallnamer   r   labelnullifis_vectorizedcategory_idin_r   r   joinr   )rD   rF   rG   rH   r   r   r   r   r   r   category_ids	doc_stats	doc_countvectorized_doc_countr   s                  r8   get_knowledge_base_statisticsr     s    7	-	 	 	'	'(8G(C	D	D	J	J	L	LB 2(111OOOOOOOOOO 	-01122	!3w>	?	?	  	"%&&--.?.QU\.\]]aacc  :9L999L 
!(#%7)*"#O

 

 
	
 	JJ(+,,227;;JJt{{#4#BEJJKKQQR^__	
 	
 
!-11,??	@	@	  $1I$/41
N-..//	!;?P?S!S	T	T	!-11,??	@	@		   %!w(#$%9HQTU2Y>DD[\K
 
 
r7   N)+r   fastapir   r   r   r   pydanticr   r	   sqlalchemy.ormr
   app.api.depsr   app.api.permissionsr   
app.configr   app.core.exceptionsr   app.core.i18nr   r   r   r   )app.services.rag.graph_enhanced_retrievalr   $app.services.rag.langchain_retrievalr   common_loggingr   r-   r   routerr   r:   postr2   r   r^   r   r0   r   r   r6   r7   r8   <module>r      s         > > > > > > > > > > > > % % % % % % % % " " " " " "       , , , , , ,       : : : : : : ( ( ( ( ( ( * * * * * * * * R R R R R R F F F F F F % % % % % %	H			+,	-	-	-    	   >> > > > > > > > /ABB%6HII
 '&// .?!@!@AALh LhLh#Lh Lh 		Lh
 Lh Lh Lh JI CBLh^ '(( '&// .?!@!@AA' ''' ' 		'
 ' ' ' )(' ,--
 '&// .?!@!@AA-j -j-j#-j -j 	-j
 	-j -j -j -j .--j` #$$ '&// .?!@!@AA	> >>> 	> 	> > > %$> > >r7   