Semantica:开源版 Palantir,给 AI Agent 装上可审计的 Context Graph
Semantica:开源版 Palantir,给 AI Agent 装上可审计的 Context Graph
监管问"AI 为什么这么批"的时候,你的 embedding 答不上来。
大多数 AI Agent 是不留痕迹的。它们存的是 embedding,不是语义:context 没法解释,决策没法审计。在聊天机器人场景这无所谓,但在贷款审批里,这是合规风险——一个承销 Agent 的批准决定,必须经得起监管机构几个月后追问的那句"为什么"。
Semantica(GitHub 10,124 星,1,084 fork,MIT 协议,Python)就是冲这个问题来的。它给自己的定位是"AI Agent 的开源 Palantir":一个图原生(Graph-Native)的基础设施层,坐在你的 LLM、向量库和 Agent 框架底下,负责 Context Graph 构建、决策记录、因果推理和全程溯源。最关键的一点:建图、推理、溯源全部是确定性代码,不依赖 LLM。
我读完它的 README 和架构文档后觉得,这个项目值得认真拆一次。它踩的位置很准——不是再造一个 Agent 框架,而是补上现有技术栈缺失的"账本"。
本文提纲
- RAG 缺的那本账
- 端到端管线:从原始数据到可审计的图
- Decision Intelligence:决策是一等公民
- Context Graph:图遍历能找到 embedding 找不到的连接
- 确定性推理:Rete、Datalog、SPARQL
- 多语言存储与生态位
- 实战:给一笔贷款审批做审计链路
- 性能数字与该知道的坑
RAG 缺的那本账
先看 Semantica 在 README 里放的那张对比表,它把当前主流方案的记忆层问题说得很直白:
| Vector DB + RAG | 普通 LLM Memory | Semantica | |
|---|---|---|---|
| 检索方式 | embedding 相似度 | token 窗口 | 图遍历 + 语义搜索 |
| 决策历史 | 不存 | 不存 | 一等公民,可查询 |
| 溯源 | 无 | 无 | W3C PROV-O,链接到源 |
| 推理 | 无 | 黑盒 | 前向链、Rete、Datalog、SPARQL |
| 冲突检测 | 静默覆盖 | 静默覆盖 | 检测、标记、解决 |
| 时间旅行 | 无 | 无 | 任意时间点快照 |
| 合规导出 | 无 | 无 | PROV-O、SHACL、OWL、RDF |
这张表里我认为最被低估的一行是冲突检测。多源数据接入时,A 系统说 Alice 是 CTO,B 系统说是 VP Eng,RAG 方案的默认行为是把两条都切成 chunk 存进去,检索时看谁相似度高——知识库就这么悄悄被污染了。Semantica 的做法是显式检测 value/type/relationship/temporal/logical 五类冲突,标记出来,再按可信度加权、多数投票或时间优先策略解决。
另一个被低估的是决策历史。Agent 做了一个决定,这个"决定"在大多数框架里就是一行日志,事后既没法按先例搜索,也没法追溯到根因。Semantica 把它变成图上的一个节点。
端到端管线:从原始数据到可审计的图
Semantica 不是单个库套了个营销名字,它是一条完整的管线,每个阶段都是独立可 import 的模块:
Sources -> Ingest -> Parse -> Normalize -> Split -> Extract -> Conflict Detection -> Deduplication
-> Knowledge Graph -> [ Ontology · Reasoning · Provenance · Decisions ] -> Enriched KG
-> Vector Store + Polyglot Graph Store (RDF & LPG) -> Export / Visualize / REST · MCP · CLI
画成图是这样:
MERMAID_BLOCK_0
几个值得注意的细节:
接入层覆盖面很广。 文件(PDF/DOCX/HTML/CSV/Excel)、网页、RSS、REST API、关系型数据库、Parquet、Kafka/Kinesis/Pulsar 流、Git 仓库、邮件、MCP 资源。针对企业数据平台还有原生连接器:Databricks(Unity Catalog + Delta Lake,支持 PAT/OAuth M2M 认证,能拉表级 lineage)和 Snowflake。这个设计意图很明显——让已经躺在 lakehouse 里的表直接变成带溯源的图节点,而不是先导出成 CSV 再导入。
切片是 GraphRAG 原生的。 semantica.split 提供 entity-aware、relation-aware、ontology-aware 等 12 种切片方式。entity-aware 保证命名实体不会被切到两个 chunk 里——做 GraphRAG 的人都知道,实体被切断意味着检索时上下文直接残废。
双向时间轴(bi-temporal)。 每个事实区分 valid_time(世界上为真的时间)和 recorded_at(你得知它的时间),支持 Allen 区间代数和任意时间点快照。这解决了"去年 Q3 这份合同到底说了什么"这类问题——不用重新处理历史数据,直接 state_at("2024-01-01")。
Decision Intelligence:决策是一等公民
这是 Semantica 的旗舰能力。在它这里,一个决策不是日志行,而是一个有完整生命周期的图节点:
record_decision() -> 存为带完整结构化上下文的图节点
add_causal_relationship() -> 链接上游原因和下游结果
find_similar_decisions() -> 跨历史决策的语义先例搜索
trace_decision_chain() -> 追溯完整因果祖先链
analyze_decision_impact() -> 下游影响图——这个决策影响了什么
check_decision_rules() -> 对可配置规则集的策略合规门
export / audit trail -> 导出 W3C PROV-O、CSV 或 JSON
看一段实际代码,贷款审批场景:
from semantica.context import ContextGraph
graph = ContextGraph(advanced_analytics=True)
app_id = graph.record_decision(
category="credit_application",
scenario="Personal loan, $85k income, 31% DTI, 3yr employment",
reasoning="Income meets threshold; employment stable; no adverse credit events",
outcome="proceed_to_underwriting",
confidence=0.88,
metadata={"applicant_id": "A-7291"},
)
uw_id = graph.record_decision(
category="loan_underwriting",
scenario="Underwriting review for A-7291",
reasoning="DTI within policy; clean 36-month credit history",
outcome="approved",
confidence=0.94,
)
rate_id = graph.record_decision(
category="interest_rate",
scenario="Rate assignment for approved loan A-7291",
outcome="rate_set_8.9pct",
reasoning="Prime + 2.4% based on risk tier B2",
confidence=0.99,
)
# 建立可审计的因果链,relationship_type 只能是 CAUSED / INFLUENCED / PRECEDENT_FOR
graph.add_causal_relationship(app_id, uw_id, relationship_type="CAUSED")
graph.add_causal_relationship(uw_id, rate_id, relationship_type="INFLUENCED")
chain = graph.trace_decision_chain(rate_id) # 完整因果祖先链
similar = graph.find_similar_decisions("personal loan approval, 31% DTI", max_results=5)
impact = graph.analyze_decision_impact(uw_id) # 下游影响图
compliant = graph.check_decision_rules({"category": "loan_underwriting", "confidence": 0.94})
这三个决策串成一条因果链:申请 → 承销 → 定价。审计时 trace_decision_chain(rate_id) 一路回溯到根因,find_similar_decisions 能找出历史上所有相似的审批先例,analyze_decision_impact 能算出这个承销决定影响了下游哪些节点。
这个设计对应的现实是:监管框架(金融、医疗)普遍接受 W3C PROV-O 格式的提交,而把决策导出成 PROV-O 恰好是这个数据模型的原生能力。
Context Graph:图遍历能找到 embedding 找不到的连接
Context Graph 是 Semantica 给 Agent 的结构化记忆层。和 RAG 的区别在于回答的问题不同:embedding 回答"什么相似",图回答"什么相连、为什么、怎么连的"。
from semantica.context import ContextGraph, AgentContext
from semantica.vector_store import VectorStore
graph = ContextGraph(advanced_analytics=True)
graph.add_node("acme_corp", "Organization", name="Acme Corp", industry="SaaS")
graph.add_node("alice_chen", "Person", name="Alice Chen", role="CTO")
graph.add_node("contract_001", "Contract", value=2_400_000, currency="USD")
graph.add_edge("alice_chen", "acme_corp", edge_type="works_for", since="2019-03-01")
graph.add_edge("acme_corp", "contract_001", edge_type="party_to", signed="2024-01-15")
# BFS 遍历,从任意节点跳 2 跳
neighbors = graph.get_neighbors("acme_corp", hops=2)
# 时间点快照——图在过去任意日期的状态
snapshot = graph.state_at("2024-01-01")
# AgentContext——Agent 记忆工作流的高层 API
vs = VectorStore(backend="faiss")
ctx = AgentContext(vector_store=vs, knowledge_graph=graph)
ctx.store("Alice approved the Acme renewal in Q1 2024", conversation_id="conv_001")
retrieved = ctx.retrieve("who approved the Acme contract?")
为什么用图而不是纯 embedding?README 给了三个理由,我认为都站得住:图遍历能找到 embedding 漏掉的连接(离合同 3 跳的那个人);每个节点带溯源,随时能问"这从哪来的";冲突在污染知识库之前被拦截。
注意 AgentContext 这个设计——它同时接 vector store 和 knowledge graph,说明 Semantica 没有打算取代向量检索,而是把两者组合起来用。
确定性推理:Rete、Datalog、SPARQL
Semantica 的推理层是这套系统里我最感兴趣的部分,因为它完全不用 LLM:
from semantica.reasoning import ReteEngine, Rule, Fact, RuleType
rete = ReteEngine()
rete.build_network([
Rule(
rule_id="aml_flag",
name="Flag high-risk transactions",
conditions=[
{"field": "amount", "operator": ">", "value": 10_000},
{"field": "country", "operator": "in", "value": ["IR", "KP", "SY"]},
],
conclusion="flag_for_compliance_review",
rule_type=RuleType.IMPLICATION,
),
])
rete.add_fact(Fact("tx_001", "transaction", [{"amount": 15_000, "country": "IR"}]))
flagged = rete.match_patterns()
# -> [{"rule": "aml_flag", "matched_facts": ["tx_001"], "conclusion": "flag_for_compliance_review"}]
这是一条 AML(反洗钱)规则:金额超 1 万且流向受制裁国家,自动标记合规审查。规则是声明式的,执行是确定性的,结果是可解释的——ExplanationGenerator 能输出推理路径,每一步用了哪个规则、命中了哪些事实。
Datalog 部分支持递归查询,写起来像自然语言:
from semantica.reasoning import DatalogReasoner
engine = DatalogReasoner()
engine.add_fact("parent(tom, bob)")
engine.add_fact("parent(bob, ann)")
engine.add_rule("ancestor(X, Y) :- parent(X, Y).")
engine.add_rule("ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).")
ancestors = engine.query("ancestor(tom, ?X)")
# -> [{"X": "bob"}, {"X": "ann"}, {"X": "pat"}]
为什么确定性推理重要?因为在合规场景里,"模型觉得该标记"和"规则判定该标记"是两回事。前者是概率,后者是因果。同一笔交易今天跑和明天跑,规则引擎给出相同结论——这个可复现性是审计的前提。
README 里有个值得表扬的诚实声明:ReteEngine 的 alpha 节点条件匹配器在这个版本是刻意简化的,接入生产合规门之前要先用自己的规则集验证 match_patterns() 的输出,更精细的条件求值在路线图上。开源项目敢在 README 里写自己推理引擎的局限,这个态度比多数商业产品的营销文档强。
另一个必须说清楚的边界:Semantica 提供的是系统级可解释性,不是基础模型可解释性。它不解释 LLM 内部发生了什么——chain-of-thought 对任何外部系统都是黑盒。它解释的是模型外部的东西:喂进去了什么 context 和数据、产出了什么决策、溯源是什么、应用了什么策略、完整执行轨迹。换句话说,它审计的是 AI 系统做了什么,不是 LLM 的私人推理过程。这个区分在选型时很重要,别把它当成模型可解释性工具买回去。
多语言存储与生态位
存储层是 polyglot 设计,RDF 和 LPG 两大阵营都支持,代码不用改就能换后端:
- RDF 三元组库:嵌入式 Oxigraph、Blazegraph、Apache Jena、Eclipse RDF4J(走 SPARQL)
- 属性图(LPG):Neo4j、FalkorDB、Apache AGE、AWS Neptune(走 Cypher)
- 向量库:FAISS、Qdrant、Weaviate、Milvus、Pinecone、PgVector
接口层同样全:CLI(semantica 命令自带 22 个命令组)、REST API(python -m semantica.server)、MCP server(semantica-mcp,暴露 12 个工具,包括 record_decision、find_precedents、get_causal_chain)。MCP 接入 30 秒:
{
"mcpServers": {
"semantica": { "command": "python", "args": ["-m", "semantica.mcp_server"] }
}
}
Agent 框架方面,Agno 和 CrewAI 是一等公民(pip install semantica[agno] / semantica[crewai]),Agno 那个多 Agent 共享 Context 的模式设计得不错——团队里 Researcher 和 Analyst 读写同一个 context graph,发现即时共享,没有拷贝和同步。LangChain、LlamaIndex、AutoGen、OpenAI Agents SDK 走 REST/MCP 支持。
还有一个浏览器端的 Knowledge Explorer(React 19 + Sigma.js),可以拖拽探索活图、拖时间轴看图演化、审查每个决策的因果链、可视化合并重复实体。pip install "semantica[explorer]" 装完直接 semantica-explorer 起服务,不需要 Node.js。
LLM 提供商通过 LiteLLM 全覆盖:OpenAI、Anthropic、Gemini、Mistral、Llama、Groq、Cohere、Azure、Bedrock、Ollama、DeepSeek 等。
实战:给一笔贷款审批做审计链路
把上面的模块串起来,就是 README 里的旗舰模式——记录因果链、给每个实体挂溯源、导出监管就绪的审计档案:
from semantica.context import ContextGraph
from semantica.provenance import ProvenanceManager
from semantica.export import RDFExporter
graph = ContextGraph(advanced_analytics=True)
prov = ProvenanceManager(storage_path="./audit.db")
# 记录决策链
d1 = graph.record_decision(
category="drug_interaction_check",
scenario="Patient P-4821: warfarin + amiodarone co-prescribed",
reasoning="Amiodarone potentiates warfarin's anticoagulant effect",
outcome="flag_for_review", confidence=0.91,
)
d2 = graph.record_decision(
category="dosage_adjustment",
scenario="INR monitoring plan for P-4821",
reasoning="Reduce warfarin dose per interaction severity; recheck INR in 5 days",
outcome="dose_reduced_30pct", confidence=0.87,
)
graph.add_causal_relationship(d1, d2, relationship_type="CAUSED")
# 给每个实体挂溯源
prov.track_entity("patient_P4821", source="ehr/medication_orders_2024.json",
metadata={"extractor": "NamedEntityRecognizer"})
# 导出 W3C PROV-O 用于监管提交
kg = graph.to_kg_dict() # 官方适配器,免手工字段映射
RDFExporter().export(kg, "audit_trail.ttl", format="turtle")
这是医疗场景(药物相互作用检查 → 剂量调整),同样的模式套到金融审批、法律取证、威胁归因都成立。核心动作就三步:记录决策、挂溯源、导出 PROV-O。输出格式是多数合规框架接受的提交格式。
性能数字与该知道的坑
v0.5.0 在一个 118,000 节点生产图上(AMD EPYC、64GB 内存)的基准:
| 操作 | 之前 | 之后 | 提升 |
|---|---|---|---|
| 节点搜索(118k 节点) | 24 ms | 0.004 ms | 6,000 倍 |
| embedding 缓存命中 | 冷加载 | 基于版本的缓存 | 10 倍吞吐 |
| 语义去重 | 基线 | 优化候选生成 | 6.98 倍 |
| 候选生成 | 基线 | blocking 策略 | 63.6% 提速 |
README 标注了这些数字里去重和候选生成是 CHANGELOG 里的历史测量值而非自动化断言,并给了自测命令 pytest tests/vector_store/test_performance_benchmarks.py -s。硬件和数据集拓扑不同结果会差很多,别直接拿这些数字做选型承诺。
安装按需装 extras,别一上来 semantica[all]:
pip install semantica # 核心
pip install semantica[graph-neo4j] # Neo4j 后端
pip install semantica[llm-litellm] # 多 LLM 提供商
pip install "semantica[explorer]" # Knowledge Explorer 仪表盘
装完先跑 semantica doctor 做健康检查,5 秒确认 Python 版本、faiss、配置文件都正常。
v0.6.6 是个安全版本,修了一批私下披露的漏洞:备份恢复的路径穿越、DataExporter 的潜在 SQL 注入、SSRF 防护的 DNS-rebinding TOCTOU 竞态、HTML 报告的存储型 XSS、重定向时的凭据泄漏。如果你在跑旧版本,升级优先级应该很高——这批漏洞集中在外发请求和数据处理路径上,对一个自称面向受监管行业的工具来说修得及时是加分项。
最后给一个适用性判断。适合你,如果:你在做高风险领域的 Agent(金融、医疗、法律、政府),决策需要可追溯;你的多源数据有冲突需要治理;你要把 Databricks/Snowflake 里的表变成知识图而不想先导出。不适合你,如果:你只想给聊天机器人加个向量记忆——ContextGraph 那套决策记录和因果链对你是杀鸡用牛刀,纯 RAG 方案更轻。另外它不解决 LLM 内部可解释性,别指望它告诉你模型为什么输出这句话。
参考文档与链接
- GitHub: semantica-agi/semantica - 10,124 星,MIT 协议,Python,Graph-Native 基础设施
- Semantica 官网 - 产品定位与企业版信息
- 官方文档 - 完整 API 与 CLI 参考(22 个命令组)
- ARCHITECTURE.md - 完整管线与决策智能生命周期的 Mermaid 架构图
- Cookbook - 可运行 Jupyter 笔记本,每个 5 分钟内跑完
- PyPI: semantica - 安装与 extras 列表
- W3C PROV-O 规范 - 溯源导出所遵循的 W3C 标准
- SHACL 规范 - 图数据约束语言,Ontology Hub 验证的基础
- DeepWiki: semantica-agi/semantica - 自动生成的架构 wiki,模块关系与数据流
- Discord 社区 - 实时讨论与 showcase
你的 Agent 决策现在用什么存?日志、数据库,还是压根没存?评论区聊聊你的做法。觉得这个项目方向对的,点个赞让更多人看到。
作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/
关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top
本文首发于 AI人工智能时代,转载请注明出处。

浙公网安备 33010602011771号