学习有如母亲一般慈爱,它用纯洁和温柔的欢乐来哺育孩子,如果向它要求额外的报酬,也许就是罪过。—— 巴尔扎克
Semantica:让 AI 的上下文、决策与责任拥有一张可追溯的图 项目地址:https://github.com/semantica-agi/semantica
当 AI 开始参与越来越重要的工作,问题便不再只是“它能不能给出答案”。
更关键的问题变成了:
它知道什么?
它为什么会这样判断?
这条结论来自哪里?
此前发生过哪些相似决策?
当一项决策影响了后续流程,又该如何回溯它的因果链路?
Semantica 想做的,正是为这些问题提供一层可以被查询、被解释、被审计、被治理的图原生基础设施。
它将自己定位为面向上下文与可问责 AI 系统的图原生基础设施。这里的重点并不只是把文本变成向量,也不只是为模型堆叠一层记忆,而是把数据、实体、关系、规则、推理、决策、溯源和时间共同组织进一张能够持续生长的图里。
在这张图中,AI 的上下文不再是一段转瞬即逝的提示词,不再只是隐藏在向量索引里的相似片段,而是变成可以连接、遍历、追问和导出的知识结构。
从“记住内容”走向“理解关系” 许多 AI 系统能够检索相似文本,却很难完整解释信息之间的关系。
它们或许能找到一份合同、一条记录、一段对话,但当问题进一步变成“这个人和这项协议之间隔着哪些关系”“这项决定受到了哪些前置条件影响”“这个结论对应的原始来源是什么”时,单纯依赖向量相似度往往显得不够从容。
Semantica 提供的 Context Graph,试图成为传统 RAG 之外的一层结构化记忆。
它不只关注“什么内容相似”,也关注“什么事物彼此连接”“为什么连接”“这些关系在什么时候成立”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from semantica.context import ContextGraph, AgentContextfrom semantica.vector_store import VectorStoregraph = 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" ) neighbors = graph.get_neighbors("acme_corp" , hops=2 ) snapshot = graph.state_at("2024-01-01" ) 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?" )
在这里,节点承载类型化信息,边表达带有语义的关系,图遍历能够沿着连接向外扩展。上下文不再是一叠孤立的文本碎片,而像一座拥有道路、坐标与历史痕迹的城市。
让决策从瞬间消失的推断,变成可追问的对象 Semantica 最鲜明的一条主线,是 Decision Intelligence。
在许多系统中,决策可能只是一条日志,或者一次模型输出。它发生过,但很难被严谨地重新组织、查询和解释。
而在 Semantica 的设计里,决策是图中的一等对象。
一条决策可以记录自己的类别、场景、推理过程、结果、置信度和附加元数据。它还可以与前置原因、后续影响和相似历史决策建立连接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from semantica.context import ContextGraphgraph = ContextGraph(advanced_analytics=True ) decision_id = graph.record_decision( category="vendor_selection" , scenario="Choose cloud provider for HIPAA workload" , reasoning="AWS offers BAA, mature HIPAA tooling, and existing team expertise" , outcome="selected_aws" , confidence=0.93 , ) chain = graph.trace_decision_chain(decision_id) similar = graph.find_similar_decisions("cloud vendor" , max_results=5 ) impact = graph.analyze_decision_impact(decision_id) compliant = graph.check_decision_rules( {"category" : "vendor_selection" } )
这段流程中,记录决策只是开始。
之后,系统可以追踪完整的因果祖先链,查找历史上的相似先例,分析一项决策的下游影响,还可以通过规则检查它是否满足既定政策。
于是,“为什么做出这个决定”不再只能依赖某个模型临时生成一段解释,而能够回到图中的结构化记录里寻找答案。
因果关系,让决策链真正连起来 单独保存一系列决策还不够。真正让决策具备可审计价值的,是它们之间的因果连接。
Semantica 支持将一个决策与它造成、影响或作为先例支撑的后续决策关联起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 from semantica.context import ContextGraphgraph = 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 , ) 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)
当一个结果需要被回溯时,系统不必在一片零散记录中翻找。因果链条已经成为图的一部分。
这让“发生了什么”与“为什么发生”开始拥有同一份结构化表达。
不只采集数据,还要理解数据 知识图谱的旅程通常从原始数据开始。
文件、网页、数据库、接口、流数据、邮件、代码仓库、企业数据平台中的表格,它们格式不同、结构不同、语义不同,也经常彼此矛盾。
Semantica 将这条路径拆成一条端到端的知识管道:
1 2 3 Sources → Ingest → Parse → Normalize → Split → Extract → Conflict Detection → Deduplication → Knowledge Graph → Ontology · Reasoning · Provenance · Decisions → Enriched KG → Vector Store + Polyglot Graph Store → Export / Visualize / REST · MCP · CLI
从数据接入开始,信息会经历解析、规范化、切分、抽取、冲突检测、去重与图构建。
这条链路的意义在于,知识图谱并不是一个只在最后出现的存储目标。它更像整条数据处理流程中逐步形成的结构化结果。
面向多来源数据的统一接入 Semantica 提供统一的数据接入接口,覆盖文件、网页、数据库、API、流、邮件、Git 仓库、Parquet、Databricks、Snowflake 与 MCP 服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from semantica.ingest import FileIngestor, WebIngestor, ParquetIngestor, DBIngestordocs = FileIngestor().ingest_directory( "./contracts/" , recursive=True , ) pages = WebIngestor().ingest_url( "https://example.com/reports/annual-2024.html" ) records = ParquetIngestor().ingest( "./data/transactions.parquet" ) rows = DBIngestor().ingest_database( connection_string="postgresql://user:pass@localhost/mydb" , include_tables=["customer_events" ], max_rows_per_table=50_000 , )
对于企业数据平台,Semantica 也提供了 Databricks 与 Snowflake 的接入能力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from semantica.ingest import DatabricksIngestor, SnowflakeIngestordatabricks = DatabricksIngestor( host="https://adb-xxx.azuredatabricks.net" , token="dapi-xxxxxxxx" , http_path="/sql/1.0/warehouses/xxxxxxxx" , catalog="main" , ) customers = databricks.ingest_table( "customers" , limit=10_000 , ) table_lineage = databricks.get_table_lineage( "customers" , catalog="main" , schema="default" , ) snowflake = SnowflakeIngestor( account="myaccount" , user="myuser" , password="mypassword" , warehouse="COMPUTE_WH" , database="MYDB" , ) orders = snowflake.ingest_table( "ORDERS" , limit=10_000 , )
数据进入系统后,并不会自动变成可信的知识。它还需要被拆解、识别、关联、验证与整理。
从文本中提取实体、关系、事件与三元组 当原始数据主要是文本时,真正的难题往往不是保存内容,而是识别内容中蕴含的结构。
谁是关键人物?
哪些组织发生了联系?
什么事件发生在什么时间?
一句自然语言描述能够拆解出哪些主体、谓词与客体?
Semantica 的语义抽取模块将命名实体识别、关系抽取、事件检测和三元组生成组织在一起。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 from semantica.semantic_extract import ( NamedEntityRecognizer, RelationExtractor, EventDetector, TripletExtractor, ) text = """ Anthropic CEO Dario Amodei announced a $7.3B Series E funding round in partnership with Google and Spark Capital, valuing the company at $61.5B as of Q4 2024. """ ner = NamedEntityRecognizer(confidence_threshold=0.7 ) entities = ner.extract_entities(text) rel_extractor = RelationExtractor( confidence_threshold=0.6 , bidirectional=True , ) relations = rel_extractor.extract_relations( text, entities=entities, ) events = EventDetector( extract_participants=True , extract_time=True , ).detect_events(text) triplets = TripletExtractor( include_temporal=True , include_provenance=True , ).extract_triplets(text)
从一段文本中提取出的,不再只是可搜索的字词,而可以成为知识图谱中的实体、关系、事件和带有时间与溯源信息的三元组。
先面对冲突,再进入知识库 多来源数据最容易带来一个现实问题:同一个实体在不同来源里,可能有不同的职位、金额、时间或关系。
如果系统只是简单覆盖,知识库看似整洁,实则可能在悄悄丢失事实冲突。
Semantica 把冲突检测放在图谱构建之前,让相互矛盾的信息先被识别和标记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 from semantica.conflicts import ConflictDetector, ConflictResolver, SourceTrackerentities_from_source_a = [ { "id" : "alice_chen" , "role" : "CTO" , "salary" : 250_000 , "start_date" : "2019-03-01" , }, ] entities_from_source_b = [ { "id" : "alice_chen" , "role" : "VP Eng" , "salary" : 275_000 , "start_date" : "2019-03-01" , }, ] detector = ConflictDetector() conflicts = detector.detect_conflicts( entities_from_source_a + entities_from_source_b ) resolver = ConflictResolver() resolved = resolver.resolve_conflicts( conflicts, strategy="credibility_weighted" , ) tracker = SourceTracker() tracker.register_source( "source_a" , source_type="document" , credibility_score=0.85 , ) tracker.register_source( "source_b" , source_type="document" , credibility_score=0.72 , )
这里可以处理值冲突、类型冲突、关系冲突、时间冲突与逻辑冲突,并支持基于可信度、最新时间或投票等策略进行处理。
一张能够承担上下文与决策责任的图,不能只收集事实,也必须能够正视事实之间的不一致。
实体去重,让同一个对象不再四处分身 知识图谱还会遇到另一个常见问题:同一个组织、人物或实体,可能因为拼写、简称、格式差异或来源不同而出现多个版本。
Semantica 提供实体解析与去重能力,通过阻塞、聚类和语义相似度识别重复对象,并支持保留溯源信息的合并。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 from semantica.deduplication import DuplicateDetector, EntityMergerentities = [ { "id" : "e1" , "name" : "Acme Corporation" , "domain" : "acme.com" , }, { "id" : "e2" , "name" : "Acme Corp." , "domain" : "acme.com" , }, { "id" : "e3" , "name" : "ACME Corp" , "domain" : "acme.co" , }, { "id" : "e4" , "name" : "Globex Industries" , "domain" : "globex.com" , }, ] detector = DuplicateDetector( similarity_threshold=0.75 , use_clustering=True , ) candidates = detector.detect_duplicates(entities) groups = detector.detect_duplicate_groups(entities) merger = EntityMerger(preserve_provenance=True ) ops = merger.merge_duplicates( entities, strategy="keep_most_complete" , ) history = merger.get_merge_history()
这让知识图谱有机会从“相同名字很多”的数据集合,逐步变成“同一实体拥有统一身份,同时保留来源脉络”的结构化知识空间。
图谱之上,运行确定性的推理 LLM 擅长生成,但在需要规则明确、过程可解释的场景中,确定性推理依然扮演重要角色。
Semantica 提供前向链推理、Rete 网络、Datalog 与 SPARQL 相关能力,让事实与规则可以在可解释的路径中产生结论。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 from semantica.reasoning import ReteEngine, Rule, Fact, RuleTyperete = 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()
规则在这里不再只是散落在业务代码里的条件判断,而可以成为推理层的一部分。
与此同时,Datalog 可以用于递归图查询。
1 2 3 4 5 6 7 8 9 10 11 12 from semantica.reasoning import DatalogReasonerengine = DatalogReasoner() engine.add_fact("parent(tom, bob)" ) engine.add_fact("parent(bob, ann)" ) engine.add_fact("parent(ann, pat)" ) 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)" )
当结论需要解释时,Semantica 还提供解释生成能力,让系统不仅给出结果,也能够呈现推理过程。
1 2 3 4 5 6 7 8 9 10 11 from semantica.reasoning import ExplanationGenerator, Reasonerreasoner = Reasoner() reasoner.add_fact("parent(tom, bob)" ) reasoner.add_rule("ancestor(X, Y) :- parent(X, Y)" ) result = reasoner.forward_chain() explainer = ExplanationGenerator() explanation = explainer.generate_explanation(result)
不让来源消失:每一个事实都可以追溯 在可问责 AI 的语境中,一个实体、一段关系或一项结论的来源,往往和结论本身一样重要。
Semantica 的溯源模块围绕 W3C PROV-O 记录实体和关系的来源信息,并支持查询谱系与追踪祖先链。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from semantica.provenance import ProvenanceManagerprov = ProvenanceManager( storage_path="./provenance.db" ) prov.track_entity( entity_id="acme_corp" , source="contracts/acme_master_agreement_2024.pdf" , metadata={ "page" : 1 , "confidence" : 0.97 , "extractor" : "NamedEntityRecognizer" , }, ) prov.track_relationship( relationship_id="alice_works_for_acme" , source="hr_records/employees_q1_2024.csv" , metadata={ "source_entity_id" : "alice_chen" , "target_entity_id" : "acme_corp" , }, ) lineage = prov.get_lineage("acme_corp" ) trail = prov.trace_lineage("alice_chen" ) entry = prov.get_provenance("acme_corp" )
当系统被追问“这个信息从哪里来”时,答案不必依赖模糊的记忆,也不必靠人工回查原始文件。来源本身就是知识图谱中的重要组成部分。
时间不是附属字段,而是图的一条坐标轴 事实会变化。
某个人曾经在某家公司任职,但后来离开。
某个关系在过去成立,在今天已经失效。
更微妙的是,事实在世界中成立的时间,与系统记录到这一事实的时间,也可能不同。
Semantica 提供双时间事实、时间范围查询与时间点快照能力,让图不仅记录连接,也记录连接在何时有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 from datetime import datetimefrom semantica.context import ContextGraphfrom semantica.kg import BiTemporalFactgraph = ContextGraph(advanced_analytics=True ) graph.add_node( "alice_chen" , "Person" , role="VP Engineering" , ) graph.add_node( "acme_corp" , "Organization" , valuation=1_200_000_000 , ) graph.add_edge( "alice_chen" , "acme_corp" , edge_type="works_for" , valid_from="2024-03-01T00:00:00" , valid_until="2025-01-01T00:00:00" , ) snapshot_2023 = graph.state_at("2023-06-01" ) snapshot_2024 = graph.state_at("2024-01-01" ) fact = BiTemporalFact( valid_from=datetime(2024 , 3 , 1 ), valid_until=datetime(2025 , 1 , 1 ), recorded_at=datetime(2024 , 3 , 5 ), )
时间让图谱不只是一张静态关系图,而拥有了回看历史、理解变迁与区分记录时刻的能力。
从知识图谱走向图分析 当知识图谱逐步成形,它不只是存放结构化事实的容器,也能够成为分析对象。
Semantica 支持中心性计算、社区发现、最短路径与链接预测等图分析能力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 from semantica.ingest import FileIngestorfrom semantica.kg import ( GraphBuilder, GraphAnalyzer, CentralityCalculator, CommunityDetector, PathFinder, LinkPredictor, ) sources = FileIngestor().ingest_directory( "./contracts/" , recursive=True , ) kg = GraphBuilder( merge_entities=True , enable_temporal=True , ).build(sources) analyzer = GraphAnalyzer() analysis = analyzer.analyze_graph(kg) centrality = CentralityCalculator() degree = centrality.calculate_degree_centrality(kg) betweenness = centrality.calculate_betweenness_centrality(kg) communities = CommunityDetector().detect_communities( kg, method="louvain" , ) path = PathFinder().find_shortest_path( kg, "alice_chen" , "contract_001" , ) predictions = LinkPredictor().predict_links( kg, top_k=10 , )
中心性可以帮助寻找连接最密集的实体,社区发现能够呈现自然形成的关系簇,路径查询能够揭示两个节点之间的连接路线,链接预测则面向潜在关系提供分析入口。
图并不只是用来保存关系,也可以帮助人们从关系中发现结构。
图原生切分,为 GraphRAG 保住语义边界 文档切分是知识检索中的基础步骤,但普通切分方式很容易在不合适的位置打断实体、关系或语义单元。
Semantica 的切分模块支持递归、词元、句子、段落、语义、实体感知、关系感知、图式、本体感知与分层等多种方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 from semantica.split import ( TextSplitter, EntityAwareChunker, RelationAwareChunker, ) text = open ("contracts/master_agreement.txt" ).read() chunks = TextSplitter( method="recursive" , chunk_size=1000 , chunk_overlap=200 , ).split(text) chunks = TextSplitter( method="entity_aware" , ner_method="llm" , chunk_size=1000 , ).split(text) chunks = RelationAwareChunker( chunk_size=1000 , preserve_triplets=True , ).chunk(text) chunks = TextSplitter( method="graph_based" , chunk_size=1000 , ).split(text) chunks = TextSplitter( method="hierarchical" , levels=["section" , "paragraph" ], ).split(text)
当切分过程开始理解实体边界、关系三元组与图社区结构时,后续的检索与知识图谱构建也拥有了更完整的语义材料。
本体与约束,为知识空间建立秩序 如果知识图谱是一座不断扩张的城市,本体则像城市中的分类体系、命名系统和建设规则。
Semantica 提供本体生成、类与属性推断、优化,以及 SHACL 验证与 SKOS 词汇管理能力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 from semantica.ontology import OntologyGenerator, OntologyValidatordata = { "entities" : [ { "id" : "acme_corp" , "type" : "Organization" , "industry" : "SaaS" , "founded" : 2012 , }, { "id" : "alice_chen" , "type" : "Person" , "role" : "CTO" , "since" : 2019 , }, ], "relationships" : [ { "source" : "alice_chen" , "target" : "acme_corp" , "type" : "works_for" , }, ], } gen = OntologyGenerator( base_uri="https://semantica.dev/ontology/" ) ontology = gen.generate_ontology(data) classes = gen.infer_classes(data) props = gen.infer_properties(data, classes) optimized = gen.optimize_ontology(ontology) validator = OntologyValidator() report = validator.validate(ontology)
本体让图中的类型、属性与关系拥有更清晰的语义框架,SHACL 则为这些结构提供验证能力。
当系统需要处理治理、合规、约束与跨来源知识对齐时,这一层结构尤为重要。
多种图存储与多种导出形式 Semantica 面向 RDF 与标记属性图提供多图存储支持。
在 RDF 侧,README 中列出了嵌入式 Oxigraph、Blazegraph、Apache Jena 与 Eclipse RDF4J。
在标记属性图侧,README 中列出了 Neo4j、FalkorDB、Apache AGE 与 AWS Neptune。
同时,它也支持多种向量存储后端,包括 FAISS、Qdrant、Weaviate、Milvus、Pinecone、PgVector、SQLite 与内存存储。
对于构建完成的知识图谱,Semantica 可以导出 RDF、OWL、Parquet、Cypher、JSON-LD 等格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 from semantica.export import ( RDFExporter, JSONExporter, ParquetExporter, LPGExporter, ReportGenerator, ) kg = { "entities" : [], "relationships" : [], } rdf = RDFExporter() turtle_str = rdf.export_to_rdf( kg, format ="turtle" , ) jsonld_str = rdf.export_to_rdf( kg, format ="json-ld" , ) rdf.export( kg, "kg_audit.ttl" , format ="turtle" , ) ParquetExporter( compression="snappy" ).export_knowledge_graph( kg, "kg_snapshot" , ) JSONExporter().export_knowledge_graph( kg, "kg.json" , ) LPGExporter().export( kg, "kg_import.cypher" , ) ReportGenerator().generate_report( { "title" : "KG Audit Report" , "summary" : "Weekly ingestion summary" , "metrics" : { "entities" : len (kg["entities" ]), }, }, file_path="audit_report.html" , format ="html" , )
对于需要在不同图系统、审计流程、分析平台与下游应用之间流动的数据而言,导出能力让知识图谱不被锁死在单一表现形式中。
可视化,让图中的结构真正可见 图的价值不仅在于机器可以查询,也在于人可以理解。
Semantica 提供交互式图工作台能力,用于呈现力导向图、社区结构、本体层级、嵌入投影与时间轴。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 from semantica.visualization import ( KGVisualizer, OntologyVisualizer, EmbeddingVisualizer, TemporalVisualizer, ) viz = KGVisualizer( layout="force" , color_scheme="default" , ) viz.visualize_network( kg, output="interactive" , file_path="kg.html" , ) viz.visualize_communities( kg, communities, output="interactive" , ) viz.visualize_centrality( kg, centrality, centrality_type="degree" , ) OntologyVisualizer().visualize_hierarchy( ontology, output="interactive" , ) TemporalVisualizer().visualize_timeline( kg, output="interactive" , )
Knowledge Explorer 则把这种能力进一步组织成浏览器中的图工作台。
它包含知识图谱、时间线、决策、注册表、实体解析、图谱概览、本体中心与谱系等工作区。
在知识图谱工作区中,可以浏览实时图谱、使用 ForceAtlas2 布局、查看自我中心模式、观察语义距离热力图与路径高亮。
在时间线中,可以通过时间事件浏览图谱演化。
在决策工作区中,可以浏览已记录决策的因果链、结果标签与置信度。
在谱系工作区中,可以查看任意实体的 W3C PROV-O 溯源信息。
用浏览器打开 Knowledge Explorer 安装带有 Explorer 扩展的包后,可以直接指向一个图 JSON 文件启动仪表盘。
1 pip install "semantica[explorer]"
1 semantica-explorer --graph my_graph.json
默认情况下,服务会在本地地址启动,并自动打开浏览器。
也可以指定端口,或者关闭自动打开浏览器的行为。
1 semantica-explorer --graph my_graph.json --port 8080
1 semantica-explorer --graph my_graph.json --no-browser
对于参与前端开发的场景,Explorer 还提供基于 React、TypeScript 与 Vite 的源码开发方式。
1 pip install -e ".[explorer]"
1 semantica-explorer --graph path/to/my_graph.json --no-browser
前端开发服务器会将 API 与 WebSocket 请求代理到 Python 后端,让图的更新、工作区交互和开发调试形成更顺畅的循环。
MCP,让 AI 工具可以直接操作知识图 Semantica 还提供 MCP Server,用于将知识图谱能力接入支持 MCP 的 AI 工具。
它采用标准输入输出传输方式,读取换行分隔的 JSON-RPC 2.0 请求,并将响应写入标准输出。
MCP Server 提供 17 个工具,覆盖实体抽取、关系抽取、完整语义抽取流程、决策记录、决策查询、先例检索、因果链追踪、影响分析、图实体与关系写入、图搜索、图摘要、图分析、规则推理、溯因推理、图导出与溯源查询。
其中,决策智能相关工具包括:
record_decision
query_decisions
find_precedents
get_causal_chain
analyze_decision_impact
知识图谱相关工具包括:
add_entity
add_relationship
search_graph
get_graph_summary
get_graph_analytics
推理与导出相关工具包括:
run_reasoning
abductive_reasoning
export_graph
get_provenance
它还提供图摘要、近期决策、模式信息与本体模式等资源入口。
这样一来,AI 工具不只是在对话中产生文本,也能够连接到一张具有实体、关系、规则、决策和溯源信息的图。
用声明式管道把流程串起来 当数据接入、语义抽取、关系抽取、图构建、去重与导出需要组合为完整流程时,Semantica 提供了 Pipeline DSL。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 from semantica.pipeline import PipelineBuilder, ExecutionEnginebuilder = PipelineBuilder() builder.add_step( "ingest" , step_type="ingest" , source="./contracts/" , recursive=True , ) builder.add_step( "extract" , step_type="ner_extract" , ) builder.add_step( "relations" , step_type="relation_extract" , ) builder.add_step( "build_kg" , step_type="kg_build" , merge_entities=True , ) builder.add_step( "deduplicate" , step_type="deduplicate" , threshold=0.75 , ) builder.add_step( "export" , step_type="export" , format ="turtle" , output="kg.ttl" , ) pipeline = ( builder .connect_steps("ingest" , "extract" ) .connect_steps("extract" , "relations" ) .connect_steps("relations" , "build_kg" ) .connect_steps("build_kg" , "deduplicate" ) .connect_steps("deduplicate" , "export" ) .set_parallelism(4 ) .build(name="contracts_pipeline" ) ) engine = ExecutionEngine() result = engine.execute_pipeline(pipeline) status = engine.get_pipeline_status(pipeline.name) progress = engine.get_progress(pipeline.name)
这段管道从目录中的文档开始,经过实体抽取、关系抽取、知识图谱构建、去重与导出,最终形成一个可执行的流程。
对于需要将多阶段知识处理任务组织起来的场景,这种声明式表达让各个步骤之间的依赖关系更清晰。
一个面向审计链路的实践模式 Semantica README 给出了一个围绕受监管决策审计的模式。
它从记录带有因果关系的决策链开始,为实体附加溯源信息,再将图数据映射为可导出的知识结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 from semantica.context import ContextGraphfrom semantica.provenance import ProvenanceManagerfrom semantica.export import RDFExportergraph = 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" , }, ) graph_dict = graph.to_dict() kg = { "entities" : [ { "id" : node["id" ], "type" : node["type" ], "text" : node["content" ], } for node in graph_dict["nodes" ] ], "relationships" : [ { "source_id" : edge["source" ], "target_id" : edge["target" ], "type" : edge["type" ], } for edge in graph_dict["edges" ] ], } RDFExporter().export( kg, "audit_trail.ttl" , format ="turtle" , )
这条链路把决策、因果关系、实体来源与导出结果连接在一起。
它所呈现的并不是一份孤立的模型输出,而是一张能够继续追踪、查询与审计的决策知识图。
从安装开始 Semantica 可以通过 pip 安装。
安装后,可以使用诊断命令检查环境。
README 中给出的诊断输出会检查 Python 版本、Semantica 版本、FAISS 向量存储与配置文件状态。
对于想快速开始构建上下文图、记录决策、追踪因果链与执行规则检查的场景,最小入口就是从 ContextGraph 开始。
一张图,承载 AI 的上下文与责任 Semantica 的核心气质,在于它没有把 AI 上下文简单视为可被召回的片段,也没有把 AI 决策视为一次性输出。
在它的图模型中,上下文可以被组织,实体可以被连接,冲突可以被标记,重复可以被处理,规则可以被运行,时间可以被回看,来源可以被追踪,决策可以被解释,影响可以被分析。
这让 AI 系统中的知识不再只是漂浮在向量、提示词和日志之间。
它们开始落在一张有结构、有因果、有时间、有来源,也有责任边界的图里。