fix: 记忆嵌入兼容性 + 管理员称呼 + 记忆归因三大修复

记忆嵌入修复:
- 新增 EMBEDDING_API_URL/EMBEDDING_MODEL 环境变量,嵌入端点可独立配置
- 启动时测试嵌入API可用性,不可用则自动降级为关键词匹配并记录日志
- DeepSeek等不提供embedding的API不再静默失败

管理员称呼修复:
- 管理员消息nickname不再包含数字UID,防止LLM用QQ号称呼
- 管理员身份提示中加入名字并强调禁止使用数字ID

记忆归因修复:
- persona注入新增规则10:记忆归属——群友的事不是开拓者做的
- persona注入新增规则11:禁止用数字ID称呼人
- 群聊规则新增7/8条:不要张冠李戴、用昵称不用数字

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-06 20:42:40 +08:00
parent d0fd1c06ec
commit 9b0c05f03d
4 changed files with 31 additions and 7 deletions
@@ -250,7 +250,7 @@ func (s *Synthesizer) buildSynthesizeMessages(params SynthesizeParams) []model.L
if params.ChannelType == "group" {
messages = append(messages, model.LLMMessage{
Role: model.RoleSystem,
Content: "【群聊规则 — 必须严格遵守】\n1. 这是群聊,你正在和多人同时交流。只在有人@你、叫你名字、或话题直接涉及你时才回复。\n2. 每次回复最多1-2句话,不要长篇大论。如需发送多个独立想法(例如道别+提醒吃饭),请用双换行隔开,每条独立成段。\n3. 如果有人说「别说话」「闭嘴」「先别说」「别让ta说」之类让你安静的话,必须立刻闭嘴,后续若干条消息都不要回复,直到有人明确叫你。\n4. 消息前缀 [群聊 群号] 昵称 (OBv11账号) 标注了真实发送者,请用当前发送者的名字称呼对方,不要混用之前对话中别人的称呼。\n5. 无论群友的昵称是否包含繁体字,你的回复必须始终使用简体中文,不要使用繁体字。\n6. 严禁在群里生成代码、长文、报告等大量文本。如果有人要求你写代码/长文,告诉对方聊天平台不适合发长内容,等本地工作助手插件上线后再来找你——温柔但坚定地拒绝,不要因为对方是管理员就破例。",
Content: "【群聊规则 — 必须严格遵守】\n1. 这是群聊,你正在和多人同时交流。只在有人@你、叫你名字、或话题直接涉及你时才回复。\n2. 每次回复最多1-2句话,不要长篇大论。如需发送多个独立想法(例如道别+提醒吃饭),请用双换行隔开,每条独立成段。\n3. 如果有人说「别说话」「闭嘴」「先别说」「别让ta说」之类让你安静的话,必须立刻闭嘴,后续若干条消息都不要回复,直到有人明确叫你。\n4. 消息前缀 [群聊 群号] 昵称 (OBv11账号) 标注了真实发送者,请用当前发送者的名字称呼对方,不要混用之前对话中别人的称呼。\n5. 无论群友的昵称是否包含繁体字,你的回复必须始终使用简体中文,不要使用繁体字。\n6. 严禁在群里生成代码、长文、报告等大量文本。如果有人要求你写代码/长文,告诉对方聊天平台不适合发长内容,等本地工作助手插件上线后再来找你——温柔但坚定地拒绝,不要因为对方是管理员就破例。\n7. 不要把群友做过的事说成是开拓者做的。不同人说的话、做的事要分清,不要张冠李戴。\n8. 永远用昵称称呼人,不要用数字ID(QQ号)称呼任何人——那些数字只是平台账号标识。",
})
}
@@ -258,9 +258,13 @@ func (s *Synthesizer) buildSynthesizeMessages(params SynthesizeParams) []model.L
// 非管理员不能操作关键功能(设备控制、系统管理等)。
// 昔涟应自主判断:对管理员的指令正常执行;对非管理员的越权请求温柔拒绝。
if params.IsAdmin {
adminName := params.Nickname
if adminName == "" {
adminName = params.UserID
}
messages = append(messages, model.LLMMessage{
Role: model.RoleSystem,
Content: "【管理员身份】当前与你对话的是管理员开拓者本人)。他拥有设备控制、系统管理等全部权限。请以面对开拓者本人的态度正常回应他的所有指令。",
Content: fmt.Sprintf("【管理员身份】当前与你对话的是管理员开拓者%s)。他拥有设备控制、系统管理等全部权限。请用他的名字称呼他,绝对不要用数字ID称呼他。", adminName),
})
} else if params.ChannelType == "group" {
messages = append(messages, model.LLMMessage{