1. 项目概述:为AI智能体构建专属记忆库

在AI编程助手和智能体日益普及的今天,一个核心痛点逐渐浮现:它们缺乏“记忆”。每次对话都像初次见面,你需要反复解释项目背景、代码结构和个人偏好。这就像和一个永远记不住事的搭档合作,效率大打折扣。 engram 正是为了解决这个问题而生。它是一个轻量、高效、开源的记忆存储系统,专门为AI编码智能体设计,旨在为它们提供一个持久化、可查询的“外部大脑”。

简单来说,engram是一个运行在你本地或服务器上的服务。它通过标准化的接口(如HTTP API或命令行),接收来自Claude Code、Cursor等AI编程工具的请求,将对话上下文、代码片段、项目元数据、开发者习惯等信息结构化地存储起来。当下次智能体需要了解项目历史或你的编码风格时,它可以直接向engram查询,从而获得连贯的上下文,实现真正“有记忆”的协作。

这个项目的核心价值在于其 “智能体无关性” “开箱即用” 。它不绑定任何特定的AI模型或平台,采用了类似 MCP(Model Context Protocol) 的思想,提供标准化的访问方式。无论你使用的是基于DeepSeek、GPT还是其他模型的智能体,只要它们能调用HTTP接口或执行命令行,就能与engram集成。对于开发者而言,这意味着你可以集中管理所有AI助手的记忆,避免数据碎片化,并完全掌控自己的隐私数据。

2. 核心架构与设计思路拆解

2.1 为什么选择“记忆库”这个方向?

在深入代码之前,理解设计动机至关重要。当前AI编程助手的工作模式本质上是“无状态”的。它们强大的上下文窗口(如128K、200K)虽然能容纳大量信息,但存在几个根本限制:一是成本高昂,每次对话都携带冗长的历史记录会迅速消耗token;二是信息检索效率低,模型需要在庞杂的上下文中“回忆”关键信息;三是无法实现跨会话、跨项目的知识积累。

engram的设计哲学是 “外部化、结构化、持久化” 。它将记忆从昂贵的模型上下文窗口中剥离出来,存储到本地的高效数据库中。这带来了几个显著优势:

  1. 成本归零 :本地存储和查询不产生任何API调用费用。
  2. 无限容量 :存储空间仅受硬盘限制,远大于任何模型的上下文窗口。
  3. 精准检索 :通过数据库索引和全文搜索,可以毫秒级定位所需信息,而非依赖模型的“模糊回忆”。
  4. 知识复用 :一个项目中学到的架构模式或解决方案,可以轻松应用到另一个项目中。

2.2 技术栈选型与权衡

engram的技术选型体现了对“简单、可靠、高效”的极致追求。我们逐一拆解其核心组件:

存储层:SQLite 这是整个系统的基石。选择SQLite而非MySQL或PostgreSQL,是基于其 “零配置、单文件、嵌入式” 的特性。对于engram这类桌面端或轻量级服务应用,SQLite是完美选择。它无需安装和运行独立的数据库服务,整个数据库就是一个 .db 文件,可以随应用轻松分发和迁移。虽然在高并发写入场景下可能不如客户端-服务器式数据库,但对于个人或小团队使用的AI记忆库,其性能完全绰绰有余,且极大地简化了部署复杂度。

接口层:HTTP API + CLI + TUI 为了最大化兼容性,engram提供了多重访问接口:

  • HTTP API (RESTful) :这是与AI智能体集成的主要方式。智能体可以通过发送HTTP POST/GET请求来存储或查询记忆。API设计力求简洁,通常只需一个 /query 端点接收自然语言查询,一个 /store 端点用于保存记忆片段。
  • 命令行接口 (CLI) :为开发者提供直接的管理和调试能力。例如,你可以通过 engram search "用户登录逻辑" 来手动检索记忆,或者用 engram stats 查看记忆库的使用情况。
  • 终端用户界面 (TUI) :这是一个加分项。对于喜欢在终端内工作的开发者,一个基于 curses 或类似库构建的TUI,提供了比纯命令行更友好的交互方式,可以浏览、搜索、删除记忆条目,而无需记住复杂的命令参数。

搜索层:SQLite FTS5 (全文搜索) 记忆库的核心价值在于“找得到”。engram利用SQLite内置的 FTS5(全文搜索)扩展 来实现高效的文本检索。当你存储一段记忆时,系统不仅将其存入普通表,还会自动将其内容分词、索引,存入专用的FTS虚拟表。之后进行查询时,FTS5能快速返回相关性最高的结果,并支持关键词、短语甚至简单的布尔查询(如 AND, OR)。这比让AI模型在上下文中“大海捞针”要高效和准确得多。

一个典型的数据流示例

  1. AI智能体在帮你重构一个函数时,生成了新的解决方案。
  2. 智能体通过HTTP API调用 POST /store ,将“项目X中用户认证模块的重构方案”及相关代码片段发送给engram。
  3. engram将这条记忆以JSON格式存入SQLite的 memories 表,同时将其内容同步索引到FTS5表。
  4. 一周后,你在新项目Y中遇到类似的认证问题。
  5. 智能体自动向engram发送查询 POST /query ,内容为“查找用户认证的最佳实践”。
  6. engram通过FTS5搜索,快速找到项目X中的相关记忆,并将其作为上下文提供给智能体。
  7. 智能体基于这份“过去的经验”,给出了更贴合你习惯的解决方案。

注意:隐私与安全考量 。所有数据默认存储在本地,这是engram的一大优势。但在团队共享或云端部署时,你需要确保HTTP API接口有适当的认证机制(如API Key)。开源代码允许你审查和增强这部分,对于敏感项目,始终建议在防火墙后的内网环境部署。

3. 从零开始部署与深度配置指南

3.1 环境准备与源码获取

虽然项目提供了打包好的可执行文件,但对于开发者而言,从源码构建能获得最大的灵活性和控制权。我们假设你在一个Linux/macOS开发环境或Windows的WSL2中操作。

首先,确保你的系统具备基础的开发工具链:

# 对于 Ubuntu/Debian
sudo apt update && sudo apt install -y build-essential curl git python3-pip

# 对于 macOS (使用 Homebrew)
brew install git python3

# 对于 Windows (建议使用 Git Bash 或 WSL2)
# 在WSL2中安装Ubuntu后,命令同上

engram的核心可能由多种语言实现(从关键词看,涉及Python/PyTorch、区块链等)。这里我们以假设的一个Python实现为例进行说明。克隆仓库并进入目录:

git clone https://github.com/kiwi018/engram.git
cd engram

查看项目结构,通常你会看到类似以下的布局:

engram/
├── src/                 # 核心源代码
│   ├── server.py       # HTTP API 服务器
│   ├── database.py     # SQLite 操作与FTS5初始化
│   ├── cli.py          # 命令行接口
│   └── tui/            # 终端用户界面模块
├── requirements.txt    # Python 依赖列表
├── config.yaml         # 配置文件模板
└── README.md

3.2 依赖安装与虚拟环境配置

强烈建议使用Python虚拟环境来隔离项目依赖,避免污染系统环境。

python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

接着安装依赖。如果项目有 requirements.txt

pip install -r requirements.txt

典型的依赖可能包括: fastapi (用于构建API), uvicorn (ASGI服务器), sqlite3 (通常内置), rich (用于美化CLI/TUI输出), pyyaml (用于解析配置)等。

如果项目依赖比较复杂,或者涉及机器学习(如PyTorch用于记忆的向量化嵌入),安装可能会更耗时。例如,如果需要PyTorch:

# 根据你的CUDA版本选择,或安装CPU版本
pip install torch --index-url https://download.pytorch.org/whl/cu118

3.3 数据库初始化与核心配置

engram首次运行时,需要初始化SQLite数据库并创建必要的表(包括用于全文搜索的FTS5虚拟表)。这个过程通常是自动的,但了解其内部机制有助于故障排查。

一个简化的 database.py 初始化逻辑可能如下:

import sqlite3
import json
from pathlib import Path

DB_PATH = Path.home() / '.engram' / 'memory.db'

def init_database():
    DB_PATH.parent.mkdir(parents=True, exist_ok=True) # 创建目录
    conn = sqlite3.connect(DB_PATH)
    cursor = conn.cursor()

    # 1. 创建主记忆表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS memories (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            agent_id TEXT,       -- 来自哪个AI智能体
            project TEXT,        -- 关联的项目
            context TEXT,        -- 记忆产生的上下文描述
            content TEXT NOT NULL, -- 记忆的具体内容(代码、文本等)
            metadata TEXT,       -- 额外的JSON格式元数据
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    ''')

    # 2. 创建FTS5虚拟表用于全文搜索
    # 注意:FTS5表通常只包含需要被搜索的文本列(如content, context)
    cursor.execute('''
        CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
            content,
            context,
            content=memories,      -- 指定内容来源表
            content_rowid=id       -- 指定行ID关联列
        )
    ''')

    # 3. 创建触发器:当主表插入/更新/删除时,自动同步FTS5表
    # (此处省略详细的触发器SQL语句,原理是维护两张表的数据一致性)
    # ...

    conn.commit()
    conn.close()
    print(f"Database initialized at {DB_PATH}")

配置文件 config.yaml 是你定制engram行为的关键:

server:
  host: "127.0.0.1"  # 绑定地址,对外服务改为 0.0.0.0
  port: 8000          # API服务端口
  api_key: ""         # 可选,用于保护API接口,留空则无需认证

database:
  path: "~/.engram/memory.db" # 数据库文件路径
  auto_vacuum: true   # 定期清理数据库碎片

search:
  fts5_weights: "content:10, context:3" # 设置搜索权重,content字段更重要
  default_limit: 10   # 默认返回结果数量

logging:
  level: "INFO"
  file: "~/.engram/engram.log"

你可以根据需求修改端口、设置API密钥(强烈建议在生产环境设置),或调整搜索的权重参数。

3.4 启动服务与验证

完成配置后,你可以通过多种方式启动engram服务。

方式一:直接运行Python脚本(开发模式)

python src/server.py

或者如果使用了FastAPI:

uvicorn src.server:app --host 127.0.0.1 --port 8000 --reload

--reload 参数允许你在修改代码后自动重启服务,非常适合开发阶段。

方式二:使用提供的CLI命令 项目可能提供了一个统一的入口点:

# 启动服务
engram start

# 或者以守护进程方式运行
engram start --daemon

服务启动后,首先验证其是否正常运行:

curl http://127.0.0.1:8000/health

预期应返回一个简单的JSON响应,如 {"status": "ok"}

接下来,测试核心的存储和查询功能:

# 测试存储记忆
curl -X POST http://127.0.0.1:8000/store \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "claude-code",
    "project": "my-web-app",
    "context": "讨论用户登录模块的JWT令牌刷新机制",
    "content": "最佳实践:将刷新令牌存储在HttpOnly Cookie中,访问令牌过期后通过特定/refresh端点获取新令牌,避免频繁让用户重新登录。",
    "metadata": {"tags": ["auth", "security", "best-practice"]}
  }'

# 测试查询记忆
curl -X POST http://127.0.0.1:8000/query \
  -H "Content-Type: application/json" \
  -d '{
    "query": "如何处理JWT令牌刷新?",
    "project": "my-web-app" # 可选,限定项目范围
  }'

如果查询成功,你将收到一个包含相关记忆片段的JSON数组,按相关性排序。

4. 与AI编程智能体的集成实战

engram的真正威力在于与你的日常AI编程工具无缝结合。下面以几种常见场景为例,展示集成方法。

4.1 集成到 Claude Code 或 Cursor

像Claude Code、Cursor这类深度集成AI的编辑器,通常允许你配置自定义的“上下文”或“知识库”。虽然它们可能没有直接提供engram插件,但我们可以通过其“自定义指令”或“项目上下文文件”来实现半自动集成。

策略:使用“项目上下文文件” 许多AI编程助手会在项目根目录读取特定的文件(如 .cursorrules .claude-config prompts.md )作为对话的固定上下文。我们可以创建一个脚本,定期或按需将engram中与本项目相关的记忆摘要写入这个文件。

  1. 创建同步脚本 sync_engram_context.py
#!/usr/bin/env python3
import requests
import json
import subprocess
from pathlib import Path

PROJECT_ROOT = Path.cwd()
PROJECT_NAME = PROJECT_ROOT.name
CONTEXT_FILE = PROJECT_ROOT / ".ai_context.md"

# 1. 从engram查询本项目相关的最新或最重要的记忆
api_url = "http://127.0.0.1:8000/query"
payload = {
    "query": "project architecture key decisions", # 通用查询,获取核心记忆
    "project": PROJECT_NAME,
    "limit": 5 # 取最相关的5条
}
try:
    resp = requests.post(api_url, json=payload, timeout=5)
    memories = resp.json().get('results', [])
except:
    memories = []

# 2. 格式化记忆,写入上下文文件
with open(CONTEXT_FILE, 'w') as f:
    f.write("# 项目记忆库 (来自 engram)\n\n")
    if memories:
        for mem in memories:
            f.write(f"## {mem.get('context', 'No Title')}\n")
            f.write(f"*记忆时间:{mem.get('created_at', 'N/A')}*\n\n")
            f.write(f"{mem.get('content', '')}\n\n")
            f.write("---\n\n")
    else:
        f.write("暂无相关项目记忆。\n")
print(f"上下文已更新至 {CONTEXT_FILE}")
  1. 设置钩子自动运行 : 你可以将此脚本添加到Git钩子(如 post-commit ),或使用文件系统监听工具(如 entr )在代码文件变化时触发,甚至简单地在启动编辑器前手动运行一次。这样,AI助手在分析本项目时,就能自动读到这些沉淀下来的记忆。

4.2 通过 MCP (Model Context Protocol) 服务器集成

MCP是一种新兴的协议,旨在标准化AI模型与外部工具、数据源之间的通信。将engram包装成一个MCP服务器,是更通用、更强大的集成方式。

概念 :MCP服务器(Server)向AI客户端(Client,如Claude Desktop)声明自己提供哪些“工具”(Tools)和“资源”(Resources)。客户端可以根据需要调用这些工具。

实现一个简单的engram MCP服务器 : 你需要安装MCP的SDK。这里以Node.js为例(Python SDK也在开发中):

npm install @modelcontextprotocol/sdk

创建一个 server.js 文件:

const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const axios = require('axios');

const server = new Server(
  { name: "engram-memory", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

// 1. 声明一个“查询记忆”的工具
server.setRequestHandler('tools/call', async (request) => {
  if (request.params.name === 'query_memory') {
    const { query, project } = request.params.arguments;
    try {
      const response = await axios.post('http://127.0.0.1:8000/query', { query, project });
      return {
        content: [{
          type: "text",
          text: `查询到${response.data.results.length}条相关记忆:\n` +
                response.data.results.map(m => `- ${m.context}: ${m.content.substring(0,100)}...`).join('\n')
        }]
      };
    } catch (error) {
      return { content: [{ type: "text", text: `查询失败: ${error.message}` }] };
    }
  }
  // ... 可以声明更多工具,如 store_memory
});

// 2. 启动服务器(使用stdio传输,与MCP客户端通信)
const transport = new StdioServerTransport();
server.connect(transport).catch(console.error);

然后在Claude Desktop等支持MCP的客户端中配置,指向这个服务器脚本。配置成功后,你就可以在对话中直接对AI说:“请查询一下我们之前在auth项目里关于密码哈希的讨论”,AI会自动调用 query_memory 工具并从engram获取结果。

4.3 命令行(CLI)与终端界面(TUI)的进阶使用

除了作为后台服务,engram的CLI和TUI是进行记忆库管理和维护的利器。

CLI常用命令示例

# 存储一条记忆(无需启动HTTP服务)
engram store --agent "cursor" --project "my-api" --context "设计用户模型" --content "用户模型包含id, username, email和password_hash字段。email需唯一索引。"

# 进行搜索(支持复杂查询)
engram search "用户模型 唯一索引" --project "my-api" --limit 5

# 列出所有项目
engram list-projects

# 导出某个项目的所有记忆为JSON,用于备份或迁移
engram export --project "my-api" > my-api-memories-backup.json

# 统计信息:查看记忆总量、各项目分布、存储大小
engram stats

TUI的便利性 : 运行 engram tui 会启动一个全屏终端应用。在这里,你可以:

  • 使用 / 键触发搜索,实时看到结果高亮。
  • 用方向键浏览历史记忆条目。
  • 直接对某条记忆进行编辑、添加标签或删除。
  • 查看记忆之间的关联图(如果项目实现了基于内容的简单关联推荐)。 对于习惯键盘操作、追求效率的开发者,TUI比Web界面或纯CLI更友好。

实操心得:记忆的“质量”重于“数量” 。初期你可能会兴奋地存储大量对话片段,但很快会发现搜索结果变得嘈杂。我的经验是,建立简单的“记忆规范”:只存储那些具有 长期参考价值 决策依据 独特解决方案 的内容。为每条记忆添加清晰的 context 描述和相关的 tags (在metadata中),这能极大提升后续检索的精准度。可以定期使用CLI的 engram cleanup --dry-run (如果实现)来审查和清理低质量或过时的记忆。

5. 高级功能探索与性能调优

5.1 实现记忆的向量化与语义搜索

基础的全文搜索(FTS5)基于关键词匹配,对于“忘记确切关键词但记得概念”的场景不够友好。例如,你存储了“用bcrypt哈希密码”,但搜索时用了“密码加密存储”,关键词匹配可能失效。

解决方案 :引入向量搜索。将记忆的文本内容通过一个轻量级的句子嵌入模型(如 all-MiniLM-L6-v2 )转换为向量(一组数字),存储到数据库中。查询时,也将查询语句转换为向量,然后计算余弦相似度,找出最相似的记忆。这实现了“语义搜索”。

实施步骤

  1. 扩展数据库表 :在 memories 表中增加一个 embedding 列(BLOB类型),用于存储向量。
  2. 集成嵌入模型 :在存储记忆时,使用Python的 sentence-transformers 库生成内容向量。
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('all-MiniLM-L6-v2')
    embedding = model.encode(memory_content).tolist() # 转换为列表
    # 将列表序列化后存入BLOB字段
    
  3. 实现混合搜索 :查询时,先进行关键词搜索(FTS5)得到一个初步结果集,再对这个结果集进行向量相似度排序。或者,对于明确的语义查询,直接使用向量搜索。
  4. 使用专用向量数据库 :如果记忆量非常大(数十万条),SQLite进行向量相似度计算可能较慢。可以考虑集成轻量级的向量数据库如 ChromaDB LanceDB ,它们对向量操作进行了高度优化。engram可以作为上层管理器,将元数据存在SQLite,向量存在ChromaDB。

5.2 记忆的关联、去重与生命周期管理

随着时间推移,记忆库会膨胀,管理变得重要。

  • 关联记忆 :系统可以自动分析新记忆与旧记忆的相似性(通过向量或关键词),在存储时建立“相关记忆”的链接。在TUI或查询结果中展示“相关记忆”,形成知识网络。
  • 自动去重 :在存储前,计算新内容的哈希值(如MD5)或向量相似度,如果与已有记忆高度相似,则可以选择更新原有记忆的“访问时间”和“权重”,而非新增一条重复记录。
  • 生命周期与衰减 :可以为记忆引入“权重”或“热度”概念。每次被成功检索并认为有帮助,其权重增加;长期未被访问,权重缓慢衰减。定期清理权重低于阈值的记忆,或将其归档到冷存储。

5.3 性能调优与大规模部署建议

对于个人使用,默认配置已足够。但如果你计划为整个团队部署一个中央engram服务器,需要考虑以下方面:

  1. 数据库优化
    • 索引 :确保在经常查询的字段上建立索引,如 project , agent_id , created_at
    • WAL模式 :启用SQLite的写前日志模式,可以提高并发读写性能。在初始化数据库后执行: PRAGMA journal_mode=WAL;
    • 定期VACUUM :删除大量数据后,数据库文件可能不会自动缩小。可以配置定时任务(如每周一次)执行 SQLite VACUUM; 命令来回收空间。
  2. API服务器优化
    • 使用生产级ASGI服务器 :开发时用的 uvicorn --reload 不适合生产。使用 uvicorn 配合多进程,或 gunicorn 搭配 uvicorn worker。
      gunicorn -w 4 -k uvicorn.workers.UvicornWorker src.server:app --bind 0.0.0.0:8000
      
    • 启用API密钥认证 :在 config.yaml 中设置 api_key ,并在所有客户端请求头中携带 X-API-Key
    • 设置速率限制 :防止恶意或错误的请求打垮服务。可以使用 slowapi 等中间件。
  3. 高可用考虑(可选)
    • 数据备份 :定期备份 .db 文件到云存储或其他机器。
    • 多实例与负载均衡 :如果负载很高,可以运行多个engram服务器实例,共享同一个网络存储上的数据库文件(注意SQLite对网络文件系统的支持有限,更好的方式是使用客户端-服务器模式的数据库,但这会牺牲简单性,需权衡)。

6. 故障排查与常见问题实录

在实际部署和使用engram的过程中,你可能会遇到以下典型问题。这里记录了我的排查思路和解决方案。

6.1 服务启动失败

问题现象 :执行 python src/server.py engram start 后,进程立即退出或报错。

排查步骤

  1. 检查依赖 :首先确认所有Python依赖已正确安装。运行 pip list 并与 requirements.txt 对比。常见问题是缺少 fastapi , uvicorn sqlite3 (后者通常是Python内置,但版本可能过旧)。
  2. 检查端口占用 :engram默认使用8000端口。使用以下命令检查:
    # Linux/macOS
    lsof -i :8000
    # Windows
    netstat -ano | findstr :8000
    
    如果端口被占用,可以在 config.yaml 中修改 port 为其他值(如 8001)。
  3. 检查数据库文件权限 :如果数据库路径设置在需要写权限的目录(如 /var/lib/engram ),确保运行engram的用户对该目录有读写权限。
  4. 查看日志 :检查engram的日志文件(默认在 ~/.engram/engram.log )或直接查看命令行输出的错误信息。常见的错误信息会直接指出问题所在,如“无法创建表”、“配置文件格式错误”等。

6.2 API调用无响应或返回错误

问题现象 :使用 curl 或AI智能体调用API时,连接超时或返回4xx/5xx错误。

排查步骤

  1. 确认服务状态 :首先用 curl http://127.0.0.1:8000/health 检查服务是否存活。
  2. 检查网络与防火墙 :如果从另一台机器调用,确保服务器防火墙放行了对应端口(如8000)。在服务器上临时关闭防火墙测试(生产环境谨慎操作):
    sudo ufw disable  # Ubuntu
    
  3. 验证请求格式 :仔细检查API请求的JSON格式、字段名是否正确。使用 -v 参数查看详细的HTTP请求和响应:
    curl -v -X POST http://127.0.0.1:8000/store ... 
    
  4. 查看服务端日志 :错误信息通常会记录在服务端日志中。根据日志中的堆栈跟踪定位代码问题。

6.3 搜索返回结果不相关或为空

问题现象 :明明存储了相关记忆,但查询时却找不到或结果排名靠后。

排查步骤

  1. 确认数据已存入 :先用CLI命令 engram search "一个你知道存在的关键词" 确认记忆确实在库中。
  2. 理解FTS5的搜索语法 :默认可能是简单的关键词匹配。尝试使用更精确的短语搜索(用双引号包裹),或使用 * 通配符。
    • 在查询内容中尝试: "JWT令牌" AND 刷新
    • 在CLI中: engram search '"password hash"'
  3. 检查搜索权重配置 :在 config.yaml 中, fts5_weights 参数决定了不同字段在搜索中的重要性。如果你总是在 context 字段搜索,但权重设得很低,结果可能不理想。可以尝试调整权重,或确保存储时在 content 字段也包含了关键信息。
  4. 考虑引入向量搜索 :如果问题是语义不匹配,如前述“密码哈希” vs “加密存储”,那么就需要按照5.1节所述,实现语义搜索功能。

6.4 数据库文件过大或性能下降

问题现象 :随着记忆条数增长(例如超过10万条),查询速度变慢,数据库文件膨胀。

解决方案

  1. 创建索引 :确保在常用查询条件涉及的列上建立了索引。可以通过CLI连接到数据库检查:
    sqlite3 ~/.engram/memory.db
    .indexes  # 查看现有索引
    
    如果缺少索引,可能需要修改初始化脚本,添加如 CREATE INDEX idx_memories_project ON memories(project); 这样的语句。
  2. 执行VACUUM :这能重建数据库,整理碎片,减小文件大小。
    sqlite3 ~/.engram/memory.db "VACUUM;"
    

    注意 :VACUUM操作会暂时占用大量磁盘空间(因为会创建临时文件),并且在此期间数据库会被锁定。建议在服务低峰期进行。

  3. 实施数据归档策略 :并非所有记忆都需要永久热存储。可以编写脚本,将超过一定时间(如6个月)且长期未被访问的记忆,移动到另一个归档数据库或压缩存储。engram的查询可以同时搜索主库和归档库。

6.5 与特定AI智能体集成失败

问题现象 :Claude Code能调用,但另一个工具无法工作。

排查思路

  1. 检查API兼容性 :确认该AI工具支持调用外部HTTP API,并且其请求格式(Headers, Body)是否符合engram API的预期。你可能需要为不同的工具编写一个简单的“适配层”或修改engram的API以支持更通用的格式。
  2. 检查网络可达性 :如果AI工具运行在容器或特殊网络环境中(如某些云IDE),确保它能访问到engram服务所在的IP和端口。
  3. 查看工具日志 :AI工具通常会有自己的日志或调试模式,查看它发送请求和接收响应的具体内容,是定位问题最快的方法。

一个通用调试技巧 :在启动engram服务器时,使用更详细的日志级别,并直接输出到控制台,以便实时观察所有 incoming 请求。

# 修改config.yaml中logging.level为"DEBUG",然后运行
uvicorn src.server:app --host 0.0.0.0 --port 8000 --log-level debug

这样,每一个API请求的细节都会打印出来,你可以清晰地看到请求体是否正确,从而判断是发送方还是接收方的问题。

更多推荐