我开源了一个 Rust 引擎刚冲上 GitHub Trending — 为什么 AI Agent 离不开实时数据

65 阅读8分钟

我开源了一个 Rust 引擎刚上 GitHub Trending:为什么 AI Agent 离不开「新鲜数据」

Gemini_Generated_Image_8itxxa8itxxa8itx.png

项目地址:

昨晚,我的一个项目 CocoIndex 在 GitHub Rust 分类上了 Trending,通知栏直接爆掉。

更有意思的是:我发现很多做 AI / Agent 的开发者,其实都在被同一类问题折磨——让 Agent 连上「每分钟都在变化」的实时数据,而不是「几个月才更新一次」的冷冻快照。

这篇文章主要讲两件事:

  1. CocoIndex 是怎么诞生的、它到底在解决什么问题
  2. 更重要的:如果我们真想把 Agent 用在真实世界,就必须像重视模型一样重视「记忆系统」和「数据新鲜度」

一、问题:大多数 Agent,其实在用「昨天的世界」做决策

很多 Agent 的 Demo 默认假设:在模型思考的这段时间里,外部世界是静止的。

但只要你真的把它丢进生产环境,很快就会发现现实完全不是这样:

  • Issue 会被关闭,Ticket 会自动流转状态,告警会触发又恢复
  • 商品目录在变、价格在变、权限在变,文档在不停重构
  • 日志、事件流、传感器数据在源源不断地产生

如果你的「知识」只是:

偶尔从线上拉一份全量快照 → 一次性处理 → 塞进某个向量库 / 数据库

那 Agent 在做决策时,看到的世界往往已经严重过期。表现在外面就是:

  • 看起来像幻觉,本质上只是上下文是旧的
  • 重复执行已经成功或失败过的动作
  • 给出的建议本身没问题,但更适合上周而不是现在

这就是我开始做 CocoIndex 的根本动机:

让各种「派生数据」——Embedding、图、表格 ——能持续、增量、可追踪地跟上真实数据源。


二、CocoIndex 到底在做什么?(去掉所有 Buzzword 的版本)

一句话:

CocoIndex 是一个用 Rust 写的、专门为 AI / Agent 场景设计的数据流引擎,用 Python API 描述「原始数据如何变成 Agent 可用的长期记忆」。

你可以用它做几件事:

  • 指定数据源:文件、对象存储、API、数据库等
  • 定义转换:文档切分、Embedding、LLM 抽取、图构建……
  • 指定目标:向量库、SQL 表、图数据库,或你自己的自定义 Sink

整个设计背后有三条原则:

1. Dataflow,而不是一堆 Glue Script

传统做法很像「补丁式自动化」:

  • 这里一个 Python 脚本,那边一个 Shell 脚本
  • 再加几条定时任务 Cron Job
  • 中间靠临时目录、状态文件和约定来沟通

久而久之:

  • 谁也说不清「某条数据到底走过哪些处理步骤」
  • 一旦要改流程,就等于从头拆一遍电路

在 CocoIndex 里,你直接声明一个 Flow:

「拿这些文档 → 按规则切块 → 调用 Embedding → 写入某个向量库」

引擎负责调度、缓存、重试和增量计算。

2. 一切可观测,可追踪血缘

每一个步骤的输入、输出都可以被检查,并且带完整血缘:

  • 你可以问:这条向量是从哪份原始文档的哪一段算出来的?
  • 也可以问:这个节点是经过了哪些处理步骤生成的?

这让你在排查问题、对齐行为、做合规和审计时,都有足够的可解释性。

3. 默认增量化

一旦源数据有变化,CocoIndex 会自动计算出「最小必要重算集」:

  • 只重算受影响的那一小部分
  • 所有能复用的重步骤(例如 Embedding 调用)都会直接命中缓存
  • 下游索引只做最小范围的增量更新

底层选择 Rust,就是为了在数据量和并发都上来的时候,这些 Flow 还能长期稳定跑着,而不是时不时被打爆


三、Agent 的记忆,现实中是怎么运转的?

如果你关注过 Agent 架构,大概率见过这三个层次的划分:短期记忆、长期记忆、工作记忆。

  • 短期记忆(Short-term)
    最近几轮对话、当前任务、最新工具输出等,主要存在于上下文窗口里——便宜、直接,但容量极其有限。

  • 长期记忆(Long-term)
    你希望 Agent 在多轮、多天甚至多次会话中都能记住的东西:

    • 文档、知识库
    • 历史对话、事件流
    • 用户画像、业务状态、领域知识
      通常落在向量库、数据库或图结构里。
  • 工作记忆(Working memory)
    Agent 每次「开始思考」时,会从短期 + 长期记忆里抓取相关信息,在一个临时的「草稿空间」里混合、归纳、推理、规划。

现在大量 Agent 文章、框架、Demo 都把精力放在:

  • 更复杂的规划器(Planner)
  • 更花哨的思维链(Chain-of-Thought / Tree-of-Thought)
  • 更高级的工具调用编排

一旦上到生产环境,真正最容易「把你坑惨」的,恰恰是长期记忆这一层

如果这层的数据是不完整的、过期的、内部矛盾的,再漂亮的 Planner 也只是「拿错地图的司机」。

CocoIndex 就是专门盯这一块:

它不替你做推理,只负责让那一整层长期记忆,尽可能干净、一致、实时。


四、为什么「增量索引」是超能力,而不是实现细节?

「有变更就全量重建」听起来很简单暴力:

某个源变了?那就从头跑一遍 Pipeline 吧。

只要你实际在规模上跑过,就会踩到几个现实坑:

  • 为所有没有任何变化的内容,重新付一遍 Embedding / LLM 调用费用
  • 只是一个小节变动,却不得不重处理整批文档
  • 只改了几行数据,却要重新发布整份索引

增量索引的意义,就是把这件事完全反过来:

  1. 当某个源对象发生变化时,CocoIndex 精确定位到「受影响的最小单元」
  2. 只重算依赖这些单元的转换步骤,其他步骤直接复用已有结果
  3. 在写回目标(向量库、SQL 表、图数据库等)时,只做最小粒度的增删改,并利用血缘信息清理掉失效条目

对 Agent 来说,这会立刻带来两大收益:

  • 1)更便宜地做到「持续新鲜」
    你可以用更高的频率去更新数据,而不用担心「每天一跑就把 API 配额 / 预算烧光」。

  • 2)记忆更可信,不再被「僵尸数据」污染
    一旦源头有更新或删除,相应的派生记忆会很快被正确刷新,不再残留那些已经过期却还在被召回的条目。

当你真的让 Agent 去做「长期自主行动」时,它们对这种一致性是高度依赖的 ——
否则你其实是在给它一张永远带时差的地图


五、把 Agent 当成「自动驾驶系统」,你就知道记忆为什么关键

这里的「自动驾驶」,不只指马路上的车。更宽泛地说,任何在「驾驶」复杂系统的 Agent,都属于这个范畴

  • 自动运维基础设施的 SRE Agent
  • 承接客服工单的 Support Agent
  • 负责跑 Growth / 营销实验的 Agent
  • 帮你操作内部工具、执行流程的 Copilot 类 Agent

它们有一个共性:它们在一个持续变化的世界里,闭环执行这三件事:

  1. 不断观察环境(监控、日志、工单、事件流……)
  2. 检索与当前决策相关的历史和事实
  3. 制定计划并长时间执行

这三步,全都建立在同一个前提上:

有一层可靠的记忆基座,能够随系统一同演进。

如果你的索引滞后几个小时甚至一天,那这个 Agent 本质上就是:

在「看后视镜」开车。

CocoIndex 想做的,就是这层记忆基座:

  • 用 Rust 写的长驻引擎
  • 通过增量更新、透明血缘和 AI 原生的数据转换
  • 把你的长期记忆,尽可能紧贴真实世界

GitHub Rust Trending 对项目本身当然是一个很开心的里程碑,但对我来说,更重要的是:

希望在未来的 Agent 技术栈里,“新鲜、可信的长期记忆”是一个默认存在的属性,而不是事后加的补丁。


六、如果这些点戳中了你,可以这么玩 CocoIndex

如果你也碰到过这种场景:

「明明 Agent 的逻辑都对,就是因为数据还没更新,导致一路翻车」

那很大概率你被的,正是同一类问题。下面是几个直接的下一步:

  • 去 GitHub 看项目源码和示例:
    👉
    里面有语义搜索、PDF、代码、图等端到端案例。

  • 把里面的思路搬到你的现有 Pipeline 里:
    不一定要整套接入,你可以先只借用「增量 + 血缘」的那部分理念。

  • 如果你有比较极端或有意思的场景:
    欢迎直接开 Issue / 提 PR,一起把「AI 时代的数据基础设施」打磨得更像一门工程,而不是一堆脚本。

模型会不断变强。

让它们看到的世界尽可能真实、最新,这件事还是要我们来负责。