🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

积微 qingmingyiyang/Incremind

DeepSeek Harness
qingmingyiyang10 天前有提交已提供中文文档扫描:含敏感能力

靠增量经验积累记忆、修正认识、逐步形成理解的认知系统。

30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/qingmingyiyang/Incremind.git
按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · chat
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包Incremind(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:39:02

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 44 条)
  • 发起网络请求
    apps/desktop-electron/src/authenticated-local-gateway.cjs:63
    const response = await this.#fetch(`${active.origin}${pathname}`, {
  • 发起网络请求
    apps/desktop-electron/src/context-graph-import-ipc-controller.cjs:89
    const response = await this.fetch(new URL("/api/rebuild/context-graph-import-selections", requestSession.origin), {
  • 写入本地文件
    apps/desktop-electron/src/desktop-runtime-bootstrap-coordinator.cjs:113
    this.fs.mkdirSync(workingDir, { recursive: true });
  • 读取本地文件
    apps/desktop-electron/src/desktop-runtime-bootstrap-coordinator.cjs:183
    if (this.fs.existsSync(settingsPath)) return;
  • 写入本地文件
    apps/desktop-electron/src/desktop-runtime-bootstrap-coordinator.cjs:184
    this.fs.mkdirSync(this.path.dirname(settingsPath), { recursive: true });
  • 写入本地文件
    apps/desktop-electron/src/desktop-runtime-bootstrap-coordinator.cjs:185
    this.fs.copyFileSync(this.path.join(sidecarRoot, "config", "settings.toml"), settingsPath);
  • 读取本地文件
    apps/desktop-electron/src/doctor.cjs:162
    return check("electron_package_installed", fs.existsSync(packagePath), packagePath, "run npm install in apps/desktop-electron");
  • 读取本地文件
    apps/desktop-electron/src/doctor.cjs:167
    if (!fs.existsSync(pathFile)) {
  • 读取本地文件
    apps/desktop-electron/src/doctor.cjs:170
    const executableName = fs.readFileSync(pathFile, "utf-8").trim();
  • 读取本地文件
    apps/desktop-electron/src/doctor.cjs:172
    return check("electron_binary_available", fs.existsSync(executablePath), executablePath, "Electron binary is missing; reinstall Electron or check netw
  • 读取本地文件
    apps/desktop-electron/src/doctor.cjs:186
    return fs.readFileSync(filePath, "utf-8");
  • 发起网络请求
    apps/desktop-electron/src/document-pdf-ipc-controller.cjs:206
    const response = await this.fetch(`${requestSession.origin}${pathname}`, { method, headers, body: body === undefined ? undefined : JSON.stringify(body
  • 读取本地文件
    apps/desktop-electron/src/file-grant.cjs:54
    for await (const chunk of fs.createReadStream(filePath, { highWaterMark: 256 * 1024 })) hash.update(chunk);
  • 发起网络请求
    apps/desktop-electron/src/file-grant.cjs:92
    const request = http.request(endpoint, { method: "POST", headers, signal }, (response) => {
  • 读取本地文件
    apps/desktop-electron/src/main.cjs:119
    const value = JSON.parse(fs.readFileSync(path.join(app.getPath("userData"), PET_POSITION_FILE), "utf8"));
  • 写入本地文件
    apps/desktop-electron/src/main.cjs:133
    fs.mkdirSync(path.dirname(target), { recursive: true });
  • 写入本地文件
    apps/desktop-electron/src/main.cjs:134
    fs.writeFileSync(temporary, `${JSON.stringify({ x, y })}\n`, { encoding: "utf8", mode: 0o600 });
  • 写入本地文件
    apps/desktop-electron/src/main.cjs:135
    fs.renameSync(temporary, target);
  • 读取本地文件
    apps/desktop-electron/src/main.cjs:440
    const pointerStats = resolved.pointerPath ? fs.statSync(resolved.pointerPath) : null;
  • 发起网络请求
    apps/desktop-electron/src/memory-transfer-ipc-controller.cjs:116
    const response = await this.fetch(`${session.origin}/api/rebuild/memory-assets/export`, {
  • 发起网络请求
    apps/desktop-electron/src/memory-transfer-ipc-controller.cjs:160
    const response = await this.fetch(`${session.origin}/api/rebuild/memory/export/round-trip`, {
  • 发起网络请求
    apps/desktop-electron/src/memory-transfer-ipc-controller.cjs:197
    const response = await this.fetch(`${session.origin}/api/rebuild/memory/export/file`, {
  • 发起网络请求
    apps/desktop-electron/src/original-asset-ipc-controller.cjs:60
    const response = await this.fetch(
  • 发起网络请求
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:91
    const session = this._session(); const response = await this.fetch(`${session.origin}/api/rebuild/session-placement/exports`, { method: "POST", creden
  • 写入本地文件
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:96
    try { await this.fs.writeFile(pick.filePath, bytes, { flag: "wx" }); } catch (error) { throw new Error(error?.code === "EEXIST" ? "session_bundle_targ
  • 读取本地文件
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:102
    const sourcePath = pick.filePaths[0]; const stat = await this.fs.lstat(sourcePath);
  • 读取本地文件
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:104
    let bundle; try { bundle = bundleDto(JSON.parse(await this.fs.readFile(sourcePath, "utf8"))); } catch { throw new Error("session_bundle_invalid"); }
  • 发起网络请求
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:105
    const session = this._session(); const response = await this.fetch(`${session.origin}/api/rebuild/session-placement/imports`, { method: "POST", creden
  • 发起网络请求
    apps/desktop-electron/src/session-placement-transfer-ipc-controller.cjs:115
    const session = this._session(); const response = await this.fetch(`${session.origin}/api/rebuild/session-placement/recoveries/${encodeURIComponent(dt
  • 发起网络请求
    apps/desktop-electron/src/sidecar-supervisor.cjs:44
    const request = http.request(url, { method, headers, timeout: 1200 }, (response) => {
  • 发起网络请求
    apps/desktop-electron/src/sidecar-supervisor.cjs:288
    const response = await this.request(`${this.session.origin}/api/health`, { [SESSION_HEADER]: this.session.secret });
  • 发起网络请求
    apps/desktop-electron/src/sidecar-supervisor.cjs:291
    const probe = await this.request(`${this.session.origin}/api/desktop/runtime-roots/verify`, { [SESSION_HEADER]: this.session.secret }, { method: "POST
  • 发起网络请求
    apps/desktop-electron/src/sidecar-supervisor.cjs:383
    const response = await this.request(`${old.origin}/api/desktop/session/rotate`, {
  • 发起网络请求
    apps/desktop-electron/src/sidecar-supervisor.cjs:392
    const health = await this.request(`${next.origin}/api/health`, { [SESSION_HEADER]: next.secret });
  • 发起网络请求
    apps/desktop-electron/src/vault-restore-ipc-controller.cjs:88
    const response = await this.fetch(endpoint, {
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:15
    const { userDataDir, exists = fs.existsSync, readFile = (candidate) => fs.readFileSync(candidate, "utf8") } = options;
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:23
    function resolveRootConfig({ userDataDir, exists = fs.existsSync, readFile = (candidate) => fs.readFileSync(candidate, "utf8") }) {
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:78
    constructor({ userDataDir, exists = fs.existsSync, readFile = (candidate) => fs.readFileSync(candidate, "utf8"), writeFile = (candidate, value) => fs.
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:323
    function defaultTargetAvailable(candidate) { try { return fs.statSync(nearestExistingDirectory(candidate)).isDirectory(); } catch { return false; } }
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:327
    fs.accessSync(directory, fs.constants.W_OK);
  • 读取本地文件
    apps/desktop-electron/src/vault-root.cjs:339
    const stats = fs.lstatSync(entry);
  • 读取本地文件
    main.cjs:58
    if (!fs.existsSync(settingsPath)) {
  • 写入本地文件
    main.cjs:59
    fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
  • 写入本地文件
    main.cjs:60
    fs.copyFileSync(path.join(sidecarRoot, "config", "settings.toml"), settingsPath);
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 增量积累记忆
  • 修正已有认识
  • 逐渐形成理解

README

由 DeepSeek 最新模型翻译生成
简体中文 · English Incremind · 积微 只记增量的第二大脑 把你挑过的资料交给它:它整理、归档,只提炼你还不知道的部分,等你一键确认,才成为长期记忆。 快速开始 · 它能做什么 · 测评与验收 · 怎么用 · 架构 · 隐私 · 开发 项目介绍视频 从提交资料、确认增量认识,到带着已有积累再次提问,2 分 45 秒看完完整过程。中文配音,中英双语字幕 · 1080p60。 https://github.com/user-attachments/assets/8f51499d-bbfb-47a2-9ab0-91193313f1f0 下载视频 · 英文字幕(SRT) · 英文字幕(VTT) 为什么做它 我想打造一个能长期陪我工作的第二大脑。 这个想法来自日常调研:围绕同一个项目,每次向 AI 提问或交办任务,都要重新讲一遍背景、已有判断和之前找到的资料。知识积累了很多,对话却常常从头开始。 Incremind 的设计围绕两件事展开: 1. 把随手投喂变成持续积累。 接收文章、个人判断、录音、视频和随手记下的灵感,自动整理并归入对应的项目与场景,把资料沉淀成可以回看的知识和待确认的认识。 2. 带着已有积累理解问题并完成任务。
展开完整文档(README 剩余 1 节)
简体中文 · English

Incremind · 积微

只记增量的第二大脑

把你挑过的资料交给它:它整理、归档,只提炼你还不知道的部分,等你一键确认,才成为长期记忆。

快速开始 · 它能做什么 · 测评与验收 · 怎么用 · 架构 · 隐私 · 开发

项目介绍视频

从提交资料、确认增量认识,到带着已有积累再次提问,2 分 45 秒看完完整过程。中文配音,中英双语字幕 · 1080p60。

https://github.com/user-attachments/assets/8f51499d-bbfb-47a2-9ab0-91193313f1f0

下载视频 · 英文字幕(SRT) · 英文字幕(VTT)

为什么做它

我想打造一个能长期陪我工作的第二大脑。

这个想法来自日常调研:围绕同一个项目,每次向 AI 提问或交办任务,都要重新讲一遍背景、已有判断和之前找到的资料。知识积累了很多,对话却常常从头开始。

Incremind 的设计围绕两件事展开:

1. 把随手投喂变成持续积累。 接收文章、个人判断、录音、视频和随手记下的灵感,自动整理并归入对应的项目与场景,把资料沉淀成可以回看的知识和待确认的认识。
2. 带着已有积累理解问题并完成任务。 根据我的要求识别问题,找到相关项目与场景,结合其中已有的认识、资料和上下文调用模型,回答基础问题、完成日常任务,减少反复交代背景。

收藏了很多文章和视频,真正记住、用上的却很少。因此,积累还需要有取舍:

Incremind 只记信息增量:

- 每份新资料都和你已有的认识对照,只提炼三类内容:补充(新条件、例子、做法)、不同(和你已知的主张不一样)、新方法(你还没有的)。只是重复已知内容的资料,不新增条目,只给原来的认识多记一个来源。
- 方法按"什么时候该想起"来存:每条认识都写明适用条件。问问题、干活时,按情境把该用的方法找回来。
- 你确认的才算数:系统提炼的认识先是"待确认",你在回执上一键 ✓ 才生效。确认、编辑、遗忘都当场生效;系统的推断放在后台慢慢做。
- 像人一样记和忘:常用的越来越牢,不用的慢慢淡出自动召回,但原文永远在资料库里,随时能找回、一键恢复。

例子:先记一篇《间隔重复入门》,系统提炼出"按第 1、2、4、7、15 天复习"。几天后再记一篇讲"主动回忆和自适应间隔"的文章,它不会把间隔重复再讲一遍,只提出:"固定间隔太粗糙,应该按难度调整"(不同)、"复习时先自答再翻面"(新方法)。

它能做什么

| | 功能 | 说明 |
| ✅ | 一个输入框 | 记住、问、干活不用选模式,系统自动判断;"记一下周五交物业费,另外问下……"这种混在一起的话会自动拆开分别处理 |
| ✅ | 自动整理 | 原件 → 整理稿 + 摘要 → 认识,逐层沉淀;支持文字、链接、PDF 和 DOCX |
| ✅ | 自动归到项目 | 没写 #项目 时,自动归进最相关的已有项目,或为新主题新建一个;零散琐事留在"日常"。归错了一键撤销 |
| ✅ | 增量认识 | 对照已有认识,只提炼补充、不同和新方法;在回执上一键确认 |
| ✅ | 带引用的回答 | 从有资格的认识、摘要、整理稿和原件中选取证据,回答里的引用可以点开看原文。在"日常"里问不到时,可去对应的项目里问 |
| 🧪 | 自主检索 | 模型决定是否继续搜索或阅读,可使用当前项目已启用且适用的技能及已配置网页搜索,缺条件时追问并在同一对话承接补充。四个阶段和验收范围见 Agentic RAG |
| ✅ | 干活 | 使用项目记忆、已确认画像和资料库翻书来写成果文档,可以接着改、重做;真实 DeepSeek 初稿与续接已核对笔记事实、版本历史及来源 |
| ✅ | 资料库 | 认识、摘要、整理稿、原文四层下钻;确认、编辑、遗忘、恢复。整理稿未保存正文可在同一浏览器恢复,保存时核对修订,更多编辑可查看修订时间、操作与作者 |
| ✅ | 隐私可控 | 数据保存在部署所在的电脑或服务器;私密项目不外发;每次调用外部模型都有回执 |
| 🧪 | 更多格式 | 图片识字、录音和视频转写、B 站收藏夹导入(需要在设置里配好对应模型) |
| 🧪 | 遗忘与每日整理 | 按使用频率和遗忘曲线降权;每天把反复出现的内容归纳成规律,等你确认 |
| 🧪 | 本机向量 | 设置里一键安装 EmbeddingGemma(约 1.5 GB),语义召回不用联网 |
| 🧪 | 接入 Claude Code、Codex、DeepSeek Harness | 三种客户端均可通过插件调用记忆工具;工作台派活只保存草稿,服务器目前仅开放 DeepSeek Harness。安装条件与验收范围见 docs/agents.md |
| 🧪 | 服务器与多用户 | 家庭服务器或云服务器部署、设备配对、备份恢复,见 docs/server.md |

✅ 基本使用路径已实现;🧪 需要可选依赖或进一步真实环境验收。各功能的实际验证范围见下表,图标不代表所有场景均已验证。

测评与验收

服务器留出集的回答质量、证据召回率、耗时和实际词元用量

同一固定48题在服务器分别完成初批和修复批,使用真实 DeepSeek Flash、CPU EmbeddingGemma 2 和正常工作台问答入口。服务器为4个逻辑CPU、7.35 GiB内存;数据含四份会话、116个session、2,536条消息,与开发集的会话及问题文本重叠均为0。

| 指标 | 初批 retrieve@7 | 修复批 retrieve@8 |
| 已尝试题目 | 48 / 48 | 48 / 48 |
| 正确 / 部分正确 / 错误 | 1 / 0 / 29 | 22 / 11 / 5 |
| 追问 / 失败 / 未发布 | 18 / 0 / 0 | 2 / 8 / 0 |
| 证据 Recall 均值,47题 | 2.13% | 65.97% |
| 全部证据进入作答输入 | 1 / 47 | 26 / 47 |
| 全题耗时均值 / 中位数 / P95 | 18.494 / 15.623 / 25.369秒 | 108.704 / 91.646 / 211.124秒 |
| 已知输入 / 输出词元 | 125,994 / 5,988 | 1,078,134 / 32,089 |
| 未知用量调用 | 0 | 1 |
| 物理模型请求 | 155 | 192 |

两批均使用 compose@30 / ladder@15 / rerank@2,修复解决了空上层阻断原件召回的问题,当前检索默认为 retrieve@8。两组独立Agent在整批回答冻结后核对全部原文。Recall取最后一次实际派发的作答输入;1题无效原标注保留为null,有效分母为47。耗时包含全题检索、生成、重试与失败,测量服务器内部工作台请求。修复批词元为已知小计,1次运输失败用量未知,完整合计保持null。全部347次模型尝试均有原生终态,8道工作台502及全部质量失败均保留。

测评总览 记录评分、原标注问题、本机向量耗时、失败与复现命令;聚合 JSON 和 tools/rag_report.py 可在零模型调用下重建图示。呈现参考 OpenViking RAG 报告,货币费用未记录。tools/rag_dataset.py 冻结原始输入,tools/rag_holdout.py 在服务器运行完整应用问答。

开发题、功能验收与历史实验

RAG30开发题的回答质量、延迟与实际词元用量

| 固定开发题 | 实际结果 |
| 2026-10-21 原文复核 | 10 正确 · 2 部分正确 · 0 错误 · 0 未发布 |
| 问题 / 对话原件 | 12 / 19 |
| 全12次尝试总耗时 / 召回耗时中位数 | 22.160 / 14.292秒 |
| 实际输入 / 输出词元 | 335,444 / 12,498 |
| 物理模型请求 | 36 |

RAG30-20261011 使用 DeepSeek Flash、本机 EmbeddingGemma 2,以及 compose@30 / ladder@15 / retrieve@5 / rerank@2。原文复核沿用冻结回答,没有新增作答请求。这批题反复参与过开发;有据的未知回答可判正确,部分正确表示遗漏必要事实。原聚合 JSON 保持。

2026-10-15 使用真实 DeepSeek,在两条合成场景和预索引原件上完成少量功能验收:

| 范围 | 实际结果 |
| 最终一轮 retrieve@7 | 三个工作台输入均返回 HTTP 200,17 项功能检查通过,覆盖检索、阅读、追问及不带问号的补充承接 |
| 三期全部尝试 | 38 次真实模型请求,51,797 输入 / 4,877 输出词元,包含此前 @6 决策失败与 @7 补充轮失败;未知用量 0,未换算货币费用 |

本次功能验收覆盖两条合成场景的检索、阅读、追问与续接。真实网页搜索、上传后的 AI 整理及向量质量分别验收,各轮失败、耗时和验证范围见 测评总览。

以下为工程验收,检查数与回答质量分开阅读:

| 项目 | 环境与范围 | 实际结果 |
| Agentic RAG 运输隔离(retrieve@6) | 完整应用工厂使用当时默认策略、临时 SQLite 及固定本机 HTTP 模型响应 | 重查、分层阅读、追问衔接、网页未配置和幂等的 31 个断言通过;本行记录固定响应的编排控制,不计作真实模型或网页质量成绩 |
| 内置任务召回 | 使用项目检索、存储、读取证明、草稿和回执;模型 HTTP 为替身 | 21 项独立控制通过,覆盖画像与翻书选材、检索时此前来源撤权及明确声明最终草稿的流程;范围与保留失败。新增付费模型请求 0 |
| DeepSeek Harness 派活到草稿 | Ubuntu 22.04 隔离数据根、真实 Harness 与 DeepSeek Flash,包含鉴权 MCP 记忆工具 | 修复后一次真实任务 29 项检查通过;本轮共 2 次真实任务,累计 4,017 输入 / 1,226 输出词元。首次 MCP 工具调用失败保留 |
| Hy-ASR 转写后校对 | 真实 SQLite、Turn 与确认流程;ASR 交付及模型运输使用替身 | 30 项新增检查、13 项旧定向检查通过;另 1 项既有评论抓取失败保留。真实识别与纠错质量待验 |
| 服务器 CPU 向量 | Ubuntu 22.04 实例、真实模型资产与设备配对 | 已验证加载、计算、卸载和重新加载;GPU 与独立向量服务联通待验 |

材料先分析再提炼的候选流程目前完成7/19份L1确认,下一份遇到引用校验失败,尚未启动新一轮12题问答评测。compose@31、@32 / ladder@16 候选复测出现错误或未发布回答,当前默认为 compose@33 / ladder@15。

RAG 试点评测 保留早期协议与结果。

快速开始

需要:

- Windows 10 / 11
- Python 3.12(安装时勾选 Add python.exe to PATH)
- Node.js:推荐 22.x(≥ 22.13.0);兼容 20.x(≥ 20.19.0)或 ≥ 24.0.0
- 一个大模型 API Key,推荐 DeepSeek;任何 OpenAI 兼容接口都可以

三步:

1. 下载代码,放在较短的路径下(例如 D:\incremind;路径太深会碰到 Windows 260 字符的路径上限):

git clone https://github.com/qingmingyiyang/Incremind.git incremind

2. 双击仓库里的 start.bat。第一次下载和安装依赖需要数分钟,之后约一分钟启动,浏览器自动打开 <http://127.0.0.1:4173>。关掉启动窗口就停止。
3. 打开 设置 · 模型,填入模型的接口地址、模型名和 API Key。

然后把 samples/ 里的示例资料依次发进工作台,就能看到整理、自动归属和增量认识的效果。

数据放在哪、怎么换位置

- 所有数据默认在仓库下的 runtime/,不进 Git。
- 想放到别处:start.bat -DataRoot D:\IncremindData
- 指定数据目录前先关闭正在运行的启动窗口;省略 -DataRoot 时复用当前实例。
- 只启动、不自动开浏览器:start.bat -NoBrowser
- 启动日志在 logs/。
- 备份:停止后把整个数据目录复制一份,或用 tools/backup.py(见 docs/server.md)。
- 设置 · 数据 · 备份 可在线创建包含受管原件的快照,使用 tools/backup.py 恢复到新目录;数据目录之外的已授权本机文件另行保留。

开发者:分别启动后端和网页

py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-web.txt -r requirements-dev.txt
cd src/frontend; npm ci; cd ../..

.\run-web.ps1 # 后端 http://127.0.0.1:8001,数据根固定为 runtime/ .\run-ui.ps1 # 网页 http://127.0.0.1:4173(Vite 开发服务器,代理 /api 到 8001)

用临时数据目录试验时,不要用 run-web.ps1,改为直接启动:

$env:CHRIPTMAS_APP_ROOT = "$PWD\work\try-root"
$env:PYTHONPATH = "$PWD\src"
.\.venv\Scripts\python.exe -m uvicorn backend.memory_app.app:app --host 127.0.0.1 --port 8001

macOS 和 Linux 暂时没有一键启动;Linux 服务器部署见 docs/server.md。

向量模型可在电脑上手动加载或卸载,也可交给独立私有服务器计算,资料库仍留在电脑。独立向量服务和整个应用的服务器部署是两条可选路径;向量配置与 Linux 模板见 私有服务器计算向量。自建模式仍受向量外发开关和私密规则约束,目前按提问填入缓存,真实服务器联通待验证。

整站部署把资料和应用一起放到服务器,所有用户共用服务器本机的向量模型,各自保留独立资料与缓存。启动默认未加载,由管理员加载或卸载;CPU/CUDA 配置、模型安装和用户配对见 服务器部署。已在 Ubuntu 22.04 CPU 实例验证安装、设备配对、向量加载、计算、卸载与重新加载,以及公网 IP 受信任 HTTPS 和多用户接口隔离;GPU 和独立向量服务联通仍待验证。

建议以本机开发提交为代码源,沿公开仓库现有的干净 AGPL 历史发布过滤后的代码增量。服务器按固定发布版本更新,记录 deployment-version.json,先备份代码,再重启并检查健康状态,保留撤回路径。服务器不要直接推送私有开发历史、runtime/、密钥、模型配置或个人资料;资料备份与迁移单独处理。

怎么用

工作台:唯一的输入框。

| 你输入 | 系统做什么 |
| 粘贴一段文字、一个链接,或拖进文件 | 记住:整理成整理稿和摘要,归到项目,提炼待确认的认识 |
| 一个问题 | 问:从你的记忆里找答案,带引用 |
| "帮我写……""整理一份……" | 干活:带着相关记忆生成成果文档 |
| 混在一起的一句话 | 自动拆成几部分,分别处理 |
| 开头写 #项目名 或 #项目名/场景 | 指定归属或提问范围;不写就自动判断 |

问答或内置干活进行中,可点击回执右侧的方形停止按钮。显示已停止后,点击继续可续接同一任务,已完成的工作保持,已经产生的模型花费照常记录。

场景入口和跨项目提问提示可完整传递包含空格、斜杠或 # 的项目与场景名称,沿用已经保存的名称。

附件已被接收后连接中断,可在当前页面重发保留的附件,回读原回执。接收成功后再次选择文件会开始一次新的投喂。

文件支持 UTF-8 编码的 TXT、Markdown(.md)和 CSV,兼容 BOM。CSV 保留原文中的引号、逗号和换行;另支持 PDF 与 DOCX。DOCX 按段落与表格的原顺序读取,包含嵌套表格正文。文件被接受后,整理尚未完成时可从回执的更多菜单打开完整原文并下载原文件,图片组提供全部图片的逐张下载入口。上传时分别提示需要密码、没有文字或文件损坏,正文和附件保留,可替换文件后重试。

工作台整理稿未保存的正文可在同一浏览器恢复,打开其他原件、往返资料库、刷新或关闭浏览器后重开都可继续编辑。保存核对原修订,出现冲突时明确选择正文后再次保存。后台进度刷新保持当前原句定位与高亮。

用于澄清的整理稿编辑或遗忘后,新的输入按当前资料处理,原澄清及回执保留在对话中。

编辑器的导出按钮可将已保存的整理稿或成果下载为 Markdown、HTML、DOCX 或 PPTX。先保存编辑并处理冲突,导出文件对应实际保存的修订。

已遗忘的整理稿仍可阅读,恢复后可继续编辑和移动,原有本地草稿随编辑器恢复。

回执上的认识可以直接 ✓ 确认或 ✕ 不要;"已移到 #项目"旁边可以撤销自动归属。

同一场景的手写认识拆分或合并后保留原场景,按该场景浏览和提问。

资料库:按项目看全部认识、摘要、整理稿和原文,逐层下钻到原文证据;在这里确认、编辑、遗忘或恢复。键盘焦点随层级保留在详情面板,按 Escape 关闭后返回原列表入口,嵌套面板每次关闭一层。拆分或合并期间其他客户端修改了认识时,重新读取当前修订,保留填写内容和勾选,再明确提交。

打开认识版本后,焦点返回更多入口,Tab 可进入历史,Escape 关闭详情。

整理稿移到其他项目后原件保持。认识提炼未完成时,可在归属旁重试;恢复模型配置后继续提炼同一份资料,成功结果显示在原对话和进度列表。撤销可恢复原归属。

资料库与备忘日期按浏览器本地时区显示。只有日期的事实保留原年月日。

管理员编辑账号配额时,停用或恢复该账号会保留尚未提交的配额。明确保存后更新实际额度,关闭账号管理表单后重新读取已保存值。

多部分任务中的子轮分享保留该子轮原问题、回答及所选引用。

方法的来源变化后,可以更新来源、人工核对正文并保存新版本,全程可手写。明确审阅该版本后再导出 ZIP。更新结束时,已经丢失的焦点返回更新入口,等待期间主动选中的其他控件保持焦点。

编辑器切换源码与整理稿模式后,焦点返回更多编辑入口,Tab 与 Escape 继续在当前面板内使用。

收件箱建议归档完整的一组认识,搜索继续筛选普通列表。响应丢失后,可在原面板重试并继续已接受的批次。

多部分回合中的认识按该子轮所属项目处理。确认或丢弃成功后,当前子轮立即显示审核结果。

打开成果版本列表后,键盘焦点保留在面板内;按 Escape 关闭成果并返回打开入口。

外部 agent 成功保存的原件可以从资料库原件层打开,尚无整理稿时也能读取完整正文。

点击进度中的外部原件可以直接打开正文,关闭或切换层级后可以再次打开;读取失败沿原位置重试。

长文件名上传保留真实扩展名,原件名称按原有 180 字符范围缩短。

工作台与手机分享支持含中文路径和查询参数的网址,原有百分号编码及签名参数保持。

设置:模型、隐私(哪些项目私密)、项目、数据与备份、设备、网站。分组下方的主题选择支持跟随系统、浅色和深色,电脑与手机均可操作,当前浏览器记住选择。

语音热词:在设置 · 模型 · 转写维护同一份个人词表,可批量粘贴或导入 UTF-8 TXT、CSV、JSON,先预览再追加或更新。上传录音和视频的内建 faster-whisper 转写使用热词提示,按权重优先选取完整词,超过模型容量时裁剪并记录实际采用数量;实时 Qwen 使用原生词表,当前 Hy-ASR 同步接口不支持热词。使用本地转写仍需准备对应依赖和模型,导入词表不会自动安装或切换转写模型。

Hy-ASR 转写后校对:默认 organize@1 流程在收到上传录音或视频的 Hy-ASR 转写后,读取同一份个人词表,请已配置的辅助生成模型提出局部术语修改。程序检查词表、原文位置、编辑重叠、字面接近程度和受保护内容,再生成校对稿;不接受自由重写,数字、日期、否定及已有正确术语保持原样,歧义保留为疑点。整理稿展示校对全文与修改位置,录音、视频、原始转写及引文坐标仍保留。确认时冻结这一版校对,之后更新词表不会改写旧稿;失败后重试可复用已完成的转写。

校对遵守现有模型外发开关、私密限制和回执,使用真实辅助模型容量及统一上下文准备入口;模型失败或校对输出不合规则保留原始转写,容量与来源变化有明确状态。词表为空、本机原生热词转写和普通文本不增加此校对调用。长材料可能分多次调用,用量与未知费用状态分别记录;自动化验证使用合成转写交付和模型传输替身,真实识别及纠错质量待验收。可选 organize@2 / material_analysis@1–4 尚未接入此后校对,不据此修改旧流程的生成证明。

Agent 操作数据:干活可通过内置技能调用受控的词表读取、预览、更新和回读工具。用户直接提供完整词表时才允许保存,自动发现的术语先作建议;工具不接受任意 SQL 或数据库路径。操作格式和权限边界见 Agent 数据操作。

手机分享:Android 在 HTTPS 网页安装应用后,可从其他 App 的分享菜单存入文字、链接、图片和视频;iPhone 使用快捷指令。小红书和 B站的完整分享文案会自动提取网址,多图可合为一份原件。配对后刷新保留当前页面及地址参数。配对、重试及快捷指令配置见 手机分享说明。

网站登录:在设置 · 网站导入 B站或小红书 Cookie,服务器读取该站资料时复用登录态;B站还可展示平台签发的二维码,用手机扫码确认后加密保存。小红书浏览器扫码需要可选运行环境,目前尚未取得真实二维码。使用方法和验证范围见 网站登录说明。

伙伴:点左上角的小熊,可以聊聊、回顾这周记住了什么、专注和安排。

聊天发送后丢失响应时,可重试原请求或取消重试。同一标签页导航、刷新后仍保留原请求与新草稿,取消重试后正文和已有消息继续保留。

一句话拆成"记住"和"问";"日常"里找不到答案,指向"学习方法" 自动转到"学习方法"项目里回答,上标数字可点开原文

资料库:认识分待确认和生效,标出补充(+)和新增(◇)设置:按用途选模型,外发开关一目了然

手机尺寸、深色主题

架构

flowchart TB
UI["网页(React + Vite)工作台 · 资料库 · 设置 · 伙伴"] --> API["FastAPI · /api/v2"]
API --> R["意图判断记住 / 问 / 干活,混合输入拆分"]
R --> M["记住原件 → 整理稿 + 摘要 → 自动归属 → 增量认识"]
R --> Q["问受控检索 → 回答 → 引用校验"]
R --> D["干活研究 → 准备 → 成果文档"]
M & Q & D --> K["AI 内核(Turn)冻结输入 · 外发回执 · 重试 · 中断恢复"]
K --> P["策略注册表提示词、阈值、公式:名字@版本"]
K --> G["模型网关(LiteLLM)DeepSeek / OpenAI 兼容 / 本机模型"]
M & Q & D --> S[("SQLite 结构化记录带版本号的事务写入")]

记忆阶梯:原件(L0)→ 整理稿(L1)+ 摘要(L2)→ 认识(L3)。存的时候自下而上沉淀,问的时候沿相反方向按问题需求下探,并在预算内选取证据。

先分析材料再提炼认识:已注册可选的 organize@2 / material_analysis@1、@2、@3 或 @4 / extract@6,第二版及后续版本使用 context_preparation@1。当前默认仍是 organize@1 / material_analysis@1 / extract@5,候选流程尚未默认启用。新流程按以下顺序处理材料:

1. 模型只阅读材料,先规划适合它的多个分析角度,不读取后续问题或标准答案。
2. 长文按完整自然段组成重点段,过长的段落沿句子边界拆分。每个子模型先接收完整可信正文,再接收重点段及真实坐标。第二版在全文加重点段超容量时调用统一文本准备入口,按章节、完整段落与论证衔接组织摘要,保留重点和必要相邻原文,再分块提要、逐层归并;第一版保留明确容量失败与原回放行为。并发跟随实际辅助模型路由,本机串行、远端最多两个,结果按冻结段序合并。
3. 各段保留主体、条件、否定、事实、推断、计划和未知。多段结果再交总模型综合,覆盖每个原条目,原条目与证据完整保留在整理稿,综合推断单独标注。第四版强调非连续依据分别引用;仅当一条拼接引用唯一对应相邻完整的 [id] Speaker: body 单行发言正文时,程序将其拆回多份真实原文片段,不增加模型调用。跳过发言、跨记录头、半句、省略、改写或重复体均拒绝,片段坐标可回查说话人;此校验不代替对结论与主体语义的判断。
4. 仅当材料涉及时间、先后或时效时增加时间分析。相对日期交给确定计算器;事件使用其之前最近的有效记录日期,保留原话、真实坐标和日期精度,不能跨记录或从历史引语借用日期。第三版允许保留没有时间原词的事件:时间原词为 null,时间未知,不使用日期锚或计算器,陈述、计划等事件状态保持原样。有时间原词仍沿用原解析;有限守卫拒绝遗漏可识别的直接相对时间、句首日期或明确时间引导日期,隔离记录头、历史引语和修饰资料的日期。守卫未命中不证明原文没有时间信息。
5. 对照已有认识,按独立信息和实际预算提出完整的增量认识,数量随材料变化,全部待人工确认。评论仍是独立来源;正文范围、原件修订和生成记录在提炼及显示时重新核验。人工编辑整理稿沿用原有修订检查,原分析证据保持冻结。

新流程复用现有 Turn、外发回执、租约和确认事务;恢复时复用成功步骤,辅助模型配置改变会明确失败。自动化检查使用真实临时数据库和领域链路,隔离模型传输;同一批 12 题的真实回答、耗时及提升仍待复测。

统一文本上下文准备:v2.context_preparation.prepare_context 在完整输入能装下时原样返回,不增加压缩调用。容量不足时,摘要保留目标、概念、事实、论证、条件、例外和未决问题及原文位置。完整原件留在本地,需要核实时按真实坐标回查。统一入口逐项核对摘要的压缩前保护项与原文;material_analysis@2 适配器及继承它的 @3 另保留交接判断、状态与依据,并执行进展审核和最终跨段审阅,检查一致性、遗漏、重复与断裂。其他调用方须自行安排分析结果终审。语义审查依赖模型判断,程序校验保护项全集和真实引用,不能保证模型从不漏判。

调用方须提供真实辅助模型预算、可信原文范围和已有合法 Turn 适配器。input_limit 是窗口扣除 max(实际预留, output_limit) 后的净输入容量,完整提示词与摘要、原文、进展都计入。下面是领域接入片段,变量由调用方的预算和来源核验生成:

from backend.memory_app.v2.context_preparation import prepare_context
from backend.memory_app.v2.policies.context_preparation import ContextPreparationInput

request = ContextPreparationInput(
task=task, instructions=instructions, original_messages=messages,
focus=verified_focus, fixed=fixed_original_spans,
surrounding=compressible_original_spans,
input_limit=net_input_limit, output_limit=output_limit,
)
prepared = prepare_context(
request, read_original=read_verified_original, validate_current=validate_current,
complete_stage=complete_via_existing_turn,
)

原文片段 ContextSpan 包含来源身份与修订、坐标类型、真实起止位置和逐字正文;read_original 返回对应原件全文,validate_current 在派发和提交前复验资格,complete_stage(stage, messages, parser) 经已有 Turn 返回已解析结果。入口目前处理文本消息和文本片段,图像、音频和工具调用消息需要后续显式适配。首个实际接入版本是 material_analysis@2,@3 扩充时间合同,@4 进一步支持严格分离相邻完整发言,均继承同一入口;旧版消息与回放保持冻结。问答继续使用现有动态召回与预算,认识提炼仍使用原容量预检,其他调用方需注册新版本接入,不会自动改变旧链路。

几条设计原则:

- 事实只追加,推导可重建:能重新算出来的都不当作事实存。
- 决策点是带版本号的纯函数:提示词、阈值、归属规则都登记成 名字@版本(在 src/backend/memory_app/v2/policies/)。换算法就是登记新版本、切换一行;改回来就是回退。
- 三条管线,一个入口:记住、问和干活、学习三条路径分开,共用入口、模型网关和事实日志。
- 每个事实只有一个主人:记忆事实归领域服务,执行事实归 AI 内核;编排层和界面不存状态。

目录:

| 路径 | 内容 |
| src/backend/memory_app/ | 产品应用层,ASGI 入口 backend.memory_app.app:app |
| src/backend/memory_app/v2/ | 工作台、资料库、设置等全部 v2 接口与编排 |
| src/backend/memory_app/v2/policies/ | 带版本号的策略:意图、归属、提炼、召回、排序、遗忘…… |
| src/backend/recognition/ | 认识领域:候选、确认、修订、遗忘 |
| src/core/ | 领域与存储底座(AI 内核、文档引擎、SQLite 存储),不依赖 backend |
| src/frontend/ | 网页 |
| apps/desktop-electron/ | 桌面安装包外壳(发行准备中) |
| deploy/ | 服务器部署模板(systemd、Caddy) |
| tests/ | pytest 与 vitest 测试 |
| samples/ | 体验用的示例资料 |

更细的设计见 ARCHITECTURE.md(架构与接口约定)、DESIGN.md(界面)和 COMPONENTS.md(可复用能力)。

提问时怎么找资料

默认 retrieve@8 让模型先决定是否检索,读取实际工具结果后,再决定继续搜索或阅读、回答,还是追问缺少的条件。当前记忆层没有合格候选时,同一次查询依次检查下层,在首个有候选的层停止。循环继续使用原预算、来源资格、每层选材和回答校验。四个阶段和验收范围见 Agentic RAG。

flowchart TB
Q["问题与已给条件"] --> D{"模型判断"}
D -->|搜索或阅读| T["受控工具记忆四层 · 有资格技能 · 网页搜索"]
T --> O["真实结果与出处"]
O --> D
D -->|回答| A["原回答流程事实草稿 → 复核 → 引用校验"]
D -->|缺少条件| C["明确追问"]
C --> U["同项目同对话补充"]
U --> D

每一层怎么匹配

- 关键词:把问题拆成整句(权重 5)、英文单词(权重 2)和相邻两个汉字(权重 1),最多 32 个,看资料里出现了几个。所以"怎么才能记得牢"和"间隔重复"在字面上对不上,要靠向量。
- 认识的关键词优先,意思补充(默认策略 rank@4):认识召回分数以命中词数为基础,有向量时用相似度区分命中词数相同的认识;没有关键词命中但相似度 ≥ 0.55 的认识也能入选,基础分低于关键词命中。最终排名还会按使用强度、明确到期的适用条件等调整。整理稿与原文的文段采用下述评分。
- 认识:本机模式读取后台已缓存的认识向量,按上面的规则召回;适用条件与当前情境匹配的方法也能补充进来。关键词或向量找到的认识,都能带入与它相关、支持或矛盾的有效认识。
- 摘要:当前只按关键词,不单独建立摘要向量。这是工程选择;把摘要前缀放进文段向量,并不能证明独立的摘要向量没有价值。
- 整理稿和原文:每份资料切成几百字一块。rank@4 按词语在本资料中的稀缺程度加权,标题和摘要前缀作为较低权重的提示;有缓存向量时按 0.45 × 加权关键词得分 + 0.55 × 意思相似度,没有时只看关键词。ladder@15 在命中位置周围保留回答所需的连续正文、问答和限定条件,按问题需求与新增信息选择片段,普通资料不固定窗口数量或宽度。普通主题问题的已确认认识和非对话正文不会仅因缺少句末标点而失去增量资格;问句、说话者、日期关系和原文连续性边界保留,摘录不补造标点。选材规则仍是启发式,不能保证语义完整。
- 块的向量带上下文:计算文字准确为 标题 + "\n" + 摘要[:120] + "\n" + 块正文;这里是 120 个 Python 字符,空摘要时仍保留标题和正文。后台索引与提问读取使用同一格式,见 EmbeddingIndex 和 chunk_vector_scores。这是固定的标题与摘要前缀;Anthropic 的 Contextual Retrieval 会用模型为每块生成专属上下文,效果需要分别评测。
- 可选重排:工作台在每层选取证据前使用已配置并启用的重排模型;云端调用还需打开该用途的外发开关。默认 rerank@2 按实际输入成本选择有限片段,不固定前 12 条;问题与片段合计仍不超过 6,000 词元及本轮输入预算,认识保持正文与条件完整。按原排名 40% 与模型排名 60% 融合,只交换同一连接和概览优先组内的次序,融合分数相同时保留场景优先。送评分的编号必须全部返回有效分数;预算内未送评分的资料保留原次序。未配置、禁止外发或调用失败时使用原排序,一次失败后本轮不再尝试重排。发送前和返回后复验来源、私密、遗忘、场景和片段,调用记录在重排用途回执中;只读覆盖检查和外部 agent 上下文不因此增加外发。

阶梯怎么挑

- 默认组合:compose@33 / ladder@15 / retrieve@8 / rerank@2。模型决定是否检索及使用哪种来源,本地资料沿认识 → 摘要 → 整理稿 → 原文逐层查找,当前层为空时在同一次查询继续检查下层;按问题中的事实、日期、关系和列举需求选择有限资料,不固定普通资料份数。我项目的画像独立使用最多600词元的背景块,认识正文与适用条件整体保留。相关、支持和矛盾连接按新增信息与预算准入,矛盾连接优先;仍受来源资格与总预算约束,预算不足时不保证两方都能进入模型。
- 实际预算:证据使用扣除输出预留、指令、Schema、问题、画像、对话历史和消息包装后的余额,再校验完整输入。受支持的官方 api.deepseek.com 的 deepseek-flash 路由总容量上限为 200,000 词元;预留 7,000 输出时,输入至多 193,000。未知路由不据此升到 200k,仍使用保守的 16,000 总窗口;无法取得有效窗口和预留时使用 4,000 输入回退预算。UTF-8 字节数除以 3 向上取整是预算估算,不是服务商精确分词或实际计费用量。不以填满窗口为目标。
- 调查与停止:retrieve@8 将真实搜索和阅读结果交回下一次模型决策。本地阅读沿有资格的摘要、正文和原件关联下探;技能只提供只读指引,网页搜索使用已配置的用途权限。最多六次决策,可继续调用工具、进入原回答流程或显式追问;重复工具操作、连续两步没有新增资料或深度、容量不足、决策超时或次数用尽时结束调查。只有同项目同对话最新的真实追问可承接不带问号的补充,已解决追问不恢复。停止理由不等于答案充分性的证明。旧检索版本保留显式回放。
- 去重:没有通过新增信息资格判断的资料,再按相似度 ≥ 0.8 检查近重复,只读已有的缓存向量,缺少可比向量时用相邻两字的重合度。通过动态策略新增需求或关系资格的片段不因词语相近而合并;有效矛盾连接对也不因相似而被去重,同一份资料在不同层的内容不互相比。去重本身不会现场计算向量,新增信息判断仍是启发式。
- 矛盾怎么判断:确认认识后、以及启动后的整理中,模型会提出支持、矛盾或取代建议,你在资料库接受后才成为有效连接。提问时读取已生效的 refutes 连接,要求回答说明两方依据及分歧;向量相似度不能判定逻辑矛盾。只有相关连接可以自动建立。

数量与预算的依据:当前默认按问题缺口、边际信息和剩余预算动态选材;这些规则及保留的专门预算都是工程选择,尚无评测证明最优。Lost in the Middle 表明长上下文中的证据位置会影响模型表现,支持按任务评测选材。更大窗口和更多资料本身不能证明回答更准确,仍需真实回答及未参与开发的新题验证。

回答模型拿到什么:规则(只按资料回答、标出引用、没依据就说不知道,以及用到淡忘资料、存在矛盾、用了网页搜索时的说明)、"我"的画像、编号的资料(认识整条给出并带适用条件,其他层只给命中的片段)、标明"不是证据"的对话历史,最后是问题。

两轮回答与出处校验

compose@33 用两次主要模型调用形成事实草稿、逐项复核纠正并作答。会话日期说明按同源冻结材料核对,事件日期继续逐项验证。首稿要求每个与问题有关的独立事实只写一次;事实题尽量保留原词,推理题给出有据前提,时间题引用程序计算的完整日期范围。指令要求说不知道或否定前检查完整资料目录、根据实际说话者判断人物归属,并在开放列举中保留每个独立项目。

事实或推理声明优先使用空的 date_refs;附带合法日期引用时,程序先验证其真实单元、原话和计算记录,然后仅将其视为没有计算权限的附带元数据。原始模型结果保持不变,这些引用不生成日期注释、计算绑定或后续精度说明资格。把相对时间换算成绝对日期或区间,仍必须实际使用日期声明类型,并精确绑定对应原文、相对时间表达与记录日期;错误引用、跨单元借用和借附带引用授权计算仍会被拒绝。

普通事实或推理可以明确写出记录或会话日期作为上下文,但日期须匹配同单元的完整支持原句和冻结来源的真实记录锚。这不授予事件发生日、当天指代或更精确区间的计算资格;原话的上周、下周仍是相对时间,合法绝对日期推算仍须独立通过日期类型、引用和完整结果校验。

结构合规的首稿中,错误日期引用、原话、支持角色、日期文字或重复项,会按条目给出具体字段路径、失败条件与修复要求,原始首稿保持不变,末轮仍核对完整资料目录。最终必须实际纠正或排除错误条目,纠错理由不能替代字段修改;清空日期引用也不能修好文字中仍然无据的绝对日期。冻结资料损坏仍立即终止,最终错误引用、无据日期或完全重复的声明仍会阻止发布,普通声明也不能靠改变附带引用逃过去重。程序生成引用,公开响应仍为 AskOutput。这些校验检查结构和出处;提示中的去重要求也不能保证模型从不重复或截断。

各版本的真实逐题结果、耗时和评测边界见 测评总览,早期结果和 回答流程图 保留对应版本。小批样本与工程控制不代表总体正确率。

本机向量

- 怎么运行:EmbeddingGemma 2,只用文字部分,输出 256 维,在后端进程的专用线程里用 CPU 运行,最多 8 个 CPU 线程。每次启动默认未加载,在设置 · 模型 · 向量手动加载或卸载;卸载等待正在运行的批次结束后释放编码器引用,保留权重与已有向量缓存,不承诺进程内存立即全部归还操作系统;提问优先于后台补算,最多积压 64 个请求。
- 资源与准备:下载约 1.5 GB,只留文字部分后约 580 MB;内存峰值约 1.8 GB;一个问题约 0.16 秒,每段资料约 0.07 秒。这些是测试机器上少量样本的观测,实际耗时与内存需在使用机器上确认。先安装 requirements-local-vectors.txt(含 torch)中的可选依赖,再下载模型;缺少依赖或权重时,向量路径回退关键词。
- 初始化会补算:手动加载成功后,后台为已有的认识 L3、整理稿 L1 与原文 L0 分块建立缓存,设置显示已索引数量;模型已加载时,每次记住完成也触发补算,正在运行的索引随后再补一轮。启动约 60 秒后和每 24 小时的补算仅在已加载时运行;未加载时跳过,不自动加载。加载权重与后台索引的完成状态分别显示。
- 提问时算什么:本机前台只现算问题向量,同一轮按模型身份与问题文本复用;认识和文段只读后台缓存。模型未加载或正在加载、卸载时本轮使用关键词;模型已就绪但某条材料尚未索引时,该条仍走关键词,前台不会为它补算材料向量。
- 缓存:recognition-vectors.sqlite3,按项目、条目、修订号、模型四项定位,内容包括每条认识与每个 L1/L0 分块的向量。模型身份包含模型名、维度与向量策略版本。资料修改后修订号变化,旧向量不再命中;更换模型身份后由后台补算。修改、删除或私密设置等写入口会清理相关派生缓存;遗忘通过召回资格生效,不能据缓存记录仍存在就判断可以召回。定期整理清掉失效、损坏或过期的向量,不调用模型;遗忘不删除原件和历史正文。
- 为什么本机计算也检查并留回执:计算前和接纳结果前都核对资料资格、修订、来源可用性,以及向量配置是否变化,变化后不接纳结果。与外接服务共用这条路径,外接模式还检查外发开关并拦截私密资料;本机模式不算外发,私密资料也能用。回执记录计算内容、用量与结果,本机费用记 0;缓存让中断的后台索引下次接着补算。

compose、retrieve、rerank、rank、ladder、vector 和 elsewhere 的版本会记录在相应轮次的策略快照中,续行使用对应版本;旧版仍可显式选择,见 policies/pipelines.py。

还没定下来的

- 按意思召回的门槛 0.55 是初始工程值,还没有在真实 EmbeddingGemma 2 的相似度分布上校准。
- 动态召回的资料量、连续片段和 200k 容量仍需用真实长资料与多来源任务验证,分别检查漏答、错答、引用、耗时和用量。

隐私与数据

- 本地优先:资料、整理稿、认识和对话保存在部署所在电脑或服务器的数据目录中;SQLite 保存结构化记录,PDF、图片、音视频等上传原件另存为文件。备份需保留整个数据目录。
- 服务器权限:普通用户空间独立;管理员可按权限进入用户空间,访问留痕对该用户可见。停用账号保留内容与访问记录;永久删除需确认,并清除账号、空间及关联记录。私密资料不对管理员隐藏。
- 凭据加密:模型密钥和网站 Cookie 复用现有加密存储,Windows 使用 DPAPI,服务器使用已有密钥存储;保存值不回显、不写日志,网站 Cookie 不进入模型输入。
- 外发可控:只有你在 设置 · 模型 里打开外发开关的用途才会调用外部模型;标成私密的项目和资料永远不外发;每次外发都留回执,写明发了什么、给了哪个模型。详见 docs/models.md。
- 不删原件:遗忘只影响自动召回,原件、整理稿、认识正文和历史修订都保留,随时恢复。

开发

在仓库根目录运行后端测试和依赖方向检查:

.\.venv\Scripts\python.exe -m pytest tests/memory_app/v2 -q
.\.venv\Scripts\python.exe tools/run_import_linter.py

在 src/frontend/ 下运行前端测试和构建:

npm test
npm run build

HTTP 冒烟入口为 tools/demo_smoke.py,运行 .\.venv\Scripts\python.exe tools/demo_smoke.py --help 查看参数。脚本使用 8011 端口的隔离后端、DeepSeek、示例资料及 --file 指定的 PDF;--check 只读取配置与尝试记录,模型调用为 0。

- 改提示词或算法:在 v2/policies/ 登记新版本,离线对比后,单独一次提交切换 ACTIVE。
- 前端只用 src/frontend/src/styles.css 里的设计 token 和 shared/ui/ 组件。
- 更新项目介绍、功能状态或使用说明时,同步维护 README.md 和 README.zh-CN.md。
- 提交前钩子 tools/task_guard.py 会检查疑似密钥、误提交的数据目录和新增的跳过标记;新克隆后运行一次 .\.venv\Scripts\python.exe tools/task_guard.py --install 安装。

已知限制

- 速度:耗时随材料长度、模型、选材与缓存状态变化,各轮实测单列在测评总览。启动后的整理、备份和索引也会影响响应时间。
- 平台:Windows 已验证基本完整路径;Ubuntu 22.04 已分项验证应用部署、CPU 向量和隔离环境中的真实 DeepSeek Harness。界面只有中文。
- 手机与网站登录:系统分享及 iPhone 快捷指令待真机验收,真实账号扫码确认尚未验证;小红书目前通过 Cookie 导入提供登录态。
- 在路上:手机外壳、共享项目、正式公网派活,以及 Claude Code、Codex 真实账号执行与重连的验收。

致谢

- 模型接入参考了 pi-ai 的协议适配与测试方法。
- MCP 接入、代理接入等思路借鉴了 Mem0 OpenMemory、Supermemory、basic-memory 和 TencentDB Agent Memory。
- 用到的开源项目包括 FastAPI、LiteLLM、LangGraph、React、Vite、ProseMirror(编辑器内核,MIT)、sqlite-vec。各依赖的许可证见 requirements-*.txt 与 src/frontend/package-lock.json。

许可证

Copyright (C) 2026 Incremind contributors.

本项目采用 GNU Affero General Public License v3.0(AGPL-3.0-only),完整条款见 LICENSE。

修改后的版本通过网络提供服务时,须按协议向与其交互的用户提供对应源代码。

第三方组件与数据保留各自的许可证和署名要求。
预览分享卡片长什么样 ↓qingmingyiyang/Incremind
分享 · DeepSeek Harness Hub
qingmingyiyang/Incremind

靠增量经验积累记忆、修正认识、逐步形成理解的认知系统。

这是你的仓库?认领条目

回到顶部