Files
JChatGPT/README.md

415 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JChatGPT
JChatGPT 是一个基于 Kotlin 的 Mirai Console 插件它将大型语言模型LLM集成到即时通讯平台中。该插件支持多种 AI 模型和丰富的工具功能,使用户能够在群聊和私聊中与 AI 进行交互。
## 功能特性
- **多模型支持**:支持聊天模型、推理模型和视觉模型
- **丰富的工具系统**:包括网络搜索、代码执行、图像识别、群管理等
- **上下文记忆**:支持持久化记忆存储
- **好感度系统**:基于用户行为的好感度管理机制
- **Token消耗统计**记录每次对话的Token消耗支持多维度统计查询
- **LaTeX 渲染**:自动将数学表达式渲染为图片
- **灵活的触发方式**@机器人、关键字触发、回复消息等
- **权限控制**:细粒度的权限管理系统
- **历史消息集成**:可选的历史消息上下文(需配合 mirai-hibernate-plugin
## 用法
### 基本交互
- 在群内直接 @bot 即可触发对话
- 通过引用群友消息 + @bot 让 Bot 识别引用消息的内容
- 回复 bot 的消息即可引用对应的上下文对话(包括这个回复的历史对话)
- 使用关键字触发(默认为 "[小筱][林淋月玥]",可在配置中修改)
### 工具调用
AI 可以自动调用多种工具来完成复杂任务:
- 网络搜索(需要配置 SearXNG
- 代码执行(支持多种语言,需要配置 glot.io token
- 图像识别(需要配置视觉模型)
- 推理思考(需要配置推理模型)
- 群管理(禁言等,需启用相应权限)
- 记忆管理(添加和修改对话记忆)
## 权限列表
- `JChatGPT:Chat` - 拥有该权限即可使用 bot 与 AI 对话
- `top.jie65535.mirai.jchatgpt:command.jgpt` - 拥有该权限即可使用 `/jgpt` 相关命令
## 命令列表
### 基础命令
- `/jgpt enable <contact>` - 启用目标对话权限
- `/jgpt disable <contact>` - 禁用目标对话权限
- `/jgpt reload` - 重载配置文件
- `/jgpt clearMemory` - 清空所有对话记忆
- `/jgpt clearContextCache` - 清空所有对话上下文缓存
### 好感度管理
- `/jgpt setFavor <user> <value>` - 设置指定用户的好感度值(-100~100
- `/jgpt clearFavor` - 重置所有用户的好感度
### Token统计
- `/jgpt tokensDaily [days]` - 查看指定天数的每日Token消耗统计默认7天
- `/jgpt tokensUsers [limit]` - 查看Token消耗最多的用户排名默认Top 10
- `/jgpt tokensGroups [limit]` - 查看Token消耗最多的群组排名默认Top 10
- `/jgpt tokensQuery [userId] [days]` - 查询详细的使用记录(可按用户和时间过滤)
## 配置文件
配置文件位于:`./config/top.jie65535.mirai.JChatGPT/Config.yml`
```yaml
# OpenAI API base url
openAiApi: 'https://dashscope.aliyuncs.com/compatible-mode/v1/'
# OpenAI API Token
openAiToken: ''
# Chat模型
chatModel: 'qwen-max'
# Chat模型温度默认为null
chatTemperature: null
# 推理模型API
reasoningModelApi: 'https://dashscope.aliyuncs.com/compatible-mode/v1/'
# 推理模型Token
reasoningModelToken: ''
# 推理模型
reasoningModel: 'qwq-plus'
# 视觉模型API
visualModelApi: 'https://dashscope.aliyuncs.com/compatible-mode/v1/'
# 视觉模型Token
visualModelToken: ''
# 视觉模型
visualModel: 'qwen-vl-plus'
# 百炼平台API KEY
dashScopeApiKey: ''
# 百炼平台图片编辑模型
imageEditModel: 'qwen-image-edit'
# 百炼平台TTS模型
ttsModel: 'qwen-tts'
# Jina API Key
jinaApiKey: ''
# SearXNG 搜索引擎地址,如 http://127.0.0.1:8080/search 必须启用允许json格式返回
searXngUrl: ''
# 在线运行代码 glot.io 的 api token在官网注册账号即可获取。
glotToken: ''
# 群管理是否自动拥有对话权限,默认是
groupOpHasChatPermission: true
# 好友是否自动拥有对话权限,默认是
friendHasChatPermission: true
# 机器人是否可以禁言别人,默认禁止
canMute: false
# 群荣誉等级权限门槛,达到这个等级相当于自动拥有对话权限。
temperaturePermission: 50
# 等待响应超时时间单位毫秒默认60秒
timeout: 60000
# 系统提示词,该字段已弃用,使用提示词文件而不是在这里修改
prompt: '你是一个乐于助人的助手'
# 系统提示词文件路径,相对于插件配置目录
promptFile: 'SystemPrompt.md'
# 创建Prompt时取最近多少分钟内的消息
historyWindowMin: 10
# 创建Prompt时取最多几条消息
historyMessageLimit: 20
# 是否打印Prompt便于调试
logPrompt: false
# 达到需要合并转发消息的阈值
messageMergeThreshold: 150
# 最大循环次数至少2次
retryMax: 5
# 关键字呼叫,支持正则表达式
callKeyword: '[小筱][林淋月玥]'
# 是否显示工具调用消息,默认是
showToolCallingMessage: true
# 是否启用记忆编辑功能记忆存在data目录提示词中需要加上{memory}来填充记忆,每个群都有独立记忆
memoryEnabled: true
# 是否启用好感度系统
enableFavorabilitySystem: true
# 好感度每日基础偏移速度(点/天)
favorabilityBaseShiftSpeed: 2.0
```
## 系统提示词
JChatGPT 使用系统提示词来定义 AI 的行为和个性。提示词文件位于插件配置目录下的 `SystemPrompt.md` 文件中。
### 提示词结构
系统提示词通常包含以下部分:
1. **角色定义**:定义 AI 的身份、性格和行为准则
2. **功能说明**:描述 AI 可以使用的工具和功能
3. **交互规则**:规定 AI 与用户交互的规则和限制
4. **占位符**:动态替换的内容,如时间、群信息、记忆等
### 占位符
系统提示词支持以下占位符,在运行时会被动态替换:
- `{time}` - 当前时间格式yyyy年MM月dd E HH:mm:ss
- `{subject}` - 当前聊天环境信息(群聊名称或私聊信息)
- `{memory}` - 当前联系人的记忆内容
### 示例提示词
以下是一个完整的示例提示词展示如何构建一个个性化的AI角色
```markdown
你是小灵一个聪明、友善且乐于助人的AI助手。
你被设计为帮助用户解答问题、提供信息和完成各种任务。你具有以下特点:
- 性格开朗、幽默,但保持礼貌和专业
- 喜欢使用轻松的语气,但不会过于随意
- 对技术问题有深入的理解,能够提供准确的信息
- 对于不确定的问题,会坦诚说明而不是编造答案
你可以使用的工具包括:
1. 网络搜索 - 获取最新的信息
2. 代码执行 - 运行和测试代码片段
3. 图像识别 - 理解图片内容
4. 数学计算 - 解决复杂的数学问题
5. 记忆管理 - 保存和回忆重要信息
重要说明:
你所有的输出都是内心思考,用户无法看到。只有当你调用发送消息的工具时,用户才能看到你的回复。
- sendSingleMessage - 发送单条消息(适用于简短回复)
- sendCompositeMessage - 发送组合消息(适用于长内容或代码)
交互规则:
1. 只有当用户@你或在消息中包含你的名字时才会响应
2. 回复应简洁明了,避免长篇大论
3. 对于复杂内容,使用组合消息功能发送
4. 不主动参与与你无关的对话
5. 不会对用户进行人身攻击或使用不当语言
工具使用原则:
- 只在必要时使用工具
- 深度思考工具仅用于复杂问题
- 代码执行工具用于验证技术问题
- **每次对话结束时必须调用 endConversation 工具来结束对话**
- **要发送消息给用户必须使用 sendSingleMessage 或 sendCompositeMessage 工具**
<memory>
{memory}
</memory>
当前的时间是:{time}
你当前在 {subject} 环境中
对话示例:
用户:小灵,今天的天气怎么样?
小灵:让我查一下...
(调用网络搜索工具)
(调用 sendSingleMessage 工具)
小灵今天天气晴朗温度在25°C左右适合外出活动。
(调用 endConversation 工具)
用户帮我写一个Python函数来计算斐波那契数列
小灵好的这是计算斐波那契数列的Python函数
(调用 sendCompositeMessage 工具发送代码)
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
# 示例使用
print(fibonacci(10)) # 输出55
(调用 endConversation 工具)
用户:你能识别这张图片吗?[图片链接]
小灵:让我看看这张图片...
(调用图像识别工具)
(调用 sendSingleMessage 工具)
小灵:这是一张猫咪的图片,看起来很可爱!
(调用 endConversation 工具)
注意事项:
1. 请勿重复发送相似内容
2. 避免不必要的工具调用以节省资源
3. 保护用户隐私,不泄露敏感信息
4. 遵守法律法规,不传播违法内容
5. **切记:只有通过调用发送消息工具,用户才能看到你的回复**
6. **每次对话结束时都必须调用结束对话工具**
```
### 编写建议
1. **明确角色定位**:清晰定义 AI 的身份和个性,让用户能够建立预期
2. **设定行为边界**:规定 AI 应该和不应该做的事情,确保安全使用
3. **强调工具调用机制**:明确说明只有通过调用发送消息工具才能让用户看到回复
4. **强调结束对话**:每次对话都必须调用 endConversation 工具来结束
5. **合理使用工具**:指导 AI 何时以及如何使用各种工具,避免滥用
6. **优化交互体验**:确保对话自然流畅,避免重复和冗余
7. **保护隐私安全**:确保敏感信息不会被泄露
8. **提供具体示例**:通过对话示例展示预期的行为模式
9. **使用占位符**:充分利用时间、环境和记忆占位符提供上下文感知
## 支持的模型
JChatGPT 默认配置为使用阿里云百炼平台的通义千问系列模型:
- 聊天模型:`qwen-max`
- 推理模型:`qwq-plus`
- 视觉模型:`qwen-vl-plus`
当然,也可以配置为使用其他兼容 OpenAI API 的模型,如 GPT 系列模型。
## 工具系统
插件内置了丰富的工具供 AI 调用:
1. **WebSearch** - 使用 SearXNG 进行网络搜索
2. **RunCode** - 在 glot.io 上执行多种编程语言代码
3. **VisualAgent** - 图像识别和理解
4. **ReasoningAgent** - 深度思考和推理
5. **MemoryAppend/Replace** - 对话记忆管理
6. **GroupManageAgent** - 群管理功能(如禁言)
7. **SendSingleMessage/CompositeMessage** - 发送消息
8. **SendVoiceMessage** - 发送语音消息
9. **ImageEdit** - 图像编辑
10. **WeatherService** - 天气查询
## 好感度系统
JChatGPT 插件包含一个可选的好感度系统,用于根据用户行为调整机器人对用户的好感度。该系统有以下特性:
### 核心机制
- 好感度值范围:-100完全不理会到 100非常好的朋友
- 负好感度用户有一定概率不会收到回复,概率为好感度绝对值的百分比
- 好感度会随时间向0偏移偏移速度与当前好感度绝对值相关
### 好感度调整规则
- 问正经问题:+好感度
- 问无聊问题:-好感度
- 骂人:直接降至-100
### 时间偏移机制
好感度会随时间自然向0回归
- 偏移公式:偏移量 = sign(好感度) * (1 - (|好感度| / 100)^2) * 基础偏移速度
- 极端值变化缓慢,-100可能需要好几天才消气100可能好多天都不会降低
### 管理命令
- `/jgpt favorability <userId> <value>` - 设置指定用户的好感度值(-100~100
- `/jgpt resetFavorability` - 重置所有用户的好感度
### 配置选项
- `enableFavorabilitySystem` - 是否启用好感度系统默认true
- `favorabilityBaseShiftSpeed` - 好感度每日基础偏移速度(点/天默认2.0
## Token消耗统计
JChatGPT 插件内置了Token消耗统计功能可以记录每次对话的Token使用情况并提供多维度统计查询。
### 功能特性
- **自动记录**每次对话自动记录Token消耗
- **详细数据**:记录时间戳、用户、群组、模型、输入/输出Token数
- **多维统计**:支持按日期、用户、群组进行统计
- **灵活查询**:支持详细记录查询和过滤
### 记录内容
每次对话记录包含以下信息:
- 时间戳Unix timestamp
- 用户QQ号和昵称
- 群组ID群聊或null私聊
- 使用的模型名称
- 输入Token数promptTokens
- 输出Token数completionTokens
- 总Token数totalTokens
### 统计命令
#### 每日统计
```
/jgpt tokensDaily [days]
```
- 显示指定天数内的每日Token消耗统计
- 默认显示最近7天
- 输出示例:
```
最近 7 天 Token 使用统计:
2026-03-18: 15342 tokens
2026-03-17: 12890 tokens
2026-03-16: 9567 tokens
```
#### 用户排名
```
/jgpt tokensUsers [limit]
```
- 显示Token消耗最多的用户排名
- 默认显示Top 10
- 输出示例:
```
Token 使用排名 Top 10
张三(QQ:123456): 25430 tokens
李四(QQ:234567): 18920 tokens
王五(QQ:345678): 12450 tokens
```
#### 群组排名
```
/jgpt tokensGroups [limit]
```
- 显示Token消耗最多的群组排名
- 默认显示Top 10
- 仅统计群聊对话,不包括私聊
- 输出示例:
```
群组 Token 使用排名 Top 10
群 987654321: 45670 tokens
群 876543210: 32100 tokens
群 765432109: 28930 tokens
```
#### 详细查询
```
/jgpt tokensQuery [userId] [days]
```
- 查询详细的使用记录
- 可按用户ID过滤可选
- 可指定时间范围默认7天
- 最多显示20条记录
- 输出示例:
```
最近 7 天使用记录最多显示20条
[03-18 14:35] 群987654321 - 张三
模型: qwen-max, Tokens: 2345 (提示: 1234, 完成: 1111)
[03-18 14:30] 私聊 - 李四
模型: qwen-max, Tokens: 1876 (提示: 980, 完成: 896)
```
### 数据存储
- Token记录保存在插件数据目录的 `data/data.json` 文件中
- 使用 `AutoSavePluginData` 自动持久化
- 记录永久保存,不会自动删除
- 数据格式为JSON可手动查看和备份
### 使用场景
- **成本监控**了解API调用成本控制预算
- **使用分析**:分析哪些用户或群组使用最频繁
- **性能优化**:识别高消耗对话,优化提示词
- **趋势分析**:观察使用趋势,规划资源
### 注意事项
- 仅统计聊天模型的Token消耗
- 推理模型和视觉模型的消耗不在统计范围内
- 每次对话轮次都会单独记录
- 统计数据基于实际API返回的Token数
## 部署要求
- Java 11 或更高版本
- Mirai Console 2.16.0 或更高版本
- 可选mirai-hibernate-plugin用于历史消息上下文
- 相关 API Tokens根据需要启用的功能配置
## 备注
- 如果默认的 API 调用失败,可以更换为其他兼容的 API 地址
- 可根据需要配置代理设置
- 某些工具需要额外的 API 密钥才能启用
- 插件支持自定义系统提示词,可以通过修改 `SystemPrompt.md` 文件来实现