Skip to content

V2LearningIntegration: Embedding/Rerank provider 因加载时序问题无法解析 #78

@LucNocturne

Description

@LucNocturne

问题描述

V2LearningIntegration.__init__() 在 AstrBot 的 Provider 注册表(provider_manager.inst_map)填充之前就调用 _create_embedding_provider()_create_rerank_provider(),导致 LightRAG 知识引擎和 Reranker 始终无法初始化。

复现步骤

  1. V2_Architecture_Settings 中配置 embedding_provider_idrerank_provider_id
  2. knowledge_engine 设为 lightrag
  3. 重启 AstrBot

实际行为

[V2Integration] Initialised — knowledge=lightrag, memory=legacy, embedding=no, reranker=no
[V2Integration] LightRAG requires an embedding provider but none is available; knowledge engine disabled

即使配置正确,embedding 和 rerank provider 始终解析为 None。

根因

AstrBot 启动时序:

  1. 插件加载阶段star_manager 载入插件)→ 此时 provider_manager.inst_map 为空
  2. V2LearningIntegration.__init__() → 调用 EmbeddingProviderFactory.create()context.get_provider_by_id() → 返回 None
  3. V2LearningIntegration.start() → 同样时机过早,inst_map 仍为空
  4. Provider 加载阶段provider.manager 实例化各 provider)→ inst_map 才被填充
  5. AstrBot 启动完成

FrameworkLLMAdapter 有类似的时序问题,但它有 _needs_lazy_init 机制在实际使用时重试。V2LearningIntegration 缺少这个机制。

临时 Workaround

start() 中用 asyncio.create_task() 启动后台 retry 任务:

async def start(self) -> None:
    # Schedule background retry for providers not yet available
    if (not self._embedding_provider or not self._rerank_provider) and self._context:
        asyncio.create_task(self._lazy_resolve_providers())
    # ... existing start logic ...

async def _lazy_resolve_providers(self) -> None:
    for attempt in range(30):
        await asyncio.sleep(3)
        if not self._embedding_provider:
            self._embedding_provider = self._create_embedding_provider()
        if not self._rerank_provider:
            self._rerank_provider = self._create_rerank_provider()
        if self._embedding_provider and self._rerank_provider:
            break
    if self._embedding_provider:
        if not self._knowledge_manager:
            self._knowledge_manager = self._create_knowledge_manager()
            if self._knowledge_manager and hasattr(self._knowledge_manager, 'start'):
                await self._knowledge_manager.start()
        if not self._exemplar_library:
            self._exemplar_library = self._create_exemplar_library()

建议修复

  1. V2LearningIntegration 中加入类似 FrameworkLLMAdapter._needs_lazy_init 的延迟初始化机制
  2. 或者利用 AstrBot 的 on_astrbot_loaded hook,在所有 provider 就绪后再初始化 V2 模块

环境

  • AstrBot: v4.19.4
  • self-learning: Next-2.0.6
  • Python: 3.12

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghelp wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions