Selaa lähdekoodia

Fix retrieval API error and add multi-kb search (#1928)

### What problem does this PR solve?
Type of change
 Bug Fix (Import necessary class for retrieval API )
 New Feature (Add multi-KB search to retrieval API)
tags/v0.10.0
wwwlll 1 vuosi sitten
vanhempi
commit
06700850df
No account linked to committer's email address
1 muutettua tiedostoa jossa 16 lisäystä ja 16 poistoa
  1. 16
    16
      api/apps/api_app.py

+ 16
- 16
api/apps/api_app.py Näytä tiedosto

import re import re
from datetime import datetime, timedelta from datetime import datetime, timedelta
from flask import request, Response from flask import request, Response
from api.db.services.llm_service import TenantLLMService
from flask_login import login_required, current_user from flask_login import login_required, current_user
from api.db import FileType, ParserType, FileSource
from api.db import FileType, LLMType, ParserType, FileSource
from api.db.db_models import APIToken, API4Conversation, Task, File from api.db.db_models import APIToken, API4Conversation, Task, File
from api.db.services import duplicate_name from api.db.services import duplicate_name
from api.db.services.api_service import APITokenService, API4ConversationService from api.db.services.api_service import APITokenService, API4ConversationService
from itsdangerous import URLSafeTimedSerializer from itsdangerous import URLSafeTimedSerializer
from api.utils.file_utils import filename_type, thumbnail from api.utils.file_utils import filename_type, thumbnail
from rag.nlp import keyword_extraction
from rag.utils.minio_conn import MINIO from rag.utils.minio_conn import MINIO
from api.db.services.canvas_service import CanvasTemplateService, UserCanvasService from api.db.services.canvas_service import CanvasTemplateService, UserCanvasService
data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR)
req = request.json req = request.json
kb_id = req.get("kb_id")
kb_ids = req.get("kb_id",[])
doc_ids = req.get("doc_ids", []) doc_ids = req.get("doc_ids", [])
question = req.get("question") question = req.get("question")
page = int(req.get("page", 1)) page = int(req.get("page", 1))
top = int(req.get("top_k", 1024)) top = int(req.get("top_k", 1024))
try: try:
e, kb = KnowledgebaseService.get_by_id(kb_id)
if not e:
return get_data_error_result(retmsg="Knowledgebase not found!")
kbs = KnowledgebaseService.get_by_ids(kb_ids)
embd_nms = list(set([kb.embd_id for kb in kbs]))
if len(embd_nms) != 1:
return get_json_result(
data=False, retmsg='Knowledge bases use different embedding models or does not exist."', retcode=RetCode.AUTHENTICATION_ERROR)
embd_mdl = TenantLLMService.model_instance( embd_mdl = TenantLLMService.model_instance(
kb.tenant_id, LLMType.EMBEDDING.value, llm_name=kb.embd_id)
kbs[0].tenant_id, LLMType.EMBEDDING.value, llm_name=kbs[0].embd_id)
rerank_mdl = None rerank_mdl = None
if req.get("rerank_id"): if req.get("rerank_id"):
rerank_mdl = TenantLLMService.model_instance( rerank_mdl = TenantLLMService.model_instance(
kb.tenant_id, LLMType.RERANK.value, llm_name=req["rerank_id"])
kbs[0].tenant_id, LLMType.RERANK.value, llm_name=req["rerank_id"])
if req.get("keyword", False): if req.get("keyword", False):
chat_mdl = TenantLLMService.model_instance(kb.tenant_id, LLMType.CHAT)
chat_mdl = TenantLLMService.model_instance(kbs[0].tenant_id, LLMType.CHAT)
question += keyword_extraction(chat_mdl, question) question += keyword_extraction(chat_mdl, question)
ranks = retrievaler.retrieval(question, embd_mdl, kb.tenant_id, [kb_id], page, size,
similarity_threshold, vector_similarity_weight, top,
doc_ids, rerank_mdl=rerank_mdl)
ranks = retrievaler.retrieval(question, embd_mdl, kbs[0].tenant_id, kb_ids, page, size,
similarity_threshold, vector_similarity_weight, top,
doc_ids, rerank_mdl=rerank_mdl)
for c in ranks["chunks"]: for c in ranks["chunks"]:
if "vector" in c: if "vector" in c:
del c["vector"] del c["vector"]
return get_json_result(data=ranks) return get_json_result(data=ranks)
except Exception as e: except Exception as e:
if str(e).find("not_found") > 0: if str(e).find("not_found") > 0:
return get_json_result(data=False, retmsg=f'No chunk found! Check the chunk status please!', return get_json_result(data=False, retmsg=f'No chunk found! Check the chunk status please!',
retcode=RetCode.DATA_ERROR) retcode=RetCode.DATA_ERROR)
return server_error_response(e)
return server_error_response(e)

Loading…
Peruuta
Tallenna