Skip to content

Commit

Permalink
记忆系统实现 (#29)
Browse files Browse the repository at this point in the history
* ✨ 添加记忆系统

* 🎨 black优化格式

* 🐛 删除apscheduler

* ✨ 将记忆插件转换为插件形式
  • Loading branch information
ChenXu233 authored Dec 17, 2024
1 parent b331a20 commit 9cca629
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 40 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,6 @@ docs/.vitepress/cache
docs/.vitepress/dist

# viztracer
result.json
result.json

data/*
4 changes: 3 additions & 1 deletion nonebot_plugin_marshoai/azure.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,9 @@ async def marsho(
nicknames = await get_nicknames()
user_nickname = nicknames.get(user_id, "")
if user_nickname != "":
nickname_prompt = f"\n*此消息的说话者:{user_nickname}*"
nickname_prompt = (
f"\n*此消息的说话者id为:{user_id},名字为:{user_nickname}*"
)
else:
nickname_prompt = ""
# 用户名无法获取,暂时注释
Expand Down
60 changes: 60 additions & 0 deletions nonebot_plugin_marshoai/plugins/marshoai_memory/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from pathlib import Path
from nonebot import require
require("nonebot_plugin_localstore")
from nonebot_plugin_localstore import get_plugin_data_file
import json

from nonebot_plugin_marshoai.plugin import PluginMetadata, on_function_call
from nonebot_plugin_marshoai.plugin.func_call.params import String

__marsho_meta__ = PluginMetadata(
name="记忆保存",
author="MarshoAI",
description="这个插件可以帮助AI记住一些事情",
)

memory_path = get_plugin_data_file("memory.json")
if not Path(memory_path).exists():
with open(memory_path, "w", encoding="utf-8") as f:
json.dump({}, f, ensure_ascii=False, indent=4)
print(memory_path)


@on_function_call(description="存储记忆内容").params(
memory=String(description="你想记住的内容,概括并保留关键内容"),
user_id=String(description="你想记住的人的id"),
)
async def write_memory(memory: str, user_id: str):

with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)

memorys = memory_data.get(user_id, [])
memorys.append(memory)
memory_data[user_id] = memorys

with open(memory_path, "w", encoding="utf-8") as f:
json.dump(memory_data, f, ensure_ascii=False, indent=4)

return "记忆已经保存啦~"


@on_function_call(description="读取记忆内容").params(
user_id=String(description="你想读取记忆的人的id")
)
async def read_memory(user_id: str):
with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)
memorys = memory_data.get(user_id, [])
if not memorys:
return "好像对ta还没有任何记忆呢~"

return "这些是有关ta的记忆:" + "\n".join(memorys)


async def organize_memories():
with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)
for i in memory_data:
...
# TODO 用大模型对记忆进行整理
17 changes: 17 additions & 0 deletions nonebot_plugin_marshoai/plugins/marshoai_memory/tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[
{
"type": "function",
"function": {
"name": "marshoai_memory__write_memory",
"description": "如果在上下中你看见并觉得应该记住的人的行为与事件,请调用这个函数,并将记忆内容写入。请尽量每次都调用,总结ta的习惯、爱好和性格,以及你对ta的印象和ta对你的印象;比如用户喜欢干什么吃什么。"
}
},
{
"type": "function",
"function": {
"name": "marshoai_memory__read_memory",
"description": "每当你想要获取更多有关某人的信息的时候,请调用这个函数。"
}
}
]

45 changes: 45 additions & 0 deletions nonebot_plugin_marshoai/tools/marshoai_memory/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from pathlib import Path
from nonebot import require

require("nonebot_plugin_localstore")
from nonebot_plugin_localstore import get_data_file
import json

memory_path = get_data_file("marshoai", "memory.json")
if not Path(memory_path).exists():
with open(memory_path, "w", encoding="utf-8") as f:
json.dump({}, f, ensure_ascii=False, indent=4)
print(memory_path)


async def write_memory(memory: str, user_id: str):

with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)

memorys = memory_data.get(user_id, [])
memorys.append(memory)
memory_data[user_id] = memorys

with open(memory_path, "w", encoding="utf-8") as f:
json.dump(memory_data, f, ensure_ascii=False, indent=4)

return "记忆已经保存啦~"


async def read_memory(user_id: str):
with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)
memorys = memory_data.get(user_id, [])
if not memorys:
return "好像对ta还没有任何记忆呢~"

return "这些是有关ta的记忆:" + "\n".join(memorys)


async def organize_memories():
with open(memory_path, "r", encoding="utf-8") as f:
memory_data = json.load(f)
for i in memory_data:
...
# TODO 用大模型对记忆进行整理
46 changes: 46 additions & 0 deletions nonebot_plugin_marshoai/tools/marshoai_memory/tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
[
{
"type": "function",
"function": {
"name": "marshoai_memory__write_memory",
"description": "如果在上下中你看见并觉得应该记住的人的行为与事件,请调用这个函数,并将记忆内容写入。请尽量每次都调用,总结ta的习惯、爱好和性格,以及你对ta的印象和ta对你的印象",
"parameters": {
"type": "object",
"properties": {
"memory": {
"type": "string",
"description": "你想记住的内容,概括并保留关键内容。"
},
"user_id": {
"type": "string",
"description": "你想记住的人的id。"
}
}
},
"required": [
"memory",
"user_id"
]
}
},
{
"type": "function",
"function": {
"name": "marshoai_memory__read_memory",
"description": "每当你想要获取更多有关某人的信息的时候,请调用这个函数。",
"parameters": {
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "你想获取的人的id。"
}
}
},
"required": [
"user_id"
]
}
}
]

2 changes: 0 additions & 2 deletions nonebot_plugin_marshoai/tools_wip/marshoai_memory/__init__.py

This file was deleted.

21 changes: 0 additions & 21 deletions nonebot_plugin_marshoai/tools_wip/marshoai_memory/tools.json

This file was deleted.

23 changes: 9 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
{
"type": "module",
"devDependencies": {
"vitepress": "^1.5.0",
"vitepress-sidebar": "^1.30.2"
},
"scripts": {
"docs:dev": "vitepress dev docs --host",
"docs:build": "vitepress build docs",
"docs:preview": "vitepress preview docs"
},
"dependencies": {
"vue": "^3.5.13"
}
}
"type": "module",
"devDependencies": {"vitepress": "^1.5.0", "vitepress-sidebar": "^1.30.2"},
"scripts": {
"docs:dev": "vitepress dev docs --host",
"docs:build": "vitepress build docs",
"docs:preview": "vitepress preview docs",
},
"dependencies": {"vue": "^3.5.13"},
}
5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ authors = [
{ name="LiteyukiStudio", email = "[email protected]"}
]
dependencies = [
"nonebot2>=2.2.0",
"nonebot2>=2.4.0",
"nonebot-plugin-alconna>=0.48.0",
"nonebot-plugin-localstore>=0.7.1",
"zhDatetime>=1.1.1",
Expand Down Expand Up @@ -76,3 +76,6 @@ dev = [
test = [
"nonebug>=0.4.3",
]

[tool.ruff.lint]
ignore = ["E402"]

0 comments on commit 9cca629

Please sign in to comment.