feat: 添加文件向量化状态检查
This commit is contained in:
@@ -61,6 +61,113 @@ QUESTION_BANK_DIR = "./题库"
|
|||||||
DRAFT_DIR = "./题库/草稿"
|
DRAFT_DIR = "./题库/草稿"
|
||||||
|
|
||||||
|
|
||||||
|
# ==================== 文件状态检查 ====================
|
||||||
|
|
||||||
|
def check_file_indexed(file_path: str, collection: str) -> Dict:
|
||||||
|
"""
|
||||||
|
检查文件是否已向量化
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path: 文件路径
|
||||||
|
collection: 向量库名称
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
{
|
||||||
|
"indexed": True/False, # 是否已索引
|
||||||
|
"chunk_count": 0, # 切片数量
|
||||||
|
"status": "ready/not_found/indexing/error",
|
||||||
|
"message": "状态说明"
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
if not file_path or not collection:
|
||||||
|
return {
|
||||||
|
"indexed": False,
|
||||||
|
"chunk_count": 0,
|
||||||
|
"status": "error",
|
||||||
|
"message": "缺少文件路径或向量库名称"
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
from core.engine import get_engine
|
||||||
|
engine = get_engine()
|
||||||
|
|
||||||
|
if not engine:
|
||||||
|
return {
|
||||||
|
"indexed": False,
|
||||||
|
"chunk_count": 0,
|
||||||
|
"status": "error",
|
||||||
|
"message": "RAG 引擎未初始化"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 提取文件名
|
||||||
|
filename = os.path.basename(file_path)
|
||||||
|
|
||||||
|
# 查询向量库
|
||||||
|
collections = [collection] if isinstance(collection, str) else list(collection) if collection else []
|
||||||
|
|
||||||
|
if not collections:
|
||||||
|
return {
|
||||||
|
"indexed": False,
|
||||||
|
"chunk_count": 0,
|
||||||
|
"status": "error",
|
||||||
|
"message": "未指定向量库"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 尝试检索文件切片
|
||||||
|
total_chunks = 0
|
||||||
|
found_collection = None
|
||||||
|
|
||||||
|
for coll in collections:
|
||||||
|
try:
|
||||||
|
# 使用简单 query 查询文件
|
||||||
|
results = engine.search_knowledge(
|
||||||
|
query="document",
|
||||||
|
collections=[coll],
|
||||||
|
source_filter=filename,
|
||||||
|
top_k=1
|
||||||
|
)
|
||||||
|
|
||||||
|
if results and results.get('documents') and results['documents'][0]:
|
||||||
|
# 获取该文件的切片总数
|
||||||
|
collection_obj = engine.kb_manager.get_collection(coll)
|
||||||
|
if collection_obj:
|
||||||
|
all_results = collection_obj.get(
|
||||||
|
where={"source": filename}
|
||||||
|
)
|
||||||
|
if all_results and all_results.get('ids'):
|
||||||
|
total_chunks = len(all_results['ids'])
|
||||||
|
found_collection = coll
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"检查向量库 {coll} 失败: {e}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if total_chunks > 0:
|
||||||
|
return {
|
||||||
|
"indexed": True,
|
||||||
|
"chunk_count": total_chunks,
|
||||||
|
"status": "ready",
|
||||||
|
"message": f"文件已索引,共 {total_chunks} 个切片",
|
||||||
|
"collection": found_collection
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
return {
|
||||||
|
"indexed": False,
|
||||||
|
"chunk_count": 0,
|
||||||
|
"status": "not_found",
|
||||||
|
"message": f"文件 {filename} 未在向量库中找到,可能正在向量化或未上传"
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"检查文件索引状态失败: {e}")
|
||||||
|
return {
|
||||||
|
"indexed": False,
|
||||||
|
"chunk_count": 0,
|
||||||
|
"status": "error",
|
||||||
|
"message": f"检查状态异常: {str(e)}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# ==================== 新版出题接口 ====================
|
# ==================== 新版出题接口 ====================
|
||||||
|
|
||||||
def generate_questions_from_file(
|
def generate_questions_from_file(
|
||||||
@@ -102,6 +209,28 @@ def generate_questions_from_file(
|
|||||||
"""
|
"""
|
||||||
options = options or {}
|
options = options or {}
|
||||||
|
|
||||||
|
# 🔥 新增:检查文件向量化状态
|
||||||
|
file_status = check_file_indexed(file_path, collection)
|
||||||
|
|
||||||
|
if not file_status["indexed"]:
|
||||||
|
# 文件未索引,返回明确的错误信息
|
||||||
|
error_messages = {
|
||||||
|
"not_found": f"文件未向量化: {file_status['message']}",
|
||||||
|
"error": f"检查文件状态失败: {file_status['message']}",
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"success": False,
|
||||||
|
"request_id": request_id,
|
||||||
|
"error_code": "FILE_NOT_INDEXED" if file_status["status"] == "not_found" else "STATUS_CHECK_ERROR",
|
||||||
|
"message": error_messages.get(file_status["status"], file_status["message"]),
|
||||||
|
"file_status": file_status["status"],
|
||||||
|
"chunk_count": file_status["chunk_count"],
|
||||||
|
"questions": [],
|
||||||
|
"total": 0,
|
||||||
|
"source_chunks_used": 0
|
||||||
|
}
|
||||||
|
|
||||||
# 1. 检索文件的所有切片
|
# 1. 检索文件的所有切片
|
||||||
chunks = retrieve_file_chunks(
|
chunks = retrieve_file_chunks(
|
||||||
file_path=file_path,
|
file_path=file_path,
|
||||||
|
|||||||
Reference in New Issue
Block a user