diff --git a/cmd/classifier/main.go b/cmd/classifier/main.go index 5eb7864..cf9adb8 100644 --- a/cmd/classifier/main.go +++ b/cmd/classifier/main.go @@ -201,6 +201,7 @@ func (c *classifier) classify(ctx context.Context, msg pendingMessage) (json.Raw if err != nil { return nil, err } + systemPrompt = promptWithVerticalGuard(msg.Vertical, systemPrompt) responseFormat, _ := json.Marshal(responseFmt{Type: "json_object"}) payload := aiservice.ChatInput{ @@ -403,6 +404,16 @@ func defaultPrompt(vertical string) string { return defaultREPrompt } +func promptWithVerticalGuard(vertical, prompt string) string { + if vertical == verticalHR { + return prompt + } + if strings.Contains(prompt, realEstateOnlyGuard) { + return prompt + } + return strings.TrimSpace(prompt) + "\n\n" + realEstateOnlyGuard +} + func loadConfig() config { return config{ PostgresUser: env("POSTGRES_USER", "parser"), @@ -466,6 +477,8 @@ func envBool(key string, fallback bool) bool { const defaultREPrompt = `Ты — аналитик объявлений о недвижимости. Тебе дают текст из Telegram-канала. Определи, является ли сообщение реальным объявлением о покупке, продаже или аренде недвижимости. +Учитывай только сделки с недвижимостью: квартиры, дома, апартаменты, участки, коммерческие помещения и другие объекты недвижимости. +Любые продажи или заявки по стройматериалам, мебели, бытовой/строительной технике, автомобилям, услугам, оборудованию и прочим товарам не являются лидами недвижимости — для них is_listing=false. Отвечай строго валидным JSON без markdown: { "is_listing": boolean, @@ -484,6 +497,9 @@ const defaultREPrompt = `Ты — аналитик объявлений о не } summary всегда по-русски, confidence в диапазоне 0..1.` +const realEstateOnlyGuard = `Жёсткое правило для недвижимости: учитывай только сделки с недвижимостью. +Если сообщение продаёт или покупает стройматериалы, мебель, бытовую/строительную технику, автомобили, услуги, оборудование или любые другие товары/работы не по недвижимости — это НЕ лид недвижимости, верни is_listing=false.` + const defaultHRPrompt = `Ты — аналитик HR-объявлений. Тебе дают текст из Telegram-канала. Определи, относится ли сообщение к рынку труда: вакансия, резюме или короткий HR-контакт. Отвечай строго валидным JSON без markdown: diff --git a/cmd/server/main.go b/cmd/server/main.go index aae46bf..3550d66 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1875,6 +1875,8 @@ func envBool(key string, fallback bool) bool { const defaultREPrompt = `Ты — аналитик объявлений о недвижимости. Тебе дают текст из Telegram-канала. Определи, является ли сообщение реальным объявлением о покупке, продаже или аренде недвижимости. +Учитывай только сделки с недвижимостью: квартиры, дома, апартаменты, участки, коммерческие помещения и другие объекты недвижимости. +Любые продажи или заявки по стройматериалам, мебели, бытовой/строительной технике, автомобилям, услугам, оборудованию и прочим товарам не являются лидами недвижимости — для них is_listing=false. Отвечай строго валидным JSON без markdown: { "is_listing": boolean,