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
+16 -4
View File
@@ -119,12 +119,24 @@ func main() {
memStore = memory.NewStore(cfg.DatabaseURL)
defer memStore.Close()
// 使用真实嵌入模型 (text-embedding-3-small),通过 OpenAI 兼容 API
memEmbedder := memory.NewAPIEmbedder(cfg.LLMBaseURL, cfg.LLMAPIKey, "text-embedding-3-small")
// 嵌入 API 可独立配置(DeepSeek 等不提供 embedding 端点时,可指向其他服务)
embedURL := getEnv("EMBEDDING_API_URL", cfg.LLMBaseURL)
embedModel := getEnv("EMBEDDING_MODEL", "text-embedding-3-small")
memEmbedder := memory.NewAPIEmbedder(embedURL, cfg.LLMAPIKey, embedModel)
if memEmbedder.IsAvailable() {
log.Println("记忆嵌入服务已就绪 (text-embedding-3-small)")
// 测试嵌入端点是否真的可用
testCtx, testCancel := context.WithTimeout(context.Background(), 10*time.Second)
_, testErr := memEmbedder.Embed(testCtx, "test")
testCancel()
if testErr != nil {
log.Printf("⚠ 嵌入 API 不可用 (%v),记忆检索将仅使用关键词匹配", testErr)
memEmbedder = nil
} else {
log.Printf("记忆嵌入服务已就绪 (%s @ %s)", embedModel, embedURL)
}
} else {
log.Println("⚠ 记忆嵌入服务未配置 API Key,降级为字符频率嵌入(检索质量较差)")
log.Println("⚠ 嵌入服务未配置,记忆检索将仅使用关键词匹配")
memEmbedder = nil
}
memRetriever = memory.NewRetriever(memStore, memEmbedder)