fix: stabilize knowledge compilation navigation updates (#17345)

This commit is contained in:
buua436
2026-07-24 17:48:27 +08:00
committed by GitHub
parent 1f97823ee3
commit 2ba7ccecaf
12 changed files with 181 additions and 76 deletions

View File

@@ -1135,6 +1135,9 @@ async def rerun_agent(tenant_id):
if 0 < doc["progress"] < 1:
return get_data_error_result(message=f"`{doc['name']}` is processing...")
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
remove_dataset_nav_doc_sync(tenant_id, doc["kb_id"], doc["id"])
if settings.docStoreConn.index_exist(search.index_name(tenant_id), doc["kb_id"]):
settings.docStoreConn.delete({"doc_id": doc["id"]}, search.index_name(tenant_id), doc["kb_id"])
doc["progress_msg"] = ""

View File

@@ -1470,6 +1470,9 @@ def _run_sync(user_id: str, req):
DocumentService.update_by_id(doc_id, info)
if req.get("delete", False):
TaskService.filter_delete([Task.doc_id == doc_id])
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
remove_dataset_nav_doc_sync(doc_tenant_id, doc.kb_id, doc.id)
if settings.docStoreConn.index_exist(search.index_name(doc_tenant_id), doc.kb_id):
settings.docStoreConn.delete({"doc_id": doc_id}, search.index_name(doc_tenant_id), doc.kb_id)
@@ -1580,6 +1583,9 @@ async def parse_documents(tenant_id, dataset_id):
DocumentService.update_by_id(doc_id, info)
TaskService.filter_delete([Task.doc_id == doc_id])
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
if settings.docStoreConn.index_exist(search.index_name(tenant_id), doc.kb_id):
settings.docStoreConn.delete({"doc_id": doc_id}, search.index_name(tenant_id), doc.kb_id)

View File

@@ -2452,7 +2452,10 @@ def _nav_item(row: dict) -> dict:
payload = json.loads(row.get("content_with_weight") or "{}")
except Exception:
payload = {}
is_cluster = (row.get("type_kwd") or payload.get("type")) == "nav_cluster"
row_type = row.get("type_kwd")
if isinstance(row_type, (list, tuple, set)):
row_type = next(iter(row_type), None)
is_cluster = (row_type or payload.get("type")) == "nav_cluster"
return {
"name": row.get("name") or "",
"description": payload.get("description") or "",
@@ -2551,7 +2554,8 @@ async def delete_nav(dataset_id: str, tenant_id: str):
index_nm, _ = pack
try:
deleted = settings.docStoreConn.delete(
deleted = await thread_pool_exec(
settings.docStoreConn.delete,
{"compile_kwd": [_NAV_COMPILE_KWD]},
index_nm,
dataset_id,
@@ -2592,16 +2596,17 @@ async def delete_nav_node(dataset_id: str, tenant_id: str, name: str):
if not frontier:
break
try:
res = settings.docStoreConn.search(
select_fields=["name"],
highlight_fields=[],
condition={"compile_kwd": [_NAV_COMPILE_KWD], "parent_kwd": frontier},
match_expressions=[],
order_by=OrderByExpr(),
offset=0,
limit=10000,
index_names=index_nm,
knowledgebase_ids=[dataset_id],
res = await thread_pool_exec(
settings.docStoreConn.search,
["name"],
[],
{"compile_kwd": [_NAV_COMPILE_KWD], "parent_kwd": frontier},
[],
OrderByExpr(),
0,
10000,
index_nm,
[dataset_id],
)
rows = settings.docStoreConn.get_fields(res, ["name"]) or {}
except Exception:
@@ -2616,7 +2621,8 @@ async def delete_nav_node(dataset_id: str, tenant_id: str, name: str):
frontier = nxt
try:
deleted = settings.docStoreConn.delete(
deleted = await thread_pool_exec(
settings.docStoreConn.delete,
{"compile_kwd": [_NAV_COMPILE_KWD], "name": list(names)},
index_nm,
dataset_id,

View File

@@ -492,6 +492,20 @@ class DocumentService(CommonService):
except Exception as e:
logging.warning(f"Failed to delete thumbnail for document {doc.id}: {e}")
# Prune this doc's line from the KB's tree-kind navigation before the
# broad doc_id delete below removes the nav_doc row needed to locate
# and update its parent cluster.
try:
from rag.advanced_rag.knowlege_compile.dataset_nav import (
remove_dataset_nav_doc_sync,
)
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
except Exception as e:
logging.warning(
f"Failed to prune dataset_nav for document {doc.id}: {e}",
)
# Delete chunks from doc store - this is critical, log errors
try:
settings.docStoreConn.delete({"doc_id": doc.id}, chunk_index_name, doc.kb_id)
@@ -507,20 +521,6 @@ class DocumentService(CommonService):
except Exception as e:
logging.warning(f"Failed to clean up artifact products for document {doc.id}: {e}")
# Prune this doc's line from the KB's tree-kind navigation
# markdown (best-effort — the markdown is a downstream artifact,
# and failure here must not block the document delete).
try:
from rag.advanced_rag.knowlege_compile.dataset_nav import (
remove_dataset_nav_doc_sync,
)
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
except Exception as e:
logging.warning(
f"Failed to prune dataset_nav for document {doc.id}: {e}",
)
# Delete document metadata (non-critical, log and continue)
try:
DocMetadataService.delete_document_metadata(doc.id, doc.kb_id, tenant_id)