m_flow README

The project's README from github.com/FlowElement-xinliuyuansu/m_flow. As one markdown file: README.md.

M-flow

RAG matches chunks. GraphRAG structures context. M-flow scores evidence paths.

Retrieval through reasoning and association — M-flow operates like a cognitive memory system.

m-flow.ai · flowelement.ai · Quick Start · Architecture · Examples · OpenClaw Skill · Contact

Tests Python License


What is M-flow?

The real shift is not whether a system builds a graph, but what the graph is allowed to do at retrieval time.

Graph topology encodes relevance.

In most RAG systems, retrieval is still dominated by similarity: the query is embedded, textual units are ranked by vector distance, and structure—if present—mainly helps organize, summarize, or expand context. Many GraphRAG systems add entities, relations, and community structure, but the graph often remains supportive rather than decisive in scoring.

M-flow takes a different approach: the graph is the scoring engine. When a query arrives, vector search casts a wide net across multiple granularities to find entry points. Then the graph takes over — propagating evidence along typed, semantically weighted edges, and scoring each knowledge unit by the strongest chain of reasoning that connects it to the query.

Relevance is not a score. It's a path.

That distinction matters because similarity and relevance are not identical.
Similarity is proximity in representation space. Relevance is whether the system can connect the query to the answer through a coherent structure of evidence.

Similar and relevant sometimes overlap, but they are fundamentally different.
Consider an everyday query: "Why was Maria upset at Monday's standup?"

Traditional retrieval — keyword overlap can look related, yet miss the real cause:

flowchart LR
    Q["Query: Why was Maria upset\nat Monday's standup?"] -->|"similarity on repeated words:\nstandup / upset / team"| C1["Document: how to run effective\ndaily standups (handling conflict,\nteam communication tips)"]
    C1 -->|"✗ high keyword overlap,\nbut generic advice"| R["Looks relevant by words,\nnot the cause of THIS event"]

M-flow retrieval — anchor at matching granularity, then graph propagation to the Episode bundle:

M-flow stores knowledge in a four-layer cone graph: Episode → Facet → FacetPoint → Entity. A query lands on the layer that matches its granularity — a precise cue hits a fine-grained FacetPoint; a broader theme hits a Facet or an Episode summary. Here the specific cue "I wasn't told about the deadline" anchors on a FacetPoint at the same granularity, and graph propagation then routes up through its Facet to the Episode it belongs to. Each returned bundle is one Episode, scored by its strongest path of evidence.

flowchart LR
    Q["Query:<br/>Why was Maria upset<br/>at Monday's standup?"]
    Q -->|"vector hit at matching<br/>granularity"| FP["FacetPoint (anchor)<br/>'I wasn't told about<br/>the deadline'<br/>— Maria, Mon 09:15"]
    FP -->|"belongs to"| F["Facet<br/>Deadline communication<br/>gap raised at standup"]
    F -->|"part of"| EP["Episode (bundle)<br/>Monday standup discussion<br/>(contains Maria's complaint AND<br/>the weekend deadline change<br/>context she referenced)"]
    EP --> R["Answer composed from<br/>the Episode bundle's contents:<br/>Maria was blindsided by a<br/>weekend deadline change<br/>she was not included in"]

The downstream LLM then composes the final answer from the bundle's content (the Episode together with its Facets and FacetPoints). For the full path-cost mechanism, see Retrieval Architecture.

Key idea: similarity matches by overlapping words; M-flow matches by granularity-aligned anchors and then routes through the cone graph to a coherent Episode bundle.

The graph finds the answer not by matching words, but by following the chain of evidence. This difference — from candidate matching to path-cost retrieval — is what drives M-flow's advantage in our reported benchmarks.

M-flow operates like a cognitive system: it captures signal at the sharpest point of detail, traces associations through structured memory, and arrives at the right answer the way human recall does.

How It Works

M-flow organizes knowledge into a four-level Cone Graph — a layered hierarchy from abstract summaries to atomic facts:

Level What it captures Query example
Episode A bounded semantic focus — an incident, decision process, or workflow "What happened with the tech stack decision?"
Facet One dimension of that Episode — a topical cross-section "What were the performance targets?"
FacetPoint An atomic assertion or fact derived from a Facet "Was the P99 target under 500ms?"
Entity A named thing — person, tool, metric — linked across all Episodes "Tell me about GPT-4o" → surfaces all related contexts

Retrieval is graph-routed: the system casts a wide net across all levels, projects the hits into the knowledge graph, propagates cost along supported evidence paths, and scores each Episode by its strongest chain of evidence.

One strong path is enough — the way a single association can trigger an entire memory.

Association as controlled propagation

M-flow treats association as controlled graph propagation, not as a one-shot similarity match.

A query first lands on the most precise anchor it can find — an Entity, FacetPoint, Facet, or Episode. From that anchor, evidence spreads through nearby typed edges and connected memory units. Each hop expands the semantic field, but each edge also adds cost. This means association is not a random graph walk: only paths with coherent, low-cost connections remain competitive.

A simple analogy: thinking of classmate A may first bring up the fact that A grew up in California. That fact opens a wider neighborhood of California-related memories; within that neighborhood, the Lakers may become the next low-cost association. M-flow models this kind of recall as path-cost propagation through a structured memory graph.

In the inverted-cone view, each hop can be seen as moving toward a wider semantic cross-section: from a precise cue, to a related fact or facet, to the broader Episode that contains the useful context.

The figure below is a visual aid for this process, laid out left-to-right (cue on the left, broader Episodes on the right; supplementary to the text above):

flowchart LR
    Q["Cue / query\nclassmate A"]
    A["Anchor (Entity)\nA"]
    FP1["FacetPoint\nA grew up in California"]
    F1["Facet\nCalifornia background"]
    FP2["FacetPoint\nA is a Lakers fan"]
    E1["Episode\nschool years context"]
    E2["Episode\nNBA chat memory"]

    Q -->|anchor match| A
    A -->|typed edge + cost| FP1
    FP1 -->|graph propagation| F1
    F1 -->|supported path| E1
    F1 -->|low additional cost| FP2
    FP2 -->|supported path| E2

Unified multi-granularity retrieval

Storing knowledge at multiple granularities is useful, but it is not enough.

Some memory systems keep separate layers for episodic memories, atomic facts, entities, or summaries. When these layers are queried separately, retrieval tends to work best when the user's query matches the selected layer: an episodic query retrieves Episodes; an atomic query retrieves atomic facts.

M-flow connects these granularities inside one graph. Episodes, Facets, FacetPoints, Entities, and semantic edge descriptions are all searchable entry points, but they are not isolated retrieval silos. A precise query can enter through a FacetPoint and return the Episode it belongs to. A broad query can enter through an Episode summary. An entity query can bridge multiple Episodes through the same Entity node.

The user does not need to choose the right memory layer. M-flow lets the query find the right-granularity anchor, then uses the graph to return the memory bundle with the strongest supporting path.

How the routing maps in practice:

Query style Typical entry layer
Broad / thematic — "How did Q3 planning go?" Episode summary (direct hit; penalized)
Mid-grained / topical — "deadline communication issues" Facet
Precise / atomic — "'I wasn't told about the deadline'" FacetPoint
Entity-centered — "anything about Maria" Entity

M-flow retrieval at a glance

1. Graph-led retrieval (not similarity-led)

Vectors find candidates. The graph decides relevance.

2. Evidence-path scoring (not flat ranking)

One strong chain of evidence is enough.

3. Unified multi-granularity retrieval

Not just multi-level storage — but multi-level retrieval.

4. Semantic edges as first-class signals

Connections carry meaning, not just structure.

5. Controlled propagation (not a naive graph walk)

Association, but with structure and discipline.

6. Adaptive and noise-resistant retrieval

Prevents "looks relevant" from beating "is relevant".

For the full technical deep-dive, see Retrieval Architecture

Three more capabilities

Coreference resolution at ingestion

Mini-example (two-turn conversation).

Without coreference: each turn is ingested independently. Turn 2 contains no Maria token, so its FacetPoint cannot anchor on Entity Maria. A later query "What did Maria say about the deadline?" finds Turn 1 but never reaches Turn 2 — the relevant evidence is invisible because the anchor is missing.

With coreference: M-flow keeps a stream-level session across turns. When Turn 2 arrives, she is resolved to Maria using the antecedent from Turn 1, producing "Maria said Maria wasn't told about the change." before indexing. Turn 2 now anchors on Entity Maria and becomes retrievable through the same Entity bridge.

Pronouns get resolved before they reach the graph. See the coreference module.

Face-aware memory partitioning (real-time routing)

Each face has its own memory; the system routes by who is talking. See Playground with Face Recognition.

Procedural memory — the abstract dimension

The reusable abstract know-how about you and your work that no foundation model can already have.

Benchmarks

All systems use gpt-5-mini (answer) + gpt-4o-mini (judge). Cat 5 (adversarial) excluded from LoCoMo.

LoCoMo-10

Aligned (top-k = 10)

System LLM-Judge Answer LLM Judge LLM Top-K
M-flow 81.8% gpt-5-mini gpt-4o-mini 10
Cognee Cloud 79.4% gpt-5-mini gpt-4o-mini 10
Zep Cloud (7e+3n) 73.4% gpt-5-mini gpt-4o-mini 10
Supermemory Cloud 64.4% gpt-5-mini gpt-4o-mini 10

With vendor-default retrieval budgets

System LLM-Judge Answer LLM Judge LLM Top-K
M-flow 81.8% gpt-5-mini gpt-4o-mini 10
Cognee Cloud 79.4% gpt-5-mini gpt-4o-mini 10
Zep Cloud (20e+20n) 78.4% gpt-5-mini gpt-4o-mini 40
Mem0ᵍ Cloud (published) 68.5% — — —
Mem0 Cloud (published) 67.1% — — —
Supermemory Cloud 64.4% gpt-5-mini gpt-4o-mini 10
Mem0 Cloud (tested) 50.4% gpt-5-mini gpt-4o-mini 30

LongMemEval

Aligned (top-k = 10)

System LLM-Judge Temporal (60) Multi-session (40)
M-flow 89% 93% 82%
Supermemory Cloud 74% 78% 68%
Mem0 Cloud 71% 77% 63%
Zep Cloud 61% 82% 30%
Cognee 57% 67% 43%

Per-category breakdowns, reproduction scripts, raw data, and methodology for all systems: mflow-benchmarks

Features

Episodic + Procedural memory Hierarchical recall for facts and step-by-step knowledge
5 retrieval modes Episodic, Procedural, Triplet Completion, Lexical, Cypher
50+ file formats PDFs, DOCX, HTML, Markdown, images, audio, and more
Multi-DB support LanceDB, Neo4j, PostgreSQL/pgvector, ChromaDB, KùzuDB, Pinecone
LLM-agnostic OpenAI, Anthropic, Mistral, Groq, Ollama, LLaMA-Index, LangChain
Precise summarization Preserves all factual details (dates, numbers, names) at the cost of lower compression — RAG context will be longer but more accurate
MCP server Expose memory as Model Context Protocol tools for any IDE
CLI & Web UI Interactive console, knowledge graph visualization, config wizard

Retrieval modes: Episodic is the primary retrieval mode — it uses graph-routed Bundle Search for best accuracy and is used in all benchmarks. Triplet Completion is a simpler vector-based mode suited for customization and secondary development. See Retrieval Architecture for details.

Quick Start

One-Command Setup (Docker)

git clone https://github.com/FlowElement-xinliuyuansu/m_flow.git && cd m_flow
./quickstart.sh

The script checks your environment, configures API keys interactively, and starts the full stack (backend + frontend). On Windows, use .\quickstart.ps1.

Install via pip

pip install mflow-ai         # or: uv pip install mflow-ai
export LLM_API_KEY="sk-..."

Install from Source

git clone https://github.com/FlowElement-xinliuyuansu/m_flow.git && cd m_flow
pip install -e .             # editable install for development

Run

import asyncio
import m_flow


async def main():
    await m_flow.add("M-flow builds persistent memory for AI agents.")
    await m_flow.memorize()

    # query() defaults to episodic graph-routed Bundle Search.
    results = await m_flow.query("How does M-flow work?")
    for item in results.context:
        print(item)


asyncio.run(main())

CLI

mflow add "M-flow builds persistent memory for AI agents."
mflow memorize
mflow search "How does M-flow work?" --query-type EPISODIC
mflow -ui          # Launch the local web console

Architecture Overview

┌───────────────┐     ┌───────────────┐     ┌───────────────┐
│  Data Input   │────▶│    Extract    │────▶│   Memorize    │
│  (50+ formats)│     │  (chunking,   │     │  (KG build,   │
│               │     │   parsing)    │     │  embeddings)  │
└───────────────┘     └───────────────┘     └───────┬───────┘
                                                    │
                      ┌───────────────┐     ┌───────▼───────┐
                      │    Search     │◀────│     Load      │
                      │  (graph-routed│     │   (graph +    │
                      │  bundle search│     │  vector DB)   │
                      └───────────────┘     └───────────────┘

Project Layout

m_flow/              Core Python library & API
├── api/             FastAPI routers (add, memorize, search, …)
├── cli/             Command-line interface (`mflow`)
├── adapters/        DB adapters (graph, vector, cache)
├── core/            Domain models (Episode, Facet, FacetPoint, …)
├── memory/          Memory processing (episodic, procedural)
├── retrieval/       Search & retrieval algorithms
├── pipeline/        Composable pipeline tasks & orchestration
├── auth/            Authentication & multi-tenancy
├── shared/          Logging, settings, cross-cutting utilities
├── tests/           Unit & integration tests
└── api/v1/playground/  Face-aware interactive chat (Playground)

m_flow-frontend/     Next.js web console
m_flow-mcp/          Model Context Protocol server
mflow_workers/       Distributed execution helpers (Modal, workers)
examples/            Runnable example scripts
docs/                Architecture & design documents

Development

git clone https://github.com/FlowElement-xinliuyuansu/m_flow.git && cd m_flow
uv sync --dev --all-extras --reinstall

# Test
PYTHONPATH=. uv run pytest m_flow/tests/unit/ -v

# Lint
uv run ruff check . && uv run ruff format .

See CONTRIBUTING.md for the full contributor guide.

Deployment

Docker

docker compose up                       # Backend only
docker compose --profile ui up          # Backend + frontend
docker compose --profile neo4j up       # Backend + Neo4j
docker compose --profile postgres up    # Backend + PostgreSQL + PGVector

Playground with Face Recognition

The Playground provides interactive multi-person conversations with face-aware memory. It requires fanjing-face-recognition as a companion service.

Quick setup (clones repo, downloads models, configures .env):

./scripts/setup-playground.sh

The script detects your OS and prints the exact launch commands when done.

Camera access: Face recognition requires a camera. On macOS/Windows, Docker cannot access USB cameras — run fanjing-face-recognition directly on the host (see "Recommended setup" below). The `--prof

m_flow (FlowElement-xinliuyuansu/m_flow)

Searching Database…

4.5K ·GitHub
这是什么?M-flow 是一个受生物启发的认知记忆引擎,是 Graph RAG 的一种新范式:它不只是检索相似的文本块,而是构建一张记忆图,并按照连接查询与内容的最强证据链为答案打分,就像人类回忆的方式。
这是我要运行的数据库、我要导入的库,还是两者都是?它是一个需要你自己托管的记忆后端:它把图存储在多个数据库之一中(Neo4j、PostgreSQL/pgvector、LanceDB、ChromaDB、KuzuDB 或 Pinecone),并且不绑定特定 LLM(支持 OpenAI、Anthropic、Mistral、Groq、Ollama、LlamaIndex、LangChain),由你把它集成到自己的 LLM 应用或智能体中。
怎么让它跑起来?你从受支持的数据库中选一个做存储,配置一个 LLM 服务商,然后按照项目的快速入门指南操作;仓库还附带 Docker 以及所需服务的 docker-compose 配置。
我需要自己的 LLM API 密钥和图数据库吗?需要——M-flow 不绑定特定 LLM,因此你要自备 OpenAI、Anthropic、Mistral、Groq 之类的服务商或本地 Ollama 模型,还需要运行一个受支持的数据库(Neo4j、PostgreSQL/pgvector 等)来存储 Cone Graph。
哪些是可选的、哪些是必需的,比如人脸识别路由?核心图记忆和检索开箱即用;像人脸感知记忆分区这样的功能需要额外、可选地集成一个独立的人脸识别组件,标准使用场景并不需要。
M-flow 内部是如何组织记忆的?它使用四层的“Cone Graph”:Episode(一个有边界的事件或决策)、Facet(该事件的一个维度)、FacetPoint(一条原子事实)和 Entity(跨事件关联的具名事物)。查询落在匹配的粒度上,图会路由并组装出正确的信息包。
与 Mem0 或 Zep 等其他记忆系统相比表现如何?在 LoCoMo-10 上,M-flow 得分 81.8%(LLM 裁判),Cognee 为 79.4%,Zep 为 73.4-78.4%,Mem0 为 50-68%;在 LongMemEval 上,M-flow 达到 89%,Mem0 为 71%,Zep 为 61%。
它能摄取哪些文件类型?它支持 50 多种文件格式,包括 PDF、DOCX、HTML、Markdown、图片和音频。
M-flow 中的程序性记忆是什么?除事实之外,它还会提取可复用的抽象模式——你的习惯、工作流、决策规则和命名约定——让系统学会你怎么工作,而不仅是发生了什么。
Size
3.7 MB
Stars
4.5K
Age
6mo
Commits · 90 Days