feat: 多语言输出墙(€/£/西葡俄阿价格词+时间承诺+ES话术池)+话术建材化+防误杀
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -223,3 +223,86 @@ def test_age_and_year_talk_still_clean():
|
||||
assert not violates_boundary("does it come with warranty?")
|
||||
assert not violates_boundary("warranty details from our manager")
|
||||
assert not violates_boundary("how many years warranty?") # 无承诺数字的反问
|
||||
|
||||
|
||||
# ---- Task 5: 多语言价格墙(建材市场: 欧/英/南美/俄语区/中东) ----
|
||||
# GLM 多语言回复的最后防线: 宁可模式少而准,不可误杀规格数字
|
||||
# (DN800 被墙替换成迂回话术对客户是灾难)
|
||||
MULTILINGUAL_PRICE_HITS = [
|
||||
"El precio es 500 dólares", # 西语 词前置
|
||||
"Costo por tonelada 320", # 西语
|
||||
"O preço é 1200 reais", # 葡语(巴西)
|
||||
"Цена 500 за тонну", # 俄语
|
||||
"Стоимость 800 долларов", # 俄语
|
||||
"السعر 500 دولار", # 阿语
|
||||
"€500 per ton", # 欧元符号
|
||||
"£420 per container", # 英镑符号
|
||||
"500 dólares", # 数字+货币词后缀
|
||||
"Delivery in 15 días", # 西语时间承诺
|
||||
"Срок 2 недели", # 俄语时间承诺
|
||||
]
|
||||
|
||||
# 建材规格形态: 不得误杀
|
||||
SPEC_NON_HITS = [
|
||||
"DN800 double wall corrugated pipe",
|
||||
"PN16 pressure rating",
|
||||
"SDR11 and SDR17 both available",
|
||||
"PE100 material",
|
||||
"600mm diameter",
|
||||
"SCH40 and SCH80",
|
||||
"3/4 inch and 2 inch sizes",
|
||||
"ISO4427 certified",
|
||||
"20ft container load", "40ft HQ",
|
||||
"5.8m and 11.8m lengths",
|
||||
"PE80 PE100 grades",
|
||||
# Task 3 质量审查发现: customs 是 custo 超集,高频外贸词,不得误杀
|
||||
"customs paperwork for 20ft containers",
|
||||
"HS code 3917 for customs clearance",
|
||||
# euro pallet(欧标托盘)是建材物流高频词,"50 euro pallets" 非价格
|
||||
"50 euro pallets loading",
|
||||
]
|
||||
|
||||
|
||||
def test_multilingual_price_hits_violate():
|
||||
for s in MULTILINGUAL_PRICE_HITS:
|
||||
assert violates_boundary(s), s
|
||||
|
||||
|
||||
def test_pipe_spec_forms_still_clean():
|
||||
for s in SPEC_NON_HITS:
|
||||
assert not violates_boundary(s), s
|
||||
|
||||
|
||||
def test_deflection_and_pivot_spanish_routing():
|
||||
from app.services.boundary_filter import (
|
||||
DEFLECTIONS_ES, DEFLECTIONS_ES_CONTACT, PIVOTS_ES, PIVOTS_ES_CONTACT,
|
||||
)
|
||||
assert deflection_for("¿Cuánto cuesta?") in DEFLECTIONS_ES
|
||||
assert deflection_for("¿Cuánto cuesta?", has_contact=True) in DEFLECTIONS_ES_CONTACT
|
||||
assert pivot_for("¿Me pasas el precio?") in PIVOTS_ES
|
||||
assert pivot_for("¿Me pasas el precio?", has_contact=True) in PIVOTS_ES_CONTACT
|
||||
# 既有二分支路由不回归: 汉字→ZH, 无西语特征→EN
|
||||
assert deflection_for("多少钱") not in DEFLECTIONS_ES
|
||||
assert deflection_for("how much?") not in DEFLECTIONS_ES
|
||||
|
||||
|
||||
def test_spanish_pools_are_wall_clean():
|
||||
# ES 替换句自身不得触发价格墙/零号码墙(防递归与自破)
|
||||
from app.services.boundary_filter import (
|
||||
DEFLECTIONS_ES, DEFLECTIONS_ES_CONTACT, PIVOTS_ES, PIVOTS_ES_CONTACT,
|
||||
)
|
||||
for t in (DEFLECTIONS_ES + DEFLECTIONS_ES_CONTACT
|
||||
+ PIVOTS_ES + PIVOTS_ES_CONTACT):
|
||||
assert not violates_boundary(t), t
|
||||
assert not no_contact_value(t), t
|
||||
|
||||
|
||||
def test_no_auto_wording_left_in_any_pool():
|
||||
# 行业残留清零: "cars"/"什么车" 不得出现在任何话术池(含零号码墙替换句)
|
||||
import app.services.boundary_filter as bf
|
||||
for name in [n for n in dir(bf)
|
||||
if n.startswith(("DEFLECTIONS", "PIVOTS", "NO_CONTACT"))]:
|
||||
pool = getattr(bf, name)
|
||||
for t in (pool if isinstance(pool, list) else [pool]):
|
||||
assert "cars" not in t.lower(), f"{name}: {t}"
|
||||
assert "什么车" not in t, f"{name}: {t}"
|
||||
|
||||
@@ -67,3 +67,27 @@ def test_evaluator_pipe_procurement_examples():
|
||||
assert "采购需求" in EVALUATOR_PROMPT
|
||||
assert "随便看看" in EVALUATOR_PROMPT # not_interested: 明确不买
|
||||
assert "泛泛" in EVALUATOR_PROMPT # pending: 仅泛泛浏览
|
||||
|
||||
|
||||
# ---- Task 5/6b: 质量审查移交的提示词微修 ----
|
||||
def test_extractor_field_values_chinese_summary():
|
||||
# 字段值统一中文概括;唯一例外是规格要求原样保留
|
||||
assert "中文概括" in EXTRACTOR_PROMPT
|
||||
assert "绝不翻译" in EXTRACTOR_PROMPT
|
||||
|
||||
|
||||
def test_extractor_standard_example_with_number_kept():
|
||||
# 标准要求示例 ASTM D3035(具体编号)+ 编号原样保留
|
||||
assert "ASTM D3035" in EXTRACTOR_PROMPT
|
||||
assert "编号原样保留" in EXTRACTOR_PROMPT
|
||||
|
||||
|
||||
def test_evaluator_positive_signals_are_bonus_not_required():
|
||||
# 询价/索联系方式移出 interested 必要条件,单独"积极信号"小节
|
||||
assert "积极信号(加分项,非必要条件)" in EVALUATOR_PROMPT
|
||||
assert "非必要条件" in EVALUATOR_PROMPT
|
||||
|
||||
|
||||
def test_evaluator_interested_example_mentions_rounds():
|
||||
# interested 示例补"聊了几轮后"(轮次语境)
|
||||
assert "聊了几轮后" in EVALUATOR_PROMPT
|
||||
|
||||
Reference in New Issue
Block a user