Stage 3: улучшена логика жизненного цикла и очищены ответы ассистента
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { composeAssistantAnswer } from "../src/services/answerComposer";
|
||||
import type { UnifiedRetrievalResult } from "../src/types/assistant";
|
||||
|
||||
@@ -26,12 +26,12 @@ function buildRetrievalWithMojibake(): UnifiedRetrievalResult {
|
||||
},
|
||||
evidence: [],
|
||||
why_included: [
|
||||
"Семантическое сужение выполнено по профилю cross_entity_breakage.",
|
||||
"После narrowing осталось 24 из 262 записей."
|
||||
"Почему профиль cross_entity_breakage.",
|
||||
"СемантичеÑкое narrowing 24 из 262."
|
||||
],
|
||||
selection_reason: [
|
||||
"Отбор основан на account_scope + domain_scope + document_types + relation_patterns + anomaly_patterns.",
|
||||
"Ранжирование по basis: closure_risk, repeatability, financial_impact."
|
||||
"Отбор на account_scope + domain_scope + relation_patterns.",
|
||||
"Ранжирование по basis: closure_risk, repeatability, financial_impact."
|
||||
],
|
||||
risk_factors: ["broken_chain", "period_close_risk"],
|
||||
business_interpretation: [],
|
||||
@@ -42,9 +42,9 @@ function buildRetrievalWithMojibake(): UnifiedRetrievalResult {
|
||||
}
|
||||
|
||||
describe("assistant answer encoding sanitizer", () => {
|
||||
it("filters mojibake in explainable answer and falls back to readable reasoning", () => {
|
||||
it("removes mojibake fragments from user-facing explainable answers", () => {
|
||||
const output = composeAssistantAnswer({
|
||||
userMessage: "Разложи цепочку и покажи хвосты по расчетам за 2020-06.",
|
||||
userMessage: "Check chain anomalies for June 2020.",
|
||||
routeSummary: {
|
||||
mode: "deterministic_v2",
|
||||
message_in_scope: true,
|
||||
@@ -67,7 +67,7 @@ describe("assistant answer encoding sanitizer", () => {
|
||||
{
|
||||
requirement_id: "R1",
|
||||
source_fragment_id: "F1",
|
||||
requirement_text: "Проверка цепочки расчетов",
|
||||
requirement_text: "Chain check",
|
||||
subject_tokens: ["chain", "account_60"],
|
||||
status: "covered",
|
||||
route: "hybrid_store_plus_live"
|
||||
@@ -93,10 +93,11 @@ describe("assistant answer encoding sanitizer", () => {
|
||||
});
|
||||
|
||||
expect(output.reply_type).toBe("factual_with_explanation");
|
||||
expect(output.assistant_reply).toContain("Почему это попало в ответ:");
|
||||
expect(output.assistant_reply).not.toMatch(/(?:Р.|С.){5,}/u);
|
||||
expect(output.assistant_reply).toContain("Проверка выполнена по профилю cross_entity_breakage.");
|
||||
expect(output.assistant_reply).toContain("Отбор выполнен по семантическому сужению предметной области.");
|
||||
expect(output.assistant_reply).toContain("Counterparty CP-1");
|
||||
expect(output.assistant_reply).toContain("broken_chain");
|
||||
expect(output.assistant_reply).not.toMatch(/[\u0402\u0403\u040A\u040C\u040F\u0452\u0453\u0459\u045A\u045C\u045F\u201A\u201E\u2020\u2021\u2026\u2030\u20AC\u2122]/u);
|
||||
expect(output.assistant_reply).not.toContain("unknown_entity:");
|
||||
expect(output.assistant_reply).not.toContain("batch_refresh_then_store:");
|
||||
expect(output.assistant_reply).not.toContain("\uFFFD");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user