fix: 修改评查点设置中的多模态抽取设置的逻辑。
This commit is contained in:
@@ -54,14 +54,14 @@ export function ExtractionSettings({
|
|||||||
llm: initialData?.extraction_config?.llm ?? {
|
llm: initialData?.extraction_config?.llm ?? {
|
||||||
fields: [],
|
fields: [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: "system",
|
type: "llm_default_prompt",
|
||||||
template: "",
|
template: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
vlm: initialData?.extraction_config?.vlm ?? {
|
vlm: initialData?.extraction_config?.vlm ?? {
|
||||||
fields: [],
|
fields: [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: "system",
|
type: "vlm_default_prompt",
|
||||||
template: "",
|
template: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -84,11 +84,13 @@ export function ExtractionSettings({
|
|||||||
vlm: initialData?.extraction_config?.vlm?.fields || []
|
vlm: initialData?.extraction_config?.vlm?.fields || []
|
||||||
});
|
});
|
||||||
// VLM字段类型
|
// VLM字段类型
|
||||||
const [selectedVlmFieldType, setSelectedVlmFieldType] = useState('default');
|
const [selectedVlmFieldType, setSelectedVlmFieldType] = useState('vlm_default_prompt');
|
||||||
|
// 自定义字段的提示词模板
|
||||||
|
const [customVlmPrompt, setCustomVlmPrompt] = useState('请识别文档中的印章信息,提取以下字段');
|
||||||
// 提示词类型
|
// 提示词类型
|
||||||
const [promptType, setPromptType] = useState({
|
const [promptType, setPromptType] = useState({
|
||||||
llm: initialData?.extraction_config?.llm?.prompt_setting?.type || 'system',
|
llm: initialData?.extraction_config?.llm?.prompt_setting?.type || 'llm_default_prompt',
|
||||||
vlm: initialData?.extraction_config?.vlm?.prompt_setting?.type || 'system'
|
vlm: initialData?.extraction_config?.vlm?.prompt_setting?.type || 'vlm_default_prompt'
|
||||||
});
|
});
|
||||||
// 提示词模板
|
// 提示词模板
|
||||||
const [selectedTemplate, setSelectedTemplate] = useState({
|
const [selectedTemplate, setSelectedTemplate] = useState({
|
||||||
@@ -115,6 +117,20 @@ export function ExtractionSettings({
|
|||||||
setCurrentTab(tab);
|
setCurrentTab(tab);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 初始化自定义字段的提示词
|
||||||
|
useEffect(() => {
|
||||||
|
// 在编辑模式下,如果有自定义类型的字段,加载其 template
|
||||||
|
const vlmFields = initialData?.extraction_config?.vlm?.fields || [];
|
||||||
|
const customField = vlmFields.find(
|
||||||
|
(f: string | { name: string; type: string; template?: string }) =>
|
||||||
|
typeof f === 'object' && f.type === 'custom' && f.template
|
||||||
|
);
|
||||||
|
|
||||||
|
if (customField && typeof customField === 'object' && customField.template) {
|
||||||
|
setCustomVlmPrompt(customField.template);
|
||||||
|
}
|
||||||
|
}, [initialData]);
|
||||||
|
|
||||||
// 自动保存字段变更状态
|
// 自动保存字段变更状态
|
||||||
// 这个效果确保添加字段后自动保存到组件状态,但不自动提交更新
|
// 这个效果确保添加字段后自动保存到组件状态,但不自动提交更新
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -176,10 +192,19 @@ export function ExtractionSettings({
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
newFields.push({
|
// 如果是自定义类型,添加 template 字段
|
||||||
name: input,
|
if (selectedVlmFieldType === 'custom') {
|
||||||
type: selectedVlmFieldType as VLMFieldType
|
newFields.push({
|
||||||
});
|
name: input,
|
||||||
|
type: selectedVlmFieldType as VLMFieldType,
|
||||||
|
template: customVlmPrompt
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
newFields.push({
|
||||||
|
name: input,
|
||||||
|
type: selectedVlmFieldType as VLMFieldType
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
setFields({ ...fields, vlm: newFields });
|
setFields({ ...fields, vlm: newFields });
|
||||||
@@ -218,41 +243,55 @@ export function ExtractionSettings({
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 获取VLM字段信息
|
// 获取VLM字段信息
|
||||||
const getFieldInfo = (fieldString: string) => {
|
const getFieldInfo = (field: string | { name: string, type: string, template?: string }) => {
|
||||||
const parts = fieldString.split('_');
|
let fieldName, fieldType, typeName, badgeClass;
|
||||||
const fieldName = parts[0];
|
|
||||||
const fieldType = parts.length > 1 ? parts[1] : 'default';
|
if (typeof field === 'string') {
|
||||||
|
const parts = field.split('_');
|
||||||
|
fieldName = parts[0];
|
||||||
|
fieldType = parts.length > 1 ? parts[1] : 'default';
|
||||||
|
} else {
|
||||||
|
fieldName = field.name;
|
||||||
|
fieldType = field.type;
|
||||||
|
}
|
||||||
|
|
||||||
let typeName, badgeClass;
|
|
||||||
switch (fieldType) {
|
switch (fieldType) {
|
||||||
case 'currency':
|
case 'vlm_default_prompt':
|
||||||
|
typeName = '默认';
|
||||||
|
badgeClass = 'bg-gray-100 text-gray-800';
|
||||||
|
break;
|
||||||
|
case 'vlm_currency_prompt':
|
||||||
typeName = '货币';
|
typeName = '货币';
|
||||||
badgeClass = 'bg-green-100 text-green-800';
|
badgeClass = 'bg-green-100 text-green-800';
|
||||||
break;
|
break;
|
||||||
case 'print':
|
case 'vlm_print_prompt':
|
||||||
typeName = '打印';
|
typeName = '打印';
|
||||||
badgeClass = 'bg-blue-100 text-blue-800';
|
badgeClass = 'bg-blue-100 text-blue-800';
|
||||||
break;
|
break;
|
||||||
case 'seal':
|
case 'vlm_seal_prompt':
|
||||||
typeName = '印章';
|
typeName = '印章';
|
||||||
badgeClass = 'bg-red-100 text-red-800';
|
badgeClass = 'bg-red-100 text-red-800';
|
||||||
break;
|
break;
|
||||||
case 'cross-seal':
|
case 'vlm_acrossPageSeal_prompt':
|
||||||
typeName = '骑缝章';
|
typeName = '骑缝章';
|
||||||
badgeClass = 'bg-orange-100 text-orange-800';
|
badgeClass = 'bg-orange-100 text-orange-800';
|
||||||
break;
|
break;
|
||||||
case 'english':
|
case 'vlm_english_prompt':
|
||||||
typeName = '英文';
|
typeName = '英文';
|
||||||
badgeClass = 'bg-purple-100 text-purple-800';
|
badgeClass = 'bg-purple-100 text-purple-800';
|
||||||
break;
|
break;
|
||||||
case 'number':
|
case 'vlm_number_prompt':
|
||||||
typeName = '数字';
|
typeName = '数字';
|
||||||
badgeClass = 'bg-yellow-100 text-yellow-800';
|
badgeClass = 'bg-yellow-100 text-yellow-800';
|
||||||
break;
|
break;
|
||||||
case 'handwriting':
|
case 'vlm_handwriting_prompt':
|
||||||
typeName = '手写';
|
typeName = '手写';
|
||||||
badgeClass = 'bg-pink-100 text-pink-800';
|
badgeClass = 'bg-pink-100 text-pink-800';
|
||||||
break;
|
break;
|
||||||
|
case 'custom':
|
||||||
|
typeName = '自定义';
|
||||||
|
badgeClass = 'bg-indigo-100 text-indigo-800';
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
typeName = '默认';
|
typeName = '默认';
|
||||||
badgeClass = 'bg-gray-100 text-gray-800';
|
badgeClass = 'bg-gray-100 text-gray-800';
|
||||||
@@ -270,7 +309,12 @@ export function ExtractionSettings({
|
|||||||
value={value}
|
value={value}
|
||||||
onChange={(e) => handlePromptTypeChange(e, type)}
|
onChange={(e) => handlePromptTypeChange(e, type)}
|
||||||
>
|
>
|
||||||
{EVALUATION_OPTIONS.promptTypeOptions.map((option) => (
|
{type === 'llm' && EVALUATION_OPTIONS.llmPromptTypeOptions.map((option) => (
|
||||||
|
<option key={`${type}-${option.value}`} value={option.value}>
|
||||||
|
{option.label}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
{type === 'vlm' && EVALUATION_OPTIONS.vlmPromptTypeOptions.map((option) => (
|
||||||
<option key={`${type}-${option.value}`} value={option.value}>
|
<option key={`${type}-${option.value}`} value={option.value}>
|
||||||
{option.label}
|
{option.label}
|
||||||
</option>
|
</option>
|
||||||
@@ -437,6 +481,17 @@ export function ExtractionSettings({
|
|||||||
// 过滤掉没有字段名的正则字段
|
// 过滤掉没有字段名的正则字段
|
||||||
const validRegexFields = regexFields.filter(field => field.field.trim() !== '');
|
const validRegexFields = regexFields.filter(field => field.field.trim() !== '');
|
||||||
|
|
||||||
|
// 更新所有自定义类型字段的 template
|
||||||
|
const updatedVlmFields = fields.vlm.map(field => {
|
||||||
|
if (typeof field === 'object' && field.type === 'custom') {
|
||||||
|
return {
|
||||||
|
...field,
|
||||||
|
template: customVlmPrompt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return field;
|
||||||
|
});
|
||||||
|
|
||||||
// 收集所有字段数据
|
// 收集所有字段数据
|
||||||
const updatedFormData = {
|
const updatedFormData = {
|
||||||
...formData,
|
...formData,
|
||||||
@@ -444,14 +499,14 @@ export function ExtractionSettings({
|
|||||||
llm: {
|
llm: {
|
||||||
fields: fields.llm,
|
fields: fields.llm,
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: promptType.llm,
|
type: promptType.llm || 'llm_default_prompt',
|
||||||
template: promptType.llm === 'custom' ? promptContent.llm : ''
|
template: promptType.llm === 'custom' ? promptContent.llm : ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
vlm: {
|
vlm: {
|
||||||
fields: fields.vlm,
|
fields: updatedVlmFields,
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: promptType.vlm,
|
type: promptType.vlm || 'vlm_default_prompt',
|
||||||
template: promptType.vlm === 'custom' ? promptContent.vlm : ''
|
template: promptType.vlm === 'custom' ? promptContent.vlm : ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -620,7 +675,7 @@ export function ExtractionSettings({
|
|||||||
className="bg-gray-50 p-2 rounded text-xs text-gray-600 mb-2"
|
className="bg-gray-50 p-2 rounded text-xs text-gray-600 mb-2"
|
||||||
id="llm-system-prompt-info"
|
id="llm-system-prompt-info"
|
||||||
style={{
|
style={{
|
||||||
display: promptType.llm === "system" ? "block" : "none",
|
display: promptType.llm === "llm_default_prompt" ? "block" : "none",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
系统将根据评查点类型和抽取目标自动生成适合的提示词,您无需额外配置。
|
系统将根据评查点类型和抽取目标自动生成适合的提示词,您无需额外配置。
|
||||||
@@ -745,12 +800,7 @@ export function ExtractionSettings({
|
|||||||
</div>
|
</div>
|
||||||
<div className="chips-container" id="fields-container-vlm">
|
<div className="chips-container" id="fields-container-vlm">
|
||||||
{fields.vlm.map((field, index) => {
|
{fields.vlm.map((field, index) => {
|
||||||
const { fieldName, fieldType, typeName, badgeClass } =
|
const { fieldName, fieldType, typeName, badgeClass } = getFieldInfo(field);
|
||||||
getFieldInfo(
|
|
||||||
typeof field === "string"
|
|
||||||
? field
|
|
||||||
: `${field.name}_${field.type}`
|
|
||||||
);
|
|
||||||
return (
|
return (
|
||||||
<div className="chip" key={`vlm-field-${index}`}>
|
<div className="chip" key={`vlm-field-${index}`}>
|
||||||
{fieldName}
|
{fieldName}
|
||||||
@@ -781,115 +831,98 @@ export function ExtractionSettings({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 gap-3 mt-3">
|
{/* 只有当选择了自定义类型时才显示提示词设置 */}
|
||||||
<div className="col-span-1">
|
{selectedVlmFieldType === 'custom' && (
|
||||||
<label
|
<div className="grid grid-cols-1 gap-3 mt-3">
|
||||||
className="form-label mb-1"
|
<div className="col-span-1">
|
||||||
htmlFor="multimodal-prompt-settings"
|
<label
|
||||||
>
|
className="form-label mb-1"
|
||||||
提示词设置
|
htmlFor="multimodal-prompt-settings"
|
||||||
</label>
|
>
|
||||||
<div
|
提示词设置
|
||||||
className="flex items-center mb-2"
|
</label>
|
||||||
id="multimodal-prompt-settings"
|
<div className="border border-dashed border-gray-300 p-3 rounded-md">
|
||||||
>
|
<div className="mb-2">
|
||||||
{renderPromptTypeSelect(promptType.vlm, "vlm")}
|
<label
|
||||||
</div>
|
className="form-label mb-1 text-sm"
|
||||||
<div
|
htmlFor="multimodal-prompt-type"
|
||||||
className="bg-gray-50 p-2 rounded text-xs text-gray-600 mb-2"
|
>
|
||||||
id="multimodal-system-prompt-info"
|
提示词类型
|
||||||
style={{
|
</label>
|
||||||
display: promptType.vlm === "system" ? "block" : "none",
|
<input
|
||||||
}}
|
type="text"
|
||||||
>
|
className="form-input bg-gray-50"
|
||||||
系统将根据评查点类型和抽取目标自动生成适合的提示词,支持图表、印章等图像内容抽取。
|
id="multimodal-prompt-type"
|
||||||
</div>
|
value="使用自定义提示词"
|
||||||
|
readOnly
|
||||||
<div
|
/>
|
||||||
id="multimodal-custom-prompt-container"
|
</div>
|
||||||
style={{
|
<div className="mb-2">
|
||||||
display: promptType.vlm === "custom" ? "block" : "none",
|
<label
|
||||||
}}
|
className="form-label mb-1 text-sm"
|
||||||
className="border border-dashed border-gray-300 p-3 rounded-md"
|
htmlFor="custom-vlm-prompt-content"
|
||||||
>
|
>
|
||||||
<div className="mb-2">
|
提示词内容
|
||||||
<label
|
</label>
|
||||||
className="form-label mb-1 text-sm"
|
<textarea
|
||||||
htmlFor="multimodal-prompt-template"
|
className="form-textarea"
|
||||||
>
|
id="custom-vlm-prompt-content"
|
||||||
选择提示词模板
|
rows={4}
|
||||||
</label>
|
placeholder="请输入自定义提示词..."
|
||||||
<select
|
value={customVlmPrompt}
|
||||||
className="form-select"
|
onChange={(e) => {
|
||||||
id="multimodal-prompt-template"
|
setCustomVlmPrompt(e.target.value);
|
||||||
value={selectedTemplate.vlm}
|
setHasPendingChanges(true);
|
||||||
onChange={(e) => handleTemplateChange(e, "vlm")}
|
}}
|
||||||
>
|
></textarea>
|
||||||
<option value="">请选择模板</option>
|
<div className="form-tip mt-1 bg-gray-50 p-2 rounded text-xs">
|
||||||
<option value="7">多模态-印章识别模板</option>
|
<p className="mb-1">
|
||||||
<option value="8">多模态-表格抽取模板</option>
|
<strong>支持的变量</strong>
|
||||||
<option value="9">多模态-手写内容识别模板</option>
|
(点击变量将其添加到提示词中):
|
||||||
</select>
|
</p>
|
||||||
</div>
|
<div className="flex flex-wrap gap-1">
|
||||||
<div className="mb-2">
|
{[
|
||||||
<label
|
"docType",
|
||||||
className="form-label mb-1 text-sm"
|
"fieldsList",
|
||||||
htmlFor="multimodal-prompt-content"
|
"companyName",
|
||||||
>
|
"documentId",
|
||||||
提示词内容
|
"date",
|
||||||
</label>
|
"industry",
|
||||||
<textarea
|
"contentType",
|
||||||
className="form-textarea"
|
"pageRange",
|
||||||
id="multimodal-prompt-content"
|
"colorMode",
|
||||||
rows={4}
|
"ocrText",
|
||||||
placeholder="选择模板后自动填充,您也可以进行修改..."
|
].map((variable) => (
|
||||||
value={promptContent.vlm}
|
<button
|
||||||
onChange={(e) => handlePromptContentChange(e, "vlm")}
|
key={variable}
|
||||||
readOnly={!selectedTemplate.vlm}
|
type="button"
|
||||||
></textarea>
|
className="var-tag"
|
||||||
<div className="form-tip mt-1 bg-gray-50 p-2 rounded text-xs">
|
onClick={() => {
|
||||||
<p className="mb-1">
|
const variableText = `\${${variable}}`;
|
||||||
<strong>支持的变量</strong>
|
setCustomVlmPrompt(customVlmPrompt + variableText);
|
||||||
(点击变量将其添加到提示词中):
|
setHasPendingChanges(true);
|
||||||
</p>
|
}}
|
||||||
<div className="flex flex-wrap gap-1">
|
>
|
||||||
{[
|
{variable=='docType' ? '文档类型:{docType}':
|
||||||
"docType",
|
variable=='fieldsList' ? '抽取字段列表:{fieldsList}':
|
||||||
"fieldsList",
|
variable=='companyName' ? '公司名称:{companyName}':
|
||||||
"companyName",
|
variable=='documentId' ? '文档编号:{documentId}':
|
||||||
"documentId",
|
variable=='date' ? '日期:{date}':
|
||||||
"date",
|
variable=='industry' ? '行业:{industry}':
|
||||||
"industry",
|
variable=='contentType' ? '内容类型:{contentType}':
|
||||||
"contentType",
|
variable=='pageRange' ? '页面范围:{pageRange}':
|
||||||
"pageRange",
|
variable=='colorMode' ? '色彩模式:{colorMode}':
|
||||||
"colorMode",
|
variable=='ocrText' ? 'OCR文本:{ocrText}':
|
||||||
"ocrText",
|
variable}
|
||||||
].map((variable) => (
|
</button>
|
||||||
<button
|
))}
|
||||||
key={variable}
|
</div>
|
||||||
type="button"
|
|
||||||
className="var-tag"
|
|
||||||
onClick={() => applyVariableToPrompt(variable, "vlm")}
|
|
||||||
>
|
|
||||||
{variable=='docType' ? '文档类型:{docType}':
|
|
||||||
variable=='fieldsList' ? '抽取字段列表:{fieldsList}':
|
|
||||||
variable=='companyName' ? '公司名称:{companyName}':
|
|
||||||
variable=='documentId' ? '文档编号:{documentId}':
|
|
||||||
variable=='date' ? '日期:{date}':
|
|
||||||
variable=='industry' ? '行业:{industry}':
|
|
||||||
variable=='contentType' ? '内容类型:{contentType}':
|
|
||||||
variable=='pageRange' ? '页面范围:{pageRange}':
|
|
||||||
variable=='colorMode' ? '色彩模式:{colorMode}':
|
|
||||||
variable=='ocrText' ? 'OCR文本:{ocrText}':
|
|
||||||
variable}
|
|
||||||
</button>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -47,14 +47,15 @@ type PostActionType = 'none' | 'manual' | 'replace';
|
|||||||
interface ExtactionConfigType {
|
interface ExtactionConfigType {
|
||||||
llm: {
|
llm: {
|
||||||
fields: string[];
|
fields: string[];
|
||||||
prompt_setting: PromptSetting;
|
prompt_setting: LLMPromptSetting;
|
||||||
};
|
};
|
||||||
vlm: {
|
vlm: {
|
||||||
fields: Array<{
|
fields: Array<{
|
||||||
name: string;
|
name: string;
|
||||||
type: VLMFieldType; // 多模态字段类型 默认、货币、打印、印章、骑缝章、英文、数字、手写
|
type: VLMFieldType; // 多模态字段类型 默认、货币、打印、印章、骑缝章、英文、数字、手写、自定义
|
||||||
|
template?: string; // 自定义类型的提示词模板(仅当 type 为 custom 时使用)
|
||||||
}>;
|
}>;
|
||||||
prompt_setting: PromptSetting;
|
prompt_setting: VLMPromptSetting;
|
||||||
};
|
};
|
||||||
regex: {
|
regex: {
|
||||||
fields: Array<{
|
fields: Array<{
|
||||||
@@ -67,20 +68,33 @@ interface ExtactionConfigType {
|
|||||||
/**
|
/**
|
||||||
* VLM字段类型定义
|
* VLM字段类型定义
|
||||||
*/
|
*/
|
||||||
type VLMFieldType = 'default' | 'currency' | 'print' | 'seal' | 'cross-seal' | 'english' | 'number' | 'handwriting';
|
type VLMFieldType = 'vlm_default_prompt' | 'vlm_currency_prompt' | 'vlm_print_prompt' | 'vlm_seal_prompt' | 'vlm_acrossPageSeal_prompt' | 'vlm_english_prompt' | 'vlm_number_prompt' | 'vlm_handwriting_prompt' | 'custom';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提示配置类型定义
|
* llm提示配置类型定义
|
||||||
*/
|
*/
|
||||||
interface PromptSetting {
|
interface LLMPromptSetting {
|
||||||
type: PromptType; // "system" or "custom" 如果为 "custom" 则为自定义提示
|
type: LLMPromptType; // "llm_default_prompt" or "custom" 如果为 "custom" 则为自定义提示
|
||||||
template: string; // 提示模板
|
template: string; // 提示模板
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提示类型定义
|
* vlm提示配置类型定义
|
||||||
*/
|
*/
|
||||||
type PromptType = 'system' | 'custom';
|
interface VLMPromptSetting {
|
||||||
|
type: VLMPromptType; // "vlm_default_prompt" or "custom" 如果为 "custom" 则为自定义提示
|
||||||
|
template: string; // 提示模板
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* llm提示类型定义
|
||||||
|
*/
|
||||||
|
type LLMPromptType = 'llm_default_prompt' | 'custom';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* llm提示类型定义
|
||||||
|
*/
|
||||||
|
type VLMPromptType = 'vlm_default_prompt' | 'custom';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 评查配置类型定义
|
* 评查配置类型定义
|
||||||
@@ -200,19 +214,26 @@ export const EVALUATION_OPTIONS = {
|
|||||||
|
|
||||||
// VLM字段类型选项
|
// VLM字段类型选项
|
||||||
vlmFieldTypeOptions: [
|
vlmFieldTypeOptions: [
|
||||||
{ value: 'default', label: '默认' },
|
{ value: 'vlm_default_prompt', label: '默认' },
|
||||||
{ value: 'currency', label: '货币' },
|
{ value: 'vlm_currency_prompt', label: '货币' },
|
||||||
{ value: 'print', label: '打印' },
|
{ value: 'vlm_print_prompt', label: '打印' },
|
||||||
{ value: 'seal', label: '印章' },
|
{ value: 'vlm_seal_prompt', label: '印章' },
|
||||||
{ value: 'cross-seal', label: '骑缝章' },
|
{ value: 'vlm_acrossPageSeal_prompt', label: '骑缝章' },
|
||||||
{ value: 'english', label: '英文' },
|
{ value: 'vlm_english_prompt', label: '英文' },
|
||||||
{ value: 'number', label: '数字' },
|
{ value: 'vlm_number_prompt', label: '数字' },
|
||||||
{ value: 'handwriting', label: '手写' }
|
{ value: 'vlm_handwriting_prompt', label: '手写' },
|
||||||
|
{ value: 'custom', label: '自定义' }
|
||||||
],
|
],
|
||||||
|
|
||||||
// 提示类型选项
|
// vlm提示词类型选项
|
||||||
promptTypeOptions: [
|
vlmPromptTypeOptions: [
|
||||||
{ value: 'system', label: '使用系统默认提示词' },
|
{ value: 'vlm_default_prompt', label: '使用系统默认提示词' },
|
||||||
|
{ value: 'custom', label: '使用自定义提示词' }
|
||||||
|
],
|
||||||
|
|
||||||
|
// llm提示词类型选项
|
||||||
|
llmPromptTypeOptions: [
|
||||||
|
{ value: 'llm_default_prompt', label: '使用系统默认提示词' },
|
||||||
{ value: 'custom', label: '使用自定义提示词' }
|
{ value: 'custom', label: '使用自定义提示词' }
|
||||||
],
|
],
|
||||||
|
|
||||||
@@ -291,9 +312,10 @@ export type {
|
|||||||
SuggestionMessageType,
|
SuggestionMessageType,
|
||||||
PostActionType,
|
PostActionType,
|
||||||
ExtactionConfigType,
|
ExtactionConfigType,
|
||||||
|
VLMPromptSetting,
|
||||||
VLMFieldType,
|
VLMFieldType,
|
||||||
PromptSetting,
|
LLMPromptSetting,
|
||||||
PromptType,
|
LLMPromptType,
|
||||||
EvaluationConfigType,
|
EvaluationConfigType,
|
||||||
LogicType,
|
LogicType,
|
||||||
Rule,
|
Rule,
|
||||||
|
|||||||
+164
-6
@@ -217,14 +217,14 @@ export default function RuleNew() {
|
|||||||
llm: {
|
llm: {
|
||||||
fields: [],
|
fields: [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: 'system',
|
type: 'llm_default_prompt',
|
||||||
template: ''
|
template: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
vlm: {
|
vlm: {
|
||||||
fields: [],
|
fields: [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: 'system',
|
type: 'vlm_default_prompt',
|
||||||
template: ''
|
template: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -358,17 +358,172 @@ export default function RuleNew() {
|
|||||||
const handleSave = async () => {
|
const handleSave = async () => {
|
||||||
// console.log("保存评查点", formData);
|
// console.log("保存评查点", formData);
|
||||||
|
|
||||||
// 验证必填字段
|
// ========== 验证必填字段 ==========
|
||||||
|
|
||||||
|
// 1. 验证评查点名称
|
||||||
if (!formData.name?.trim()) {
|
if (!formData.name?.trim()) {
|
||||||
toastService.warning("评查点名称不能为空");
|
toastService.warning("评查点名称不能为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (formData.name.trim().length > 30) {
|
||||||
|
toastService.warning("评查点名称不能超过30个字符");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 验证评查点编码
|
||||||
if (!formData.code?.trim()) {
|
if (!formData.code?.trim()) {
|
||||||
toastService.warning("评查点编码不能为空");
|
toastService.warning("评查点编码不能为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. 验证风险等级
|
||||||
|
if (!formData.risk) {
|
||||||
|
toastService.warning("请选择风险等级");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 验证评查点类型(父级类型组)
|
||||||
|
if (!formData.evaluation_point_groups_pid) {
|
||||||
|
toastService.warning("请选择评查点类型");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 验证所属规则组
|
||||||
|
if (!formData.evaluation_point_groups_id) {
|
||||||
|
toastService.warning("请选择所属规则组");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 6. 验证评查设置中的规则
|
||||||
|
if (formData.evaluation_config?.rules && Array.isArray(formData.evaluation_config.rules)) {
|
||||||
|
const rules = formData.evaluation_config.rules;
|
||||||
|
|
||||||
|
if (rules.length <=0){
|
||||||
|
toastService.warning('评查设置中尚未添加或完善规则')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查每个规则是否选择了评查类型
|
||||||
|
for (let i = 0; i < rules.length; i++) {
|
||||||
|
const rule = rules[i];
|
||||||
|
|
||||||
|
console.log("log",rule)
|
||||||
|
|
||||||
|
if (!rule.type) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1} 未选择评查类型`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据不同规则类型验证配置
|
||||||
|
if (!rule.config) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1} 配置不完整`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证各类型规则的必填字段
|
||||||
|
switch (rule.type) {
|
||||||
|
case 'exists':
|
||||||
|
if (!rule.config.fields || rule.config.fields.length === 0) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(有无判断):请至少选择一个字段`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.logic) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(有无判断):请选择逻辑关系`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'consistency':
|
||||||
|
if (!rule.config.pairs || rule.config.pairs.length === 0) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(一致性判断):请至少添加一对比较字段`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 检查每对字段是否完整
|
||||||
|
for (let j = 0; j < rule.config.pairs.length; j++) {
|
||||||
|
const pair = rule.config.pairs[j];
|
||||||
|
if (!pair.sourceField || !pair.targetField || !pair.compareMethod) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(一致性判断):第 ${j + 1} 对比较字段配置不完整`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'format':
|
||||||
|
if (!rule.config.field) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(格式判断):请选择检查字段`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.formatType) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(格式判断):请选择格式类型`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'logic':
|
||||||
|
if (!rule.config.conditions || rule.config.conditions.length === 0) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(逻辑判断):请至少添加一个条件`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 检查每个条件是否完整
|
||||||
|
for (let j = 0; j < rule.config.conditions.length; j++) {
|
||||||
|
const condition = rule.config.conditions[j];
|
||||||
|
if (!condition.field || !condition.operator || condition.value === undefined || condition.value === '') {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(逻辑判断):第 ${j + 1} 个条件配置不完整`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'regex':
|
||||||
|
if (!rule.config.field) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(正则表达式):请选择检查字段`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.pattern) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(正则表达式):请输入正则表达式`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.matchType) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(正则表达式):请选择匹配类型`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'ai':
|
||||||
|
if (!rule.config.model) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(大模型判断):请选择模型`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.prompt) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(大模型判断):请输入提示词`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'code':
|
||||||
|
if (!rule.config.language) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(自定义代码):请选择编程语言`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rule.config.code) {
|
||||||
|
toastService.warning(`评查设置中的规则 ${i + 1}(自定义代码):请输入代码`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 验证组合逻辑
|
||||||
|
if (formData.evaluation_config?.logicType === 'custom') {
|
||||||
|
if (!formData.evaluation_config.customLogic?.trim()) {
|
||||||
|
toastService.warning("请输入自定义组合逻辑");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 显示保存中状态
|
// 显示保存中状态
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
|
|
||||||
@@ -389,7 +544,7 @@ export default function RuleNew() {
|
|||||||
fields: Array.isArray(formData.extraction_config?.llm?.fields) ?
|
fields: Array.isArray(formData.extraction_config?.llm?.fields) ?
|
||||||
[...formData.extraction_config.llm.fields] : [],
|
[...formData.extraction_config.llm.fields] : [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: formData.extraction_config?.llm?.prompt_setting?.type || 'system',
|
type: formData.extraction_config?.llm?.prompt_setting?.type || 'llm_default_prompt',
|
||||||
template: formData.extraction_config?.llm?.prompt_setting?.template || ''
|
template: formData.extraction_config?.llm?.prompt_setting?.template || ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -397,7 +552,7 @@ export default function RuleNew() {
|
|||||||
fields: Array.isArray(formData.extraction_config?.vlm?.fields) ?
|
fields: Array.isArray(formData.extraction_config?.vlm?.fields) ?
|
||||||
[...formData.extraction_config.vlm.fields] : [],
|
[...formData.extraction_config.vlm.fields] : [],
|
||||||
prompt_setting: {
|
prompt_setting: {
|
||||||
type: formData.extraction_config?.vlm?.prompt_setting?.type || 'system',
|
type: formData.extraction_config?.vlm?.prompt_setting?.type || 'vlm_default_prompt',
|
||||||
template: formData.extraction_config?.vlm?.prompt_setting?.template || ''
|
template: formData.extraction_config?.vlm?.prompt_setting?.template || ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -546,7 +701,10 @@ export default function RuleNew() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// console.log("当前表单数据-----------------:", formData);
|
||||||
// console.log("当前评查配置-----------------:", formData.evaluation_config);
|
// console.log("当前评查配置-----------------:", formData.evaluation_config);
|
||||||
|
// return;
|
||||||
|
|
||||||
// 如果是新建模式,则删除id字段
|
// 如果是新建模式,则删除id字段
|
||||||
if (!isEditMode) {
|
if (!isEditMode) {
|
||||||
@@ -799,7 +957,7 @@ export default function RuleNew() {
|
|||||||
<ExtractionSettings
|
<ExtractionSettings
|
||||||
onChange={handleExtractionSettingsChange}
|
onChange={handleExtractionSettingsChange}
|
||||||
initialData={formData}
|
initialData={formData}
|
||||||
promptTypeOptions={EVALUATION_OPTIONS.promptTypeOptions}
|
promptTypeOptions={EVALUATION_OPTIONS.llmPromptTypeOptions}
|
||||||
vlmFieldTypeOptions={EVALUATION_OPTIONS.vlmFieldTypeOptions}
|
vlmFieldTypeOptions={EVALUATION_OPTIONS.vlmFieldTypeOptions}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user