AI记忆问题解决方案Basic Memory

在这里插入图片描述

前言

我们可能都曾遇到过这种情况。你正在与一个大型语言模型(LLM)进行深入对话,当对话变得复杂或持续时间较长时,AI 会因为缺乏完整的叙事链条而“遗忘”关键信息,导致对话质量下降,甚至会为了“合理化”自己的回答而进行错误的推断(即“幻觉”)。

这就是 AI 的记忆问题。

当然我们还有其他的需求,希望能在不同 AI 工具之间,共享和访问彼此的记忆信息,从而实现上下文的连续性和一致性,这在 AI 编程中尤其重要。

目前记忆类 MCP已经比较多了,像 OpenMemorySupermemory 等,但都采用了向量数据库进行持久化存储。而今天老苏介绍的 Basic Memory,采用了最简单也最可靠的纯文本文档的方案。

什么是 Basic Memory ?

基本记忆(Basic Memory)可让您通过与 Claude 等大型语言模型(LLM)进行自然对话来构建持久知识,同时将所有内容保存在计算机上的简单 Markdown 文件中。它使用模型上下文协议(MCP),使任何兼容的 LLM 都能读取和写入您的本地知识库。

主要特点

  1. 本地优先:所有知识存储在用户控制的本地 Markdown 文件中,确保数据隐私和安全。
  2. 双向交互:用户和 LLM 可以同时读取和写入相同的文件,支持实时更新和结构化笔记。
  3. 简单易用:使用熟悉的 Markdown 格式进行知识管理,方便用户查看和编辑。
  4. 知识图谱:支持语义链接,用户可以在不同主题之间导航,形成一个结构化的知识网络。
  5. 与 Obsidian 集成:可以与流行的笔记工具 Obsidian 配合使用,增强知识管理体验。

主要功能

  • 创建和管理笔记:用户可以通过对话创建、修改和搜索笔记。
  • 实时同步:笔记修改会实时反映在本地文件中。
  • 支持多个项目:允许用户在不同项目之间切换,保持组织性。

使用场景

  • 适合需要长期保存和管理知识的个人或团队。
  • 可以用于学习、研究或项目管理,帮助用户构建一个不断扩展的知识库。

Basic Memory 通过简化知识管理过程,解决了传统 LLM 互动中常见的知识遗忘问题。

安装

  1. Basic Memory 支持 Docker 安装,但并不支持 SSE 协议,所以需要在本机安装 Docker,但老苏不喜欢这种方式;
  2. 如果你安装过 MCPHub ,可以试试这种方式,但笔记的管理肯定需要重新修改 MCPHub 映射的卷;

所以本文假设你已经在本机安装了 Python 包管理工具 uv

老苏只关注常用的几个工具,但原理上基本上是一样的;

Gemini CLI

Gemini 中安装比较简单,只要在 settings.json 中的 "mcpServers": {} 插入下面这段 json 代码即可

Claude CodeKiroCodeBuddy 都可以使用这种方式

      "basic-memory": {
        "command": "uvx",
        "args": ["basic-memory", "mcp"]
      }

如果没问题,应该可以看到工具

如果你总是遇到下面这种情况

2025-07-23 10:25:46.417 [warning] [basic-memory] Log from MCP Server: 
  Caused by: Request failed after 3 retries
  Caused by: error sending request for url (https://pypi.org/simple/basic-memory/)
  Caused by: client error (Connect)
  Caused by: dns error: 不知道这样的主机。 (os error 11001)
  Caused by: 不知道这样的主机。 (os error 11001)

可以考虑在本地安装

uv tool install basic-memory

# 或者 
pip install basic-memory

然后修改配置

"basic-memory": {
  "command": "basic-memory",  // 使用本地命令
  "args": []  // 无需参数
}

只要在 Gemini 中告诉它保存到笔记或者知识库,它会告诉你保存的目录和文件

打开目录, Windows 平台在 C:\Users\用户\basic-memory

打开文件

聊了一些其他的内容之后,你可以随时看看 AI 是否还记得

如果忘记了

可以再从知识库笔记中获取

Cherry Studio

Cherry Studio 中设置也很简单

  • 类型: 选择 stdio
  • 命令: 填入 uvx
  • 参数:
    • 第一行填入 basic-memory
    • 第二行填入 mcp

在助手中需要启用 Basic Memory MCP

要求 在笔记中查找 Basic Memory 的使用方法,可以清晰的看到调用了 search_notesread_note 工具

Obsidian

可以直接打开 C:\Users\用户\basic-memory 目录作为新仓库

如果不想新建仓库,可以通过 mklink /D 方式,将 C:\Users\用户\basic-memory 链接到现有的 Obsidian 笔记目录中

官方有个视频,可以看看

Basic Memory 功能演示

上面的示例和视频都还只是最简单的用法,想要更好的使用,还是建议多看看官方的文档:https://docs.basicmemory.com/user-guide

题外话

老苏最近一直在用各种 AI 编程工具,亚马逊的 Kiro、腾讯的 CodeBuddyClaude Code(AnyRoute)

因为都是基于 Claude 系列的大模型,所以有了一定的可比性。老苏关注的不是能不能一句话搞定一个 demo 或者系统,而是拿了一个有 bug 的项目让 AI 进行修复

  • CC 应该是表现最出色的,一般两到三轮就能解决问题,而且基本上编辑过的文件,不会有什么语法错误,比如因为缺少 } 导致的不能闭合这样的低级错误;

只是 AnyRoute 是个公益网站,虽然不需要充值,但稳定性稍差,用来学习还是非常不错的,有兴趣可以去注册一个账号体验体验:

https://anyrouter.top/register?aff=3L46

  • Kiro 表现中规中矩,感觉比较适合团队开发,就是改个 bug,也是一顿文档输出。任务结束时,出现文件存在语法错误的几率还是蛮高的,需要指定文件让其修复才行,要是能在任务结束时主动检测就好了;

  • CodeBuddy 目前 Chat 还不错,Craft 还差点意思。一个比较典型的案例就是,它自己提出的 bug 修复方案,搞来搞去都搞不定,但是将修复方案给了 CCKiro,都搞定了。所以老苏觉得, CodeBuddy 还有很大的进步空间,需要时间来打磨。

等有了免费的途径,准备再去看看 Kimi K2Qwen3 Coder

参考文档

basicmachines-co/basic-memory: AI conversations that actually remember. Never re-explain your project to Claude again. Local-first, integrates with Obsidian. Join our Discord: https://discord.gg/tyvKNccgqN
地址:https://github.com/basicmachines-co/basic-memory

Basic Memory - Build Knowledge That Grows With You
地址:https://basicmemory.com/

Basic Memory
地址:https://docs.basicmemory.com/

### Spring AI 会话记忆保存到数据库的配置方法 为了将Spring AI 的 `VectorStoreChatMemoryAdvisor` 或其他类型的会话记忆保存至数据库,可以采用持久化存储方案替代内存存储方式。以下是具体实现过程: #### 使用 Cassandra 数据库作为会话记忆存储 如果希望使用 Apache Cassandra 来存储会话记忆,则可以通过以下步骤完成配置。 1. **引入依赖** 在项目的 `pom.xml` 文件中添加 Cassandra 客户端支持的相关依赖项: ```xml <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-core</artifactId> <version>4.15.0</version> </dependency> ``` 2. **创建 Cassandra 数据表结构** 需要在 Cassandra 中预先定义用于存储会话数据的数据表。例如: ```sql CREATE TABLE IF NOT EXISTS chat_memory ( session_id UUID PRIMARY KEY, messages MAP<TEXT, TEXT>, created_at TIMESTAMP ); ``` 3. **自定义 ChatMemory 实现** 编写一个基于 Cassandra 的 `ChatMemory` 类来代替默认的 `InMemoryChatMemory`。该类需继承 `org.springframework.ai.chat.ChatMemory` 接口并重写其核心方法。 下面是一个简单的代码示例: ```java import com.datastax.oss.driver.api.core.CqlSession; import org.springframework.ai.chat.ChatMessage; import org.springframework.ai.chat.ChatMemory; import java.util.List; import java.util.UUID; public class CassandraChatMemory implements ChatMemory { private final CqlSession cqlSession; private final String sessionId; public CassandraChatMemory(CqlSession cqlSession, String sessionId) { this.cqlSession = cqlSession; this.sessionId = sessionId; } @Override public List<ChatMessage> getMessages() { // 查询当前会话的消息列表 var query = "SELECT messages FROM chat_memory WHERE session_id = ?"; return cqlSession.execute(query, UUID.fromString(sessionId)) .one() .map(row -> row.getMap("messages", String.class, String.class).entrySet().stream()) .orElseThrow(() -> new RuntimeException("No memory found")); } @Override public void add(ChatMessage message) { // 将消息存入数据库 var currentMessages = getMessages(); currentMessages.add(message); var updateQuery = """ INSERT INTO chat_memory (session_id, messages, created_at) VALUES (?, ?, toTimestamp(now())) """; cqlSession.execute( updateQuery, UUID.fromString(sessionId), currentMessages.stream().collect(Collectors.toMap(m -> m.getRole(), m -> m.getContent()))); } } ``` 4. **集成到 Spring Bean 配置** 修改现有的 Spring Boot 应用程序配置文件以注入新的 `CassandraChatMemory` 对象。例如,在 Java Config 类中编写如下内容: ```java @Configuration public class AppConfig { @Bean public CqlSession cassandraSession() { return CqlSession.builder().withKeyspace("my_keyspace").build(); } @Bean public ChatMemory chatMemory(CqlSession cassandraSession) { return new CassandraChatMemory(cassandraSession, "unique_session_id"); } @Bean public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) { return ChatClient.builder(model) .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory)) .build(); } } ``` 以上即完成了从内存转向外部数据库(此处为 Cassandra)存储会话记忆的功能扩展[^1]。 --- ### 替代方案:使用关系型数据库 MySQL/PostgreSQL 存储会话记忆 对于更熟悉的关系型数据库用户来说,也可以考虑利用 JPA/Hibernate 把会话记录映射成实体对象进行管理。这种方式相对直观易懂,适合初学者尝试实践[^3]。 ```java @Entity @Table(name="chat_sessions") public class ChatSessionEntity { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(nullable=false) private String sessionId; @Lob @Basic(fetch=FetchType.LAZY) private String conversationHistory; // Getters and Setters omitted for brevity... } ``` 随后按照常规 ORM 流程操作此 Entity 即可达成目标。 --- ### 已知局限性与改进建议 尽管上述两种途径均能有效解决短期或长期储存需求问题,但仍存在一些潜在缺陷需要注意: - 如果选用 NoSQL 解决方案如 Cassandra,虽然具备高可用性和水平伸缩能力,但对于小型项目而言可能显得过于复杂; - 关系型数据库则面临性能瓶颈以及难以处理海量非结构化数据等问题;因此实际选型时应综合考量业务规模和技术栈特点作出最佳决策[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨浦老苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值