Files
AIRegulation-DocAnalysis/tests/verify_mvp.py

224 lines
6.4 KiB
Python
Raw Normal View History

2026-04-28 11:29:33 +08:00
"""
MVP功能验证脚本
用于验证完整的文档处理流程
1. PDF/DOCX解析
2. 智能分块
3. 向量嵌入
4. Milvus入库
5. 混合检索
使用方法:
1. 首先启动Milvus: docker-compose up -d
2. 运行此脚本: python verify_mvp.py
"""
import os
import sys
import time
PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, os.path.join(PROJECT_ROOT, "backend"))
2026-04-28 11:29:33 +08:00
from loguru import logger
from app.config.logging import setup_logging
from app.services.document_processor import DocumentProcessor, ProcessingResult
from app.services.storage.milvus_client import MilvusClient
from app.config.settings import settings
2026-04-28 11:29:33 +08:00
# 设置日志
setup_logging(level="INFO")
def verify_milvus_connection():
"""验证Milvus连接"""
logger.info("=" * 50)
logger.info("Step 1: 验证Milvus连接")
logger.info("=" * 50)
client = MilvusClient()
try:
result = client.connect()
if result:
logger.success("Milvus连接成功")
# 创建Collection
client.create_collection(recreate=True)
stats = client.get_collection_stats()
logger.info(f"Collection信息: {stats}")
client.disconnect()
return True
else:
logger.error("Milvus连接失败请检查docker-compose是否启动")
return False
except Exception as e:
logger.error(f"Milvus连接异常: {e}")
logger.info("请先启动Milvus: cd docker && docker-compose up -d")
return False
def verify_embedding_model():
"""验证嵌入模型"""
logger.info("=" * 50)
logger.info("Step 2: 验证BGE-M3嵌入模型")
logger.info("=" * 50)
try:
from app.services.embedding.bge_m3_embedder import BGEM3Embedder
2026-04-28 11:29:33 +08:00
embedder = BGEM3Embedder()
logger.success("嵌入模型加载成功")
# 测试嵌入
test_text = "这是一条测试文本,用于验证嵌入模型功能"
result = embedder.embed_single(test_text)
logger.info(f"Dense向量维度: {len(result['dense'])}")
logger.info(f"Sparse向量词数: {len(result['sparse'])}")
return True
except Exception as e:
logger.error(f"嵌入模型验证失败: {e}")
logger.info("请确保已安装FlagEmbedding: pip install FlagEmbedding")
return False
def verify_sample_document():
"""验证示例文档处理"""
logger.info("=" * 50)
logger.info("Step 3: 验证文档处理流程")
logger.info("=" * 50)
# 使用内置的示例文本(无需外部文件)
sample_text = """
# GB 7258-2017 机动车运行安全技术条件
第一章 范围
第一条 本标准规定了机动车运行安全技术条件适用于在我国道路上行驶的所有机动车
第二条 本标准包括整车发动机传动系行驶系制动系照明与信号装置等技术要求
第二章 术语和定义
第三条 下列术语和定义适用于本标准
机动车以动力装置驱动或者牵引上道路行驶的供人员乘用或者用于运送物品的轮式车辆
整车产品完整的机动车产品包括所有必要的部件和系统
第三章 整车技术要求
第四条 机动车整车应满足以下基本技术要求
1. 车辆外廓尺寸应符合规定限值
2. 车辆应具有唯一的产品标识
3. 车辆结构应安全可靠各部件连接牢固
第五条 车辆应配备必要的安全装置包括
- 制动系统
- 照明与信号装置
- 安全带
- 灭火器
"""
try:
from app.services.embedding.text_chunker import RegulationChunker
from app.services.embedding.bge_m3_embedder import BGEM3Embedder
from app.services.storage.milvus_client import MilvusClient
2026-04-28 11:29:33 +08:00
# 1. 分块
logger.info("测试分块...")
chunker = RegulationChunker(chunk_size=256)
chunks = chunker.chunk_document(
sample_text,
doc_id="gb7258_test",
doc_name="GB 7258-2017 测试",
regulation_type="车辆安全"
)
logger.success(f"分块完成,共{len(chunks)}个chunk")
# 2. 嵌入
logger.info("测试嵌入...")
embedder = BGEM3Embedder()
embeddings = embedder.embed([c.content for c in chunks])
logger.success(f"嵌入完成,向量数: {len(embeddings.dense_embeddings)}")
# 3. 入库
logger.info("测试入库...")
client = MilvusClient()
client.connect()
client.create_collection(recreate=False)
client.load_collection()
inserted_ids = client.insert_chunks(chunks, embeddings)
logger.success(f"入库完成,共{len(inserted_ids)}条记录")
# 4. 检索
logger.info("测试检索...")
query = "机动车安全技术要求"
query_emb = embedder.embed_single(query)
results = client.hybrid_search(
query_dense=query_emb['dense'].tolist(),
query_sparse=query_emb['sparse'],
top_k=3
)
logger.success(f"检索完成,返回{len(results)}条结果")
for i, r in enumerate(results):
logger.info(f"结果{i+1}: 分数={r.score:.4f}, 内容={r.content[:50]}...")
client.disconnect()
return True
except Exception as e:
logger.error(f"文档处理验证失败: {e}")
return False
def main():
"""主验证流程"""
logger.info("\n" + "=" * 60)
logger.info("AI+合规智能中枢 MVP功能验证")
logger.info("=" * 60)
results = []
# 1. Milvus连接验证
results.append(("Milvus连接", verify_milvus_connection()))
# 2. 嵌入模型验证
results.append(("嵌入模型", verify_embedding_model()))
# 3. 文档处理验证
results.append(("文档处理", verify_sample_document()))
# 输出结果汇总
logger.info("\n" + "=" * 60)
logger.info("验证结果汇总")
logger.info("=" * 60)
all_passed = True
for name, passed in results:
status = "✅ 通过" if passed else "❌ 失败"
logger.info(f"{name}: {status}")
if not passed:
all_passed = False
if all_passed:
logger.success("\n🎉 所有验证通过MVP功能正常")
else:
logger.warning("\n⚠️ 部分验证失败,请检查配置和环境")
return all_passed
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)