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( ...@@ -329,15 +329,6 @@ export function buildAuditResultFromAnalysis(
); );
} }
const selectedIdsAfterRules = new Set(selected.map(getAuditRecordKey)); 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 { return {
version: 2, version: 2,
kind: classifyAuditIntent(isRefine ? baseQuery : query), kind: classifyAuditIntent(isRefine ? baseQuery : query),
...@@ -352,11 +343,9 @@ export function buildAuditResultFromAnalysis( ...@@ -352,11 +343,9 @@ export function buildAuditResultFromAnalysis(
), ),
threshold: instruction.threshold, threshold: instruction.threshold,
totalCount: records.length, totalCount: records.length,
scoredCount: analyzedRecords.length, scoredCount: records.length,
matchedCount: selected.length, matchedCount: selected.length,
records: selected, records: selected,
allScoredRecords: analyzedRecords,
groups: groupAuditRecords(selected),
generatedAt: new Date().toISOString(), generatedAt: new Date().toISOString(),
selectedRiskPointIds: Array.from(selectedIdsAfterRules), selectedRiskPointIds: Array.from(selectedIdsAfterRules),
reportStyle: skillContext.styles, reportStyle: skillContext.styles,
...@@ -932,13 +921,53 @@ export function buildAuditResult( ...@@ -932,13 +921,53 @@ export function buildAuditResult(
scoredCount: allScored.length, scoredCount: allScored.length,
matchedCount: selected.length, matchedCount: selected.length,
records: selected, records: selected,
allScoredRecords: allScored,
groups: groupAuditRecords(selected),
generatedAt: new Date().toISOString(), generatedAt: new Date().toISOString(),
reportStyle: skillContext.styles, 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 = []) { export function findPreviousAuditResult(messages = []) {
for (let index = messages.length - 1; index >= 0; index -= 1) { for (let index = messages.length - 1; index >= 0; index -= 1) {
if (messages[index]?.auditResult) return messages[index].auditResult; if (messages[index]?.auditResult) return messages[index].auditResult;
......
...@@ -42,6 +42,8 @@ import { ...@@ -42,6 +42,8 @@ import {
isAuditRefineRequest, isAuditRefineRequest,
isPersistentAuditRuleRequest, isPersistentAuditRuleRequest,
recordMatchesTerms, recordMatchesTerms,
slimAuditRecord,
toPersistedAuditResult,
} from '../../features/audit/engine'; } from '../../features/audit/engine';
import { parseAuditExcelFromRemote } from '../../features/audit/excel'; import { parseAuditExcelFromRemote } from '../../features/audit/excel';
import { import {
...@@ -266,6 +268,22 @@ async function readLlmText(response) { ...@@ -266,6 +268,22 @@ async function readLlmText(response) {
return content; 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) { async function expandAuditQuery(query, model, signal) {
const response = await llmChat( const response = await llmChat(
{ {
...@@ -1273,7 +1291,7 @@ export default forwardRef((props, ref) => { ...@@ -1273,7 +1291,7 @@ export default forwardRef((props, ref) => {
styleAdjusted: true, styleAdjusted: true,
generatedAt: new Date().toISOString(), generatedAt: new Date().toISOString(),
}; };
pendingAuditResultRef.current = styledResult; pendingAuditResultRef.current = toPersistedAuditResult(styledResult);
auditKnowledgePrompt = buildAuditStylePrompt( auditKnowledgePrompt = buildAuditStylePrompt(
styleRequest.changes, styleRequest.changes,
persisted, persisted,
...@@ -1365,8 +1383,8 @@ export default forwardRef((props, ref) => { ...@@ -1365,8 +1383,8 @@ export default forwardRef((props, ref) => {
console.warn('审计 Skill 业务过滤规则保存失败:', error); console.warn('审计 Skill 业务过滤规则保存失败:', error);
} }
} }
pendingAuditResultRef.current = result;
auditKnowledgePrompt = buildAuditKnowledgePrompt(result); auditKnowledgePrompt = buildAuditKnowledgePrompt(result);
pendingAuditResultRef.current = toPersistedAuditResult(result);
} else { } else {
let result = null; let result = null;
try { try {
...@@ -1406,7 +1424,7 @@ export default forwardRef((props, ref) => { ...@@ -1406,7 +1424,7 @@ export default forwardRef((props, ref) => {
pendingAuditExportRef.current = { pendingAuditExportRef.current = {
question: message.content, question: message.content,
title: '审计知识库问答', title: '审计知识库问答',
records: result.records || [], records: (result.records || []).map(slimAuditRecord),
}; };
auditKnowledgePrompt = buildGroundedAuditKnowledgePrompt( auditKnowledgePrompt = buildGroundedAuditKnowledgePrompt(
result.records || [], result.records || [],
...@@ -1701,7 +1719,7 @@ export default forwardRef((props, ref) => { ...@@ -1701,7 +1719,7 @@ export default forwardRef((props, ref) => {
setMessages( setMessages(
messages.map((message) => ({ messages.map((message) => ({
status: 'success', status: 'success',
message: message, message: sanitizePersistedMessage(message),
})), })),
); );
}, [conversation]); }, [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