Skip to content

Commit 947152e

Browse files
committed
feat: enhance search functionality with dynamic scope selection and improved UI
1 parent 3ba1a0b commit 947152e

File tree

5 files changed

+135
-14
lines changed

5 files changed

+135
-14
lines changed

apps/application/flow/step_node/search_document_node/impl/base_search_document_node.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
from application.flow.i_step_node import NodeResult
99
from application.flow.step_node.search_document_node.i_search_document_node import ISearchDocumentStepNode
10+
from common.constants.permission_constants import RoleConstants
11+
from common.database_model_manage.database_model_manage import DatabaseModelManage
1012
from knowledge.models import Document, DocumentTag, Knowledge
1113

1214

@@ -39,6 +41,23 @@ def execute(self, knowledge_id_list: List, search_mode: str, search_scope_type:
3941
knowledge_id__in=self.get_reference_content(search_scope_reference)
4042
).values_list('id', flat=True)
4143

44+
# 权限过滤
45+
get_knowledge_list_of_authorized = DatabaseModelManage.get_model('get_knowledge_list_of_authorized')
46+
chat_user_type = self.workflow_manage.get_body().get('chat_user_type')
47+
48+
if get_knowledge_list_of_authorized is not None and RoleConstants.CHAT_USER.value.name == chat_user_type:
49+
# 获取授权的知识库ID列表
50+
authorized_knowledge_ids = get_knowledge_list_of_authorized(
51+
self.workflow_manage.get_body().get('chat_user_id'),
52+
knowledge_id_list
53+
)
54+
55+
# 过滤出授权知识库下的文档
56+
document_id_list = QuerySet(Document).filter(
57+
id__in=document_id_list,
58+
knowledge_id__in=authorized_knowledge_ids
59+
).values_list('id', flat=True)
60+
4261
if search_mode == 'auto': # 通过问题自动检索
4362
matched_doc_ids = self.handle_auto_tags(document_id_list, question_reference)
4463

apps/application/flow/step_node/search_knowledge_node/i_search_knowledge_node.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@
1010
from typing import Type
1111

1212
from django.core import validators
13+
from django.utils.translation import gettext_lazy as _
1314
from rest_framework import serializers
1415

1516
from application.flow.i_step_node import INode, NodeResult
1617
from common.utils.common import flat_map
1718

18-
from django.utils.translation import gettext_lazy as _
19-
2019

2120
class DatasetSettingSerializer(serializers.Serializer):
2221
# 需要查询的条数
@@ -43,6 +42,17 @@ class SearchDatasetStepNodeSerializer(serializers.Serializer):
4342

4443
show_knowledge = serializers.BooleanField(required=True,
4544
label=_("The results are displayed in the knowledge sources"))
45+
search_scope_type = serializers.ChoiceField(
46+
required=False, choices=['custom', 'referencing'], label=_("search scope type"),
47+
allow_null=True, default='custom'
48+
)
49+
search_scope_source = serializers.ChoiceField(
50+
required=False, choices=['document', 'knowledge'],
51+
label=_("search scope variable type"), default='knowledge'
52+
)
53+
search_scope_reference = serializers.ListField(
54+
required=False, label=_("search scope variable"), default=list
55+
)
4656

4757
def is_valid(self, *, raise_exception=False):
4858
super().is_valid(raise_exception=True)
@@ -76,7 +86,9 @@ def _run(self):
7686
return self.execute(**self.node_params_serializer.data, question=str(question),
7787
exclude_paragraph_id_list=exclude_paragraph_id_list)
7888

79-
def execute(self, dataset_id_list, dataset_setting, question, show_knowledge,
89+
def execute(self, dataset_id_list, dataset_setting, question, show_knowledge, search_scope_type,
90+
search_scope_source,
91+
search_scope_reference,
8092
exclude_paragraph_id_list=None,
8193
**kwargs) -> NodeResult:
8294
pass

apps/application/flow/step_node/search_knowledge_node/impl/base_search_knowledge_node.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,27 @@ def save_context(self, details, workflow_manage):
6868
result])[0:knowledge_setting.get('max_paragraph_char_number', 5000)]
6969
self.context['directly_return'] = directly_return
7070

71-
def execute(self, knowledge_id_list, knowledge_setting, question, show_knowledge,
71+
def get_reference_content(self, fields: List[str]):
72+
return self.workflow_manage.get_reference_field(fields[0], fields[1:])
73+
74+
def execute(self, knowledge_id_list, knowledge_setting, question, show_knowledge, search_scope_type,
75+
search_scope_source,
76+
search_scope_reference,
7277
exclude_paragraph_id_list=None,
7378
**kwargs) -> NodeResult:
7479
self.context['question'] = question
7580
self.context['show_knowledge'] = show_knowledge
81+
82+
if search_scope_type == 'referencing': # 引用上一步知识库/文档
83+
if search_scope_source == 'knowledge': # 知识库
84+
knowledge_id_list = self.get_reference_content(search_scope_reference)
85+
else: # 文档
86+
knowledge_id_list = QuerySet(Document).filter(
87+
id__in=self.get_reference_content(search_scope_reference)
88+
).values_list(
89+
'knowledge_id', flat=True
90+
).distinct()
91+
7692
get_knowledge_list_of_authorized = DatabaseModelManage.get_model('get_knowledge_list_of_authorized')
7793
chat_user_type = self.workflow_manage.get_body().get('chat_user_type')
7894
if get_knowledge_list_of_authorized is not None and RoleConstants.CHAT_USER.value.name == chat_user_type:

ui/src/workflow/nodes/search-document-node/index.vue

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
{{ $t('views.applicationWorkflow.nodes.searchDocumentNode.selectKnowledge') }}
1818
</span>
1919
<span>
20-
<el-button type="primary" link @click="openKnowledgeDialog">
20+
<el-button v-if="form_data.search_scope_type === 'custom'"
21+
type="primary" link @click="openKnowledgeDialog"
22+
>
2123
<AppIcon iconName="app-add-outlined"></AppIcon>
2224
</el-button>
2325
<el-select
@@ -78,9 +80,6 @@
7880
{{ $t('选择变量') }}
7981
</span>
8082
<span>
81-
<el-button type="primary" link @click="openKnowledgeDialog">
82-
<AppIcon iconName="app-add-outlined"></AppIcon>
83-
</el-button>
8483
<el-select
8584
:teleported="false"
8685
size="small"
@@ -89,11 +88,11 @@
8988
@change="form_data.search_scope_reference = []"
9089
>
9190
<el-option
92-
:label="$t('知识库列表')"
91+
:label="$t('views.applicationWorkflow.nodes.searchDocumentNode.knowledge_list')"
9392
value="knowledge"
9493
/>
9594
<el-option
96-
:label="$t('文档列表')"
95+
:label="$t('views.applicationWorkflow.nodes.searchDocumentNode.document_list')"
9796
value="document"
9897
/>
9998
</el-select>

ui/src/workflow/nodes/search-knowledge-node/index.vue

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,31 @@
1414
<template #label>
1515
<div class="flex-between">
1616
<span>{{ $t('views.chatLog.selectKnowledge') }}</span>
17-
<el-button type="primary" link @click="openknowledgeDialog">
18-
<AppIcon iconName="app-add-outlined"></AppIcon>
19-
</el-button>
17+
<span>
18+
<el-button v-if="form_data.search_scope_type === 'custom'"
19+
type="primary" link @click="openknowledgeDialog"
20+
>
21+
<AppIcon iconName="app-add-outlined"></AppIcon>
22+
</el-button>
23+
<el-select
24+
:teleported="false"
25+
size="small"
26+
v-model="form_data.search_scope_type"
27+
style="width: 85px"
28+
>
29+
<el-option
30+
:label="$t('views.applicationWorkflow.nodes.searchDocumentNode.custom')"
31+
value="custom"
32+
/>
33+
<el-option
34+
:label="$t('views.applicationWorkflow.variable.Referencing')"
35+
value="referencing"
36+
/>
37+
</el-select>
38+
</span>
2039
</div>
2140
</template>
22-
<div class="w-full">
41+
<div class="w-full" v-if="form_data.search_scope_type === 'custom'">
2342
<el-text type="info" v-if="form_data.knowledge_id_list?.length === 0">
2443
{{ $t('views.application.form.relatedKnowledge.placeholder') }}
2544
</el-text>
@@ -42,6 +61,49 @@
4261
</div>
4362
</template>
4463
</div>
64+
<div class="w-full" v-else>
65+
<el-form-item
66+
prop="search_scope_reference"
67+
:rules="{
68+
message: $t('views.applicationWorkflow.variable.placeholder'),
69+
trigger: 'blur',
70+
required: true,
71+
}"
72+
>
73+
<template #label>
74+
<div class="flex-between">
75+
<span>
76+
{{ $t('选择变量') }}
77+
</span>
78+
<span>
79+
<el-select
80+
:teleported="false"
81+
size="small"
82+
v-model="form_data.search_scope_source"
83+
style="width: 95px"
84+
@change="form_data.search_scope_reference = []"
85+
>
86+
<el-option
87+
:label="$t('views.applicationWorkflow.nodes.searchDocumentNode.knowledge_list')"
88+
value="knowledge"
89+
/>
90+
<el-option
91+
:label="$t('views.applicationWorkflow.nodes.searchDocumentNode.document_list')"
92+
value="document"
93+
/>
94+
</el-select>
95+
</span>
96+
</div>
97+
</template>
98+
<NodeCascader
99+
ref="nodeCascaderRef"
100+
:nodeModel="nodeModel"
101+
class="w-full"
102+
:placeholder="$t('views.applicationWorkflow.variable.placeholder')"
103+
v-model="form_data.search_scope_reference"
104+
/>
105+
</el-form-item>
106+
</div>
45107
</el-form-item>
46108
<el-form-item
47109
:label="$t('views.applicationWorkflow.nodes.searchKnowledgeNode.searchParam')"
@@ -142,6 +204,7 @@ import type { FormInstance } from 'element-plus'
142204
import { ref, computed, onMounted } from 'vue'
143205
import { relatedObject } from '@/utils/array'
144206
import { SearchMode } from '@/enums/application'
207+
import AppIcon from "@/components/app-icon/AppIcon.vue";
145208
146209
const props = defineProps<{ nodeModel: any }>()
147210
const nodeCascaderRef = ref()
@@ -155,6 +218,9 @@ const form = {
155218
},
156219
question_reference_address: [],
157220
show_knowledge: false,
221+
search_scope_type: 'custom',
222+
search_scope_source: 'knowledge',
223+
search_scope_reference: [],
158224
}
159225
160226
const form_data = computed({
@@ -221,6 +287,15 @@ onMounted(() => {
221287
form_data.value.show_knowledge = form_data.value.show_knowledge
222288
? form_data.value.show_knowledge
223289
: false
290+
form_data.value.search_scope_type = form_data.value.search_scope_type
291+
? form_data.value.search_scope_type
292+
: 'custom'
293+
form_data.value.search_scope_source = form_data.value.search_scope_source
294+
? form_data.value.search_scope_source
295+
: 'knowledge'
296+
form_data.value.knowledge_id_list = form_data.value.knowledge_id_list
297+
? form_data.value.knowledge_id_list
298+
: []
224299
set(props.nodeModel, 'validate', validate)
225300
})
226301
</script>

0 commit comments

Comments
 (0)