Commit 48cccb9b authored by David Yang's avatar David Yang

fix(audit): slim persisted audit results to stop carrying full knowledge base

- drop unused allScoredRecords/groups from audit results
- add slimAuditRecord/toPersistedAuditResult to strip derived fields
  (mdContent/searchText) before attaching results to messages
- sanitize legacy messages when loading conversations so stored
  oversized results are replaced on next save
parent c1ec05a3
......@@ -329,15 +329,6 @@ export function buildAuditResultFromAnalysis(
);
}
const selectedIdsAfterRules = new Set(selected.map(getAuditRecordKey));
const analyzedRecords = records.map((record) => ({
...record,
aiSelected: selectedIds.has(getAuditRecordKey(record)),
aiExcluded: !selectedIdsAfterRules.has(getAuditRecordKey(record)),
skillExcluded:
selectedIds.has(getAuditRecordKey(record)) &&
!selectedIdsAfterRules.has(getAuditRecordKey(record)),
aiRationale: rationale.get(getAuditRecordKey(record)) || '',
}));
return {
version: 2,
kind: classifyAuditIntent(isRefine ? baseQuery : query),
......@@ -352,11 +343,9 @@ export function buildAuditResultFromAnalysis(
),
threshold: instruction.threshold,
totalCount: records.length,
scoredCount: analyzedRecords.length,
scoredCount: records.length,
matchedCount: selected.length,
records: selected,
allScoredRecords: analyzedRecords,
groups: groupAuditRecords(selected),
generatedAt: new Date().toISOString(),
selectedRiskPointIds: Array.from(selectedIdsAfterRules),
reportStyle: skillContext.styles,
......@@ -932,13 +921,53 @@ export function buildAuditResult(
scoredCount: allScored.length,
matchedCount: selected.length,
records: selected,
allScoredRecords: allScored,
groups: groupAuditRecords(selected),
generatedAt: new Date().toISOString(),
reportStyle: skillContext.styles,
};
}
// 审计结果会挂在消息上随会话记录反复持久化,只保留展示、导出和再调整所需字段;
// 不携带全量知识库(allScoredRecords/groups)和 mdContent/searchText 等派生大字段。
const PERSISTED_AUDIT_RECORD_FIELDS = [
'id',
'riskPointCode',
'sheetName',
'sourceRow',
'sourceFileName',
'sourceBatch',
'businessSegment',
'level1Project',
'level2Project',
'riskDescription',
'regulationBasis',
'riskSource',
'riskLevel',
'remark',
'matchScore',
'matchLevel',
'matchReasons',
'aiRationale',
];
export function slimAuditRecord(record) {
if (!record) return record;
const slim = {};
PERSISTED_AUDIT_RECORD_FIELDS.forEach((key) => {
const value = record[key];
if (value !== undefined && value !== '') slim[key] = value;
});
return slim;
}
export function toPersistedAuditResult(result) {
if (!result) return result;
const persisted = { ...result };
delete persisted.allScoredRecords;
delete persisted.groups;
persisted.records = (persisted.records || []).map(slimAuditRecord);
return persisted;
}
export function findPreviousAuditResult(messages = []) {
for (let index = messages.length - 1; index >= 0; index -= 1) {
if (messages[index]?.auditResult) return messages[index].auditResult;
......
......@@ -42,6 +42,8 @@ import {
isAuditRefineRequest,
isPersistentAuditRuleRequest,
recordMatchesTerms,
slimAuditRecord,
toPersistedAuditResult,
} from '../../features/audit/engine';
import { parseAuditExcelFromRemote } from '../../features/audit/excel';
import {
......@@ -266,6 +268,22 @@ async function readLlmText(response) {
return content;
}
// 旧会话可能保存过未瘦身的大体积审计结果,加载时统一裁剪,
// 避免后续每次保存会话都继续携带全量知识库副本。
function sanitizePersistedMessage(message) {
if (!message?.auditResult && !message?.auditExport) return message;
return {
...message,
auditResult: toPersistedAuditResult(message.auditResult),
auditExport: message.auditExport
? {
...message.auditExport,
records: (message.auditExport.records || []).map(slimAuditRecord),
}
: message.auditExport,
};
}
async function expandAuditQuery(query, model, signal) {
const response = await llmChat(
{
......@@ -1273,7 +1291,7 @@ export default forwardRef((props, ref) => {
styleAdjusted: true,
generatedAt: new Date().toISOString(),
};
pendingAuditResultRef.current = styledResult;
pendingAuditResultRef.current = toPersistedAuditResult(styledResult);
auditKnowledgePrompt = buildAuditStylePrompt(
styleRequest.changes,
persisted,
......@@ -1365,8 +1383,8 @@ export default forwardRef((props, ref) => {
console.warn('审计 Skill 业务过滤规则保存失败:', error);
}
}
pendingAuditResultRef.current = result;
auditKnowledgePrompt = buildAuditKnowledgePrompt(result);
pendingAuditResultRef.current = toPersistedAuditResult(result);
} else {
let result = null;
try {
......@@ -1406,7 +1424,7 @@ export default forwardRef((props, ref) => {
pendingAuditExportRef.current = {
question: message.content,
title: '审计知识库问答',
records: result.records || [],
records: (result.records || []).map(slimAuditRecord),
};
auditKnowledgePrompt = buildGroundedAuditKnowledgePrompt(
result.records || [],
......@@ -1701,7 +1719,7 @@ export default forwardRef((props, ref) => {
setMessages(
messages.map((message) => ({
status: 'success',
message: message,
message: sanitizePersistedMessage(message),
})),
);
}, [conversation]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment