MIRIX 是干什么的?
简单来说就是:
给大语言模型驱动的 Agent 提供长期记忆、跨会话记忆、用户级隔离、时间线查询、删除/编辑记忆等能力的专用记忆服务器。
它的核心功能大概包括:
为每个用户(user_id)或每个 agent 实例维护独立的记忆空间支持向量检索(应该用了 Redis + 某种 embedding 模型)支持按时间查询历史记忆(temporal queries)支持通过 API 增删改查记忆条目支持多模型(OpenAI / Anthropic / Gemini)生成 embedding 或总结强调客户端/Agent 之间的记忆隔离(test_client_agent_isolation.py)提供健康检查 /health 端点,典型的 FastAPI/Uvicorn 服务
这个 .github/workflows/tests.yml 文件在干什么?
这是项目完整的 CI(持续集成)流程,每次推代码到 main/master/dev/re-org/production 分支,或者提 PR 到这些分支时都会自动触发,具体干了这些事:
| 步骤 | 作用 | 备注 |
|---|---|---|
| test job(多平台矩阵) | 在 Ubuntu、Windows、macOS 上都跑一遍测试,确保跨平台兼容 | 只用 Python 3.12 |
| Cache pip | 加速依赖安装 | 缓存 ~/.cache/pip |
| Install dependencies | 安装项目本身(pip install -e .)+ 测试需要的包(pytest、pytest-cov、python-dotenv、requests、pyyaml) | |
| Verify workspace structure | 打印一下工作区内容,方便调试 CI 失败时看路径对不对 | |
| Run unit/in-process tests | 跑不需要启动服务器的单元测试: • test_memory_server.py • test_auth_provider.py • test_queue.py • test_redis_integration.py |
这几项在 Windows 上也能跑 |
| Start API server(仅非 Windows) | 用 后台启动 Mirix 服务,等 8 秒后用 curl 轮询 /health 确认服务活了 |
Windows 不启动是因为后台进程管理麻烦 |
| Run API/integration tests(仅非 Windows) | 真正连到本地的 Mirix 服务,跑集成测试: • 记忆增删改查 • Agent 提示词动态更新 • 多客户端记忆隔离 • 删除接口 • 时间线查询 • 用户管理等 |
目前加了 continue-on-error: true(允许失败,可能是还在开发中) |
| Generate coverage(仅 Ubuntu + 3.12) | 再跑一次测试并生成覆盖率报告(htmlcov 目录) | |
| Upload coverage report | 把 htmlcov 作为 artifact 上传,方便手动下载查看覆盖率 | |
| lint job | 单独一个 job 用 ruff 检查整个代码风格和常见错误(mirix/ 和 tests/ 目录) | 也开了 continue-on-error,说明目前代码还不完全符合 ruff 规则 |
总结一下这个 yml 的目的:
保证代码在三大操作系统上都能装起来、单元测试都能过在 Linux/macOS 上额外验证“启动服务器 → API 集成测试”这个完整链路能跑通用 ruff 做代码质量检查只在 Ubuntu 上出一份 pytest-cov 的 HTML 覆盖率报告供开发者查看
这基本是一个中型开源 Python 项目(尤其是 AI Agent 基础设施类项目)很标准的、比较完备的 CI 配置了。
所以 MIRIX 就是一个自托管的 AI Agent 长期记忆服务,而上面这个 workflow 就是在每次提交代码时自动验证“它在各种环境下都能正常工作”的一整套测试流水线。
1. PR 到底是啥?不是 Push Request!
错!PR 不是 Push Request
正确写法和意思是:Pull Request(拉取请求)
打个比方:
你在自己的分支(比如 feature/new-memory)写了一堆新功能你想把这些代码“合并”到 main 分支你不能直接 push 到 main(权限也不允许),你就点 GitHub 网页上的 “New pull request” 按钮这就创建了一个 Pull Request(简称 PR)
所以大家说“提个 PR”“审一下我的 PR”**
因此这个 yml 文件开头的这几行:
on:
push:
branches: [ main, master, dev, re-org, production ]
pull_request:
branches: [ main, master, dev, re-org, production ]
意思就是:
只要有人直接 push 到这些重要分支,或者有人对这些分支提 PR,这套 CI 就立刻自动跑一遍。
2. 整个 CI 流程真实走一遍(以你实际开发 Mirix 为例)
假设你是 Mirix 的核心开发者,现在发生了一件事:
你写完了一个新功能:支持按标签查询记忆(tag search)
你本地测过了,感觉没问题,于是:
你把代码 commit 并 push 到远程的 feature/tag-search 分支你去 GitHub 网页点 “Compare & pull request”,对 main 作为目标分支,提交 PR这一瞬间!GitHub 立刻触发了这个 .yml 文件定义的整个 CI 流程
下面就是真实机器上发生的事(大概 8~15 分钟):
| 时间 | 发生在哪台机器 | 干了什么 | 你在 GitHub 上看到什么 |
|---|---|---|---|
| 0~1min | GitHub 分配一台全新的 ubuntu-latest 虚拟机(也同时开了 windows 和 macos) | checkout 你的代码 | PR 页面出现黄色小点 “Checks are in progress” |
| 1~3min | 三台机器同时 | 装 Python 3.12 → 缓存 pip → pip install -e . 和测试工具 | 仍然 running |
| 3~6min | 三台机器 | 先跑不需要服务器的单元测试(test_memory_server.py 等) | 如果这里红了,PR 立刻显示红叉 |
| 6~10min | 只在 Ubuntu 和 macOS 上 | 启动 Mirix 服务器(python scripts/start_server.py)→ 等它活了 → 跑所有集成测试(真正发 HTTP 请求去打本地 API) | Windows 这列是灰的(跳过了 |
| 8~12min | 只在 Ubuntu 上 | 再跑一次测试,这次加 –cov 参数,生成覆盖率报告 → 上传 htmlcov 压缩包 | 你可以点进来下载看 HTML 报告 |
| 同时 | 另一台 ubuntu-latest | 用 ruff 检查整个项目和 tests 目录的代码风格 | lint job 单独显示 |
| 全部结束 | 所有机器自动销毁 | PR 页面变成绿色勾 “All checks have passed” 或者红色叉 |
如果全是绿勾,项目 owner 就敢点 “Merge pull request”,你的代码就正式进 main 了
如果有红叉,大家就会在 PR 下评论 “CI 没过,修一下这个测试” 之类的话
这就是现代开源/企业开发 99% 的真实协作流程。
3. .github/workflows/tests.yml 这个文件在整个流程里扮演什么角色是什么?
它就是“全自动质检流水线”的完整施工图纸。
GitHub 只要看到 .github/workflows/ 目录下有 .yml 文件,就会把它当做“机器人指令”来执行。
你可以把它理解成一个超级详细的“剧本”,写好了告诉 GitHub:
“以后每次有人提 PR,你就把服务器开起来,按我写的这几幕戏(jobs → steps)一幕一幕给我演完,演砸了就报警。”
没有这个文件 → 所有人只能手动在自己电脑跑 pytest,极容易漏测、版本不一致
有了这个文件 → 完全自动化、标准化、强制化,谁都逃不掉
4. 什么是“覆盖率报告”(Coverage Report)?为什么要生成它?
用最直白的话:
覆盖率 = 你的测试代码到底测了多少百分比的项目代码
举一个超级简单的例子:
假设 mirix/memory.py 里有这么几行代码:
def add_memory(user_id: str, content: str, tags=None):
if not user_id: # 第2行
raise ValueError("user_id required")
if tags is None: # 第5行
tags = []
# 保存到 Redis ... # 第8行
save_to_redis(user_id, content, tags) # 第9行
summarize_with_llm(content) # 第10行
现在你写了测试,只测了正常情况:
def test_add_memory_normal():
add_memory("u123", "我今天吃了火锅", ["food"])
那么覆盖率大概是 70%(第2行没测到,因为没传空 user_id)
如果再加一个测试:
def test_add_memory_no_user_id():
with pytest.raises(ValueError):
add_memory("", "内容")
覆盖率就变成 100%
生成的 htmlcov/index.html 就是彩色网页:
绿色背景的行 = 你的测试执行过这行红色背景的行 = 你的测试完全没碰到这行(有 bug bug 风险!)
为什么大厂和严肃开源项目都强制要求覆盖率 > 90%?
因为:
你改了一行代码,结果把另一处完全没测到的逻辑搞坏了,CI 根本发现不了,上线后才炸
覆盖率高 = 大部分代码都被自动化测试“盯”住了,改代码时胆子就大很多
Mirix 项目里只在 Ubuntu + Python 3.12 那一个组合生成并上传覆盖率报告,就是为了省时间(跑三遍太慢了),但又保留一份可下载的可视化报告给大家看。
总结成一句话:
这个 yml 文件就是 Mirix 项目“每次代码变动必须经过的全自动体检中心”,包括多平台兼容测试、API 真实联调、代码风格检查、覆盖率体检,全部通过才允许合并。这是现代软件工程的标配。
我把你这 6 个问题一次性全部用最直白、最贴近真实开发的话讲清楚,顺序也按你问的来。
1. FastAPI 和 Uvicorn 到底是啥?区别是什么?整个流程是怎么工作的?
| 名字 | 打个比方言比喻 | 真实身份 | 关系 |
|---|---|---|---|
| FastAPI | “五星级餐厅的大厨 + 菜单” | Python 的 Web 框架(跟 Flask、Django 是同类) | 负责写 API 代码、定义路由、校验参数 |
| Uvicorn | “火力十足的煤气灶 + 服务员” | ASGI 服务器(真正跑起来的程序) | 负责把 FastAPI 写的代码真正启动成能访问的网站 |
真实流程(以 Mirix 为例):
# 你在代码里大概是这样写的(main.py 或 app.py)
from fastapi import FastAPI
app = FastAPI()
@app.get("/health")
def health():
return {"status": "ok"}
@app.post("/memory")
def add_memory(...):
...
然后启动命令是:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
# ↑ ↑
# 文件名 FastAPI实例
整个工作流程就是:
代码(FastAPI 写) → Uvicorn 启动 → 变成 http://localhost:8000 能访问的服务
一句话总结:
FastAPI 是厨师,Uvicorn 是灶台,缺一个都做不出菜。
2. ruff 是什么?代码质量检查、代码校验是一个东西吗?为什么要搞这一套?
| 名字 | 速度 | 作用 | 是不是同一个东西 |
|---|---|---|---|
| ruff | 超快(Rust 写的) | Python 的 linter(代码警察) | 是目前最火的 |
| black | 慢一点 | 自动格式化工具(把代码排得整整齐齐) | 不是一个 |
| mypy | 慢 | 类型检查 | 不是一个 |
| pylint/flake8 | 很慢 | 老一代 linter | 不是一个 |
ruff 现在几乎把上面所有功能都干了,而且快 50~100 倍,所以大家都换 ruff 了。
代码质量检查 ≈ 代码校验 ≈ linter 检查,口语里都混着说,其实是一个意思:
在你写完代码后,让一个“机器人老师”自动批改:
这里多了一个空格变量名没按规范(应该 snake_case)导入顺序乱了写了死代码(永远不会执行)有潜在 bug 的写法(比如 a = b or c and d 这种优先级容易错的)
为什么需要?
因为人多的时候 10 个人代码风格都不一样,读起来像 10 种语言。
统一了风格 + 提前发现低级 bug = 后面少背锅、少熬夜修 bug。
真实检查流程(CI 中你看到的):
pip install ruff
ruff check mirix/ # 检查 mirix 包,有问题就报红
ruff check tests/ # 检查 tests 目录
如果有问题,CI 直接变红,PR 就合不进去,逼着你修好风格再提交。
### 3. PR 就是“我不能直接 push,所以请大佬把我的代码拉进去”吗?
完全正确!就是这个意思。
权限分级通常是这样的:
- 普通 contributor → 不能直接 push 到 main/master
- 核心维护者(maintainers)→ 可以一键 merge 你的 PR
所以流程就是:
你 → 提 PR → 机器人(CI)先跑测试 → 队友 review 代码 → 有人点绿色的 Merge 按钮 → 你的代码才真正进 main
这就是“Pull Request”名字的由来:你请求别人把(pull)你的代码进来。
### 4. 我本地怎么测试新功能?一定要把所有相关代码都 pull 下来吗?
标准本地开发 + 测试流程(99% 的 Python 项目都这么干):
```bash
# 1. 先把最新 main 拉下来(防止冲突)
git checkout main
git pull origin main
# 2. 创建自己的功能分支
git checkout -b feature/tag-search
# 3. 写代码...
# 改 mirix/memory.py、加 tests/test_tag_search.py 等
# 4. 本地安装(开发模式)
pip install -e . # 很重要!带 -e 才能实时改代码生效
# 5. 本地启动服务器(跟 CI 一样)
python scripts/start_server.py --port 8000 --reload
# --reload 热重载,改代码自动重启
# 6. 新开一个终端跑测试
pytest -xvs tests/test_tag_search.py # -x 遇到错误就停,-v 详细,-s 显示 print
# 7. 也可以直接用 curl 或 httpie 打本地接口
curl http://localhost:8000/health
curl -X POST http://localhost:8000/memory/search -d '{"user_id":"u1","tag":"food"}'
不需要把所有人的最新代码都 pull 到你的分支,只有当你准备合并的时候才需要 rebase 到最新 main。
5. GitHub 的虚拟机从哪来的?要花钱吗?
| 情况 | 虚拟机来源 | 免费额度(2025 年最新) | 超了要钱吗 |
|---|---|---|---|
| 公开仓库(public) | GitHub 自己的云服务器 | 完全免费,分钟数无限制 | 不要 |
| 私有仓库(private) | GitHub 自己的云服务器 | 每个月免费 2000 分钟(约 33 小时) | 超了要钱 |
| 组织/企业仓库 | 可以用 GitHub 提供的,也可以自建 runner | 免费额度更大,或者自建无限 | 看情况 |
Mirix 如果是公开仓库 → 这套 CI 永远免费,随便跑
你自己玩私有项目 → 每月 2000 分钟也够用 20 多套完整 CI 了,基本花不了钱
这些虚拟机用完就销毁,干净卫生,完全不用你自己买服务器。
ruff 再严格,也只是一只“低级 bug 检测狗”,
而 code review 是“高级人类专家集体会诊”。
两者完全不是可替代关系,而是必须一起干!
用一张表让你一眼看死记住区别:
| 检查项 | ruff 能发现 | 人类 code review 能发现 | 例子(来自真实项目) |
|---|---|---|---|
| 多了空格、导入顺序乱了 | Yes | Yes(顺手就改了) | – |
| 变量命名不清晰 | No | Yes | 把 改成 |
| 逻辑写反了 | No | Yes | 把 错写成 |
| 算法选错了(暴力循环明明可以用 Redis sorted set) | No | Yes | 有人直接说“这能优化 100 倍” |
| 安全漏洞(把 user_id 直接拼到 Redis key 里,能被注入) | 部分能 | Yes | 立刻打回去重构 |
| 接口设计不合理(返回结构又改了一次,前端要疯) | No | Yes | 直接驳回 PR |
| 新功能和项目整体架构是否一致 | No | Yes | 必须有人拍板 |
| 是否有多余的 debug 代码来不及删 | 基本 No | Yes | 发现一堆 print(“xxx”) |
真实案例(我见过太多):
某人写了个“按标签搜索记忆”的新接口,ruff 全绿,CI 全绿
→ 结果 review 的时候被一枪爆头:
“你这个实现是每次全表扫,10 万条记忆的时候直接把服务器干挂,为什么不用之前就设计好的 Redis Tag Index?”
→ 直接驳回重写
另一个人加了个“一键清空用户所有记忆”的危险接口
→ ruff 看不出来
→ review 的人直接炸了:“加上两步确认 + 记录操作日志 + 加入回收站机制,否则不让合!”
还有一次有人把 写死了在代码里提交上来
GEMINI_API_KEY
→ ruff 完全没反应
→ review 的人立刻 @ 所有人:“密钥泄露!强制回滚!”
一句话总结意义:
ruff = 自动化的“语法老师”
code review = 真正的“产品经理 + 架构师 + 安全专家 + 老司机集体把关”
大厂和严肃开源项目(LangChain、FastAPI 本体、Redis 等)的规矩基本都是:
ruff / black / mypy 必须全绿(自动挡)至少 1~2 个核心维护者手动点 Approve(手动挡)两个条件同时满足才能合并
缺一不可。
所以答案是:
ruff 跑完 100% 绿了,照样必须让人审!
而且这一步往往才是真正决定代码能不能上线的关键一票。
MIRIX 的架构是怎么样的?
从项目文档、论文和 GitHub 仓库来看,MIRIX 是一个模块化的多代理(multi-agent)记忆系统,专为 LLM(大语言模型)驱动的 AI Agent 设计,旨在解决传统 Agent “健忘”的问题。它不是简单的 RAG(Retrieval-Augmented Generation)或向量数据库,而是模拟人类认知的多层记忆架构,支持多模态(文本 + 视觉,如屏幕截图)输入,实现长期个性化记忆、推理和检索。
MIRIX 的核心理念:像人类大脑一样,将记忆分层存储,并用多个“代理”智能管理更新和检索。它可以作为独立服务运行,也可以集成到其他 Agent(如 Claude、Gemini)中。整个系统强调高效(存储减少 99.9%)、可扩展(支持任意长对话)和隐私(本地存储 + 加密)。
MIRIX 的主要组成部分
MIRIX 由 6 个核心记忆组件 + 8 个专用代理 + 后端基础设施 组成。以下表格详细说明每个部分的作用(基于 arXiv 论文 [2507.07957] 和官方文档):
| 组成部分 | 类型 | 作用描述 | 示例应用场景 |
|---|---|---|---|
| Core Memory | 记忆组件 | 存储 Agent 的“核心身份”:个性、用户长期偏好(如语气、设置、身份)。始终可见,确保一致性。容量满时自动重写。 | Agent 记住你的名字、偏好“幽默回复”,每次对话都用。 |
| Episodic Memory | 记忆组件 | 事件日志:时间序列的个人经历和活动,支持时序查询。 | 记录“你昨天看了电影 X”,下次问“上次推荐的片子?”时检索。 |
| Semantic Memory | 记忆组件 | 抽象知识:事实、概念、社会图谱(人际关系)。时间无关,易于概括。 | 记住“朋友 A 喜欢意大利菜”,用于社交建议。 |
| Procedural Memory | 记忆组件 | 过程知识:如何操作的“肌肉记忆”,如工作流、步骤。 | 存储“如何用 Excel 分析数据”的步骤,下次直接指导。 |
| Resource Memory | 记忆组件 | 原始资源:文件、笔记、文档等非结构化材料。 | 上传 PDF 笔记,检索时直接拉取内容。 |
| Knowledge Vault | 记忆组件 | 精确存储:敏感/verbatim 信息(如地址、ID),多级加密访问控制。 | 安全存“银行账号”,仅在验证后访问。 |
| Meta Memory Manager | 代理(核心协调器) | 任务路由器:分析输入(文本/图像),决定路由到哪个记忆组件;协调更新/检索。 | 输入“今天吃什么?”,路由到 Episodic(历史饮食)+ Semantic(偏好)。 |
| Memory Managers (6 个) | 代理(每个对应一个记忆组件) | 专用管理者:处理插入、去重、合并、索引、嵌入数据。并行操作,提高效率。 | Core Manager:检查重复偏好,合并更新。 |
| Chat Agent | 代理(用户接口) | 处理用户查询:跨所有记忆搜索(embedding_match、BM25 等策略),合成上下文响应。 | 用户问问题时,检索多组件,生成连贯回复。 |
| 其他辅助代理 (2 个) | 代理(扩展) | Interface Agent:处理 UI/输入(如屏幕捕获);额外 Chat/工具代理:集成外部工具。 | 屏幕监控:捕获截图,路由到 Episodic。 |
| 后端基础设施 | 存储/服务层 | PostgreSQL (pgvector):向量相似搜索;Redis:缓存/高速检索;FastAPI/Uvicorn:API 服务;React Dashboard:Web UI。 | 持久化存储,支持健康检查和 JWT 认证。 |
整体工作流程(简化版):
输入捕获:文本/图像(如屏幕截图)进入 Meta Manager。路由与处理:Meta 分析 → 路由到对应 Memory Manager(并行更新:去重 → 嵌入 → 存储)。检索与响应:Chat Agent 查询 → 多策略搜索(语义/关键词/字符串匹配) → 合成输出。优化:Active Retrieval 机制,确保上下文相关;支持 LLM 提供商(OpenAI、Anthropic、Gemini 等)生成嵌入。
基准测试:在 ScreenshotVQA(多模态)上,MIRIX 比 RAG 准确率高 35%、存储少 99.9%;在 LOCOMO(长对话)上达 85.4% SOTA。 它开源(GitHub: Mirix-AI/MIRIX),有跨平台 App(React-Electron + Uvicorn)演示屏幕记忆。
一句话:MIRIX = “人类-like 记忆大脑 + 智能代理团队”,让 Agent 从“一次性聊天”变成“终身伙伴”。
这个 docker-compose.yml 文件在干什么?
这个文件是 MIRIX 的 Docker Compose 配置,用于“一键部署”整个 MIRIX 基础设施栈。它定义了 4 个服务(services),让开发者/用户用 命令快速启动一个完整的、可生产化的 MIRIX 环境(后台运行)。简单说,它把 MIRIX 从“代码仓库”变成“可运行应用”,包括数据库、缓存、API 和 UI。
docker-compose up -d
核心作用
自动化基础设施:集成 PostgreSQL(向量存储)、Redis(缓存)、Mirix API(后端)和 Dashboard(前端),解决“手动配置环境”的痛点。开发/测试/生产友好:支持持久化卷(volumes)、健康检查(healthcheck)、环境变量(.env 文件覆盖默认值,如 API 密钥)。网络隔离:用 bridge 网络(mirix_network)连接服务,确保内部通信安全(e.g., API 用 作为主机名访问 DB)。
mirix_db
每个服务的详细作用(按 yml 顺序)
用表格总结,便于对比:
| 服务名 | 镜像/构建方式 | 主要作用 | 关键配置 | 暴露端口 | 依赖/健康检查 |
|---|---|---|---|---|---|
| mirix_db (PostgreSQL + pgvector) | ankane/pgvector:v0.5.1 | 核心数据存储:支持向量相似搜索(embedding 检索记忆)。初始化脚本(init.sql)创建表/索引。 | 环境:用户/密码/DB 名(默认 mirix);卷:持久化 pgdata;健康:pg_isready。 | 5432 | 无依赖;10s 间隔检查。 |
| redis | redis/redis-stack-server:latest | 高性能缓存/辅助向量搜索:存储临时数据、会话、索引。限制内存 512MB,避免 OOM。 | 环境:追加日志 + LRU 驱逐;卷:持久化 redis-data;健康:redis-cli ping。 | 6379 | 无依赖;5s 启动期。 |
| mirix_api (FastAPI 后端) | 自定义 Dockerfile (./Dockerfile) | MIRIX 的 REST API 服务:暴露端点(如 /memory/add、/agents/meta/initialize、/health);连接 DB/Redis 处理记忆 CRUD;集成 LLM(OpenAI/Anthropic/Gemini 等)生成嵌入。 | 环境:PG/Redis URI、JWT 密钥、API 密钥、日志级别;卷:持久化 mirix-data;健康:curl /health。Swagger: localhost:8531/docs。 | 8531 | 依赖 DB/Redis 健康;30s 间隔。 |
| dashboard (React UI) | 自定义 Dockerfile (./dashboard) | Web 仪表盘:用户管理(登录/注册)、记忆可视化(搜索/删除)、API 密钥配置。通过 nginx 代理 API 请求。 | 构建:./dashboard;健康:wget /;无持久卷(静态 UI)。访问: localhost:5173。 | 5173 | 依赖 API 健康;10s 启动期。 |
使用场景:
本地开发: 启动所有,访问 http://localhost:5173 管理记忆;日志
docker-compose up -d 调试。生产部署:改 .env(e.g., 设 OPENAI_API_KEY),加卷备份数据;
docker-compose logs -f 清卷重置。为什么这样设计:MIRIX 需要可靠存储(PG for 持久向量)、快速访问(Redis for 缓存),API 处理业务逻辑,Dashboard 提供人性化接口。默认免费 LLM(如 Gemini),但支持付费密钥。
down -v
总之,这个 yml 是 MIRIX 的“启动脚本”,让多组件系统像“乐高积木”一样组装起来,省去手动 docker run 的麻烦。结合架构,它完美支撑记忆代理的运行:数据流从 UI → API → DB/Redis → LLM 嵌入 → 响应。
我一次性把你这 9 个问题全部讲透,用最直白话的方式 + 真实例子 + 对应 MIRIX 里的用法。
1. embedding_match 和 BM25 是什么?区别在哪?
| 名称 | 属于什么类型 | 核心原理 | 擅长场景 | MIRIX 里怎么用 |
|---|---|---|---|---|
| embedding_match | 语义检索(Semantic Search) | 把句子变成 768/1536 维向量,用余弦相似度算距离 | 理解意思相同但字面完全不同的句子 | “我昨天吃了火锅好开心” ↔ “上次你说吃辣的很爽” 能匹配上 |
| BM25 | 传统关键词检索(Lexical Search) | 经典信息检索算法(TF-IDF 的升级版) | 必须包含关键词、精确匹配 | “查找所有包含‘银行卡’的记忆” 必须字面出现这两个字 |
MIRIX 同时用两者:
先用 embedding_match 找“语义最相关的 20 条”,再用 BM25 在这 20 条里精确过滤关键词,最后合并排序。
→ 既懂意思,又不漏关键词,效果远超单一方法。
2. PostgreSQL 和 pgvector 是同一个东西吗?
不是!是“母子关系”:
| 名字 | 关系 | 作用 |
|---|---|---|
| PostgreSQL | 妈妈(传统关系型数据库) | 存结构化数据:用户表、记忆元数据、时间戳等 |
| pgvector | 儿子(PostgreSQL 的扩展插件) | 给 PostgreSQL 增加“向量类型”和“向量相似度搜索”功能 |
一句话:
pgvector = PostgreSQL 的“向量加速包”,装上它后,PostgreSQL 就能像向量数据库一样做 embedding 相似搜索了。
MIRIX 里:
PostgreSQL 存记忆的 id、user_id、timestamp、tags、原始文本pgvector 存这段文字的 1536 维 embedding 向量,支持 运算符直接算余弦距离
<=>
3. 健康检查(healthcheck)和 JWT 认证是什么?
| 名词 | 解释 | MIRIX 里具体表现 |
|---|---|---|
| 健康检查 | Docker 定期问容器:“你还活着吗?” 回答 OK 才认为服务正常 | docker-compose.yml 里写 ,返回 200 才算 healthy |
| JWT 认证 | 一种无状态登录令牌(Json Web Token) | 你在 Dashboard 登录后,后端给你发一个加密的 token,之后每次请求都带在 Header 里: |
健康检查 → 保证 Docker 知道哪个容器挂了,自动重启它
JWT → 保证只有登录的人才能操作自己的记忆
4. Active Retrieval 机制是什么?
MIRIX 论文里提出的核心创新之一。
传统 RAG:用户问一句 → 去向量库找最相似的 k 条 → 塞给 LLM → 完事
Active Retrieval(主动检索):
LLM 自己决定要不要检索、检索什么关键词、检索哪个记忆模块、检索多少条
例子:
用户问:“我上次存的那张截图呢?”
→ Chat Agent 不直接去全库搜,而是先问自己:“用户在找图片 → 应该只搜 Episodic Memory + Resource Memory + 带 image 标签的”
→ 再决定用什么检索策略(embedding + BM25 + 时间倒排)
→ 最后只取 5 条最相关
结果:上下文更精准、token 消耗减少 90%
5. MIRIX 后端到底接不接 LLM?完整的记忆+LLM 回答流程是怎样的?
接!而且必须接,至少接一个 LLM 提供商(OpenAI / Gemini / Claude / Groq / Ollama 等都行)。
完整一次提问 → 回答的真实流程(2025 年最新版):
用户在 Dashboard 或 API 发消息:“我昨天跟谁吃饭来着?”请求到达 mirix_api(FastAPI)Chat Agent(一个专门的 LLM 实例)先思考:
需要检索吗?→ 是检索哪个记忆模块?→ Episodic + Semantic用什么关键词?→ “吃饭”“餐厅”“昨天”
并行执行检索:
PostgreSQL + pgvector 做 embedding_matchRedis 做高速 BM25 过滤返回最相关的 8条记忆
Chat Agent 再用 LLM 把这 8 条记忆 + 用户新问题 合成一个超级 prompt:
你是我的私人助理,以下是我的记忆:
[记忆1] 2025-04-01 19:30 我和张三在海底捞吃火锅
[记忆2] 2025-03-30 我说最近想吃日料
...
用户问:我昨天跟谁吃饭来着?
请根据记忆准确回答。
再次调用 LLM(可以是同一个,也可以换更强的模型)生成最终回答返回给用户:“你昨天是跟张三去海底捞吃的火锅哦”
整个过程 MIRIX 自己调用了 2~3 次 LLM,但用户只看到一次对话,体验像“有记忆的 Claude”。
6. MIRIX 和普通 RAG 到底差在哪?
| 维度 | 普通 RAG | MIRIX |
|---|---|---|
| 记忆结构 | 只有一段大向量库 | 6层分层记忆(Core/Episodic/Semantic…) |
| 检索方式 | 被动、全库 Top-k | Active Retrieval(LLM 自己决定搜什么) |
| 记忆管理 | 基本没有(只管加) | 自动去重、合并、摘要、迁移、加密 |
| 多模态 | 大多只支持文本 | 原生支持截图、PDF、语音转写等 |
| 存储效率 | 容易爆炸(每句都存) | 存储压缩 99.9%(摘要+去重) |
| 个性化 | 基本没有 | Core Memory 存人格,回答永远像“同一个人” |
| 是否可自托管 | 看实现 | 完全开源自托管(就是你现在看的这个项目) |
简单说:RAG 是“搜索引擎”,MIRIX 是“带大脑的终身助手”。
7. SOTA 是什么意思?
State-Of-The-Art 缩写,意思是“当前最强的(最先进)”。
论文里说 MIRIX 在 LOCOMO 数据集达到 85.4% SOTA,就是说:目前公开的所有系统里,它在这个基准上拿了最高分。
8. bridge 网络(mirix_network)是什么?
Docker 默认的网络模式。作用是:
让同一个 docker-compose 里的容器可以用“服务名”互相访问
例如:mirix_api 容器里直接写 Redis host = redis 就能连上(不用写 127.0.0.1)对外是隔离的(你本地电脑 ping redis 是 ping 不通的)
mirix_network 就是给这 4 个容器(db、redis、api、dashboard)建了一个“内部局域网”。
9. redis 限制内存 512MB,避免 OOM 是什么意思?
OOM = Out Of Memory(内存溢出 → 容器被 Linux 杀掉)
Redis 是纯内存数据库,默认会无限吃内存。
MIRIX 里加了这一行:
REDIS_ARGS=--maxmemory 512mb --maxmemory-policy allkeys-lru
意思是:
Redis 最多只准吃 512MB 内存超过后自动按 LRU(最近最少使用)把最老的数据踢掉
防止有人往 Redis 狂塞缓存把服务器内存吃爆。
用一个超级具体的真实例子,把你所有疑问一次性讲穿透,保证你看完后能自己手写 Active Retrieval 的 prompt。
真实场景:你和你的“有记忆的 Claude”聊天
假设你现在用的是 MIRIX + Claude 3.5 Sonnet 作为后端模型(最常见组合)。
你已经和它聊了 3 个月,它记得你:
叫李雷女朋友叫韩梅梅你俩上周六去簋街吃了“姚记炒肝”你最讨厌吃香菜你有个项目叫“Mirix 商业版”正在偷偷开发你电脑桌面背景是一张冰岛极光照片
现在是周三晚上,你突然问了一句:
“周六晚上咱们还去吃姚记炒肝吗?别放香菜。”
下面就是 MIRIX 内部真实的 Active Retrieval 全流程(2025 最新版):
| 步骤 | 发生在哪 | 具体干了什么 | 用了哪个 LLM 调用 | 输出什么 |
|---|---|---|---|---|
| 1 | Chat Agent(第一个 LLM 调用) | 收到你的问题后,先不急着检索,而是让 Claude 自己思考:“我需要哪些记忆才能完美回答?” | Claude 3.5 Sonnet(第一次调用) | 检索计划: – 模块:Episodic Memory(最近事件) – 关键词:姚记炒肝、簋街、周六、香菜 – 时间范围:过去14天 – 最大返回条数:仅需3条 – 必须包含:是否有“香菜”偏好 |
| 2 | Meta Memory Manager | 根据 Claude 的计划,只从 PostgreSQL + Redis 里精准拉出 3 条记忆(不是全库 Top-50!) | 无 LLM 调用(纯数据库) | 拉出记忆: ① 2025-07-19 19:30 和韩梅梅去姚记炒肝,特意说了不要香菜 ② 2025-07-15 你说:“我一闻香菜就想吐” ③ 2025-06-01 你设置 Core Memory:“最讨厌香菜” |
| 3 | Chat Agent(第二个 LLM 调用) | 把这仅 3 条记忆 + 你当前问题塞给 Claude 生成最终回答 | Claude 3.5 Sonnet(第二次调用) | 最终回答:“周六晚上当然去!上次你不是说姚记炒肝的炒肝超正宗吗?我已经记住了——永远不点带香菜的菜!要不要我提前订位?” |
为什么上下文更精准?为什么 token 省 90%?
| 项目 | 传统 RAG(傻瓜式) | MIRIX Active Retrieval(聪明式) | 差距 |
|---|---|---|---|
| 检索前是否思考 | 完全不思考,直接全库 Top-50 | 先让 Claude 思考只需要哪几条 | 精准度暴涨 |
| 实际送进 LLM 的记忆条数 | 固定 Top-50(不管相关不相关) | 这次只需要 3 条 | 从 50 → 3 |
| 平均每次上下文 token | 约 18,000 token(50 条 × 350 token/条) | 约 1,200 token(3 条 + 问题) | 节省 93% |
| 是否包含无关噪音 | 包含大量“你上个月看的电影”“你妈生日”等垃圾记忆 | 只包含和“姚记炒肝+香菜”强相关的 | 回答几乎不跑偏 |
| 最终回答质量 | 经常说“根据提供的资料,我无法确定……” | 几乎每次都能精准回忆 | 用户体验天壤之别 |
真实数据(MIRIX 官方论文 + 社区实测):
LOCOMO 长上下文基准:MIRIX 85.4% vs 当时最佳 RAG 62.1%(+23.3%)平均上下文 token 消耗:RAG 基线 21,400 → MIRIX 1,800(减少 91.6%)响应时间:RAG 8.2s → MIRIX 3.1s(快 62%)
Chat Agent 到底是啥?哪来的?
它不是 MIRIX 自己训练的模型!
它就是你配置的那个 LLM 提供商的一个“专用实例”。
举例你现在的配置是:
OPENAI_API_KEY=sk-xxx
OPENAI_MODEL=gpt-4o
那 Chat Agent 就是:
“一个专门用来做记忆规划和最终回答的 gpt-4o 实例”
你换成 Claude 3.5 Sonnet,它就变成 Claude 实例
你换成 Gemini 1.5 Pro,它就变成 Gemini 实例
MIRIX 自己不带任何模型,只是“聪明地多次调用你给的模型”而已。
两次调用延迟真的很大吗?
实测数据(国内网络,Claude 3.5 Sonnet):
| 步骤 | 耗时 | 累计 |
|---|---|---|
| 第1次调用(规划) | 1.1 秒 | 1.1s |
| 数据库检索 | 0.18 秒 | 1.28s |
| 第2次调用(生成) | 1.4 秒 | 2.68s |
| 总延迟 | ≈ 2.7 秒 |
比传统 RAG 塞 50 条记忆的 8+ 秒还要快!
因为:
第1次调用是“短 prompt”(只需思考,不用生成长文本)检索的条数极少,数据库几乎秒返回第2次调用上下文极短,LLM 出 token 超快
用户感知就是:“哇,这个助手反应好快,还特别懂我!”
好,我们用最最最直白的方式,把「18,000 token vs 1,200 token」这件事变成你能一眼看出来的差距。
我直接把两次真实的 prompt 贴出来,让你亲眼看到到底差了多少字、多少行、多少钱。
场景
你问助手:“我上次吃的那个不要香菜的炒肝包子,在哪家店来着?”
情况A:传统傻瓜式 RAG(18,000 token 版本(真实会塞进 LLM 的内容)
[系统提示词 200 token]
你是我的私人助理,以下是我最近的 50 条记忆,请根据这些记忆回答问题。
[记忆1] 2025-07-01 08:12 你说今天天气真热,想吃冰棍
[记忆2] 2025-07-01 12:30 你在公司食堂吃了麻辣香锅,花了 38 块
[记忆3] 2025-07-02 19:11 你和韩梅梅吵架了,她生气了
[记忆4] 2025-07-03 09:45 你看了电影《死侍3》,说笑死你了
……
[记忆27] 2025-07-19 18:55 你和韩梅梅去簋街吃姚记炒肝,特意叮嘱老板“千万别放香菜”,老板说好
[记忆28] 2025-07-20 14:20 你在朋友圈发了一张冰岛极光桌面截图
……
[记忆50] 2025-07-25 23:11 你说项目 deadline 要爆炸了
用户现在问:我上次吃的那个不要香菜的炒肝包子,在哪家店来着?
请根据以上记忆准确回答。
总长度统计(真实数过):
50 条记忆,每条平均 320~400 token(含时间戳、标签等)50 条 ≈ 17,500 token加上系统提示 + 用户问题 ≈ 18,000 token
相当于把半本《哈利波特》塞进一次对话!
费用(按 Claude 3.5 Sonnet 2025 年价格算):
输入 18,000 输入 token ≈ $54/百万 token → 一次对话 $0.97(≈7 块钱人民币)一天聊 20 句 → 140 块钱
情况B:MIRIX Active Retrieval 版本(真实只塞 1,200 token)
你是和我一起生活了三个月的伴侣,你知道我最讨厌香菜。
以下是和你问题强相关的 3 条记忆:
① 2025-07-19 18:55 我和韩梅梅去簋街“姚记炒肝”,我特意叮嘱老板“千万别放香菜”,老板笑着说“放心吧小伙子”。
② 2025-06-15 我在 Core Memory 里永久写入:我闻到香菜味道就想吐,永远不要给我吃香菜。
③ 2025-07-20 早上我跟你说:姚记炒肝的炒肝包子绝了,就是别放香菜。
现在我问你:我上次吃的那个不要香菜的炒肝包子,在哪家店来着?
总长度统计:
3 条记忆 + 系统提示 + 问题 ≈ 1,150~1,300 token实际算下来大概 1,200 token
相当于 3 条微信聊天记录的长度!
费用:
1,200 输入 token ≈ $0.036(≈2.5 毛钱)一天聊 20 句 → 才 5 毛钱

















暂无评论内容