mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-12 14:45:42 +08:00
Handle searching dataset without embedding model (#16742)
### Summary Handle searching dataset without embedding model In this PR, Searching datasets with different embedding models or searching dataset with/without embedding models are not allowed. We will improve the behavior later.
This commit is contained in:
@@ -31,7 +31,7 @@ from common.constants import LLMType, ParserType, StatusEnum
|
||||
from api.db.db_models import DB, Dialog
|
||||
from api.db.services.common_service import CommonService
|
||||
from api.db.services.doc_metadata_service import DocMetadataService
|
||||
from api.db.services.knowledgebase_service import KnowledgebaseService
|
||||
from api.db.services.knowledgebase_service import KnowledgebaseService, validate_dataset_embedding_models
|
||||
from api.db.services.langfuse_service import TenantLangfuseService
|
||||
from api.db.services.llm_service import LLMBundle
|
||||
from common.metadata_utils import apply_meta_data_filter
|
||||
@@ -358,16 +358,16 @@ async def async_chat_solo(dialog, messages, stream=True, session_id=None):
|
||||
def get_models(dialog, trace_context=None, langfuse_session_id=None):
|
||||
embd_mdl, chat_mdl, rerank_mdl, tts_mdl = None, None, None, None
|
||||
kbs = KnowledgebaseService.get_by_ids(dialog.kb_ids)
|
||||
embedding_list = list(set([kb.embd_id for kb in kbs]))
|
||||
if len(embedding_list) > 1:
|
||||
raise Exception("**ERROR**: Knowledge bases use different embedding models.")
|
||||
err = validate_dataset_embedding_models(kbs)
|
||||
if err:
|
||||
raise Exception(err)
|
||||
|
||||
if embedding_list:
|
||||
if kbs and kbs[0].embd_id:
|
||||
embd_owner_tenant_id = kbs[0].tenant_id
|
||||
embd_model_config = get_model_config_from_provider_instance(embd_owner_tenant_id, LLMType.EMBEDDING, embedding_list[0])
|
||||
embd_model_config = get_model_config_from_provider_instance(embd_owner_tenant_id, LLMType.EMBEDDING, kbs[0].embd_id)
|
||||
embd_mdl = LLMBundle(embd_owner_tenant_id, embd_model_config, trace_context=trace_context, langfuse_session_id=langfuse_session_id)
|
||||
if not embd_mdl:
|
||||
raise LookupError("Embedding model(%s) not found" % embedding_list[0])
|
||||
raise LookupError("Embedding model(%s) not found" % kbs[0].embd_id)
|
||||
|
||||
if dialog.llm_id:
|
||||
if dialog.tenant_llm_id:
|
||||
@@ -721,8 +721,8 @@ async def async_chat(dialog, messages, stream=True, **kwargs):
|
||||
prompt_config,
|
||||
partial(
|
||||
retriever.retrieval,
|
||||
embd_mdl = embd_mdl,
|
||||
tenant_ids = tenant_ids,
|
||||
embd_mdl=embd_mdl,
|
||||
tenant_ids=tenant_ids,
|
||||
kb_ids=dialog.kb_ids,
|
||||
page=1,
|
||||
page_size=dialog.top_n,
|
||||
|
||||
@@ -29,6 +29,29 @@ from api.constants import DATASET_NAME_LIMIT
|
||||
from api.utils.api_utils import get_parser_config, get_data_error_result
|
||||
|
||||
|
||||
def _base_model_name(embd_id: str) -> str:
|
||||
"""Return the base model name by stripping provider/instance suffix from an embd_id."""
|
||||
parts = embd_id.rsplit("@", 2)
|
||||
return parts[0]
|
||||
|
||||
|
||||
def validate_dataset_embedding_models(kbs):
|
||||
"""Validate that all given datasets use the same embedding model (or all use none).
|
||||
|
||||
Returns an error message string on failure, or ``None`` on success.
|
||||
"""
|
||||
# Either all datasets have an embedding model, or none do. Mixing is not allowed.
|
||||
embd_ids = [kb.embd_id for kb in kbs if kb.embd_id]
|
||||
has_embd = len(embd_ids) > 0
|
||||
if has_embd and len(embd_ids) != len(kbs):
|
||||
return "Cannot search across datasets where some have embedding models and others do not."
|
||||
if has_embd:
|
||||
embd_nms = list({_base_model_name(eid) for eid in embd_ids})
|
||||
if len(embd_nms) > 1:
|
||||
return f"Datasets use different embedding models: {[kb.embd_id for kb in kbs]}"
|
||||
return None
|
||||
|
||||
|
||||
class KnowledgebaseService(CommonService):
|
||||
"""Service class for managing dataset operations.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user