Open-World: удержать бизнес-обзор от мусорных anchors
This commit is contained in:
@@ -56,7 +56,17 @@ function hasUnicodeLikelyCounterpartyAfterBy(text) {
|
||||
"\u0431\u0430\u043d\u043a\u0435",
|
||||
"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c",
|
||||
"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b",
|
||||
"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443"
|
||||
"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443",
|
||||
"\u0434\u0430\u043d\u043d\u044b\u043c",
|
||||
"\u044d\u0442\u0438\u043c",
|
||||
"\u044d\u0442\u0438\u043c\u0438",
|
||||
"\u0438\u0442\u043e\u0433\u0443",
|
||||
"\u0438\u0442\u043e\u0433\u0430\u043c",
|
||||
"\u0432\u0441\u0435\u043c\u0443",
|
||||
"\u0432\u0441\u0435\u0439",
|
||||
"\u0432\u0441\u0435\u043c",
|
||||
"\u0432\u044b\u0432\u043e\u0434\u0443",
|
||||
"\u0432\u044b\u0432\u043e\u0434\u0430\u043c"
|
||||
]);
|
||||
return !stopWords.has(token);
|
||||
}
|
||||
|
||||
@@ -1152,6 +1152,30 @@ function isLikelyCounterpartyToken(rawToken) {
|
||||
"этомуже",
|
||||
"томуже"
|
||||
]);
|
||||
for (const semanticStopWord of [
|
||||
"данным",
|
||||
"этим",
|
||||
"этими",
|
||||
"итогу",
|
||||
"итогам",
|
||||
"всему",
|
||||
"всей",
|
||||
"всем",
|
||||
"выводу",
|
||||
"выводам",
|
||||
"аудиту",
|
||||
"прокси",
|
||||
"покажи",
|
||||
"показать",
|
||||
"выведи",
|
||||
"вывести",
|
||||
"дай",
|
||||
"дать",
|
||||
"какие",
|
||||
"список"
|
||||
]) {
|
||||
stopWords.add(semanticStopWord);
|
||||
}
|
||||
return !stopWords.has(token);
|
||||
}
|
||||
function hasPartyAnchorMention(text) {
|
||||
@@ -1658,6 +1682,18 @@ function resolveUnicodeAddressIntentBridge(text) {
|
||||
"сальдо",
|
||||
"дате",
|
||||
"периоду",
|
||||
"данным",
|
||||
"этим",
|
||||
"этими",
|
||||
"итогу",
|
||||
"итогам",
|
||||
"всему",
|
||||
"всей",
|
||||
"всем",
|
||||
"выводу",
|
||||
"выводам",
|
||||
"аудиту",
|
||||
"прокси",
|
||||
"складу",
|
||||
"товару",
|
||||
"этому",
|
||||
|
||||
+67
-2
@@ -95,11 +95,48 @@ function isActionVerbEntityCandidate(value) {
|
||||
}
|
||||
return new Set(["провести", "показать", "посмотреть", "смотреть", "найти", "искать", "анализ"]).has((0, addressTextRepair_1.normalizeRussianComparableText)(value));
|
||||
}
|
||||
function isGarbageSemanticAnchorCandidate(value) {
|
||||
if (!value) {
|
||||
return false;
|
||||
}
|
||||
const text = compactLower((0, addressTextRepair_1.repairAddressMojibakeText)(value));
|
||||
if (!text || text.length < 2) {
|
||||
return true;
|
||||
}
|
||||
const compact = (0, addressTextRepair_1.normalizeRussianComparableText)(text);
|
||||
if (new Set([
|
||||
"данным",
|
||||
"этим",
|
||||
"этими",
|
||||
"итогу",
|
||||
"итогам",
|
||||
"всему",
|
||||
"всей",
|
||||
"всем",
|
||||
"выводу",
|
||||
"выводам",
|
||||
"аудиту",
|
||||
"прокси",
|
||||
"proxy",
|
||||
"summary",
|
||||
"overall"
|
||||
]).has(compact)) {
|
||||
return true;
|
||||
}
|
||||
if (/^(?:по\s+)?(?:этим|этими)\s+данн\p{L}*$/iu.test(text) ||
|
||||
/^(?:и\s+)?кто\s+(?:главн\p{L}*|основн\p{L}*|крупн\p{L}*)\s+(?:клиент|покупател|поставщик|контрагент)(?:\s+в)?$/iu.test(text) ||
|
||||
/^(?:что|чего)\s+(?:подтвержден\p{L}*|не\s+хватает)/iu.test(text) ||
|
||||
/^(?:можно\s+ли|если\s+нет|дай\s+proxy|дай\s+прокси)/iu.test(text)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isInvalidEntityCandidate(value) {
|
||||
return Boolean(value &&
|
||||
(isReferentialEntityPlaceholder(value) ||
|
||||
isValueFlowPredicateEntityCandidate(value) ||
|
||||
isActionVerbEntityCandidate(value)));
|
||||
isActionVerbEntityCandidate(value) ||
|
||||
isGarbageSemanticAnchorCandidate(value)));
|
||||
}
|
||||
function normalizeFollowupCounterpartyCandidate(value) {
|
||||
const text = candidateValue(value);
|
||||
@@ -288,6 +325,13 @@ function mapPilotScopeToFollowupMeaning(pilotScope) {
|
||||
unsupported: "1c_metadata_surface"
|
||||
};
|
||||
}
|
||||
if (pilotScope === "business_overview_route_template_v1") {
|
||||
return {
|
||||
domain: "business_overview",
|
||||
action: "broad_evaluation",
|
||||
unsupported: "broad_business_evaluation"
|
||||
};
|
||||
}
|
||||
return {
|
||||
domain: null,
|
||||
action: null,
|
||||
@@ -568,6 +612,23 @@ function hasBusinessOverviewSignal(text) {
|
||||
}
|
||||
return /(?:\u0431\u0438\u0437\u043d\u0435\u0441[-\s]?\u043e\u0431\u0437\u043e\u0440|\u0431\u0438\u0437\u043d\u0435\u0441[-\s]?\u0430\u0443\u0434\u0438\u0442|\u043f\u043e\u043b\u043d\w*\s+\u0430\u043d\u0430\u043b\u0438\u0437\s+(?:\u043a\u043e\u043c\u043f\u0430\u043d|\u0431\u0438\u0437\u043d\u0435\u0441|\u0434\u0435\u044f\u0442\u0435\u043b)|\u0441\u0432\u043e\u0434\u043d\w*\s+\u0430\u043d\u0430\u043b\u0438\u0437\s+(?:\u043a\u043e\u043c\u043f\u0430\u043d|\u0431\u0438\u0437\u043d\u0435\u0441|\u0434\u0435\u044f\u0442\u0435\u043b)|\u043a\u0430\u043a\s+\u0442\u044b\s+\u043e\u0446\u0435\u043d(?:\u0438\u0448\u044c|\u0438)\s+\u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442|\u043a\u043e\u043c\u043f\u0430\u043d(?:\u0438\u0438|\u0438\u044e|\u0438\u044f)\s+\u0432\s+\u0446\u0435\u043b\u043e\u043c|company\s+(?:analysis|overview)|business\s+(?:overview|audit)|llm[-\s]?audit|бизнес[-\s]?обзор|бизнес[-\s]?аудит)/iu.test(text);
|
||||
}
|
||||
function hasBusinessOverviewContinuationSignal(text) {
|
||||
if (!text) {
|
||||
return false;
|
||||
}
|
||||
const normalized = compactLower(text);
|
||||
const hasEvidenceContinuationCue = /(?:по\s+этим\s+данн|на\s+базе\s+этих\s+данн|из\s+этого|по\s+итогам|что\s+подтвержден|чего\s+не\s+хватает|что\s+пока\s+нельзя|что\s+можно\s+сказать|какой\s+вывод|итогов|резюм|вывод)/iu.test(normalized);
|
||||
const hasAnalystContinuationCue = /(?:можно\s+ли|если\s+нет|proxy|прокси|аудит|оцен|что\s+думаешь|нормальн\p{L}*\s+прибыл|прибыл|марж|рентаб|ликвидн|просроч|качество\s+долг|риск|налогов\p{L}*\s+вывод)/iu.test(normalized);
|
||||
const hasTaxContinuationCue = /(?:ндс|vat)[\s\S]{0,120}(?:позици|период|основан|не\s+хватает|налогов\p{L}*\s+вывод)|(?:позици|налогов\p{L}*\s+вывод)[\s\S]{0,80}(?:ндс|vat)/iu.test(normalized);
|
||||
return hasEvidenceContinuationCue || hasAnalystContinuationCue || hasTaxContinuationCue;
|
||||
}
|
||||
function hasBusinessOverviewFollowupSeed(followupSeed) {
|
||||
return (followupSeed.pilotScope === "business_overview_route_template_v1" ||
|
||||
followupSeed.domain === "business_overview" ||
|
||||
followupSeed.action === "broad_evaluation" ||
|
||||
followupSeed.unsupported === "broad_business_evaluation" ||
|
||||
followupSeed.loopSelectedChainId === "business_overview");
|
||||
}
|
||||
function hasValueFlowSignal(text) {
|
||||
return /(?:оборот|выручк|оплат|плат[её]ж|заплат|перечисл|списан|расход|исходящ|входящ|получ(?:ил|ено|ен)|поступил|поступлен|денежн[а-яёa-z0-9_-]*\s+поток|(?<!\p{L})заработ(?:ал|али|ало|аем|ает|ать|ано|ок)(?!\p{L})|supplier|value[-\s]?flow|turnover|revenue|payment|payout|outflow|cash\s+flow|\bearn(?:ed|ing|ings)?\b)/iu.test(text);
|
||||
}
|
||||
@@ -912,7 +973,8 @@ function buildAssistantMcpDiscoveryTurnInput(input) {
|
||||
const rawEntitySourceText = repairedUserText ?? rawUserText ?? repairedEffectiveText ?? rawEffectiveText ?? rawSignalSourceText;
|
||||
const rawText = compactLower(rawSignalSourceText);
|
||||
const rawReferentialDocumentExclusionSignal = hasReferentialDocumentExclusionFollowupSignal(repairedUserText ?? rawUserText ?? "");
|
||||
const rawBusinessOverviewSignal = hasBusinessOverviewSignal(rawText);
|
||||
const businessOverviewContinuationSignal = hasBusinessOverviewFollowupSeed(followupSeed) && hasBusinessOverviewContinuationSignal(rawText);
|
||||
const rawBusinessOverviewSignal = hasBusinessOverviewSignal(rawText) || businessOverviewContinuationSignal;
|
||||
const rawLifecycleSignal = !rawBusinessOverviewSignal && hasLifecycleSignal(rawText);
|
||||
const rawBidirectionalValueFlowSignal = !rawBusinessOverviewSignal && !rawLifecycleSignal && hasBidirectionalValueFlowSignal(rawText);
|
||||
const rawValueFlowSignal = !rawBusinessOverviewSignal &&
|
||||
@@ -1744,6 +1806,9 @@ function buildAssistantMcpDiscoveryTurnInput(input) {
|
||||
if (businessOverviewSignal) {
|
||||
pushReason(reasonCodes, "mcp_discovery_broad_business_evaluation_route_candidate");
|
||||
}
|
||||
if (businessOverviewContinuationSignal) {
|
||||
pushReason(reasonCodes, "mcp_discovery_business_overview_continuation_from_followup_context");
|
||||
}
|
||||
if (!(valueFlowOrganizationStaysScope && normalizedPredecomposeCounterparty === explicitOrganizationScope) &&
|
||||
normalizedPredecomposeCounterparty) {
|
||||
pushReason(reasonCodes, "mcp_discovery_counterparty_from_predecompose");
|
||||
|
||||
Reference in New Issue
Block a user