o
    ?7i                     @   s   d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ eeZe
G d	d
 d
ZG dd dZdS )u   
税务自适应切分器
结合 AdaptivePropositionSplitter + ParentChildSplitStrategy + TaxReferenceExtractor
实现生产级混合检索架构
    N)ListDictAnyOptional)	dataclass   )AdaptivePropositionSplitterPropositionChunk)ParentChildSplitStrategy)TaxReferenceExtractorc                   @   sj   e Zd ZU dZeed< eed< eed< ee ed< eed< eed< e	e
eef  ed< e
eef ed	< d
S )TaxChunku6   税务文档块（包含父子关系和引用信息）chunk_idtext	is_parentparent_chunk_idchunk_levelchunk_index
referencesmetadataN)__name__
__module____qualname____doc__str__annotations__boolr   intr   r   r    r   r   T/lsinfo/ai/hellotax_ai/base_platform/app/services/knowledge/tax_adaptive_splitter.pyr      s   
 r   c                   @   s   e Zd ZdZ				ddededed	efd
dZ		ddededededee f
ddZ	dedededee
eef  fddZdeee
eef   dee
eef  fddZdS )TaxAdaptiveSplitteru   
    税务自适应切分器

    功能：
    1. 自动识别文档结构（章/条/款）
    2. 生成双层分块（子块 + 父块）
    3. 提取章节引用关系
    4. 支持父子块都向量化
              window_sizemin_child_sizemax_child_sizetarget_parent_sizec                 C   sD   || _ || _|| _|| _t|||| d d| _t | _t | _	dS )u   
        Args:
            window_size: 父块窗口大小（几个子块合并为一个父块）
            min_child_size: 子块最小大小
            max_child_size: 子块最大大小
            target_parent_size: 父块目标大小
           )min_sizemax_sizetarget_sizeN)
r$   r%   r&   r'   r   proposition_splitterr
   parent_child_strategyr   reference_extractor)selfr$   r%   r&   r'   r   r   r   __init__+   s   
zTaxAdaptiveSplitter.__init__ lawr   document_iddocument_numberdoc_typereturnc                    s  |r|  std|  g S td| d|  | jj||d}|s/td|  g S tdt| d | jj|||d}td	t| d
 | j	j
|| jd\}}tdt| dt| d i  |D ]}	| |	j||}
|
r~|
 |	j< qmg }t|D ]4\}}|  fdd|jD }t|j|jddd|||j|j|j|jt|jd|jd}|| qt|}t|D ].\}}	 |	jg }
t|	j|	jd|	j|	j|| |
|	j|	jt|	jd|	jd}|| qtdt| dt| dt| d |S )uR  
        执行税务自适应切分

        Args:
            text: 文档文本
            document_id: 文档ID
            document_number: 文档编号（如"财税[2019]20号"）
            doc_type: 文档类型（law/announcement/case/practice）

        Returns:
            TaxChunk列表（包含父块和子块）
        zEmpty text for document zSplitting document z with type )r5   z!No chunks generated for document z
Generated z proposition chunksr   doc_id
doc_numberz
Extracted z document-level references)chunksr$   zCreated z parent chunks and z child chunksc                    s   g | ]}  |g qS r   )get).0cidchild_references_mapr   r   
<listcomp>   s    z-TaxAdaptiveSplitter.split.<locals>.<listcomp>TNparent)r3   article_rangechapter	child_ids
char_count)r   r   r   r   r   r   r   r   F)r3   levelrE   z total TaxChunks (z parents + z
 children))striploggerwarninginfor,   splitlenr.   extract_relationsr-   create_parent_child_pairsr$   _extract_chunk_referencesr   child_id	enumerate_merge_referencesrD   r   	parent_idr3   rB   rC   r   appendr;   rF   )r/   r   r3   r4   r5   proposition_chunksdoc_referencesparentschildrenchildrefs
tax_chunksidxrA   parent_refs	tax_chunkparent_countr   r>   r   rK   G   s   
 
*zTaxAdaptiveSplitter.split
chunk_textc                 C   s    | j j|||d}dd |D S )u   
        提取单个块的引用信息

        Args:
            chunk_text: 块文本
            document_id: 文档ID
            document_number: 文档编号

        Returns:
            引用信息列表
        r7   c                 S   s(   g | ]}|j j|j|j|j|jd qS ))relation_typetarget_doc_numberarticle_numbercontext
confidence)ra   valuerb   rc   rd   re   )r<   relr   r   r   r@      s    zATaxAdaptiveSplitter._extract_chunk_references.<locals>.<listcomp>)r.   rM   )r/   r`   r3   r4   	relationsr   r   r   rO      s   z-TaxAdaptiveSplitter._extract_chunk_referencesreference_listsc                 C   sv   i }|D ]0}|D ]+}| d| d| df}||v r/| dd||  ddkr.|||< q|||< qqt| S )u   
        合并多个引用列表，去重并保留最高置信度

        Args:
            reference_lists: 引用列表的列表

        Returns:
            合并后的引用列表
        ra   rb   rc   re   r   )r;   listvalues)r/   ri   
merged_mapref_listrefkeyr   r   r   rR      s   
z%TaxAdaptiveSplitter._merge_referencesN)r    r!   r"   r#   )r1   r2   )r   r   r   r   r   r0   r   r   r   rK   r   r   rO   rR   r   r   r   r   r       sT    
 
m
#r   )r   uuidjsonloggingtypingr   r   r   r   dataclassesr   r,   r   r	   parent_child_storer
   r.   r   	getLoggerr   rH   r   r   r   r   r   r   <module>   s    
