Skip to content

Commit e126d4b

Browse files
committed
Merge branch 'dev'
2 parents 48639bb + a9115c3 commit e126d4b

File tree

182 files changed

+26218
-3539
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

182 files changed

+26218
-3539
lines changed

.gitignore

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ message_queue_content.bat
3535
message_queue_window.bat
3636
message_queue_window.txt
3737
queue_update.txt
38-
memory_graph.gml
39-
/src/tools/tool_can_use/auto_create_tool.py
40-
/src/tools/tool_can_use/execute_python_code_tool.py
4138
.env
4239
.env.*
4340
.cursor
@@ -48,9 +45,6 @@ config/lpmm_config.toml
4845
config/lpmm_config.toml.bak
4946
template/compare/bot_config_template.toml
5047
template/compare/model_config_template.toml
51-
(测试版)麦麦生成人格.bat
52-
(临时版)麦麦开始学习.bat
53-
src/plugins/utils/statistic.py
5448
CLAUDE.md
5549
MaiBot-Dashboard/
5650
cloudflare-workers/
@@ -327,6 +321,7 @@ run_pet.bat
327321
!/plugins/emoji_manage_plugin
328322
!/plugins/take_picture_plugin
329323
!/plugins/deep_think
324+
!/plugins/MaiBot_MCPBridgePlugin
330325
!/plugins/ChatFrequency/
331326
!/plugins/__init__.py
332327

CODE_OF_CONDUCT.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171

7272
1. **GitHub Issues**: 对于公开的违规行为,可以在相关issue中直接指出
7373
2. **私下联系**: 可以通过GitHub私信联系项目维护者
74-
3. **邮件联系**: [如果有项目邮箱地址,请在此提供]
7574

7675
所有报告都将得到及时和公正的处理。我们承诺保护报告者的隐私和安全。
7776

bot.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@
3434
print(f"自动创建 .env 失败: {e}")
3535
raise
3636

37-
initialize_logging()
37+
# 检查是否是 Worker 进程,只在 Worker 进程中输出详细的初始化信息
38+
# Runner 进程只需要基本的日志功能,不需要详细的初始化日志
39+
is_worker = os.environ.get("MAIBOT_WORKER_PROCESS") == "1"
40+
initialize_logging(verbose=is_worker)
3841
install(extra_lines=3)
3942
logger = get_logger("main")
4043

4144
# 定义重启退出码
4245
RESTART_EXIT_CODE = 42
4346

47+
4448
def run_runner_process():
4549
"""
4650
Runner 进程逻辑:作为守护进程运行,负责启动和监控 Worker 进程。
@@ -55,25 +59,25 @@ def run_runner_process():
5559

5660
while True:
5761
logger.info(f"正在启动 {script_file}...")
58-
62+
5963
# 启动子进程 (Worker)
6064
# 使用 sys.executable 确保使用相同的 Python 解释器
6165
cmd = [python_executable, script_file] + sys.argv[1:]
62-
66+
6367
process = subprocess.Popen(cmd, env=env)
64-
68+
6569
try:
6670
# 等待子进程结束
6771
return_code = process.wait()
68-
72+
6973
if return_code == RESTART_EXIT_CODE:
7074
logger.info("检测到重启请求 (退出码 42),正在重启...")
71-
time.sleep(1) # 稍作等待
75+
time.sleep(1) # 稍作等待
7276
continue
7377
else:
7478
logger.info(f"程序已退出 (退出码 {return_code})")
7579
sys.exit(return_code)
76-
80+
7781
except KeyboardInterrupt:
7882
# 向子进程发送终止信号
7983
if process.poll() is None:
@@ -87,6 +91,7 @@ def run_runner_process():
8791
process.kill()
8892
sys.exit(0)
8993

94+
9095
# 检查是否是 Worker 进程
9196
# 如果没有设置 MAIBOT_WORKER_PROCESS 环境变量,说明是直接运行的脚本,
9297
# 此时应该作为 Runner 运行。
@@ -99,8 +104,10 @@ def run_runner_process():
99104
# 以下是 Worker 进程的逻辑
100105

101106
# 最早期初始化日志系统,确保所有后续模块都使用正确的日志格式
102-
# from src.common.logger import initialize_logging, get_logger, shutdown_logging # noqa
103-
# initialize_logging()
107+
# 注意:Runner 进程已经在第 37 行初始化了日志系统,但 Worker 进程是独立进程,需要重新初始化
108+
# 由于 Runner 和 Worker 是不同进程,它们有独立的内存空间,所以都会初始化一次
109+
# 这是正常的,但为了避免重复的初始化日志,我们在 initialize_logging() 中添加了防重复机制
110+
# 不过由于是不同进程,每个进程仍会初始化一次,这是预期的行为
104111

105112
from src.main import MainSystem # noqa
106113
from src.manager.async_task_manager import async_task_manager # noqa
@@ -143,7 +150,7 @@ def print_opensource_notice():
143150
"",
144151
f"{Fore.WHITE} 官方仓库: {Fore.BLUE}https://github.com/MaiM-with-u/MaiBot {Style.RESET_ALL}",
145152
f"{Fore.WHITE} 官方文档: {Fore.BLUE}https://docs.mai-mai.org {Style.RESET_ALL}",
146-
f"{Fore.WHITE} 官方群聊: {Fore.BLUE}766798517{Style.RESET_ALL}",
153+
f"{Fore.WHITE} 官方群聊: {Fore.BLUE}1006149251{Style.RESET_ALL}",
147154
f"{Fore.CYAN}{'─' * 70}{Style.RESET_ALL}",
148155
f"{Fore.RED} ⚠ 将本软件作为「商品」倒卖、隐瞒开源性质均违反协议!{Style.RESET_ALL}",
149156
f"{Fore.CYAN}{'═' * 70}{Style.RESET_ALL}",

changelogs/changelog.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## [0.12.0] - 2025-12-16
4+
### 🌟 重大更新
5+
- 添加思考力度机制,动态控制回复时间和长度
6+
- planner和replyer现在开启联动,更好的回复逻辑
7+
- 新的私聊系统,吸收了pfc的优秀机制
8+
- 增加麦麦做梦功能
9+
- mcp插件作为内置插件加入,默认不启用
10+
- 添加全局记忆配置项,现在可以选择让记忆为全局的
11+
12+
### 细节功能更改
13+
- 移除频率自动调整
14+
- 移除情绪功能
15+
- 优化记忆差许多呢超时设置
16+
- 部分配置为0的bug
17+
- 黑话和表达不再提取包含名称的内容
18+
319
## [0.11.6] - 2025-12-2
420
### 🌟 重大更新
521
- 大幅提高记忆检索能力,略微提高token消耗

docs-src/lpmm_parameters_guide.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# LPMM 关键参数调节指南(进阶版)
2+
3+
> 本文是对 `config/bot_config.toml``[lpmm_knowledge]` 段的补充说明。
4+
> 如果你只想使用默认配置,可以不改这些参数,脚本仍然可以正常工作。
5+
>
6+
> 重要提醒:无论是修改 `[lpmm_knowledge]` 段的参数,还是通过脚本导入 / 删除 LPMM 知识库数据,主程序都需要重启(或在内部调用一次 `lpmm_start_up()`)后,新的参数和知识才会真正生效到聊天侧。
7+
8+
所有与 LPMM 相关的参数,都集中在:
9+
10+
```toml
11+
[lpmm_knowledge] # lpmm知识库配置
12+
enable = true
13+
lpmm_mode = "agent"
14+
...
15+
```
16+
17+
下面按功能将常用参数分为三组介绍。
18+
19+
---
20+
21+
## 一、检索相关参数(影响答案质量与风格)
22+
23+
```toml
24+
qa_relation_search_top_k = 10 # 关系检索TopK
25+
qa_relation_threshold = 0.5 # 关系阈值,相似度高于该值才认为“命中关系”
26+
qa_paragraph_search_top_k = 1000 # 段落检索TopK,越小可能影响召回
27+
qa_paragraph_node_weight = 0.05 # 段落节点权重,在图检索&PPR中的权重
28+
qa_ent_filter_top_k = 10 # 实体过滤TopK
29+
qa_ppr_damping = 0.8 # PPR阻尼系数
30+
qa_res_top_k = 3 # 最终提供给问答模型的段落数
31+
```
32+
33+
- `qa_relation_search_top_k`
34+
控制“最多考虑多少条关系向量候选”。
35+
- 数值大:召回更全面,但略慢;
36+
- 数值小:更快,可能遗漏部分隐含关系。
37+
38+
- `qa_relation_threshold`
39+
关系相似度的阈值:
40+
- 数值高:只信任非常相关的关系,系统更可能退化为纯段落向量检索;
41+
- 数值低:图结构影响更大,适合实体关系较丰富的场景。
42+
43+
- `qa_paragraph_search_top_k`
44+
控制“最多考虑多少段落候选”。
45+
- 太小:可能召回不全,导致答案缺失;
46+
- 太大:略微增加计算量,一般 1000 为安全默认。
47+
48+
- `qa_paragraph_node_weight`
49+
文段节点在图检索中的权重:
50+
- 数值大:更依赖段落向量相似度(传统向量检索);
51+
- 数值小:更依赖图结构和实体网络。
52+
53+
- `qa_ppr_damping`
54+
Personalized PageRank 的阻尼系数:
55+
- 通常保持在 0.8 左右即可;
56+
- 越接近 1:偏向长路径探索,结果更发散;
57+
- 略低:更集中在与问题直接相关的节点附近。
58+
59+
- `qa_res_top_k`
60+
LPMM 最终会把相关度最高的前 `qa_res_top_k` 条段落组合成“知识上下文”给问答模型。
61+
- 太多:增加模型负担、阅读更多文字;
62+
- 太少:信息不够充分,一般 3–5 比较平衡。
63+
64+
> 调参建议:
65+
> - 优先在 `qa_relation_threshold``qa_paragraph_node_weight` 上做小幅调整;
66+
> - 每次调整后,用 `scripts/test_lpmm_retrieval.py` 跑一遍固定问题,感受回答变化。
67+
68+
---
69+
70+
## 二、性能与硬件相关参数
71+
72+
```toml
73+
embedding_dimension = 1024 # 嵌入向量维度,应与模型输出维度一致
74+
max_embedding_workers = 12 # 嵌入/抽取并发线程数
75+
embedding_chunk_size = 16 # 每批嵌入的条数
76+
info_extraction_workers = 3 # 实体抽取同时执行线程数
77+
enable_ppr = true # 是否启用PPR,低配机器可关闭
78+
```
79+
80+
- `embedding_dimension`
81+
必须与所选嵌入模型的输出维度一致(比如 768、1024 等)。**不要随意修改,除非你知道你在做什么!!!**
82+
83+
- `max_embedding_workers`
84+
决定导入/抽取阶段的并行线程数:
85+
- 机器配置好:可以适当调大,加快导入速度;
86+
- 机器配置弱:建议调低(如 2 或 4),避免 CPU 长时间 100%。
87+
88+
- `embedding_chunk_size`
89+
每批发送给嵌入 API 的段落数量:
90+
- 数值大:请求次数少,但单次请求更“重”;
91+
- 数值小:请求次数多,但对网络和 API 的单次压力小。
92+
93+
- `info_extraction_workers`
94+
`scripts/info_extraction.py` 中实体抽取的并行线程数:
95+
- 使用 Pro/贵价模型时建议不要太大,避免并行费用过高;
96+
- 一般 2–4 就能取得较好平衡。
97+
98+
- `enable_ppr`
99+
是否启用个性化 PageRank(PPR)图检索:
100+
- `true`:检索会结合向量+知识图,效果更好,但略慢;
101+
- `false`:只用向量检索,牺牲一定效果,性能更稳定。
102+
103+
104+
> 调参建议:
105+
> - 若导入/检索阶段机器明显“顶不住”(>=1MB的大文本,且分配配置<4C),优先调低:
106+
> - `max_embedding_workers`
107+
> - `embedding_chunk_size`
108+
> - `info_extraction_workers`
109+
> - 或暂时将 `enable_ppr = false` (除非真的出现问题,否则不建议禁用此项,大幅影响检索效果)
110+
> - 调整后重新执行导入或检索,观察日志与系统资源占用。
111+
112+
> 小提示:每次大改参数或批量删除知识后,建议用
113+
> - `scripts/test_lpmm_retrieval.py` 看回答风格是否如预期;
114+
> - 如需确认当前磁盘数据能否正常初始化,可执行 `scripts/refresh_lpmm_knowledge.py` 做一次快速自检。
115+
116+
---
117+
118+
## 三、开启/关闭 LPMM 与模式说明
119+
120+
```toml
121+
enable = true # 是否开启lpmm知识库
122+
lpmm_mode = "agent" # 可选 classic / agent
123+
```
124+
125+
- `enable`
126+
- `true`:LPMM 知识库启用,检索和问答会使用知识库;
127+
- `false`:LPMM 完全关闭,脚本仍可导入/删除数据,但对聊天问答不生效。
128+
129+
- `lpmm_mode`
130+
- `classic`:传统模式,仅使用 LPMM 知识库本身;
131+
- `agent`:与新的记忆系统联动,用于更复杂的记忆+知识混合场景。
132+
133+
> 修改 `enable``lpmm_mode` 后,需要重启主程序,让配置生效。
134+
135+
---
136+
137+
## 四、推荐的调参流程
138+
139+
1. **保持默认配置,先跑一轮完整流程**
140+
- 导入 → `inspect_lpmm_global.py``test_lpmm_retrieval.py`
141+
- 记录当前“答案风格”和“响应速度”。
142+
143+
2. **每次只调整一到两个参数**
144+
- 例如先调 `qa_relation_threshold``qa_paragraph_node_weight`
145+
- 或在性能不佳时调整 `max_embedding_workers``enable_ppr`
146+
147+
3. **调整后重复同一组测试问题**
148+
- 使用 `scripts/test_lpmm_retrieval.py`
149+
- 对比不同配置下的答案,选择更符合需求的组合。
150+
151+
4. **出现“怎么调都不对”时**
152+
-`[lpmm_knowledge]` 段恢复为仓库中的默认配置;
153+
- 重启主程序,即可回到“出厂设置”。
154+
155+
通过本指南中的参数调节,你可以在“检索质量”“响应速度”“系统资源占用”之间找到适合自己麦麦和机器的平衡点!
156+

0 commit comments

Comments
 (0)