返回首页
最新
# 我用图数据库替换了我的AI代理的扁平事实存储,它的运行内存仅为85MB
我正在构建LocalClaw,这是一个以本地模型为主的AI代理框架,通过Ollama在个人硬件上运行。没有云服务,也没有API费用。几周前,我发布了关于路由器/专家架构的帖子,很多人询问了内存系统的相关信息,下面就是这个内容。
## 问题
最初使用的是一个JSONL事实存储和嵌入相似性检索。起初看似简单,但后来并非如此。在经过几周的实际使用后,我发现关于同一主题的14个近重复事实来自不同的会话。对重复数据进行分层去重,但仍然不够干净。
更大的问题是关系。“彼得在DevMesh工作”和“DevMesh正在构建一个外联平台”是两个独立的嵌入。你可以检索到每一个,但无法从一个跳转到另一个。没有多跳,没有事实演变。旧事实和新事实并存,但没有信号表明哪个是当前的。
经过四次对扁平存储的迭代后,我意识到我在修补错误的东西。
## 为什么选择FalkorDB
我考虑了Neo4j(社区版故意受限)、Memgraph(没有原生向量搜索)和FalkorDB。
FalkorDB在Docker中运行,使用Redis协议,具有原生的HNSW向量搜索,并且在我当前的规模下整个系统仅占用85MB。图遍历、向量相似性和混合关键词搜索都在一个容器中运行。没有单独的Qdrant,也没有两个存储之间的同步问题。
## 图所能实现的功能
每个事实通过ABOUT边与其引用的实体连接。多跳遍历变得自然——查找与项目相关的所有内容,查找与某项技术同时提到的所有实体。
当一个事实发生变化时,新事实会与旧事实建立SUPERSEDES边。两个事实都保留时间戳。时间查询现在可以使用。“系统上个月对这个的了解是什么?”是一个真实的查询。
向量索引在FalkorDB内部运行,使用来自qwen3-embedding:8b的4096维嵌入。O(log n)的HNSW搜索。没有外部数据库。
## 让我惊讶的部分
小型本地模型的实体提取是不可靠的盲目操作。phi4-mini将DGX Spark分类为软件,并为同一实体的单数和复数形式创建了独立节点。
解决方案:在从新事实中提取实体之前,先从图中查询现有的类型化实体,并将它们注入到NER提示中作为参考上下文。现在,phi4-mini在分类任何新内容之前,会看到“DGX Spark → 硬件,FalkorDB → 软件”。每个正确类型的实体使未来的提取更加一致。图在没有任何额外训练的情况下,随着时间的推移教会模型。
## 评分
纯粹的向量相似性会浮现出语义上最接近的内容,无论其重要性如何。评分公式如下:
```
score = similarity × 0.5 + recency × 0.2 + importance × 0.3
```
重要性使用1-5级(关键健康/家庭=5,工作/身份=4,偏好=3,上下文=2,短暂=1)。一个相关性适中但关键的事实得分高于一个高度相关但短暂的事实。你妻子的健康状况得分高于昨天的天气。
## 我学到了什么
模型本身不进行计算。代码处理哪些事实发生了变化,哪些是重复的,得分是多少。模型处理其含义。一旦你让模型进行算术或基于哈希的去重,就会出现无法解释的失败。
重要性层级需要在提取提示中提供具体示例。phi4:14b将所有内容默认为2级,直到我添加了一些带有情感权重的少量示例。抽象指令无法校准模型。
一旦需要关系推理,图就超越了扁平存储。单单SUPERSEDES链就证明了迁移的合理性。
整个系统完全在Mac Mini上运行。图占用85MB。所有内容均为本地存储。
GitHub: https://github.com/PeterGreenAppliedAI/LocalClaw
OpenSOP 是一个早期的开源运行时/标准,用于可执行的代理过程。<p>您(或您的代理)可以使用 YAML 定义一个过程,OpenSOP 将其暴露为一个类型化的 REST API,供代理和人类共同使用。<p>我们之所以开发它,是因为许多代理工作流程仍然存在于提示、文档或一次性脚本中,而不是版本化的过程定义,我们希望能够获得更多的控制和审计能力。该项目仍在开发中,我们在 Coba.ai 中已将其投入生产,关于模型、API 结构和使用案例的反馈将非常有用。<p>我们希望与社区分享这一成果,欢迎任何反馈和评论。尤其是在 Claude 发布了 Ant 之后,<a href="https://x.com/ClaudeDevs/status/2061877343078244459" rel="nofollow">https://x.com/ClaudeDevs/status/2061877343078244459</a>,它与这个概念大致相同。