ScienceDiscovery
English GitHub

安装 Neo4j 与配置科学记忆

科学记忆(ScienceMemory)是 ScienceDiscovery 的可选功能,把一个会话的研究目标、每一步任务、运行的代码、产出的文件,到最终报告里每条带引用的断言及其证据,存成一张图谱,让"这个结论是怎么来的"可被点击回溯。源码、Docker 与单文件新安装均自动启动 memory-graph 服务,本地文件后端无需 Neo4j。单文件包内置服务及 Python 依赖;如果该可选服务启动失败,启动器报告原因并在关闭科学记忆的情况下继续启动。

单文件发行包

照常运行 ScienceDiscovery serve 即可。图谱保存在 <数据目录>/memory-graph/,不在解包缓存内,升级程序时保留。该服务无需额外安装系统 Python 或 Neo4j。已在系统设置中关闭记忆的用户需要自行开启,启动器不会覆盖已有设置。

本文讲内置的本地文件存储、怎么装 Neo4j 并在系统设置里配置、怎么在前端用。功能本身的架构、节点/边类型、API 接口见科学记忆说明;环境变量与端口见配置参考。

0. 零配置:本地文件存储

科学记忆不需要任何外部服务。默认(“系统配置 → 记忆 → 存储后端”选“本地文件”)图谱由 memory-graph 侧车自己维护,并以纯文本落盘到 ~/.science-agent/memory-graph/(可用 SCIENCE_AGENT_MEMORY_GRAPH_DATA_DIR 修改):

回放按 id 取最后一次写入,所以文件只追加,写到一半崩溃也不丢数据(损坏的末行会被跳过),加载时还会压缩。可以直接 grep、jq、diff,也方便附在问题报告里。所有会话共用一个存储,每个节点都带 session_id。/health 返回 {"status": "healthy", "backend": "local"}。

后端是一项设置:在“存储后端”里选“Neo4j 服务”,才会出现 Neo4j HTTP 地址、用户名、密码等字段(见第 2 节)。只保存凭据不会切换存储;选了 Neo4j 但连不上时保持 degraded,不会悄悄回退,两边的历史不会分叉。SCIENCE_AGENT_MEMORY_GRAPH_BACKEND(local 或 neo4j)只决定侧车在 API 首次推送之前的取值。

本地存储适合单用户、每个会话几千个节点以内的图。更大或多人共享的部署,或想用 Neo4j Browser 时,请选 Neo4j。要把本地历史迁到 Neo4j(单向、可重复执行):

NEO4J_PASSWORD=yourpassword python -m sciencediscovery_memory_graph.export_to_neo4j \
  --http http://127.0.0.1:7474 --user neo4j

下面各节只有在你想用 Neo4j 时才需要。

1. 可选:安装 Neo4j

需要的是:

注意:连接走的是 Neo4j 的 HTTP 端口(7474),不是 Bolt 端口(7687)。Bolt 端口不用配。Neo4j 装好后会在 7474 提供 HTTP、7687 提供 Bolt,科学记忆只用前者。

1.1 方式 A:用 Docker(推荐,最简)

这是 UI 里也提示的快速启动方式。在装好 Docker 的机器上:

docker run -d --name neo4j \
  -p 7474:7474 -p 7687:7687 \
  -e NEO4J_AUTH=neo4j/你的密码 \
  -v neo4j-data:/data \
  neo4j:5

启动后等几十秒,访问 http://127.0.0.1:7474 能打开 Neo4j Browser 登录页即说明 Neo4j 已就绪(用 neo4j / 你设的密码登录验证)。

如果要随 ScienceDiscovery 一起拉起、一起停,把上面的 Neo4j 容器加进你自己的 Compose 文件即可,但不要改 ScienceDiscovery 自带的 docker-compose.yml,那个文件只负责 ScienceDiscovery 自己。

1.2 方式 B:Linux 原生安装(不想用 Docker 时)

以 Debian/Ubuntu 为例,安装 Neo4j 官方仓库后用 apt 安装:

# 导入 Neo4j 官方签名 key 与仓库
sudo install -d /etc/apt/keyrings && \
wget -qO- https://keyserver.ubuntu.com/4046BCA5E2F9A889B1A6FDB0E8E8F9A1B5A3C9F5 | \
  sudo gpg --dearmor -o /etc/apt/keyrings/neo4j.gpg
echo "deb [signed-by=/etc/apt/keyrings/neo4j.gpg] https://deb.neo4j.com stable latest" | \
  sudo tee /etc/apt/sources.list.d/neo4j.list
sudo apt-get update && sudo apt-get install -y neo4j

上面的 key 指纹与仓库地址以 Neo4j 官方安装文档为准,不同发行版步骤不同,请按官方文档对号入座。RHEL/openEuler 用 dnf,Alpine 用 apk。

安装后设初始密码并启动:

sudo neo4j-admin dbms set-initial-password 你的密码   # 首次设置
sudo systemctl enable --now neo4j                       # 开机自启 + 立即启动

启动后同样访问 http://127.0.0.1:7474 验证。如果需要远程访问或改端口,编辑 /etc/neo4j/neo4j.conf 后 sudo systemctl restart neo4j,但本地部署默认回环配置即可,不用改。

1.3 验证 Neo4j 就绪

不管哪种安装方式,确保这两点成立:

  1. curl -s http://127.0.0.1:7474 返回 JSON(含 neo4j_version);
  2. 能用 neo4j / 你设的密码登录 http://127.0.0.1:7474。

Neo4j 不必与 ScienceDiscovery 同时启动,但科学记忆要写图或读图时它必须在线。Neo4j 临时不可达时科学记忆会静默降级,不报错、不阻断对话。

2. 在系统设置里配置科学记忆

Neo4j 跑起来后(并把“存储后端”设为“Neo4j 服务”),配置全部在 系统设置 → 记忆(Memory)里完成,不用改 .env、不用重启 stack。

2.1 打开设置

  1. 打开 ScienceDiscovery Web UI(默认 http://127.0.0.1:4310)并登录。
  2. 点左侧栏底部的 系统配置(System configuration)按钮,打开系统设置对话框。
  3. 左侧分组列表里选 记忆(Memory)。

2.2 填写四项

记忆设置区有这些字段:

字段 填什么 默认占位
启用科学记忆(开关) 关闭后不再记录 开(新安装;Docker 中为关)
存储后端 本地文件(默认)或 Neo4j 服务;只有选 Neo4j 时才显示下面三项 本地文件
Neo4j HTTP Neo4j 的 HTTP 地址 http://127.0.0.1:7474
Neo4j 用户 Neo4j 用户名 neo4j
Neo4j 密码 你在 1.1/1.2 里设的密码 —

要点:

2.3 保存

点底部 保存(或"保存并关闭")。保存时后端会把 HTTP 地址、用户名、密码经回环、Bearer 保护的内部端点推给记忆图侧车(sidecar),侧车立刻用它连 Neo4j。保存成功会弹出"科学记忆设置已更新"提示。

2.4 确认连上了

回到会话工作区,展开右侧“记忆 → 科学记忆”,缩略卡的健康状态会显示当前连接情况。未启用时该入口隐藏;启用后连接异常仍显示状态提示。状态取自 /health,取值:

状态 含义 处理
healthy Neo4j 可达、密码已配 正常,可读写图
needs-password 后端选了 Neo4j,但侧车还没收到密码 把密码填上并保存,或把“存储后端”改回“本地文件”
degraded 配了密码但 Neo4j 连不上 检查 Neo4j 是否在跑、7474 端口是否通、地址/密码是否对
disabled 功能开关关着 打开开关

暂停(关开关)不删已有图数据,重新打开即恢复视图。

3. 在前端使用科学记忆

配置为 healthy 且开了开关后,会话执行过程中会自动把任务链、产物、引用链写进图。前端只读,所有读请求经控制 API 反向代理到侧车,浏览器不直连 7474 或 17674。

3.1 打开图谱

有两种入口:

3.2 默认视图:研究主线

刚打开时,图谱默认只显示研究主线:研究目标 → 子任务 → 工具调用,按执行先后排成一条线。每个任务产出的代码、论文、产物,以及引用链里的证据、观点节点,默认折叠不显示,避免一上来糊成一团。

3.3 双击展开 / 折叠

3.4 链路按钮(按节点类型)

选中一个节点后,节点旁或顶部会出现该节点类型专属的链路按钮。点一个按钮,就高亮该节点到相关节点的那条链路,其余节点雾化淡出。不同类型节点能看的链路不同,举例:

按钮按存在性动态显示:某条链路在图里没有对应数据时,对应按钮会直接隐藏,不会点了报空。看完点顶部 ← 返回全图 回到完整图谱。

3.5 色块类型筛选

图谱顶部有一排色块条,每个色块代表一种节点或边类型。点某个色块只看这一类的节点/边,再点取消;可以同时筛多类。悬停色块会弹出该类型的含义说明。

节点颜色(供对照):研究目标红、任务青、工具调用橙、论文粉、证据绿、观点橙、代码紫、产物青绿。

3.6 节点详情面板

点一个节点选中它,右侧详情面板显示该节点的字段(如代码内容、文件路径、论文标题、观点正文)与它相关的关系列表,可直接跳转到关联节点。

3.7 首次导览

第一次打开图谱时,会有一个两步的操作指引弹窗:第一步讲默认研究主线视图与双击展开,第二步讲顶部色块筛选。可按"下一步"看完,或"跳过"。之后想再看可重新触发。

4. 报告里的引用 chip

科学记忆开启后,智能体写最终总结报告时会带可点击的 [alias] chip(引用标签)。报告正文里的每个 chip 对应一段被引用的内容,可能是从论文抽取的证据,也可能是代码跑出的产物。点 chip 即弹出该证据/产物的详情与来源链路,可逐条核验"结论从哪来"。无 chip 的报告会被视为未完成。

5. 排查

现象 排查方向
设置区显示 degraded Neo4j 没起或 7474 不通。curl -s http://127.0.0.1:7474 看是否返回 JSON;检查 docker ps / systemctl status neo4j。
显示 needs-password 密码没推到侧车。回设置把密码填上、保存;若已填,确认密码和 Neo4j 里设的一致。
改了 src 重新跑还是旧行为 改源码后要先 pnpm build 重建再重启,否则跑的是旧产物。
图谱是空的 本会话还没产生执行事件(任务链是在代码执行/文献检索完成时才镜像写图的)。先跑一个任务再说。
Docker 里连不上宿主 Neo4j 容器走回环时,127.0.0.1:7474 指的是容器自己。把 Neo4j HTTP 地址改成宿主在容器内可达的地址(如 host.docker.internal:7474 或宿主 IP),并确保 Neo4j 监听非回环。

6. 下一步