mirror of
https://github.com/jie65535/JChatGPT.git
synced 2026-09-15 02:56:10 +08:00
profile: add progressive user profiles
Add cache-expiry profile maintenance and contextual injection, reorganize runtime code by responsibility, remove automatic favorability decay, and prepare version 1.15.0.
This commit is contained in:
+43
-101
@@ -1,123 +1,65 @@
|
||||
# 好感度系统功能规范
|
||||
# 好感度与主观印象系统
|
||||
|
||||
## 功能概述
|
||||
为机器人添加一个可开关的好感度系统,通过AI工具自动调整用户的好感度值。好感度数据将保存在插件数据中,以用户QQ号为键,包含好感度值和调整原因。
|
||||
## 功能定位
|
||||
|
||||
## 核心功能
|
||||
好感度系统保存 Bot 对群友的主观认识,与证据驱动的长期用户画像互补:
|
||||
|
||||
### 1. 好感度数据存储
|
||||
- 在`PluginData`中新增一个映射来存储好感度数据
|
||||
- 键:用户QQ号(Long)
|
||||
- 值:包含好感度值和调整原因的数据结构
|
||||
- 默认值:0(中立)
|
||||
- `FavorabilityInfo` 保存好感度、代号、标签、印象和最近调整原因;
|
||||
- `user-profile.sqlite` 保存从历史聊天归纳出的长期画像;
|
||||
- 两套数据独立持久化,在普通对话上下文中按用户合并渲染;
|
||||
- 自动历史画像不会修改主观好感度。
|
||||
|
||||
### 2. 好感度变化规则
|
||||
- **问正经问题**:+好感度(例如:询问学习/工作相关问题、寻求帮助等)
|
||||
- **问无聊问题**:-好感度(例如:骚扰机器人要求评价他人、攻击性言论、让机器人做无意义的事情、引战问题等)
|
||||
- **骂人**:直接降至-100
|
||||
- **时间偏移**:好感度会随时间向0偏移,偏移速度与当前好感度绝对值相关
|
||||
- 好感度越高或越低,偏移速度越慢
|
||||
- 设计算法确保极端值变化缓慢(具体公式见实现细节)
|
||||
## 数据结构
|
||||
|
||||
### 3. 回复概率机制
|
||||
- 当好感度为负数时,有一定概率不回复用户消息
|
||||
- 概率计算:好感度绝对值的百分比
|
||||
- 例如:好感度为-50,则有50%概率不回复(即50%概率回复)
|
||||
|
||||
### 4. 好感度调整工具
|
||||
- 新增一个AI工具,允许AI根据对话内容自主调整用户的好感度
|
||||
- 工具名称:`adjustUserFavorability`
|
||||
- 工具参数:
|
||||
- `userId`: 用户QQ号
|
||||
- `change`: 好感度变化值(可正可负)
|
||||
- `reason`: 调整原因(用于溯源)
|
||||
- `impression`: 对用户的印象/画像(可选)
|
||||
|
||||
### 5. 系统开关
|
||||
- 在配置文件中添加开关选项,控制是否启用好感度系统
|
||||
- 默认启用
|
||||
|
||||
### 6. 管理员命令
|
||||
- 添加插件命令手动修改某个人的好感度
|
||||
- 添加命令重置所有好感度
|
||||
|
||||
## 实现细节
|
||||
|
||||
### 1. 数据结构
|
||||
在`PluginData`中添加:
|
||||
```kotlin
|
||||
/**
|
||||
* 用户好感度数据
|
||||
* Key: 用户QQ号
|
||||
* Value: 好感度信息
|
||||
*/
|
||||
val userFavorability by value(mutableMapOf<Long, FavorabilityInfo>())
|
||||
|
||||
/**
|
||||
* 好感度信息数据类
|
||||
* @param value 好感度值 (-100 ~ 100)
|
||||
* @param reason 调整原因列表,用于溯源
|
||||
* @param impression 对用户的印象/画像
|
||||
*/
|
||||
@Serializable
|
||||
data class FavorabilityInfo(
|
||||
val userId: Long,
|
||||
val value: Int = 0,
|
||||
val reasons: List<String> = emptyList(),
|
||||
val impression: String = ""
|
||||
val impression: String = "",
|
||||
val name: String = "",
|
||||
val tags: List<String> = emptyList(),
|
||||
)
|
||||
```
|
||||
|
||||
### 2. 好感度工具
|
||||
创建新的工具类`AdjustUserFavorabilityAgent`,继承`BaseAgent`。
|
||||
工具描述:`根据用户行为调整其好感度值,范围-100~100`
|
||||
字段约束:
|
||||
|
||||
### 3. 消息处理逻辑
|
||||
在`JChatGPT.kt`的`onMessage`函数中:
|
||||
- 添加好感度系统开关检查
|
||||
- 在决定是否回复前,计算回复概率
|
||||
- 如果随机数小于不回复概率,则直接返回,不进行后续处理
|
||||
- `value`:限制在 -100 到 100;
|
||||
- `reasons`:只在好感度发生变化且提供原因时追加,保留最近 10 条;
|
||||
- `impression`:最多 200 字符;
|
||||
- `name`:最多 20 字符;
|
||||
- `tags`:最多 5 项,每项最多 20 字符。
|
||||
|
||||
### 4. 时间偏移机制
|
||||
设计时间偏移算法,使好感度逐渐向0回归:
|
||||
- 偏移公式:`偏移量 = sign(好感度) * (1 - (|好感度| / 100)^2) * 基础偏移速度`
|
||||
- 基础偏移速度可设置为每天1-5点
|
||||
- 这样确保当好感度接近极端值时,变化速度会显著减慢
|
||||
数据继续保存在 Mirai `data.yml` 中,已有字段保持兼容。
|
||||
|
||||
### 5. 配置选项
|
||||
在`PluginConfig.kt`中添加:
|
||||
```kotlin
|
||||
/**
|
||||
* 是否启用好感度系统
|
||||
*/
|
||||
val enableFavorabilitySystem by value(true)
|
||||
## AI 更新工具
|
||||
|
||||
/**
|
||||
* 好感度每日基础偏移速度(点/天)
|
||||
*/
|
||||
val favorabilityBaseShiftSpeed by value(2.0)
|
||||
`adjustUserFavorability` 是唯一的好感度和主观印象维护入口。模型可以在一次调用中:
|
||||
|
||||
- 通过 `change` 增减好感度;
|
||||
- 覆盖 `impression` 或 `name`;
|
||||
- 通过 `tags_add`、`tags_remove` 调整标签。
|
||||
|
||||
只更新印象或标签时,`change` 默认为 0。系统不会因为好感度为 0 而删除用户记录。
|
||||
|
||||
## 回复门控
|
||||
|
||||
启用 `enableFavorabilitySystem` 后,负好感度会降低对应用户触发 Bot 回复的概率:
|
||||
|
||||
```text
|
||||
忽略概率 = abs(value) / 100
|
||||
```
|
||||
|
||||
### 6. 插件命令
|
||||
添加以下命令:
|
||||
- `/jgpt favorability <qq> <value>`: 设置指定QQ号的好感度值
|
||||
- `/jgpt resetFavorability`: 重置所有用户的好感度为0
|
||||
好感度不再随时间自动向 0 偏移,也没有管理员手动修改或清空好感度的命令。它只会在模型明确调用工具时变化。
|
||||
|
||||
### 7. 提示词设计
|
||||
不再使用系统提示词中的占位符,而是将好感度信息直接添加到聊天历史的顶部。
|
||||
## 上下文注入
|
||||
|
||||
### 8. 好感度信息展示
|
||||
- 不再使用系统提示词中的占位符
|
||||
- 在获取历史消息时,将好感度信息作为摘要添加到聊天历史的顶部
|
||||
- 格式示例:
|
||||
```
|
||||
[好感度摘要]
|
||||
用户840465812(筱杰) 好感度: 75
|
||||
印象: 热心的开发者,经常提供有用的建议
|
||||
调整原因:
|
||||
- 2025-09-10 14:30: 提供了关于代码优化的建议 +10
|
||||
- 2025-09-09 10:15: 帮助测试新功能 +5
|
||||
```
|
||||
普通聊天会把当前相关用户的主观认识和长期画像合并为紧凑文本:
|
||||
|
||||
## 待确认事项
|
||||
- 群聊优先选择触发者和最近发言者;
|
||||
- 私聊只注入当前联系人;
|
||||
- 仅有数值、没有代号/标签/印象的空记录不会制造提示词噪声;
|
||||
- 好感度为 0 但仍有代号、标签或印象的记录继续正常注入。
|
||||
|
||||
1. 时间偏移的基础速度设定(每天多少点)
|
||||
2. 好感度调整工具的具体参数和使用方式
|
||||
长期画像的生成、证据校验和自动维护流程参见 `ProfileSystemDesign-v3.md`。
|
||||
|
||||
Reference in New Issue
Block a user