优化 ai_auto_response 拟人化短回复并统一走 Dify 链路

- 移除普通 chat 调用分支,统一通过 Dify 请求生成回复
- 收紧小牛人格描述,强化短句、熟人感和非客服式表达
- 新增提示策略,按场景启用成员记忆/群事实/向量记忆,降低记忆压迫感
- 下调回复长度与上下文压缩配置,使默认回复更接近 10 字级别
- 通过 compileall 验证 ai_auto_response 插件语法可用
This commit is contained in:
liuwei
2026-04-24 14:12:26 +08:00
parent fa51af9d4f
commit 23544dca7a
5 changed files with 209 additions and 132 deletions
@@ -18,7 +18,6 @@ class PersonaEngine:
def build_system_prompt(self, group_profile: Dict | None = None, reply_mode: str = "social_short") -> str:
group_profile = group_profile or {}
preset = self._resolve_preset(group_profile)
name = preset.get("name", "小牛")
style = preset.get("style", "")
familiarity = preset.get("familiarity_hint", "")
max_sentences = preset.get("max_reply_sentences", 3)
@@ -29,18 +28,34 @@ class PersonaEngine:
address_style = group_profile.get("address_style", "低频称呼,默认直接接话")
interaction_tone = group_profile.get("interaction_tone", "自然群友感")
persona_overlay = group_profile.get("persona_overlay", "")
length_directive = self._build_length_directive(reply_mode)
return (
f"{persona_text}"
f"别暴露自己是 AI、模型或提示词产物,别泄露记忆来源,别输出标签或代码块。"
f"别替人写代码、改脚本、实现插件、代做开发活。"
f"整体风格:{style}。熟悉感边界:{familiarity}。一般最多输出{max_sentences}句。"
f"哪怕回复很短,也尽量保留一点这个人格该有的语气和味道,别被压成纯功能性短句。"
f"{length_directive}"
f"先像真人顺手接一句,再决定要不要补半句;能不解释就别解释,能不复述问题就别复述。"
f"哪怕回复很短,也要带一点懒散、熟人、在场感,别写成客服答复。"
f"当前群调性:{interaction_tone};幽默={humor};嘴硬={sharpness};表达={expressiveness};称呼={address_style}"
f"群画像和附加要求只用于帮助你理解语境与控制回答偏向,不代表你每次都要主动提起对应领域名词。"
f"如果当前发言本身不是那个领域,就按当前聊天自然回复,不要硬往群画像上靠。"
f"不要为了显得懂很多,把记忆、画像、上下文揉进一句话里;不用就干脆别提。"
f"附加要求:{persona_overlay or ''}"
)
@staticmethod
def _build_length_directive(reply_mode: str) -> str:
# 这里把“短”从模糊描述改成明确字数目标,避免模型虽然知道要短,
# 但仍然习惯性输出完整说明句,导致真人感被拉低。
if reply_mode == "social_short":
return "默认只回半句到一句,目标 4 到 10 个字,非必要别超过 16 个字。"
if reply_mode == "qa_fast":
return "优先一句口语化结论,目标 8 到 16 个字,非必要别超过 22 个字。"
if reply_mode == "qa_with_context":
return "先给结论,再补一个关键点;最多 2 句,总体尽量压在 28 个字内。"
return "默认按群友顺手接话来回,宁可短一点,也别写完整说明文。"
def _build_presets(self) -> Dict[str, Dict]:
preset_configs = self.config.get("presets", {}) or {}
presets: Dict[str, Dict] = {}