diff --git a/lib/byteseek/memory.kv b/lib/byteseek/memory.kv index b657f53..77c046b 100644 --- a/lib/byteseek/memory.kv +++ b/lib/byteseek/memory.kv @@ -2,7 +2,8 @@ // remember(key, value) —— 写一条记忆到 /byteseek/memory/。 // recall(query) —— 记忆检查:扫描 /byteseek/memory/ 子树,自动滤出与 query 相关的关键树路径, // 返回多行 "key = value",供 mainbrain 注入 LLM 上下文。 -// classify(msg) —— 用 LLM 把消息归入一个简短类别。 +// classify(msg) —— 用 LLM 把消息归入一个简短类别;类别名与消息语言相同(lang 判定,默认中文)。 +// lang(msg) —— 判消息文字类型(假名 / 谚文 / 汉字 / 拉丁),默认中文。 // ensure_category(cat) —— 若类别不存在,则在 /byteseek/memory/cat/ 新建。 // 匹配规则:query 与 key 互相包含,或 query 与 value 互相包含(子串匹配,大小写敏感)。 lib byteseek { @@ -45,13 +46,56 @@ lib byteseek { } } + // lang(msg) —— 判消息的文字类型:假名 > 谚文 > 汉字 > 拉丁,都不命中则默认中文。 + rwfunc lang(msg:[]char/utf32) -> (lg:[]char/utf32) { + han = 0 + kana = 0 + hangul = 0 + latin = 0 + string·len(msg) -> n + i = 0 + while (i < n) { + string·char(msg, i) -> ch + string·ord(ch) -> c + if (c >= 12352) { if (c <= 12543) { kana = 1 } } // 平/片假名 + if (c >= 19968) { if (c <= 40959) { han = 1 } } // 汉字 + if (c >= 44032) { if (c <= 55215) { hangul = 1 } } // 谚文 + if (c >= 65) { if (c <= 90) { latin = 1 } } // A-Z + if (c >= 97) { if (c <= 122) { latin = 1 } } // a-z + i + 1 -> i + } + "中文" -> lg + if (latin == 1) { "English" -> lg } + if (han == 1) { "中文" -> lg } + if (hangul == 1) { "한국어" -> lg } + if (kana == 1) { "日本語" -> lg } + } + + rwfunc fallback_cat(lg:[]char/utf32) -> (cat:[]char/utf32) { + "未分类" -> cat + if (lg == "English") { "uncategorized" -> cat } + if (lg == "日本語") { "未分類" -> cat } + if (lg == "한국어") { "미분류" -> cat } + } + rwfunc classify(msg:[]char/utf32) -> (cat:[]char/utf32) { - "请把下面这条用户消息归入一个简短中文类别(2-6字,如:编程、文件、shell、数学、闲聊)。只输出类别名本身,不要任何空格、换行、标点或解释。\n\n消息:" + msg -> user - llm·raw("你是消息分类器。只输出一个简短中文类别名。", user) -> cat + byteseek/memory·lang(msg) -> lg + "你是消息分类器,只输出一个简短类别名。" -> sys + "把下面这条用户消息归入一个简短类别(2-6 字或 1-3 个词),类别名必须用" + lg + "书写。只输出类别名本身,不要空格、换行、标点或解释。\n\n消息:" + msg -> user + llm·raw(sys, user) -> cat string·find(cat, "error") -> e if (e == 0) { - "未分类" -> cat + byteseek/memory·fallback_cat(lg) -> cat + return } + byteseek/memory·lang(cat) -> got + if (got == lg) { return } + // 语言不符就再要一次,仍不符则用同语言的兜底类别名 + "类别名必须用" + lg + "书写,不要用别的语言。只输出类别名本身:\n\n消息:" + msg -> retry + llm·raw(sys, retry) -> cat + byteseek/memory·lang(cat) -> got + if (got == lg) { return } + byteseek/memory·fallback_cat(lg) -> cat } rwfunc ensure_category(cat:[]char/utf32) -> () {