The memory system that understands causality.
Ask "why did auth fail?" and get a traced causal chain — not just similar documents.
Problem · Architecture · Pipeline · Quick Start · Deep Dive
______________________________________________________________________
问题
大多数代理内存都是平面检索——文本块上的余弦相似性。polyg-mcp是一个多图记忆系统,它追踪因果链,重建时间线,映射实体依赖关系,并用置信度评分的因果路径回答“为什么”。
Query: "Why did the auth service fail?"
Vector store → 5 documents mentioning "auth service" ranked by cosine similarity.
polyg-mcp → JWT_SECRET removed (PR #1234) → deploy missing secret → CrashLoopBackOff → 503s
↓ 100% ↓ 100% ↓ 95% ↓ 90%
Root cause identified with full causal chain.
Confidence degrades at each hop — quantified uncertainty, not guesswork.通过类型化交叉链接连接的四个专用图(语义、实体、时间、因果)(X_REPRESENTS, X_INVOLVES, X_AFFECTS, X_REFERS_TO)允许单个查询遍历所有四个维度。该系统公开了15个MCP工具,每次检索需要2个LLM调用——一个用于意图分类,一个用于综合。
______________________________________________________________________
建筑
系统概述
MCP Client (Claude, Cursor, any MCP agent)
│
│ MCP Protocol (HTTP/SSE)
▼
PolygMCPServer ─── Tool Registration (15 tools: 6 MAGMA + 7 write + 2 admin)
│
▼
SharedResources ── Orchestrator, FalkorDB Adapter, LLM Provider, Embedding Provider
│
▼
MAGMA Pipeline ── IntentClassifier → Executor → Merger → Linearizer → Synthesizer
│
├── SemanticGraph (S_Concept, vector similarity, cosine distance)
├── EntityGraph (E_Entity, E_RELATES, BFS traversal)
├── TemporalGraph (T_Event, T_Fact, ISO timestamp sort)
├── CausalGraph (C_Node, C_CAUSES with confidence, path traversal)
└── CrossLinker (X_REPRESENTS, X_INVOLVES, X_AFFECTS, X_REFERS_TO)
│
▼
FalkorDB (Redis-based graph database, Cypher queries)四个内存图
| 图 | 节点类型 | 模式 | 边类型 | 查询算法 |
|---|---|---|---|---|
| 语义 | S_Concept | uuid, name, embedding[1536] | 余弦相似度 | 向量距离,O(n\*d) |
| 实体 | E_Entity | uuid, name, type, properties{} | E_RELATES (键入,定向) | BFS遍历,O(V+E) |
| 时序 | T_Event / T_Fact | uuid, description, occurred_at / valid_from, valid_to | 时间顺序 | ISO时间戳排序,O(n log n) |
| 因果 | C_Node | uuid, description, node_type | C_CAUSES (置信度:0.0-1.0) | 有向路径遍历,O(V+E) |
跨图链接
这些图表不是孤立的。已输入 X_ 边跨图边界连接节点,实现从单个查询的多跳遍历:
| 交叉链接 | 方向 | 目的 | 创建者 |
|---|---|---|---|
X_REPRESENTS | S_概念→ E_Entity | 将概念建立在其现实世界实体的基础上 | CrossLinker 在写 |
X_INVOLVES | T_事件→ E_Entity | 将事件链接到参与实体 | CrossLinker 在写 |
X_AFFECTS | C_节点→ E_Entity | 将因果节点连接到受影响的实体 | CrossLinker 在写 |
X_REFERS_TO | T_事件→ C_Node | 将事件链接到它触发的因果节点 | CrossLinker 在写 |
所有交叉链接使用 MERGE 为了幂等性。当一个图被清除时,孤立 X_ 链接会自动清除。
横向示例 — *“为什么在周二部署后身份验证失败?”*:
Semantic search → S_Concept("auth-service", score=0.92)
↓ X_REPRESENTS
Entity expand → E_Entity("auth-service", type=SERVICE) → E_RELATES → E_Entity("api-gateway")
↓ X_INVOLVES
Temporal expand → T_Event("deploy v2.3.0", 14:00) → T_Event("CrashLoop", 14:03)
↓ X_REFERS_TO
Causal expand → C_Node("secret removed") →[100%]→ C_Node("crash") →[95%]→ C_Node("503s")______________________________________________________________________
MAGMA管道
岩浆 (多图自适应基于图的内存架构)通过2个LLM调用,分7步处理每次检索:
| 步骤 | 组件 | 操作 | 输出 |
|---|---|---|---|
| 1 | IntentClassifier | LLM提取意图+每图深度提示 | { type: "WHY", depthHints: { causal: 3, ... } } |
| 2 | SemanticGraph.searchWithEntities() | 余弦相似性超过 S_Concept 嵌入 | 对概念进行排序 linkedEntityIds |
| 3 | MAGMAExecutor.extractSeedsFromEnriched() | 跟随 X_REPRESENTS 边缘,按分数>=0.5过滤 | Set |
| 4 | MAGMAExecutor.expandFromSeeds() | 平行通孔 Promise.allSettled --部分故障安全 | 实体、时间、因果视图 |
| 5 | SubgraphMerger.merge() | 哈希聚合+多视图增强 | MergedSubgraph { nodes[], edges[] } |
| 6 | ContextLinearizer.linearize() | 意图特定排序,强制4000个令牌预算 | 有序上下文字符串 |
| 7 | Synthesizer.synthesize() | LLM从结构化上下文中生成答案 | { answer, reasoning, confidence } |
意图自适应深度
分类器为每个图分配遍历深度。这是自适应检索的核心——系统不是均匀扩展的。
Semantic Entity Temporal Causal
WHY 1 1 1 3 ← deep causal chain traversal
WHEN 1 1 3 1 ← deep timeline reconstruction
WHO / WHAT 1 2 1 1 ← entity relationship expansion
EXPLORE 2 2 2 2 ← uniform exploration线性化策略
合并后,必须为LLM上下文窗口排序节点。排序策略依赖于意图:
| 意图 | 策略 | 效果 |
|---|---|---|
WHY | 拓扑排序 | 原因先于结果出现——LLM按逻辑顺序读取链 |
WHEN | 按时间顺序排序 | 事件排序 occurred_at --自然时间线 |
WHO / WHAT | 相关性加权 | 大多数关联实体首先出现 |
EXPLORE | 基于频率 | 首先引用最多的节点 |
多视图增强
在多个图扩展中发现的节点获得了相关性提升。直觉:如果一个节点出现在因果和时间视图中,它更有可能是答案的核心。
final_score = avg_score × 1.5^(view_count - 1)
1 view → 1.0× (single graph only)
2 views → 1.5× (corroborated)
3 views → 2.25× (strong cross-graph signal)
4 views → 3.375× (central to entire context)______________________________________________________________________
快速开始
安装
npm install -g polyg-mcp
# or run directly
npx polyg-mcp先决条件
FalkorDB(图形数据库):
docker run -d -p 6379:6379 falkordb/falkordb克劳德桌面版
添加到 claude_desktop_config.json:
{
"mcpServers": {
"polyg": {
"command": "npx",
"args": ["polyg-mcp"],
"env": {
"OPENAI_API_KEY": "your-key-here",
"FALKORDB_HOST": "localhost",
"FALKORDB_PORT": "6379"
}
}
}
}Docker Compose
git clone https://github.com/Captain-Jay29/polyg-mcp.git
cd polyg-mcp
cp .env.example .env
docker-compose up -d来源
git clone https://github.com/Captain-Jay29/polyg-mcp.git
cd polyg-mcp && npm install
cp .env.example .env
npm run dev______________________________________________________________________
MCP工具
通过MCP暴露的15个工具。与Claude、Cursor和任何MCP代理兼容。
MAGMA Retrieval (6 tools)
| 工具 | 操作 |
|---|---|
semantic_search | 余弦相似性超过 S_Concept 嵌入,返回丰富的匹配 linkedEntityIds |
entity_lookup | BFS从种子实体ID扩展,可配置深度,返回 E_Entity 节点+ E_RELATES 边缘 |
temporal_expand | 时间范围查询结束 T_Event / T_Fact,按时间顺序返回事件 |
causal_expand | 定向路径遍历 C_Node → C_CAUSES,以每条边的置信度返回链 |
subgraph_merge | 结合实体/时间/因果视图,应用多视图增强公式 |
linearize_context | 使用特定意图的排序策略将合并的子图格式化为令牌预算字符串 |
Write (7 tools)
| 工具 | 操作 |
|---|---|
remember | 自然语言内存存储(自动路由到适当的图形) |
add_entity | 创建 E_Entity 节点与 type 和 properties 地图 |
add_event | 创建 T_Event 带ISO的节点 occurred_at 时间戳 |
add_fact | 创建 T_Fact 节点与 subject, predicate, valid_from / valid_to |
add_concept | 创建 S_Concept 自动生成 text-embedding-3-small 嵌入 |
add_causal_link | 创建两个 C_Node 节点连接方式 C_CAUSES 自信边缘(自我循环预防) |
link_entities | 创建类型 E_RELATES 两个之间的边缘 E_Entity 节点(防止自循环) |
Admin (2 tools)
| 工具 | 操作 |
|---|---|
get_statistics | 每个图的节点/边计数+交叉链接统计 |
clear_graph | 选择性图形清晰,自动孤立 X_ 链接清理 |
______________________________________________________________________
配置
# .env
OPENAI_API_KEY=sk-... # Required — LLM + embeddings
EMBEDDING_MODEL=text-embedding-3-small
LLM_MODEL=gpt-4o-mini
CLASSIFIER_MAX_TOKENS=1000 # Intent classifier token limit
SYNTHESIZER_MAX_TOKENS=2000 # Synthesizer output limit
FALKORDB_HOST=localhost
FALKORDB_PORT=6379
FALKORDB_QUERY_TIMEOUT=30000 # Max query execution (ms)
POLYG_PORT=3000
POLYG_LOG_LEVEL=info
POLYG_PARALLEL_TIMEOUT=30000 # Graph expansion timeout (ms)
POLYG_MAX_RETRIES=3 # LLM retry with exponential backoff______________________________________________________________________
项目结构
polyg-mcp/
├── packages/
│ ├── core/src/
│ │ ├── graphs/
│ │ │ ├── semantic.ts # Vector similarity (cosine over 1536-dim)
│ │ │ ├── entity.ts # Entity relationships (BFS)
│ │ │ ├── temporal.ts # Timeline queries (ISO sort)
│ │ │ ├── causal.ts # Cause-effect chains (path traversal)
│ │ │ └── cross-linker.ts # X_* relationship management
│ │ ├── executor/
│ │ │ └── magma-executor.ts # MAGMA pipeline orchestration
│ │ ├── retrieval/
│ │ │ ├── subgraph-merger.ts # Multi-view boosting
│ │ │ ├── context-linearizer.ts
│ │ │ └── seed-extraction.ts
│ │ ├── agents/
│ │ │ ├── intent-classifier.ts
│ │ │ └── synthesizer.ts
│ │ └── storage/
│ │ └── falkordb-adapter.ts # Cypher query builder
│ ├── server/src/
│ │ ├── mcp-server-factory.ts # 15 tool registrations
│ │ └── shared-resources.ts # Dependency injection
│ └── shared/src/
│ ├── types.ts # TypeScript interfaces
│ └── schemas.ts # Zod validation
├── docker-compose.yml
└── tests/______________________________________________________________________
贡献
看 贡献.md.
pnpm test
pnpm lint
pnpm build许可证
______________________________________________________________________
Built for agents that need to answer "why" — not just "what".
Report Bug · Request Feature
