-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
fix(kb): 修复知识库向量维度不一致时的错误提示与更新状态 #7866
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,7 @@ | ||
| from pathlib import Path | ||
|
|
||
| from astrbot.core import logger | ||
| from astrbot.core.exceptions import KnowledgeBaseUploadError | ||
| from astrbot.core.provider.manager import ProviderManager | ||
| from astrbot.core.utils.astrbot_path import get_astrbot_knowledge_base_path | ||
|
|
||
|
|
@@ -198,6 +199,19 @@ async def update_kb( | |
| } | ||
| previous_init_error = kb_helper.init_error | ||
|
|
||
| def rollback_state() -> None: | ||
| kb.kb_name = previous_state["kb_name"] | ||
| kb.description = previous_state["description"] | ||
| kb.emoji = previous_state["emoji"] | ||
| kb.embedding_provider_id = previous_state["embedding_provider_id"] | ||
| kb.rerank_provider_id = previous_state["rerank_provider_id"] | ||
| kb.chunk_size = previous_state["chunk_size"] | ||
| kb.chunk_overlap = previous_state["chunk_overlap"] | ||
| kb.top_k_dense = previous_state["top_k_dense"] | ||
| kb.top_k_sparse = previous_state["top_k_sparse"] | ||
| kb.top_m_final = previous_state["top_m_final"] | ||
| kb_helper.init_error = previous_init_error | ||
|
|
||
| if kb_name is not None: | ||
| kb.kb_name = kb_name | ||
| if description is not None: | ||
|
|
@@ -229,24 +243,21 @@ async def update_kb( | |
|
|
||
| try: | ||
| await new_helper.initialize() | ||
| except KnowledgeBaseUploadError as e: | ||
| rollback_state() | ||
| logger.error( | ||
| f"知识库 {kb.kb_name}({kb.kb_id}) 重新初始化失败,继续使用旧实例: {e}", | ||
| exc_info=True, | ||
| ) | ||
| raise | ||
| except Exception as e: | ||
| # Roll back in-memory settings and keep current helper available. | ||
| kb.kb_name = previous_state["kb_name"] | ||
| kb.description = previous_state["description"] | ||
| kb.emoji = previous_state["emoji"] | ||
| kb.embedding_provider_id = previous_state["embedding_provider_id"] | ||
| kb.rerank_provider_id = previous_state["rerank_provider_id"] | ||
| kb.chunk_size = previous_state["chunk_size"] | ||
| kb.chunk_overlap = previous_state["chunk_overlap"] | ||
| kb.top_k_dense = previous_state["top_k_dense"] | ||
| kb.top_k_sparse = previous_state["top_k_sparse"] | ||
| kb.top_m_final = previous_state["top_m_final"] | ||
| kb_helper.init_error = previous_init_error | ||
| rollback_state() | ||
| logger.error( | ||
| f"知识库 {kb.kb_name}({kb.kb_id}) 重新初始化失败,继续使用旧实例: {e}", | ||
| exc_info=True, | ||
| ) | ||
| return kb_helper | ||
| raise ValueError(f"知识库重新初始化失败:{e}") from e | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 同上,将通用异常包装为 References
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 这里关于重复逻辑抽取成共享 helper 的方向我认同,不过这次我没有继续做这一步重构。当前这次 PR 的目标是尽量以最小 diff 修复 #7794 对应的两个核心问题:索引维度校验,以及初始化失败时不要伪成功。目前已经先修复了更关键的一点: |
||
|
|
||
| async with self.kb_db.get_db() as session: | ||
| session.add(kb) | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.