fix: degrade elder analysis when knowledge retrieval fails
This commit is contained in:
@@ -208,20 +208,23 @@ export async function generateElderAiAnalysis(
|
|||||||
: { success: true as const, data: { results: [] } };
|
: { success: true as const, data: { results: [] } };
|
||||||
|
|
||||||
if (!knowledgeResults.success) {
|
if (!knowledgeResults.success) {
|
||||||
await saveFailedAnalysis({
|
await recordAuditLog({
|
||||||
context,
|
actor: context.account,
|
||||||
organizationId: residentContext.context.organizationId,
|
organizationId: residentContext.context.organizationId,
|
||||||
elderId,
|
action: "ai.knowledge.retrieve",
|
||||||
dataScopes: residentContext.context.dataScopes,
|
targetType: "elder",
|
||||||
category: "retrieval_failed",
|
targetId: elderId,
|
||||||
|
result: "failure",
|
||||||
|
reason: getBriefErrorReason("retrieval_failed"),
|
||||||
});
|
});
|
||||||
return { success: false, reason: knowledgeResults.reason, status: knowledgeResults.status };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const dataScopes = knowledgeResults.data.results.length > 0
|
const knowledgeItems = knowledgeResults.success ? knowledgeResults.data.results : [];
|
||||||
|
const knowledgeUnavailableReason = knowledgeResults.success ? "" : getBriefErrorReason("retrieval_failed");
|
||||||
|
const dataScopes = knowledgeItems.length > 0
|
||||||
? [...residentContext.context.dataScopes, "knowledge" as const]
|
? [...residentContext.context.dataScopes, "knowledge" as const]
|
||||||
: residentContext.context.dataScopes;
|
: residentContext.context.dataScopes;
|
||||||
const knowledgeCitations: AiCitation[] = knowledgeResults.data.results.map((item, index) => ({
|
const knowledgeCitations: AiCitation[] = knowledgeItems.map((item, index) => ({
|
||||||
id: `kb-${index + 1}`,
|
id: `kb-${index + 1}`,
|
||||||
sourceType: "knowledge",
|
sourceType: "knowledge",
|
||||||
sourceId: item.chunkId,
|
sourceId: item.chunkId,
|
||||||
@@ -238,10 +241,11 @@ export async function generateElderAiAnalysis(
|
|||||||
"输出 JSON 字段:overallRiskLevel(low|medium|high|critical|unknown), summary, keyFindings, recommendations, dataGaps, citations, confidence, modelSummary。",
|
"输出 JSON 字段:overallRiskLevel(low|medium|high|critical|unknown), summary, keyFindings, recommendations, dataGaps, citations, confidence, modelSummary。",
|
||||||
"keyFindings[] 字段:category, severity(info|warning|critical), evidence, citationIds。",
|
"keyFindings[] 字段:category, severity(info|warning|critical), evidence, citationIds。",
|
||||||
"recommendations[] 字段:title, priority(low|normal|high|urgent), rationale, suggestedNextStep, citationIds。",
|
"recommendations[] 字段:title, priority(low|normal|high|urgent), rationale, suggestedNextStep, citationIds。",
|
||||||
|
knowledgeUnavailableReason ? `知识库检索不可用:${knowledgeUnavailableReason}。请在 dataGaps 中包含“知识库检索不可用,分析未使用内部知识库”。` : "",
|
||||||
`modelSummary 固定为 {"provider":"openai-compatible","chatModel":"${runtimeConfig.config.chatModel}","embeddingModel":"${runtimeConfig.config.embeddingModel}"}。`,
|
`modelSummary 固定为 {"provider":"openai-compatible","chatModel":"${runtimeConfig.config.chatModel}","embeddingModel":"${runtimeConfig.config.embeddingModel}"}。`,
|
||||||
`可用 citations:${JSON.stringify(citations)}`,
|
`可用 citations:${JSON.stringify(citations)}`,
|
||||||
`住民上下文:\n${residentContext.context.promptContext}`,
|
`住民上下文:\n${residentContext.context.promptContext}`,
|
||||||
`知识库片段:\n${knowledgeResults.data.results.map((item, index) => `[kb-${index + 1}] ${item.title}\n${item.content}`).join("\n\n") || "无"}`,
|
`知识库片段:\n${knowledgeItems.map((item, index) => `[kb-${index + 1}] ${item.title}\n${item.content}`).join("\n\n") || "无"}`,
|
||||||
].join("\n\n");
|
].join("\n\n");
|
||||||
|
|
||||||
let rawOutput: unknown;
|
let rawOutput: unknown;
|
||||||
@@ -275,7 +279,15 @@ export async function generateElderAiAnalysis(
|
|||||||
return { success: false, reason: getBriefErrorReason("schema_validation_failed"), status: 502 };
|
return { success: false, reason: getBriefErrorReason("schema_validation_failed"), status: 502 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const normalizedOutput = normalizeCitations(output, citations);
|
const normalizedOutput = normalizeCitations(
|
||||||
|
knowledgeUnavailableReason
|
||||||
|
? {
|
||||||
|
...output,
|
||||||
|
dataGaps: [...output.dataGaps, "知识库检索不可用,分析未使用内部知识库"],
|
||||||
|
}
|
||||||
|
: output,
|
||||||
|
citations,
|
||||||
|
);
|
||||||
const database = getDatabase();
|
const database = getDatabase();
|
||||||
const rows = await database
|
const rows = await database
|
||||||
.insert(elderAiAnalyses)
|
.insert(elderAiAnalyses)
|
||||||
|
|||||||
Reference in New Issue
Block a user