ДОМЕНЫ - ВОПРОСЫ - Исправить обработку коротких debt follow-up и защиту от диагностических LLM rewrite
This commit is contained in:
@@ -403,6 +403,28 @@ function hasAny(text: string, patterns: string[]): boolean {
|
||||
return patterns.some((item) => text.includes(item));
|
||||
}
|
||||
|
||||
function hasFlexibleReceivablesDebtSignal(text: string): boolean {
|
||||
const normalized = String(text ?? "");
|
||||
if (!normalized) {
|
||||
return false;
|
||||
}
|
||||
return (
|
||||
/(?:кто(?:\s+\S+){0,4}\s+нам(?:\s+\S+){0,4}\s+долж)/iu.test(normalized) ||
|
||||
/(?:нам(?:\s+\S+){0,4}\s+кто(?:\s+\S+){0,4}\s+долж)/iu.test(normalized)
|
||||
);
|
||||
}
|
||||
|
||||
function hasFlexiblePayablesDebtSignal(text: string): boolean {
|
||||
const normalized = String(text ?? "");
|
||||
if (!normalized) {
|
||||
return false;
|
||||
}
|
||||
return (
|
||||
/(?:кому(?:\s+\S+){0,4}\s+мы(?:\s+\S+){0,4}\s+долж)/iu.test(normalized) ||
|
||||
/(?:мы(?:\s+\S+){0,4}\s+кому(?:\s+\S+){0,4}\s+долж)/iu.test(normalized)
|
||||
);
|
||||
}
|
||||
|
||||
function tokenizeText(text: string): string[] {
|
||||
return String(text ?? "")
|
||||
.toLowerCase()
|
||||
@@ -576,13 +598,27 @@ function hasAccountBalanceSignal(text: string): boolean {
|
||||
function hasForecastTaxSignal(text: string): boolean {
|
||||
const hasForecastLexeme =
|
||||
/(?:прогноз|forecast|план(?:\s+платежа|\s+оплаты)?|прикин(?:уть|ем|у|ь|ул|ули|усь|усь))/iu.test(text);
|
||||
const hasVatLexeme = /(?:ндс|vat)/iu.test(text);
|
||||
const hasTaxLexeme = /(?:ндс|vat|налог)/iu.test(text);
|
||||
const hasVatPayableEstimatePattern =
|
||||
/(?:(?:сколько|скока|скок).{0,48}(?:ндс|vat).{0,48}(?:надо|нужно|к\s+уплате|заплатить|уплатить|платеж|платежа|платежей|платежку)|(?:ндс|vat).{0,48}(?:к\s+уплате|надо|нужно|заплатить|уплатить)|(?:сколько|скока|скок).{0,32}(?:надо|нужно).{0,32}(?:заплатить|уплатить).{0,32}(?:ндс|vat))/iu.test(
|
||||
return hasForecastLexeme && hasTaxLexeme;
|
||||
}
|
||||
|
||||
function hasVatPayableConfirmedSignal(text: string): boolean {
|
||||
const hasVatLexeme = /(?:ндс|vat)/iu.test(text);
|
||||
if (!hasVatLexeme) {
|
||||
return false;
|
||||
}
|
||||
const hasPaymentCue =
|
||||
/(?:к\s+уплате|надо|нужно|заплатить|уплатить|плат[её]ж|платежку|в\s+налогов|в\s+бюджет|должн[аы]?\s+заплатить)/iu.test(
|
||||
text
|
||||
);
|
||||
return (hasForecastLexeme && hasTaxLexeme) || (hasVatLexeme && hasVatPayableEstimatePattern);
|
||||
if (!hasPaymentCue) {
|
||||
return false;
|
||||
}
|
||||
const hasDateOrPeriodCue =
|
||||
/(?:на\s+дат|по\s+состоянию|на\s+конец|за\s+(?:\d{4}|январ|феврал|март|апрел|май|июн|июл|август|сентябр|октябр|ноябр|декабр)|квартал|месяц|год|период|\b\d{4}[./-]\d{2}[./-]\d{2}\b)/iu.test(
|
||||
text
|
||||
);
|
||||
return hasDateOrPeriodCue || /(?:сколько|скока|скок)/iu.test(text);
|
||||
}
|
||||
|
||||
function hasPeriodCoverageProfileSignal(text: string): boolean {
|
||||
@@ -1006,7 +1042,7 @@ function hasSupplierTailRiskSignal(text: string): boolean {
|
||||
|
||||
function hasPayablesDebtLifecycleSignal(text: string): boolean {
|
||||
const hasOweSignal =
|
||||
/(?:кому\s+мы\s+должны|мы\s+должны|кому\s+должны|должн(?:ы|а|о)\s+(?:заплат|оплат|перечис)|к\s+оплате|на\s+оплату|who\s+we\s+owe|owe\s+to|payables?|кредитор(?:ск)?)/iu.test(
|
||||
/(?:кому\s+мы\s+долж(?:ен|ны|эны|эна|эно)?|мы\s+долж(?:ен|ны|эны|эна|эно)?|кому\s+долж(?:ен|ны|эны|эна|эно)?|долж[нэ](?:ы|а|о)?\s+(?:заплат|оплат|перечис)|к\s+оплате|на\s+оплату|who\s+we\s+owe|owe\s+to|payables?|кредитор(?:[а-яё]{0,6})?)/iu.test(
|
||||
text
|
||||
);
|
||||
if (!hasOweSignal) {
|
||||
@@ -1022,7 +1058,7 @@ function hasPayablesDebtLifecycleSignal(text: string): boolean {
|
||||
|
||||
function hasReceivablesDebtLifecycleSignal(text: string): boolean {
|
||||
const hasOweUsSignal =
|
||||
/(?:кто\s+нам\s+долж(?:ен|ны)?|кто\s+долж(?:ен|ны)?\s+нам|нам\s+долж(?:ен|ны)|должник(?:и|ов|а)?|дебитор(?:ы|ов|ск)?|задолж|долг(?:и|ов|а|у)?|к\s+получению|на\s+поступление|к\s+взысканию|who\s+owes\s+us|receivables?)/iu.test(
|
||||
/(?:кто\s+нам\s+долж(?:ен|ны|эны|эна|эно)?|кто\s+долж(?:ен|ны|эны|эна|эно)?\s+нам|нам\s+долж(?:ен|ны|эны|эна|эно)?|должник(?:[а-яё]{0,6})?|дебитор(?:[а-яё]{0,6})?|дебиторск(?:[а-яё]{0,6})?|задолж|долг(?:и|ов|а|у)?|к\s+получению|на\s+поступление|к\s+взысканию|who\s+owes\s+us|receivables?)/iu.test(
|
||||
text
|
||||
);
|
||||
if (!hasOweUsSignal) {
|
||||
@@ -1475,11 +1511,23 @@ export function resolveAddressIntent(userMessage: string): AddressIntentResoluti
|
||||
};
|
||||
}
|
||||
|
||||
if (hasAny(text, RECEIVABLES_STRONG)) {
|
||||
const receivablesDebtLifecycleSignal = hasReceivablesDebtLifecycleSignal(text);
|
||||
if (hasVatPayableConfirmedSignal(text)) {
|
||||
return {
|
||||
intent: "vat_payable_confirmed_as_of_date",
|
||||
confidence: "high",
|
||||
reasons: ["vat_payable_confirmed_signal_detected"]
|
||||
};
|
||||
}
|
||||
|
||||
if (hasAny(text, RECEIVABLES_STRONG) || hasFlexibleReceivablesDebtSignal(text)) {
|
||||
const receivablesDebtLifecycleSignal =
|
||||
hasReceivablesDebtLifecycleSignal(text) || hasFlexibleReceivablesDebtSignal(text);
|
||||
const reasons = ["receivables_signal_detected"];
|
||||
if (receivablesDebtLifecycleSignal) {
|
||||
reasons.push("receivables_debt_lifecycle_signal_detected");
|
||||
if (hasFlexibleReceivablesDebtSignal(text)) {
|
||||
reasons.push("receivables_signal_detected_flexible_phrase");
|
||||
}
|
||||
}
|
||||
return {
|
||||
intent: receivablesDebtLifecycleSignal ? "receivables_confirmed_as_of_date" : "list_receivables_counterparties",
|
||||
@@ -1488,11 +1536,15 @@ export function resolveAddressIntent(userMessage: string): AddressIntentResoluti
|
||||
};
|
||||
}
|
||||
|
||||
if (hasAny(text, PAYABLES_STRONG)) {
|
||||
if (hasAny(text, PAYABLES_STRONG) || hasFlexiblePayablesDebtSignal(text)) {
|
||||
const reasons = ["payables_signal_detected"];
|
||||
const payablesDebtLifecycleSignal = hasPayablesDebtLifecycleSignal(text);
|
||||
const payablesDebtLifecycleSignal =
|
||||
hasPayablesDebtLifecycleSignal(text) || hasFlexiblePayablesDebtSignal(text);
|
||||
if (payablesDebtLifecycleSignal) {
|
||||
reasons.push("payables_debt_lifecycle_signal_detected");
|
||||
if (hasFlexiblePayablesDebtSignal(text)) {
|
||||
reasons.push("payables_signal_detected_flexible_phrase");
|
||||
}
|
||||
}
|
||||
return {
|
||||
intent: payablesDebtLifecycleSignal ? "payables_confirmed_as_of_date" : "list_payables_counterparties",
|
||||
|
||||
Reference in New Issue
Block a user