fix(customer-service): 追问适当性结论时不能丢掉产品名

实测三连问:「季季盈90天起投多少」→「C1 客户能买它吗」→「那我能买它吗」,
第三问转人工。原因是 _topic_of 不认识适当性回答的格式——它那一行是
"南方季季盈90天为 R2(中低风险),与您当前的风险测评结果不匹配…",
既没有冒号也不是标题行,于是被判成"取不出主语",第三问就失去了指代对象。

补上这种格式:产品名在"为 R{1-5}"之前,且必须在冒号判断**之前**匹配(那一行没有冒号)。
以"为 R2"开头的行说明前面没有产品名,返回空串,而不是把等级本身当成主语。

修好后第三问给出与第二问一致的结论,这是对的:裁决是确定性的,同一个客户问同一只
产品,结论就该一样。新增两条单测钉住这两种情形。
This commit is contained in:
2026-09-10 22:46:31 +08:00
parent 958fd62d64
commit c564494f84
2 changed files with 24 additions and 0 deletions
@@ -402,6 +402,13 @@ class CustomerServiceAgent(BaseAgent):
"""
first = next((line.strip() for line in answer.splitlines() if line.strip()), "")
first = first.lstrip("#").strip()
# 适当性回答的首行是「{产品名}为 R2(中低风险),与您当前的风险测评结果不匹配…」,
# 产品名在"为 R"之前。这一条必须在冒号判断**之前**:那一行里没有冒号。
for level in range(1, 6):
index = first.find(f"为 R{level}")
if index >= 0:
candidate = first[:index].strip()
return candidate if 0 < len(candidate) <= 20 else ""
topic = first.split(":", 1)[0].strip() if ":" in first else first
# FAQ 型回答的首行是"问:C1 客户能买什么产品?",冒号前只有一个"问"字;
# 拿它当主语只会把检索词污染成"问 那它风险高吗"。