|
19 | 19 |
|
20 | 20 | from application.workflow.common import WorkflowType |
21 | 21 | from application.workflow.i_node import INode |
22 | | -from common.auth.constants.role_constants import RoleConstants |
23 | 22 | from common.config.embedding_config import VectorStore |
24 | | -from common.database_model_manage.database_model_manage import DatabaseModelManage |
25 | 23 | from common.db.search import native_search |
26 | 24 | from common.utils.common import flat_map, get_file_content |
27 | 25 | from common.utils.shared_resource_auth import filter_authorized_ids |
28 | 26 | from knowledge.models import Document, Paragraph, Knowledge, SearchMode, SourceType |
29 | 27 | from knowledge.services.multimodal_retrieval import get_hit_asset_map |
30 | 28 | from knowledge.services.retrieval_stats import get_recall_tracker, record_recall_safely |
| 29 | +from knowledge.services.retrieval_access import filter_workflow_knowledge |
31 | 30 | from maxkb.conf import PROJECT_DIR |
32 | 31 | from models_provider.tools import get_model_instance_by_model_workspace_id |
33 | 32 |
|
@@ -178,18 +177,27 @@ def _record_recalled_items(embedding_list: List[Dict], paragraph_list: List[Dict |
178 | 177 | record_recall_safely(recalled_items, tracker=get_recall_tracker(workflow_manage)) |
179 | 178 |
|
180 | 179 |
|
181 | | -def _list_paragraph(embedding_list: List, vector): |
| 180 | +def _list_paragraph(embedding_list: List, vector, knowledge_ids=None, document_ids=None): |
182 | 181 | paragraph_id_list = [row.get("paragraph_id") for row in embedding_list] |
183 | 182 | if paragraph_id_list is None or len(paragraph_id_list) == 0: |
184 | 183 | return [] |
| 184 | + query = QuerySet(Paragraph).filter(id__in=paragraph_id_list) |
| 185 | + if knowledge_ids is not None: |
| 186 | + query = query.filter( |
| 187 | + knowledge_id__in=knowledge_ids, |
| 188 | + is_active=True, |
| 189 | + document_id__in=QuerySet(Document).filter(knowledge_id__in=knowledge_ids, is_active=True).values("id"), |
| 190 | + ) |
| 191 | + if document_ids is not None: |
| 192 | + query = query.filter(document_id__in=document_ids) |
185 | 193 | paragraph_list = native_search( |
186 | | - QuerySet(Paragraph).filter(id__in=paragraph_id_list), |
| 194 | + query, |
187 | 195 | get_file_content( |
188 | 196 | os.path.join(PROJECT_DIR, "apps", "application", "sql", "list_knowledge_paragraph_by_paragraph_id.sql") |
189 | 197 | ), |
190 | 198 | with_table_name=True, |
191 | 199 | ) |
192 | | - if len(paragraph_list) != len(paragraph_id_list): |
| 200 | + if knowledge_ids is None and len(paragraph_list) != len(paragraph_id_list): |
193 | 201 | exist_paragraph_list = [row.get("id") for row in paragraph_list] |
194 | 202 | for paragraph_id in paragraph_id_list: |
195 | 203 | if paragraph_id not in exist_paragraph_list: |
@@ -250,15 +258,11 @@ def execute(self): |
250 | 258 | .distinct() |
251 | 259 | ] |
252 | 260 |
|
253 | | - get_knowledge_list_of_authorized = DatabaseModelManage.get_model("get_knowledge_list_of_authorized") |
254 | | - chat_user_type = workflow_params.get("chat_user_type") |
255 | | - if get_knowledge_list_of_authorized is not None and RoleConstants.CHAT_USER.value.name == chat_user_type: |
256 | | - knowledge_id_list = get_knowledge_list_of_authorized(workflow_params.get("chat_user_id"), knowledge_id_list) |
257 | | - |
258 | 261 | workspace_id = workflow_params.get("workspace_id") |
259 | 262 | knowledge_id_list = filter_authorized_ids("knowledge", knowledge_id_list, workspace_id) |
| 263 | + knowledge_id_list = filter_workflow_knowledge(knowledge_id_list, workflow_params) |
260 | 264 |
|
261 | | - if len(knowledge_id_list) == 0: |
| 265 | + if len(knowledge_id_list) == 0 or document_id_list == []: |
262 | 266 | self._write_empty_result(question) |
263 | 267 | return |
264 | 268 |
|
@@ -293,7 +297,8 @@ def execute(self): |
293 | 297 | self._write_empty_result(question) |
294 | 298 | return |
295 | 299 |
|
296 | | - paragraph_list = _list_paragraph(embedding_list, vector) |
| 300 | + knowledge_id_list = filter_workflow_knowledge(knowledge_id_list, workflow_params) |
| 301 | + paragraph_list = _list_paragraph(embedding_list, vector, knowledge_id_list, document_id_list) |
297 | 302 | hit_asset_map = get_hit_asset_map(embedding_list) |
298 | 303 | result = [ |
299 | 304 | reset_paragraph |
|
0 commit comments