diff --git a/README.md b/README.md index 67435ab..7463b79 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ JChatGPT 是一个基于 Kotlin 的 Mirai Console 插件,它将大型语言模 - **多模型支持**:支持聊天模型、推理模型和视觉模型 - **丰富的工具系统**:包括网络搜索、代码执行、图像识别、群管理等 - **上下文记忆**:支持持久化记忆存储 -- **好感度系统**:基于用户行为的好感度管理机制 -- **Token消耗统计**:记录每次对话的Token消耗,支持多维度统计查询 +- **用户画像系统**:好感度、印象、标签、Bot 自定义代号 +- **Token消耗统计**:按天 × 用户 × 群聚合记录,支持多维度统计查询 - **LaTeX 渲染**:自动将数学表达式渲染为图片 - **灵活的触发方式**:@机器人、关键字触发、回复消息等 - **权限控制**:细粒度的权限管理系统 @@ -55,7 +55,7 @@ AI 可以自动调用多种工具来完成复杂任务: - `/jgpt tokensDaily [days]` - 查看指定天数的每日Token消耗统计(默认7天) - `/jgpt tokensUsers [limit]` - 查看Token消耗最多的用户排名(默认Top 10) - `/jgpt tokensGroups [limit]` - 查看Token消耗最多的群组排名(默认Top 10) -- `/jgpt tokensQuery [userId] [days]` - 查询详细的使用记录(可按用户和时间过滤) +- `/jgpt tokensQuery [userId] [days]` - 查询日聚合记录(每行一天一人,可按用户和时间过滤) - `/jgpt tokensUserDaily [days]` - 查询指定用户每天的消费统计(默认7天) ## 配置文件 @@ -109,8 +109,10 @@ friendHasChatPermission: true canMute: false # 群荣誉等级权限门槛,达到这个等级相当于自动拥有对话权限。 temperaturePermission: 50 -# 等待响应超时时间,单位毫秒,默认60秒 +# 等待响应超时时间(整个请求的总超时与socket读超时),单位毫秒,默认60秒 timeout: 60000 +# 首块响应超时时间,单位毫秒,默认10秒。若连接建立后在此时间内没收到首块data:则中断走重试 +firstChunkTimeout: 10000 # 系统提示词,该字段已弃用,使用提示词文件而不是在这里修改 prompt: '你是一个乐于助人的助手' # 系统提示词文件路径,相对于插件配置目录 @@ -282,52 +284,56 @@ JChatGPT 默认配置为使用阿里云百炼平台的通义千问系列模型 10. **WeatherService** - 天气查询 11. **SearchChatHistory** - 按关键词、发送者、时间范围搜索群聊消息历史(依赖 mirai-hibernate-plugin) -## 好感度系统 +## 用户画像系统 -JChatGPT 插件包含一个可选的好感度系统,用于根据用户行为调整机器人对用户的好感度。该系统有以下特性: +JChatGPT 维护对每位用户的画像,由好感度、Bot 自定义代号、最多 5 个标签和印象文本组成。模型可以通过 `adjustUserFavorability` 工具在交流后增量更新这些字段(同一次调用可以同时调好感度、加 tag、改印象,不必分开)。 -### 核心机制 -- 好感度值范围:-100(完全不理会)到 100(非常好的朋友) -- 负好感度用户有一定概率不会收到回复,概率为好感度绝对值的百分比 -- 好感度会随时间向0偏移,偏移速度与当前好感度绝对值相关 +### 字段 +- **value(好感度)**:范围 -100(完全不理会)到 100(非常好的朋友) +- **name(代号)**:Bot 给此人起的内部代号,区别于 QQ 昵称,长度 ≤20 +- **tags(标签)**:最多 5 个简短标签,记录身份/职业/偏好/技术栈等 +- **impression(印象)**:自由文本,长度 ≤200 +- **reasons(调整原因)**:只有 change ≠ 0 的调整才会追加,保留最近 10 条 -### 好感度调整规则 -- 问正经问题:+好感度 -- 问无聊问题:-好感度 -- 骂人:直接降至-100 +### 好感度机制 +- 负好感度用户有一定概率不会收到回复,概率 = |好感度| / 100 +- 好感度会随时间向 0 偏移:偏移量 = sign(好感度) × (1 - (|好感度| / 100)²) × 基础偏移速度 +- 极端值变化缓慢,-100 需要好几天才能回升,100 也不会快速衰减 -### 时间偏移机制 -好感度会随时间自然向0回归: -- 偏移公式:偏移量 = sign(好感度) * (1 - (|好感度| / 100)^2) * 基础偏移速度 -- 极端值变化缓慢,-100可能需要好几天才消气,100可能好多天都不会降低 +### 注入到上下文 +- 群聊:列出会话历史中"认识的群友"(name/tags/impression 任一非空) +- 私聊:仅当对方有 name/tags/impression 时注入对方画像 +- 仅有好感度数值、其它字段全空的用户不会被列出,避免提示词噪声 ### 管理命令 -- `/jgpt favorability ` - 设置指定用户的好感度值(-100~100) -- `/jgpt resetFavorability` - 重置所有用户的好感度 +- `/jgpt setFavor ` - 设置指定用户的好感度值(-100~100),不改其他字段 +- `/jgpt clearFavor` - 清空所有用户画像 ### 配置选项 -- `enableFavorabilitySystem` - 是否启用好感度系统(默认:true) +- `enableFavorabilitySystem` - 是否启用画像系统(默认:true) - `favorabilityBaseShiftSpeed` - 好感度每日基础偏移速度(点/天,默认:2.0) ## Token消耗统计 -JChatGPT 插件内置了Token消耗统计功能,可以记录每次对话的Token使用情况,并提供多维度统计查询。 +JChatGPT 按 (日期, userId, groupId) 三元组聚合每次对话的 Token 消耗,提供多维度统计查询。 + +> 历史版本曾按每次请求逐条记录,但增长不受控(数千条后会触发 mamoe-yamlkt 的编/解码 bug 导致整个 data.yml 无法加载)。现已改为按天聚合并搬到独立的 `token_usage.json`,data.yml 只保留小规模的 memory / favorability 数据。 ### 功能特性 -- **自动记录**:每次对话自动记录Token消耗 -- **详细数据**:记录时间戳、用户、群组、模型、输入/输出Token数 +- **自动记录**:每次对话累加到当日聚合行 +- **聚合维度**:日期 × 用户 × 群(同一人同一天在同一群只占一行) - **多维统计**:支持按日期、用户、群组进行统计 - **灵活查询**:支持详细记录查询和过滤 ### 记录内容 -每次对话记录包含以下信息: -- 时间戳(Unix timestamp) -- 用户QQ号和昵称 +每条聚合记录包含: +- 日期(yyyy-MM-dd,本地时区) +- 用户QQ号和最近一次记录到的昵称 - 群组ID(群聊)或null(私聊) -- 使用的模型名称 -- 输入Token数(promptTokens) -- 输出Token数(completionTokens) -- 总Token数(totalTokens) +- 当日累计输入Token数(promptTokens) +- 当日累计输出Token数(completionTokens) +- 当日累计总Token数(totalTokens) +- 当日调用次数(callCount) ### 统计命令 @@ -410,19 +416,19 @@ JChatGPT 插件内置了Token消耗统计功能,可以记录每次对话的Tok ``` /jgpt tokensQuery [userId] [days] ``` -- 查询详细的使用记录 +- 查询日聚合记录(每行 = 某天某人某群的当日合计) - 可按用户ID过滤(可选) - 可指定时间范围(默认7天) -- 最多显示20条记录 +- 最多显示20条记录,按日期倒序 - 输出示例: ``` - 最近 7 天使用记录(最多显示20条): + 最近 7 天使用记录(最多显示20条,按日聚合): - [03-18 14:35] 群987654321 - 张三 - 模型: qwen-max, Tokens: 2,345 (提示: 1,234, 输出: 1,111) + [2026-03-18] 群987654321 - 张三 + 调用 12 次, Tokens: 23,450 (输入: 12,340, 输出: 11,110) - [03-18 14:30] 私聊 - 李四 - 模型: qwen-max, Tokens: 1,876 (提示: 980, 输出: 896) + [2026-03-18] 私聊 - 李四 + 调用 5 次, Tokens: 8,760 (输入: 4,800, 输出: 3,960) ``` #### 用户日统计 @@ -445,8 +451,10 @@ JChatGPT 插件内置了Token消耗统计功能,可以记录每次对话的Tok ``` ### 数据存储 -- Token记录保存在插件数据目录的 `data/data.json` 文件中 -- 使用 `AutoSavePluginData` 自动持久化 +- Token 聚合记录保存在插件数据目录的 `token_usage.json` 文件中 +- 由 `TokenUsageStore` 直接管,绕开 mamoe 的 plugin data 系统(避免 yamlkt 在大数据量下的编/解码 bug) +- 每次记录后写盘(先写 `.tmp` 再覆盖,避免半文件) +- 加载失败会自动备份原文件为 `token_usage.json.broken-` 并从空开始 - 记录永久保存,不会自动删除 - 数据格式为JSON,可手动查看和备份 @@ -459,7 +467,7 @@ JChatGPT 插件内置了Token消耗统计功能,可以记录每次对话的Tok ### 注意事项 - 仅统计聊天模型的Token消耗 - 推理模型和视觉模型的消耗不在统计范围内 -- 每次对话轮次都会单独记录 +- 同一用户同一天在同一群的多次调用合并为一行(callCount 自增) - 统计数据基于实际API返回的Token数 ## 部署要求