数据 截至 (上游 commit b948f88d48be)
Cognee — 架构与原理
30 秒导读: Cognee 是给 AI agent 用的开源记忆平台。你把文档/文本喂给它,它用 LLM 把内容抽成一张知识图谱(谁是谁、谁和谁有什么关系),同时存成向量;之后 agent 提问时,它不是简单做向量 RAG,而是「先用向量找到相关节点,再沿图扩展出三元组事实」喂给 LLM 回答。一句话:把 agent 的「记性」做成一张会长大的图。
1. 这是什么(零基础也能懂)
一句话定义: Cognee 是一个 Python 库,把「原始数据 → 知识图谱 + 向量索引 → 可检索的记忆」这条链路打包好,让 AI agent 跨会话拥有持久长期记忆。
解决什么问题 / 给谁用。 假设你在做一个 AI 助手,它读了你公司 200 篇文档。下次对话时,模型早忘了——上下文窗口装不下,而普通向量 RAG 只会捞回「字面相似」的段落,捞不出「A 公司收购了 B,B 的 CTO 是 C」这种跨段落的关系。Cognee 的用户就是这类需要「记住事实之间的连接」的 agent 开发者。
它和普通 RAG 的区别。 官方把核心流程称作 ECL 流水线(Extract, Cognify, Load:抽取、认知化、装载),用来替代传统 RAG(CLAUDE.md:7):
| 传统向量 RAG | Cognee | |
|---|---|---|
| 存什么 | 文本块 + 向量 | 文本块 + 向量 + 实体/关系图 |
| 怎么召回 | 找最相似的块 | 向量找种子节点 → 沿图扩展三元组 |
| 能答的问题 | 「文档里怎么说 X」 | 「X 和 Y 之间有什么关系」 |
它能做什么(功能):
- 吃多种格式:文本、PDF、图片(OCR/视觉)、音频(转写)、代码、Office 文档(
cognee/api/v1/add/add.py的 docstring「Supported File Formats」)。 - 自动用 LLM 抽实体和关系,建成知识图谱。
- 多种检索模式:图补全、向量块、摘要、Cypher、时序等(
SearchType枚举共 17 种,cognee/modules/search/types/SearchType.py)。 - 可插拔后端:图库(Ladybug/Kuzu/Neo4j…)、向量库(LanceDB/pgvector…)、关系库各司其职。
用起来什么样。 整个库的「主线」就是三个 await 调用(三步结构仿照 cognee/api/v1/add/add.py 的 docstring;下面的 Einstein 文本是为演示自拟的,非 docstring 原文):
import cognee
# 第 1 步:喂数据(一段文本或一个文件路径)
await cognee.add("Einstein was born in Ulm. He developed relativity.")
# 第 2 步:认知化——抽实体/关系,建知识图谱
await cognee.cognify()
# 第 3 步:检索——基于图上下文让 LLM 回答
results = await cognee.search("Where was Einstein born?")
新一点的 v2「记忆语义」API 把 add+cognify 合成了一个 remember()(cognee/api/v1/remember/remember.py:633),但底层还是同一条流水线。
一句话直觉/类比。 把 Cognee 想成 agent 的「海马体」:add 是看到信息,cognify 是把信息理解成概念之间的连接(而不是死记字面),search 是被问到时顺着连接回忆出相关事实。
2. 顶层全景(它大概怎么转)
一张主线图
怎么读:从左到右是数据的一生。上排是三个对外函数,下排是它们各自跑的任务流水线,最右是三类数据库。
add() cognify() search()
│ │ │
┌──▼─────────┐ ┌───────────▼───────────────┐ ┌─────────────▼──────────────┐
│ 解析路径 │ │ ① 分类文档(Document) │ │ 选一个 Retriever │
│ 抽取文本 │ │ ② 切块(DocumentChunk) │ │ (默认 GraphCompletion) │
│ 存原始数据 │ │ ③ LLM 抽实体/关系 + 摘要 │ │ 1. 向量找种子节点 │
└──┬─────────┘ │ ④ 落库:节点/边/向量 │ │ 2. 图投影 + 扩展三元组 │
│ └───────────┬───────────────┘ │ 3. 三元组打分排序 top-k │
│ │ │ 4. 拼上下文 → LLM 回答 │
▼ ▼ └─────────────┬──────────────┘
┌───────────────────────────────────────────────────────────▼──────────┐
│ 关系库(Data/Dataset/User 元数据) · 图库(节点+边) · 向量库(嵌入) │
└───────────────────────────────────────────────────────────────────────┘
三步全部由同一个任务流水线引擎 run_pipeline 驱动,只是任务列表不同(详见第 1 章)。
部件一句话职责
| 部件 | 干什么 | 在哪个文件 |
|---|---|---|
add() | 把原始数据解析、抽文本、存为 Data 记录 | cognee/api/v1/add/add.py |
cognify() | 切块→LLM 抽图→落库,构建知识图谱 | cognee/api/v1/cognify/cognify.py |
search() | 路由到某个 Retriever,召回并(可选)让 LLM 生成答案 | cognee/api/v1/search/search.py |
run_pipeline / Task | 通用流水线引擎,串起一串可组合任务 | cognee/modules/pipelines/operations/run_tasks_base.py |
DataPoint | 所有图节点的统一基类(Entity、DocumentChunk… 都继承它) | cognee/infrastructure/engine/models/DataPoint.py |
GraphCompletionRetriever | 默认召回器:向量种子 + 图三元组 | cognee/modules/retrieval/graph_completion_retriever.py |
| 数据库适配层 | 图/向量/关系三类库的统一接口 + 多后端实现 | cognee/infrastructure/databases/ |
主线走一遍(高层)
- add:
cognee.add(text)跑一个两步流水线resolve_data_directories → ingest_data,把内容存成关系库里的Data行,并给用户授予该 dataset 的读写权限(cognee/api/v1/add/add.py,tasks列表)。 - cognify:
cognee.cognify()跑默认五步流水线:分类 → 切块 → 「LLM 抽图 + 摘要」 → 落库 → DLT 外键边(get_default_tasks,cognee/api/v1/cognify/cognify.py:321)。这一步把文本变成实体节点 + 关系边。 - search:
cognee.search(q)默认走GRAPH_COMPLETION:用查询向量在向量库里找最近的节点当「种子」,把图投影成一个内存子图,扩展出三元组,按距离打分取 top-k,渲染成文本喂给 LLM 生成答案(graph_completion_retriever.py)。