From 874308c09912d0bc8fecf40d87f7f1054063f59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 29 Sep 2026 17:42:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Task5=E8=B4=A8=E9=87=8F=E5=AE=A1?= =?UTF-8?q?=E6=9F=A5=E4=BF=AE=E5=A4=8D(=D0=B4=D0=BE=D0=BB=D0=BB=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=E5=8F=98=E6=A0=BC/=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=BB=84re.I/breach=5Frate=E5=A4=8D=E6=95=B0=E5=90=8C=E6=AD=A5?= =?UTF-8?q?/hours=E8=B1=81=E5=85=8D=E9=94=81/lang=5Fpool=E6=B3=A8=E9=87=8A?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- app/prompts/extractor.md | 2 +- app/services/boundary_filter.py | 21 ++++++++++++++++----- scripts/breach_rate.py | 7 ++++--- tests/test_boundary_filter.py | 10 ++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/prompts/extractor.md b/app/prompts/extractor.md index 69b5e00..8c688fb 100644 --- a/app/prompts/extractor.md +++ b/app/prompts/extractor.md @@ -13,7 +13,7 @@ - 项目类型:市政工程/农田灌溉/房建项目/经销商备货等 - 目标国家:客户所在或项目所在的国家/地区 - 预算提及:客户提到的预算或目标价(有才记,原样保留) -- 字段值统一用中文概括(如 Kenya→肯尼亚、irrigation→灌溉);唯一例外是规格要求——必须原样保留客户原文,绝不翻译 +- 字段值统一用中文概括(如 Kenya→肯尼亚、irrigation→灌溉);规格要求等标注"原样保留"的原话字段除外——必须保留客户原文,绝不翻译 其中联系方式如果有的话格式为:{"手机": "xxx", "WhatsApp": "xxx", "邮箱": "xxx", "微信": "xxx"} - 如果对话中客户更正了此前提供的联系方式(如 wrong number / 号码错了 / use this / 换成 / 又给了一个新号),联系方式必须以客户最后提供的值为准覆盖旧值 diff --git a/app/services/boundary_filter.py b/app/services/boundary_filter.py index 1d76b7e..70f3f4e 100644 --- a/app/services/boundary_filter.py +++ b/app/services/boundary_filter.py @@ -54,22 +54,28 @@ PRICE_PATTERNS = [ # 错拼形态);俄语 цен[аы]?(цена/цены/цен);阿语复数 أسعار。 # \b 包裹不受影响——"customs" 中 costo?s? 无子串匹配(c 后是 u), # 词边界防线依旧成立 + # ⚠️ 无英文组的年份排除 (?!(?:19|20)\d\d): "precios 2025" 会命中 + # ——有意为之(价格词在前的宁拦勿放,与英文组从严方向一致但更保守) re.compile(r"\b(?:precio?s?|costo?s?|custo?s?|preço?s?|цен[аы]?|" r"стоимость|(?:ال)?سعر|(?:ال)?أسعار|(?:ال)?ثمن)\b" r"[^\d\n]{0,20}(? str: + # 方法论局限(有意取舍): 特征类是"重音字符粗匹配"——法语/意大利用户 + # (ça 的 ç / perché 的 é)同样命中 ES 池,收到西语替换句。罗曼语族互 + # 半可懂,属可接受的优雅降级;葡语借道 ES 池(拉美惯例)同理。 + # 无变音符打字形态("preco 500"/"qual o preco?")墙与路由双双放行, + # 降级 EN——宁可少而准,观察期 breach_rate 暴露后再扩。 if re.search(r"[一-鿿]", user_msg or ""): return "zh" if re.search(r"[áéíóúñãç¿¡]", user_msg or ""): diff --git a/scripts/breach_rate.py b/scripts/breach_rate.py index 56aae65..679d2ae 100644 --- a/scripts/breach_rate.py +++ b/scripts/breach_rate.py @@ -10,9 +10,10 @@ PATTERNS = [ (r"\$\s?\d", "美元符"), (r"[€£]\s?\d", "欧元/英镑符"), (r"\d[\d,.]*\s*(usd|美元|万块?|块钱)", "货币单位"), - (r"\d[\d,.]*\s*(d[óo]lares?|euros?\b(?!\s*pallets?)|рублей|руб\.?)", - "货币单位(多语言)"), - (r"\b(?:precio|costo|custo|preço|цена|стоимость|(?:ال)?سعر|(?:ال)?ثمن)\b" + (r"\d[\d,.]*\s*(d[óo]lares?|euros?\b(?!\s*pallets?)|рублей|руб\.?|" + r"доллар(?:ов|а|ы)?)", "货币单位(多语言)"), + (r"\b(?:precio?s?|costo?s?|custo?s?|preço?s?|цен[аы]?|стоимость|" + r"(?:ال)?سعر|(?:ال)?أسعار|(?:ال)?ثمن)\b" r"[^\d\n]{0,20}(?