"""
测试 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 is None:
    print("❌ BM25 检索器未加载")
else:
    print("✅ BM25 检索器已加载")
    print(f"BM25 检索器类型: {type(bm25_retriever)}")
    print(f"BM25 检索器属性: {dir(bm25_retriever)}")
    
    # 执行检索
    query = "什么是RAG"
    print(f"\n🔍 检索问题: {query}")
    
    # 直接调用 BM25 检索器的 retrieve 方法
    nodes = bm25_retriever.retrieve(query)
    
    print(f"\n📊 检索到 {len(nodes)} 个节点")
    
    # 检查第一个节点的详细信息
    if nodes:
        print("\n=== 第一个节点详细信息 ===")
        node = nodes[0]
        print(f"节点类型: {type(node)}")
        print(f"节点属性: {dir(node)}")
        print(f"\n节点信息:")
        print(f"  - score: {node.score}")
        print(f"  - node.text[:200]: {node.node.text[:200]}")
        
        # 检查是否有其他分数相关的属性
        if hasattr(node, 'metadata'):
            print(f"  - metadata: {node.metadata}")
        
        # 检查 BM25 检索器的内部状态
        print("\n=== BM25 检索器内部状态 ===")
        if hasattr(bm25_retriever, '_bm25'):
            print(f"BM25 对象: {bm25_retriever._bm25}")
            print(f"BM25 类型: {type(bm25_retriever._bm25)}")
            
            # 检查 BM25 对象的属性
            if hasattr(bm25_retriever._bm25, 'score'):
                print("BM25 对象有 score 方法")
            
            # 尝试获取文档频率等信息
            if hasattr(bm25_retriever._bm25, 'idf'):
                print(f"IDF 信息: {bm25_retriever._bm25.idf}")
        
        # 检查前5个节点的分数
        print("\n=== 前5个节点的分数 ===")
        for i, n in enumerate(nodes[:5], 1):
            print(f"节点 {i}: score={n.score:.6f}, text_preview={n.node.text[:50]}...")
