"""
深入检查 BM25 分数计算问题
"""
from src.core import RAGSystem

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

# 加载索引
rag.load_index()

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

if bm25_retriever:
    print("=== BM25 检索器内部对象检查 ===")
    
    # 检查 bm25 属性
    if hasattr(bm25_retriever, 'bm25'):
        print(f"\n✅ BM25 检索器有 bm25 属性")
        print(f"bm25 类型: {type(bm25_retriever.bm25)}")
        print(f"bm25 属性列表: {dir(bm25_retriever.bm25)}")
        
        # 检查文档数量
        if hasattr(bm25_retriever.bm25, 'corpus_size'):
            print(f"语料库大小: {bm25_retriever.bm25.corpus_size}")
        
        # 检查 IDF
        if hasattr(bm25_retriever.bm25, 'idf'):
            print(f"\nIDF 值（部分）: {dict(list(bm25_retriever.bm25.idf.items())[:5])}")
        
        # 尝试手动计算分数
        query = "什么是RAG"
        print(f"\n测试查询: {query}")
        
        # 检查分词器
        if hasattr(bm25_retriever, 'tokenizer'):
            print(f"\n✅ 检索器有 tokenizer")
            print(f"tokenizer 类型: {type(bm25_retriever.tokenizer)}")
            
            # 测试分词
            if callable(bm25_retriever.tokenizer):
                tokens = bm25_retriever.tokenizer(query)
                print(f"查询分词结果: {tokens}")
        else:
            print("\n❌ 检索器没有 tokenizer 属性")
        
        # 尝试获取原始BM25分数
        if hasattr(bm25_retriever.bm25, 'get_scores'):
            print("\n尝试调用 bm25.get_scores()...")
            try:
                # 需要先对查询分词
                if hasattr(bm25_retriever, 'tokenizer') and callable(bm25_retriever.tokenizer):
                    query_tokens = bm25_retriever.tokenizer(query)
                    scores = bm25_retriever.bm25.get_scores(query_tokens)
                    print(f"BM25 原始分数（前5个）: {scores[:5]}")
                    print(f"最大分数: {max(scores)}, 最小分数: {min(scores)}")
            except Exception as e:
                print(f"调用失败: {e}")
    else:
        print("\n❌ BM25 检索器没有 bm25 属性")
    
    # 检查 corpus (语料库)
    if hasattr(bm25_retriever, 'corpus'):
        print(f"\n✅ 语料库大小: {len(bm25_retriever.corpus)}")
        if bm25_retriever.corpus:
            print(f"第一个文档（分词后，前10个词）: {bm25_retriever.corpus[0][:10]}")
    
    # 检查相似度计算参数
    print(f"\n相似度 top_k: {bm25_retriever.similarity_top_k}")
    
    # 再次执行检索并详细观察
    print("\n=== 再次执行检索 ===")
    nodes = bm25_retriever.retrieve(query)
    print(f"返回节点数: {len(nodes)}")
    
    # 检查节点ID是否匹配语料库索引
    if nodes:
        print("\n节点ID和分数:")
        for i, node in enumerate(nodes[:5]):
            print(f"  节点 {i}: id={node.node_id[:50]}..., score={node.score}")
