Skip to content

Commit a8c4e48

Browse files
committed
feat: enhance form layout and add dynamic selection for chunk size, patterns, and limits
1 parent 4b417ed commit a8c4e48

File tree

3 files changed

+165
-35
lines changed

3 files changed

+165
-35
lines changed

apps/application/flow/step_node/document_split_node/i_document_split_node.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,38 @@ class DocumentSplitNodeSerializer(serializers.Serializer):
3535
required=False, label=_("document name relate problem reference"), child=serializers.CharField(), default=[]
3636
)
3737
limit = serializers.IntegerField(required=False, label=_("limit"), default=4096)
38+
limit_type = serializers.ChoiceField(
39+
choices=['custom', 'referencing'], required=False, label=_("document name relate problem type"),
40+
default='custom'
41+
)
42+
limit_reference = serializers.ListField(
43+
required=False, label=_("limit reference"), child=serializers.CharField(), default=[]
44+
)
3845
chunk_size = serializers.IntegerField(required=False, label=_("chunk size"), default=256)
46+
chunk_size_type = serializers.ChoiceField(
47+
choices=['custom', 'referencing'], required=False, label=_("chunk size type"), default='custom'
48+
)
49+
chunk_size_reference = serializers.ListField(
50+
required=False, label=_("chunk size reference"), child=serializers.CharField(), default=[]
51+
)
3952
patterns = serializers.ListField(
4053
required=False, label=_("patterns"), child=serializers.CharField(), default=[]
4154
)
55+
patterns_type = serializers.ChoiceField(
56+
choices=['custom', 'referencing'], required=False, label=_("patterns type"), default='custom'
57+
)
58+
patterns_reference = serializers.ListField(
59+
required=False, label=_("patterns reference"), child=serializers.CharField(), default=[]
60+
)
4261
with_filter = serializers.BooleanField(
4362
required=False, label=_("with filter"), default=False
4463
)
64+
with_filter_type = serializers.ChoiceField(
65+
choices=['custom', 'referencing'], required=False, label=_("with filter type"), default='custom'
66+
)
67+
with_filter_reference = serializers.ListField(
68+
required=False, label=_("with filter reference"), child=serializers.CharField(), default=[]
69+
)
4570

4671

4772
class IDocumentSplitNode(INode):
@@ -59,5 +84,7 @@ def _run(self):
5984
def execute(self, document_list, knowledge_id, split_strategy, paragraph_title_relate_problem_type,
6085
paragraph_title_relate_problem, paragraph_title_relate_problem_reference,
6186
document_name_relate_problem_type, document_name_relate_problem,
62-
document_name_relate_problem_reference, limit, chunk_size, patterns, with_filter, **kwargs) -> NodeResult:
87+
document_name_relate_problem_reference, limit, limit_type, limit_reference, chunk_size, chunk_size_type,
88+
chunk_size_reference, patterns, patterns_type, patterns_reference, with_filter, with_filter_type,
89+
with_filter_reference, **kwargs) -> NodeResult:
6390
pass

apps/application/flow/step_node/document_split_node/impl/base_document_split_node.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,23 @@ def get_reference_content(self, fields: List[str]):
4444
def execute(self, document_list, knowledge_id, split_strategy, paragraph_title_relate_problem_type,
4545
paragraph_title_relate_problem, paragraph_title_relate_problem_reference,
4646
document_name_relate_problem_type, document_name_relate_problem,
47-
document_name_relate_problem_reference, limit, chunk_size, patterns, with_filter, **kwargs) -> NodeResult:
47+
document_name_relate_problem_reference, limit, limit_type, limit_reference, chunk_size, chunk_size_type,
48+
chunk_size_reference, patterns, patterns_type, patterns_reference, with_filter, with_filter_type,
49+
with_filter_reference, **kwargs) -> NodeResult:
4850
self.context['knowledge_id'] = knowledge_id
49-
file_list = self.workflow_manage.get_reference_field(document_list[0], document_list[1:])
50-
paragraph_list = []
51+
file_list = self.get_reference_content(document_list)
52+
53+
# 处理引用类型的参数
54+
if patterns_type == 'referencing':
55+
patterns = self.get_reference_content(patterns_reference)
56+
if limit_type == 'referencing':
57+
limit = self.get_reference_content(limit_reference)
58+
if chunk_size_type == 'referencing':
59+
chunk_size = self.get_reference_content(chunk_size_reference)
60+
if with_filter_type == 'referencing':
61+
with_filter = self.get_reference_content(with_filter_reference)
5162

63+
paragraph_list = []
5264
for doc in file_list:
5365
get_buffer = FileBufferHandle().get_buffer
5466

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

Lines changed: 122 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
:label="$t('views.workflow.nodes.documentSplitNode.splitStrategy.label')"
3030
:rules="{
3131
required: true,
32-
message: $t('views.workflow.nodes.documentSplitNode.splitStrategy.required'),
32+
message: $t('views.workflow.nodes.documentSplitNode.splitStrategy.requiredMessage'),
3333
trigger: 'change'
3434
}"
3535
>
@@ -52,45 +52,79 @@
5252
</el-form-item>
5353
<el-form-item>
5454
<template #label>
55-
<div class="flex">
56-
<span>子分块长度</span>
57-
<el-tooltip
58-
effect="dark"
59-
placement="top"
60-
>
61-
<template #content>
62-
核心目标是平衡检索精度与召回效率 <br/>
63-
•避免过短拆分:单块<50 字易导致语义碎片化,检索时可能因缺少上下文无法匹配查询意图<br/>
64-
•避免过长拆分:单块>500 字会增加冗余信息,降低检索精准度,且占用更多存储和计算资源
65-
</template>
66-
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
67-
</el-tooltip>
55+
<div class="flex-between">
56+
<span>
57+
<span>子分块长度</span>
58+
<el-tooltip
59+
effect="dark"
60+
placement="right"
61+
>
62+
<template #content>
63+
核心目标是平衡检索精度与召回效率 <br/>
64+
•避免过短拆分:单块<50 字易导致语义碎片化,检索时可能因缺少上下文无法匹配查询意图<br/>
65+
•避免过长拆分:单块>500 字会增加冗余信息,降低检索精准度,且占用更多存储和计算资源
66+
</template>
67+
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
68+
</el-tooltip>
69+
</span>
70+
<el-select v-model="form_data.chunk_size_type" size="small" style="width: 100px">
71+
<el-option
72+
:label="$t('views.workflow.nodes.searchDocumentNode.custom')"
73+
value="custom"
74+
/>
75+
<el-option
76+
:label="$t('views.workflow.variable.Referencing')"
77+
value="referencing"
78+
/>
79+
</el-select>
6880
</div>
6981
</template>
7082
<el-input-number
83+
v-if="form_data.chunk_size_type === 'custom'"
7184
v-model="form_data.chunk_size"
7285
show-input
7386
:min="50"
7487
:max="100000"
7588
/>
89+
<NodeCascader
90+
v-else
91+
ref="nodeCascaderRef4"
92+
:nodeModel="nodeModel"
93+
class="w-full"
94+
:placeholder="$t('views.chatLog.documentPlaceholder')"
95+
v-model="form_data.chunk_size_reference"
96+
/>
7697
</el-form-item>
7798
<div v-if="form_data.split_strategy === 'custom'">
7899
<div class="set-rules__form">
79100
<div class="form-item mb-16">
80-
<div class="title flex align-center mb-8">
81-
<span style="margin-right: 4px">{{
82-
$t('views.document.setRules.patterns.label')
83-
}}</span>
84-
<el-tooltip
85-
effect="dark"
86-
:content="$t('views.document.setRules.patterns.tooltip')"
87-
placement="right"
88-
>
89-
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
90-
</el-tooltip>
101+
<div class="flex-between">
102+
<div class="title flex align-center mb-8">
103+
<span style="margin-right: 4px">
104+
{{ $t('views.document.setRules.patterns.label') }}
105+
</span>
106+
<el-tooltip
107+
effect="dark"
108+
:content="$t('views.document.setRules.patterns.tooltip')"
109+
placement="right"
110+
>
111+
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
112+
</el-tooltip>
113+
</div>
114+
<el-select v-model="form_data.patterns_type" size="small" style="width: 100px">
115+
<el-option
116+
:label="$t('views.workflow.nodes.searchDocumentNode.custom')"
117+
value="custom"
118+
/>
119+
<el-option
120+
:label="$t('views.workflow.variable.Referencing')"
121+
value="referencing"
122+
/>
123+
</el-select>
91124
</div>
92125
<div @click.stop>
93126
<el-select
127+
v-if="form_data.patterns_type === 'custom'"
94128
v-model="form_data.patterns"
95129
multiple
96130
:reserve-keyword="false"
@@ -107,25 +141,74 @@
107141
>
108142
</el-option>
109143
</el-select>
144+
<NodeCascader
145+
v-else
146+
ref="nodeCascaderRef5"
147+
:nodeModel="nodeModel"
148+
class="w-full"
149+
:placeholder="$t('views.chatLog.documentPlaceholder')"
150+
v-model="form_data.patterns_reference"
151+
/>
110152
</div>
111153
</div>
112154
<div class="form-item mb-16">
113-
<div class="title mb-8">
114-
{{ $t('views.document.setRules.limit.label') }}
155+
<div class="flex-between">
156+
<div class="title mb-8">
157+
{{ $t('views.document.setRules.limit.label') }}
158+
</div>
159+
<el-select v-model="form_data.limit_type" size="small" style="width: 100px">
160+
<el-option
161+
:label="$t('views.workflow.nodes.searchDocumentNode.custom')"
162+
value="custom"
163+
/>
164+
<el-option
165+
:label="$t('views.workflow.variable.Referencing')"
166+
value="referencing"
167+
/>
168+
</el-select>
115169
</div>
116170
<el-slider
171+
v-if="form_data.limit_type === 'custom'"
117172
v-model="form_data.limit"
118173
show-input
119174
:show-input-controls="false"
120175
:min="50"
121176
:max="100000"
122177
/>
178+
<NodeCascader
179+
v-else
180+
ref="nodeCascaderRef6"
181+
:nodeModel="nodeModel"
182+
class="w-full"
183+
:placeholder="$t('views.chatLog.documentPlaceholder')"
184+
v-model="form_data.limit_reference"
185+
/>
123186
</div>
124187
<div class="form-item mb-16">
125-
<div class="title mb-8">
126-
{{ $t('views.document.setRules.with_filter.label') }}
188+
<div class="flex-between">
189+
<div class="title mb-8">
190+
{{ $t('views.document.setRules.with_filter.label') }}
191+
</div>
192+
<el-select v-model="form_data.with_filter_type" size="small" style="width: 100px">
193+
<el-option
194+
:label="$t('views.workflow.nodes.searchDocumentNode.custom')"
195+
value="custom"
196+
/>
197+
<el-option
198+
:label="$t('views.workflow.variable.Referencing')"
199+
value="referencing"
200+
/>
201+
</el-select>
127202
</div>
128-
<el-switch size="small" v-model="form_data.with_filter" />
203+
<el-switch v-if="form_data.with_filter_type === 'custom'" size="small" v-model="form_data.with_filter" />
204+
<NodeCascader
205+
v-else
206+
ref="nodeCascaderRef7"
207+
:nodeModel="nodeModel"
208+
class="w-full"
209+
:placeholder="$t('views.chatLog.documentPlaceholder')"
210+
v-model="form_data.with_filter_reference"
211+
/>
129212
<div style="margin-top: 4px">
130213
<el-text type="info">
131214
{{ $t('views.document.setRules.with_filter.text') }}
@@ -240,9 +323,17 @@ const form = {
240323
document_name_relate_problem: false,
241324
document_name_relate_problem_reference: [],
242325
limit: 4096,
326+
limit_type: 'custom',
327+
limit_reference: [],
243328
chunk_size: 256,
329+
chunk_size_type: 'custom',
330+
chunk_size_reference: [],
244331
patterns: [],
245-
with_filter: false
332+
patterns_type: 'custom',
333+
patterns_reference: [],
334+
with_filter: false,
335+
with_filter_type: 'custom',
336+
with_filter_reference: []
246337
}
247338
248339

0 commit comments

Comments
 (0)