feat: 示例问题按场景过滤,防止跨场景混淆
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

后端:
- filter_by_scene(): 关键词判断问题归属场景,过滤跨场景问题
  legal: 仲裁/诉讼/合同/税务/股权等
  decision: 扩张/定价/招人/融资/现金流/竞争等
  life: 孩子/父母/养老/健康/睡眠等
  emotion: 焦虑/失眠/自我怀疑/崩溃/拖延症等
- generate_daily_topics: prompt加场景边界说明,返回前双重过滤(老板视角+场景归属)
- /samples: prompt加场景边界说明,返回前双重过滤
- /topics: prompt加禁止清单+正确视角示例

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-09-01 09:32:11 +08:00
co-authored by Devin
parent 9da6f69cae
commit eab1efa323
2 changed files with 111 additions and 11 deletions
+15 -8
View File
@@ -18,7 +18,7 @@ from bossai import (
ExpertStore, ConsultationStore, RatingStore,
DocumentGenerator, RegulationUpdateManager, FactFinder,
ChatStore, redact,
DailyTopicStore, generate_daily_topics, filter_boss_perspective,
DailyTopicStore, generate_daily_topics, filter_boss_perspective, filter_by_scene,
)
# ===== 日志脱敏 =====
@@ -461,10 +461,14 @@ def generate_samples(req: SampleRequest):
return {"samples": builtin.get(req.scene, builtin["legal"])}
scene_config = {
"legal": {"desc": "法律/法务", "focus": "劳动用工、合同审查、债权债务、股东纠纷、税务风险、诉讼仲裁等法律问题"},
"decision": {"desc": "经营决策", "focus": "扩张收缩、定价策略、招人裁员、融资合伙、项目承接、业务转型等经营决策"},
"life": {"desc": "生活助理", "focus": "家庭沟通、子女教育、父母养老、睡眠压力、出差日程、健康习惯等个人生活问题,不是企业经营问题"},
"emotion": {"desc": "情绪疏导", "focus": "压力、焦虑、愤怒、拖延、疲惫等情绪状态,老板可能倾诉的心理感受"},
"legal": {"desc": "法律/法务", "focus": "劳动用工、合同审查、债权债务、股东纠纷、税务风险、诉讼仲裁等法律问题",
"boundary": "只关注法律/法务问题,不要生成纯经营策略、纯情绪疏导、纯生活问题"},
"decision": {"desc": "经营决策", "focus": "扩张收缩、定价策略、招人裁员、融资合伙、项目承接、业务转型等经营决策",
"boundary": "只关注经营决策问题。不要生成纯法律问题(如合同违约金怎么约定)、纯情绪问题(如焦虑失眠、自我怀疑、凌晨怀疑人生)、纯生活问题。情绪相关的决策问题可以,但必须是'该怎么做'而非'我很难受'"},
"life": {"desc": "生活助理", "focus": "家庭沟通、子女教育、父母养老、睡眠压力、出差日程、健康习惯等个人生活问题,不是企业经营问题",
"boundary": "只关注个人生活问题,不要生成纯法律问题、纯经营决策问题、纯情绪疏导问题"},
"emotion": {"desc": "情绪疏导", "focus": "压力、焦虑、愤怒、拖延、疲惫等情绪状态,老板可能倾诉的心理感受",
"boundary": "关注情绪与心理疏导,核心是情绪感受和心理状态,不是经营策略或法律方案"},
}
config = scene_config.get(req.scene, scene_config["legal"])
@@ -473,6 +477,7 @@ def generate_samples(req: SampleRequest):
f"你是{config['desc']}领域的专业顾问。请生成 4 个该领域的典型问题,"
f"用户(中小企业老板)可能会问的问题。\n\n"
f"问题方向:{config['focus']}\n\n"
f"场景边界:{config['boundary']}\n\n"
)
if req.topic:
prompt += f"具体话题:{req.topic}\n\n"
@@ -538,9 +543,11 @@ def generate_samples(req: SampleRequest):
if start == -1 or end == -1:
return {"samples": builtin.get(req.scene, builtin["legal"])}
samples = json.loads(answer[start:end + 1])
# 过滤:老板视角 + 非字符串 + 去重
samples = filter_boss_perspective(
[s for s in samples if isinstance(s, str) and s.strip()]
# 过滤:老板视角 + 场景归属 + 非字符串
samples = filter_by_scene(
filter_boss_perspective(
[s for s in samples if isinstance(s, str) and s.strip()]
), req.scene
)[:4]
if len(samples) < 2:
return {"samples": builtin.get(req.scene, builtin["legal"])}