"""
测试 BM25 分词器修复
验证加载后的 BM25 检索器是否正确使用 jieba 中文分词器
"""
from src.core import RAGSystem
from src.tokenizers import create_tokenizer

# 创建 RAG 系统实例
rag = RAGSystem()
rag.load_index()

# 获取 BM25 检索器
bm25_retriever = rag.bm25_store_manager.get_bm25_retriever()

if bm25_retriever:
    print("=== BM25 分词器测试 ===\n")
    
    # 测试查询
    query = "什么是RAG"
    print(f"查询: {query}\n")
    
    # 1. 检查 BM25 检索器的分词器
    print("1. BM25 检索器配置:")
    print(f"   tokenizer 类型: {type(bm25_retriever.tokenizer)}")
    print(f"   tokenizer: {bm25_retriever.tokenizer}")
    
    # 2. 测试分词器
    if hasattr(bm25_retriever, 'tokenizer') and bm25_retriever.tokenizer:
        print(f"\n2. 使用 BM25 检索器的分词器:")
        tokens = bm25_retriever.tokenizer(query)
        print(f"   分词结果: {tokens}")
        print(f"   分词数量: {len(tokens)}")
    else:
        print("\n2. ⚠️ BM25 检索器没有自定义分词器")
    
    # 3. 直接创建 jieba 分词器进行对比
    print(f"\n3. 使用新创建的 jieba 分词器:")
    jieba_tokenizer = create_tokenizer(language="chinese", use_stemmer=False)
    jieba_tokens = jieba_tokenizer(query)
    print(f"   分词结果: {jieba_tokens}")
    print(f"   分词数量: {len(jieba_tokens)}")
    
    # 4. 测试检索
    print(f"\n4. 执行检索测试:")
    nodes = bm25_retriever.retrieve(query)
    print(f"   检索到 {len(nodes)} 个结果")
    
    if nodes:
        print(f"\n5. Top 3 检索结果:")
        for i, node in enumerate(nodes[:3], 1):
            score = node.score if hasattr(node, 'score') else 'N/A'
            text_preview = node.text[:100] if hasattr(node, 'text') else 'N/A'
            print(f"\n   [{i}] 分数: {score}")
            print(f"       内容预览: {text_preview}...")
    else:
        print(f"\n   ⚠️ 没有检索到任何结果（分数可能全为0）")
    
    # 6. 检查内部 bm25 对象
    if hasattr(bm25_retriever, 'bm25'):
        print(f"\n6. BM25 内部状态:")
        print(f"   corpus 大小: {len(bm25_retriever.corpus) if hasattr(bm25_retriever, 'corpus') else 'N/A'}")
        print(f"   skip_stemming: {bm25_retriever.skip_stemming if hasattr(bm25_retriever, 'skip_stemming') else 'N/A'}")
        print(f"   stemmer: {bm25_retriever.stemmer if hasattr(bm25_retriever, 'stemmer') else 'N/A'}")
else:
    print("❌ BM25 检索器未加载")
