feat: add LLM-guided semantic rechunking for knowledge compilation (#17546)

This commit is contained in:
buua436
2026-07-31 13:33:30 +08:00
committed by GitHub
parent 0969c04eca
commit 44e13d1cb6
20 changed files with 827 additions and 117 deletions

View File

@@ -1,6 +1,7 @@
import { ModelTreeSelectFormField } from '@/components/model-tree-select';
import { SelectWithSearch } from '@/components/originui/select-with-search';
import { RAGFlowFormItem } from '@/components/ragflow-form';
import { SwitchFormField } from '@/components/switch-fom-field';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
@@ -65,6 +66,10 @@ export function TemplateConfiguration({
control: form.control,
name: `templates.${selectedTemplateIndex}.kind`,
});
const rechunk = useWatch({
control: form.control,
name: `templates.${selectedTemplateIndex}.config.rechunk`,
});
const availableKindOptions = useAvailableKindOptions(
form,
@@ -198,39 +203,62 @@ export function TemplateConfiguration({
{kind === CompilationTemplateKind.Tree ? (
<TreeTemplateFields index={selectedTemplateIndex} />
) : (
sectionNames.length > 0 &&
activeSectionTab && (
<Tabs
value={activeSectionTab}
onValueChange={setActiveSectionTab}
className="w-full"
>
<TabsList className="w-full justify-start">
<>
{kind !== CompilationTemplateKind.Artifacts && (
<>
<SwitchFormField
name={`templates.${selectedTemplateIndex}.config.rechunk`}
label={t('setting.rechunkInput')}
tooltip={t('setting.rechunkInputTip')}
vertical={false}
/>
{rechunk && (
<RAGFlowFormItem
name={`templates.${selectedTemplateIndex}.config.rechunk_rules`}
label={t('setting.rechunkRules')}
>
<Textarea
placeholder={t('setting.rechunkRulesPlaceholder')}
rows={6}
resize="vertical"
/>
</RAGFlowFormItem>
)}
</>
)}
{sectionNames.length > 0 && activeSectionTab && (
<Tabs
value={activeSectionTab}
onValueChange={setActiveSectionTab}
className="w-full"
>
<TabsList className="w-full justify-start">
{sectionNames.map((sectionName) => (
<TabsTrigger
key={sectionName}
value={sectionName}
className="flex-1"
>
{t(
SectionTitleKeyMap[sectionName] ??
startCase(sectionName),
)}
</TabsTrigger>
))}
</TabsList>
{sectionNames.map((sectionName) => (
<TabsTrigger
<TabsContent
key={sectionName}
value={sectionName}
className="flex-1"
className="mt-4"
>
{t(
SectionTitleKeyMap[sectionName] ??
startCase(sectionName),
)}
</TabsTrigger>
{renderSectionTabs(sectionName)}
</TabsContent>
))}
</TabsList>
{sectionNames.map((sectionName) => (
<TabsContent
key={sectionName}
value={sectionName}
className="mt-4"
>
{renderSectionTabs(sectionName)}
</TabsContent>
))}
</Tabs>
)
</Tabs>
)}
</>
)}
</div>
</div>

View File

@@ -61,6 +61,8 @@ export const DefaultTemplateValues: TemplateSchemaType = {
instruction: '',
page_example: '',
use_blueprint: false,
rechunk: false,
rechunk_rules: '',
},
};
@@ -81,6 +83,8 @@ export const isConfigMetaKey = (key: string) =>
'page_example',
'synthesis',
'use_blueprint',
'rechunk',
'rechunk_rules',
].includes(key);
export const createEmptyField = (keys: string[]) =>
@@ -132,6 +136,15 @@ export const buildConfigFromBuiltin = (
: {}),
use_blueprint:
kind === CompilationTemplateKind.Artifacts && example.length > 0,
...(kind !== CompilationTemplateKind.Tree
? {
rechunk: builtinTemplate.config?.rechunk === true,
rechunk_rules:
typeof builtinTemplate.config?.rechunk_rules === 'string'
? builtinTemplate.config.rechunk_rules
: '',
}
: {}),
};
if (kind === CompilationTemplateKind.Artifacts && example.length > 0) {
@@ -183,6 +196,15 @@ export const transformDetailToForm = (
: {}),
use_blueprint:
detail.kind === CompilationTemplateKind.Artifacts && example.length > 0,
...(detail.kind !== CompilationTemplateKind.Tree
? {
rechunk: config.rechunk === true,
rechunk_rules:
typeof config.rechunk_rules === 'string'
? config.rechunk_rules
: '',
}
: {}),
};
if (detail.kind === CompilationTemplateKind.Artifacts && example.length > 0) {
@@ -258,7 +280,8 @@ export const transformTemplateToPayload = (template: TemplateSchemaType) => {
return;
}
if (isConfigMetaKey(key)) {
if (typeof value === 'string') config[key] = value;
if (typeof value === 'string' || typeof value === 'boolean')
config[key] = value;
} else {
config[key] = value as ICompilationTemplateConfigRequest[string];
}

View File

@@ -1,6 +1,7 @@
import { ModelTreeSelectFormField } from '@/components/model-tree-select';
import { SelectWithSearch } from '@/components/originui/select-with-search';
import { RAGFlowFormItem } from '@/components/ragflow-form';
import { SwitchFormField } from '@/components/switch-fom-field';
import { Input } from '@/components/ui/input';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Textarea } from '@/components/ui/textarea';
@@ -58,6 +59,10 @@ export function TemplateConfiguration({
control: form.control,
name: `templates.${selectedTemplateIndex}.kind`,
});
const rechunk = useWatch({
control: form.control,
name: `templates.${selectedTemplateIndex}.config.rechunk`,
});
const availableKindOptions = useAvailableKindOptions(
form,
@@ -191,39 +196,62 @@ export function TemplateConfiguration({
{kind === CompilationTemplateKind.Tree ? (
<TreeTemplateFields index={selectedTemplateIndex} />
) : (
sectionNames.length > 0 &&
activeSectionTab && (
<Tabs
value={activeSectionTab}
onValueChange={setActiveSectionTab}
className="w-full"
>
<TabsList className="w-full justify-start">
<>
{kind !== CompilationTemplateKind.Artifacts && (
<>
<SwitchFormField
name={`templates.${selectedTemplateIndex}.config.rechunk`}
label={t('setting.rechunkInput')}
tooltip={t('setting.rechunkInputTip')}
vertical={false}
/>
{rechunk && (
<RAGFlowFormItem
name={`templates.${selectedTemplateIndex}.config.rechunk_rules`}
label={t('setting.rechunkRules')}
>
<Textarea
placeholder={t('setting.rechunkRulesPlaceholder')}
rows={6}
resize="vertical"
/>
</RAGFlowFormItem>
)}
</>
)}
{sectionNames.length > 0 && activeSectionTab && (
<Tabs
value={activeSectionTab}
onValueChange={setActiveSectionTab}
className="w-full"
>
<TabsList className="w-full justify-start">
{sectionNames.map((sectionName) => (
<TabsTrigger
key={sectionName}
value={sectionName}
className="flex-1"
>
{t(
SectionTitleKeyMap[sectionName] ??
startCase(sectionName),
)}
</TabsTrigger>
))}
</TabsList>
{sectionNames.map((sectionName) => (
<TabsTrigger
<TabsContent
key={sectionName}
value={sectionName}
className="flex-1"
className="mt-4"
>
{t(
SectionTitleKeyMap[sectionName] ??
startCase(sectionName),
)}
</TabsTrigger>
{renderSectionTabs(sectionName)}
</TabsContent>
))}
</TabsList>
{sectionNames.map((sectionName) => (
<TabsContent
key={sectionName}
value={sectionName}
className="mt-4"
>
{renderSectionTabs(sectionName)}
</TabsContent>
))}
</Tabs>
)
</Tabs>
)}
</>
)}
{children}

View File

@@ -57,6 +57,8 @@ export const DefaultTemplateValues: TemplateSchemaType = {
instruction: '',
page_example: '',
use_blueprint: false,
rechunk: false,
rechunk_rules: '',
},
};
@@ -77,6 +79,8 @@ export const isConfigMetaKey = (key: string) =>
'page_example',
'synthesis',
'use_blueprint',
'rechunk',
'rechunk_rules',
].includes(key);
export const createEmptyField = (keys: string[]) =>
@@ -128,6 +132,15 @@ export const buildConfigFromBuiltin = (
: {}),
use_blueprint:
kind === CompilationTemplateKind.Artifacts && example.length > 0,
...(kind !== CompilationTemplateKind.Tree
? {
rechunk: builtinTemplate.config?.rechunk === true,
rechunk_rules:
typeof builtinTemplate.config?.rechunk_rules === 'string'
? builtinTemplate.config.rechunk_rules
: '',
}
: {}),
};
if (kind === CompilationTemplateKind.Artifacts && example.length > 0) {
@@ -179,6 +192,15 @@ export const transformDetailToForm = (
: {}),
use_blueprint:
detail.kind === CompilationTemplateKind.Artifacts && example.length > 0,
...(detail.kind !== CompilationTemplateKind.Tree
? {
rechunk: config.rechunk === true,
rechunk_rules:
typeof config.rechunk_rules === 'string'
? config.rechunk_rules
: '',
}
: {}),
};
if (detail.kind === CompilationTemplateKind.Artifacts && example.length > 0) {
@@ -254,7 +276,8 @@ export const transformTemplateToPayload = (template: TemplateSchemaType) => {
return;
}
if (isConfigMetaKey(key)) {
if (typeof value === 'string') config[key] = value;
if (typeof value === 'string' || typeof value === 'boolean')
config[key] = value;
} else {
config[key] = value as ICompilationTemplateConfigRequest[string];
}