Stage 3 Wave 1: lifecycle-слой встроен в pipeline
This commit is contained in:
+96
-7
@@ -282,6 +282,59 @@ function formatAffectedScope(unit) {
|
||||
}
|
||||
return scopeParts.join("; ");
|
||||
}
|
||||
function formatLifecycleScope(unit) {
|
||||
if (!unit.lifecycle_domain) {
|
||||
return null;
|
||||
}
|
||||
const parts = [`domain=${unit.lifecycle_domain}`];
|
||||
if (unit.current_lifecycle_state) {
|
||||
parts.push(`current=${unit.current_lifecycle_state}`);
|
||||
}
|
||||
if (unit.expected_lifecycle_state) {
|
||||
parts.push(`expected=${unit.expected_lifecycle_state}`);
|
||||
}
|
||||
if (unit.lifecycle_defect_type) {
|
||||
parts.push(`defect=${unit.lifecycle_defect_type}`);
|
||||
}
|
||||
if (unit.missing_transition) {
|
||||
parts.push(`missing_transition=${unit.missing_transition}`);
|
||||
}
|
||||
if (unit.invalid_transition) {
|
||||
parts.push(`invalid_transition=${unit.invalid_transition}`);
|
||||
}
|
||||
if (unit.stale_duration) {
|
||||
parts.push(`stale_duration=${unit.stale_duration}`);
|
||||
}
|
||||
return parts.join(", ");
|
||||
}
|
||||
function rankProblemUnitsForAnswer(units, lifecycleAnswerEnabled) {
|
||||
if (!lifecycleAnswerEnabled) {
|
||||
return units.slice().sort((left, right) => {
|
||||
const severityDiff = right.severity.score - left.severity.score;
|
||||
if (severityDiff !== 0)
|
||||
return severityDiff;
|
||||
return right.confidence.score - left.confidence.score;
|
||||
});
|
||||
}
|
||||
return units.slice().sort((left, right) => {
|
||||
const lifecycleRankDiff = (right.lifecycle_ranking_score ?? 0) - (left.lifecycle_ranking_score ?? 0);
|
||||
if (lifecycleRankDiff !== 0)
|
||||
return lifecycleRankDiff;
|
||||
const lifecycleConfidenceDiff = (right.lifecycle_confidence?.score ?? 0) - (left.lifecycle_confidence?.score ?? 0);
|
||||
if (lifecycleConfidenceDiff !== 0)
|
||||
return lifecycleConfidenceDiff;
|
||||
const severityDiff = right.severity.score - left.severity.score;
|
||||
if (severityDiff !== 0)
|
||||
return severityDiff;
|
||||
return right.confidence.score - left.confidence.score;
|
||||
});
|
||||
}
|
||||
function hasLifecycleResolution(units) {
|
||||
return units.some((unit) => Boolean(unit.lifecycle_domain) &&
|
||||
Boolean(unit.current_lifecycle_state) &&
|
||||
Boolean(unit.expected_lifecycle_state) &&
|
||||
Boolean(unit.lifecycle_defect_type));
|
||||
}
|
||||
function buildProblemCentricActions(input) {
|
||||
const actions = [];
|
||||
const unitTypes = new Set(input.units.map((item) => item.problem_unit_type));
|
||||
@@ -300,6 +353,17 @@ function buildProblemCentricActions(input) {
|
||||
if (unitTypes.has("lifecycle_anomaly_node")) {
|
||||
actions.push("Проверьте lifecycle объекта: ожидаемый этап не должен оставаться в partially_linked состоянии.");
|
||||
}
|
||||
for (const unit of input.units) {
|
||||
if (unit.lifecycle_defect_type === "stale_active_state") {
|
||||
actions.push("Проверьте, почему объект завис: ожидаемый переход не должен оставаться в активной стадии.");
|
||||
}
|
||||
if (unit.lifecycle_defect_type === "misclosed_state") {
|
||||
actions.push("Проверьте закрывающий документ и проводки: закрытие может быть формальным, но некорректным по пути.");
|
||||
}
|
||||
if (unit.lifecycle_defect_type === "cross_branch_state_conflict") {
|
||||
actions.push("Сверьте бухгалтерскую и смежную ветки (например, НДС/расчеты): обнаружен межконтурный конфликт состояния.");
|
||||
}
|
||||
}
|
||||
if (input.mode === "clarification_required") {
|
||||
if (input.missingAnchors.period) {
|
||||
actions.push("Уточните период проверки, чтобы зафиксировать границы проблемного контура.");
|
||||
@@ -657,6 +721,12 @@ function buildDirectAnswer(input) {
|
||||
return "Не удалось сформировать обоснованный ответ; нужно уточнение запроса.";
|
||||
}
|
||||
function buildProblemCentricAnswerSummary(input) {
|
||||
if (input.lifecycleEnriched && input.summary?.lifecycle_enriched_units && input.summary.lifecycle_enriched_units > 0) {
|
||||
if (input.mode === "clarification_required") {
|
||||
return "Выявлены lifecycle-дефекты, но для надежного вывода требуется уточнение предметных якорей.";
|
||||
}
|
||||
return `Сформирован lifecycle-aware problem срез: выделено ${input.summary.lifecycle_enriched_units} lifecycle-узлов с приоритетом по дефектам перехода.`;
|
||||
}
|
||||
if (input.mode === "clarification_required") {
|
||||
return "Выявлены проблемные кластеры, но для надежного вывода требуется предметное уточнение фокуса.";
|
||||
}
|
||||
@@ -673,10 +743,23 @@ function buildProblemCentricDirectAnswer(input) {
|
||||
? "Обнаружены проблемные зоны, но без уточнения якорей сильный factual-вывод преждевременен."
|
||||
: input.weakUnits
|
||||
? "Выделены проблемные зоны с ограниченной надежностью; вывод дан в ограниченном режиме."
|
||||
: "Выделены ключевые проблемные зоны и их влияние на учетный контур.";
|
||||
: input.lifecycleAnswerEnabled && hasLifecycleResolution(input.units)
|
||||
? "Выделены lifecycle-проблемы: определены текущие/ожидаемые стадии и тип нарушения перехода."
|
||||
: "Выделены ключевые проблемные зоны и их влияние на учетный контур.";
|
||||
const unitLines = input.units.map((unit) => {
|
||||
const scope = formatAffectedScope(unit);
|
||||
return `- ${unit.title}: ${unit.business_defect_class}; ${scope}; severity=${unit.severity.grade}, confidence=${unit.confidence.grade}.`;
|
||||
const lifecycleScope = input.lifecycleAnswerEnabled ? formatLifecycleScope(unit) : null;
|
||||
const lifecycleInterpretation = input.lifecycleAnswerEnabled ? unit.business_lifecycle_interpretation : null;
|
||||
const segments = [
|
||||
`${unit.title}: ${unit.business_defect_class}`,
|
||||
scope,
|
||||
lifecycleScope,
|
||||
lifecycleInterpretation,
|
||||
`severity=${unit.severity.grade}`,
|
||||
`confidence=${unit.confidence.grade}`,
|
||||
unit.lifecycle_confidence ? `lifecycle_confidence=${unit.lifecycle_confidence.grade}` : null
|
||||
].filter((item) => Boolean(item));
|
||||
return `- ${segments.join("; ")}.`;
|
||||
});
|
||||
if (unitLines.length === 0) {
|
||||
return `${lead}\nПроблемные кластеры не удалось детализировать в текущем срезе.`;
|
||||
@@ -685,6 +768,7 @@ function buildProblemCentricDirectAnswer(input) {
|
||||
}
|
||||
function buildProblemCentricAnswerStructure(input) {
|
||||
const weakUnits = input.selectedUnits.every((item) => item.confidence.grade === "low");
|
||||
const lifecycleEnriched = input.lifecycleAnswerEnabled && hasLifecycleResolution(input.selectedUnits);
|
||||
const unitMechanismNotes = uniqueStrings(input.selectedUnits
|
||||
.map((item) => item.mechanism_summary)
|
||||
.filter((item) => typeof item === "string" && item.trim().length > 0), 6);
|
||||
@@ -724,12 +808,14 @@ function buildProblemCentricAnswerStructure(input) {
|
||||
answer_summary: buildProblemCentricAnswerSummary({
|
||||
mode: input.mode,
|
||||
weakUnits,
|
||||
summary: input.problemSummary
|
||||
summary: input.problemSummary,
|
||||
lifecycleEnriched
|
||||
}),
|
||||
direct_answer: buildProblemCentricDirectAnswer({
|
||||
mode: input.mode,
|
||||
units: input.selectedUnits,
|
||||
weakUnits
|
||||
weakUnits,
|
||||
lifecycleAnswerEnabled: input.lifecycleAnswerEnabled
|
||||
}),
|
||||
mechanism_block: {
|
||||
status: mechanismStatus,
|
||||
@@ -836,10 +922,11 @@ function composeAssistantAnswerV11(input) {
|
||||
const mechanismNotes = uniqueStrings(evidenceItems
|
||||
.map((item) => item.mechanism_note)
|
||||
.filter((item) => typeof item === "string" && item.trim().length > 0), 6);
|
||||
const lifecycleAnswerEnabled = Boolean(input.enableLifecycleAnswerV1);
|
||||
const problemUnits = flattenProblemUnits(input.retrievalResults);
|
||||
const problemUnitSummary = selectProblemUnitSummary(input.retrievalResults);
|
||||
const problemHeavyUnits = problemUnits.filter((item) => PROBLEM_HEAVY_TYPES.has(item.problem_unit_type));
|
||||
const selectedProblemUnits = problemHeavyUnits.slice(0, 4);
|
||||
const selectedProblemUnits = rankProblemUnitsForAnswer(problemHeavyUnits, lifecycleAnswerEnabled).slice(0, 4);
|
||||
const claimEvidenceLinks = buildClaimEvidenceLinks(input.retrievalResults);
|
||||
const aggregateEvidenceConfidence = aggregateConfidence(input.retrievalResults, evidenceItems);
|
||||
const lowConfidenceSignals = evidenceItems.filter((item) => item.confidence === "low").length;
|
||||
@@ -903,8 +990,10 @@ function composeAssistantAnswerV11(input) {
|
||||
groundingCheck: input.groundingCheck,
|
||||
retrievalResults: input.retrievalResults,
|
||||
missingAnchors,
|
||||
coverageReport: input.coverageReport
|
||||
coverageReport: input.coverageReport,
|
||||
lifecycleAnswerEnabled
|
||||
});
|
||||
const lifecycleModeActive = lifecycleAnswerEnabled && hasLifecycleResolution(selectedProblemUnits);
|
||||
return {
|
||||
assistant_reply: renderPolicyReply(problemCentricStructure),
|
||||
fallback_type: decision.fallback_type,
|
||||
@@ -912,7 +1001,7 @@ function composeAssistantAnswerV11(input) {
|
||||
answer_structure_v11: problemCentricStructure,
|
||||
problem_centric_answer_applied: true,
|
||||
problem_units_used_count: selectedProblemUnits.length,
|
||||
problem_answer_mode: "stage2_problem_centric_v1",
|
||||
problem_answer_mode: lifecycleModeActive ? "stage3_lifecycle_aware_v1" : "stage2_problem_centric_v1",
|
||||
problem_unit_ids_used: selectedProblemUnits.map((item) => item.problem_unit_id)
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user