10 分钟用 Semantica 构建知识图谱:零配置抽取到导出全流程
【免费下载链接】semanticaGraph-Native Infrastructure for Context and Accountable AI Systems项目地址: https://gitcode.com/GitHub_Trending/sema/semantica
Semantica 是一套图原生的上下文基础设施(官方描述为 Graph-Native Infrastructure for Context and Accountable AI Systems),作用很直接:把 PDF、文档、网页里的文字变成"实体 + 关系",再组装成可查询、可导出、可追溯的知识图谱。这篇指南跟着一个真实任务走:从安装、摄取文件,到抽取、构图、可视化、导出,中间遇到扫描件、大语料、内存溢出等常见坑,都给出了对应解法。
装好环境:三种安装方式与版本自检
Semantica 是标准 Python 包,要求 Python >= 3.9.2。日常使用选基础安装即可:
pip install semantica需要向量库、LLM provider、GPU 加速等可选依赖时,装全家桶:
pip install semantica[all]要读源码或改代码,走开发者模式(仓库只读克隆到本地后安装):
git clone https://gitcode.com/GitHub_Trending/sema/semantica cd semantica pip install -e ".[dev]"装完确认一下能否正常导入,能打印出版本号就说明环境没问题:
python -c "import semantica; print(semantica.__version__)"它的 CLI 也能独立运行各类子命令,效果如下:
把文件变成文本:FileIngestor 与 DocumentParser 的分工
第一步是把磁盘上的文件统一成内部的FileObject结构。FileIngestor().ingest()传文件路径或目录路径都行,目录默认递归扫描:
from semantica.ingest import FileIngestor sources = FileIngestor().ingest("data/report.pdf") # 也支持 .docx、.html、.json、.csv、.xlsx、.pptx、.parquet、.xml文件进来之前的检测逻辑值得了解:FileTypeDetector按"扩展名 → MIME 类型 → 魔数"三级策略识别格式(比如靠%PDF文件头认出 PDF),单文件默认上限 100MB,超限直接抛ValidationError,避免后续环节被大文件拖垮。
拿到FileObject后交给DocumentParser抽文本。下面这两行代码演示从解析到打印正文:
from semantica.parse import DocumentParser parser = DocumentParser() parsed = parser.parse(sources[0].path) # 接收路径字符串 print(parsed["full_text"][:200])parse()返回 dict,full_text和metadata对所有格式都有;其余键看格式——PDF 带pages,DOCX 带tables和paragraphs。如果 PDF 里表格、图表、多栏版面比较多,基础解析器会丢结构,换用DoclingParser(需pip install semantica[parse-docling]),它会做版面分析并输出结构化tables。
💡 不想走文件路径也行:WebIngestor().ingest_url(url)返回的WebContent直接用.text进入抽取步骤;ParquetIngestor/XMLIngestor产出的是结构化记录,可以跳过解析直接构图。
不配置 API Key 也能抽实体:两种抽取路线
抽取是整条链路的核心。Semantica 给NERExtractor和RelationExtractor各留了一条不需要任何密钥的 pattern 路线,装完包就能跑:
from semantica.semantic_extract import NERExtractor, RelationExtractor ner = NERExtractor(method="pattern") entities = ner.extract(text) # 返回 Entity(text="Apple Inc.", label="ORG", start_char=..., confidence=0.7) rel = RelationExtractor(method="pattern") relationships = rel.extract(text, entities=entities) # 返回 Relation(subject=..., predicate="founded_by", object=..., confidence=0.7)关系模板是内置正则,目前覆盖founded_by、located_in、works_for、born_in这几种常见句式,所以 pattern 路线对"XX 由 YY 创立"这类表达命中率高,对自由叙述则偏保守。
两个参数直接影响结果质量:NERExtractor的min_confidence默认 0.5,RelationExtractor的confidence_threshold默认 0.6,低于阈值的候选会被丢弃。RelationExtractor还有max_distance(默认 50 个 token)限制主宾语的最大跨度,防止把离得很远的两个实体误配成一对。
精度不够时切到 LLM 路线,只改method并指定后端,读取环境变量里的对应 API Key:
ner = NERExtractor(method="llm", provider="groq", llm_model="llama-3.3-70b-versatile") entities = ner.extract(text)企业内网走 OpenAI 兼容网关时传base_url即可,此时会自动切到 JSON 返回模式,适配 Qwen、LLaMA 一类的自建网关。method还接受列表写成回退链(比如["ml", "pattern"]),配合merge_strategy(fallback/union/consensus)做多方法集成,更多参数可查semantica/semantic_extract/下的实现与官方文档。
跨文档实体合并:GraphBuilder 如何避免重复节点
抽完的实体是散落的引用,"Apple"、"Apple Inc."、"AAPL" 可能指同一家公司。GraphBuilder的merge_entities=True就是干这个的:构建时按语义相似度自动消解重复引用,不用手工去重:
from semantica.kg import GraphBuilder builder = GraphBuilder(merge_entities=True) graph = builder.build({"entities": entities, "relationships": relationships}) print(len(graph["entities"]), len(graph["relationships"]))消解策略由entity_resolution_strategy控制(默认fuzzy,可选exact、ml-based),合并时内部实例化EntityResolver完成匹配。多文档场景下这个参数的价值更明显——每份文档抽完先攒着,最后一次性构图,跨文档的重复实体在构建阶段统一归并:
all_entities, all_rels = [], [] for source in FileIngestor().ingest("data/reports/"): text = DocumentParser().parse(source.path)["full_text"] entities = ner.extract(text) all_entities.extend(entities) all_rels.extend(rel.extract(text, entities=entities)) graph = builder.build({"entities": all_entities, "relationships": all_rels})GraphBuilder还能在构图时叠加其他能力:resolve_conflicts做冲突检测与消解、enable_temporal打开时序边、track_history记录版本快照、graph_store指定持久化后端(见后文)持久化后端。
浏览器里看图:KGVisualizer 输出交互式 HTML
图谱建好后第一件事是"看见"。KGVisualizer基于 Plotly,生成的 HTML 支持平移、缩放、点节点看详情、按实体类型过滤:
from semantica.visualization import KGVisualizer viz = KGVisualizer(layout="force") viz.visualize_network(graph, output="html", file_path="graph.html", node_color_by="type")布局三种可选:force(力导向)、hierarchical(分层)、circular(环形);输出除html外还有interactive、png、svg,悬停字段、路径高亮(highlight_path按跳数衰减边透明度)都可以配。没装 Plotly 时会提示pip install 'semantica[viz]'。
除了自己生成的 HTML,Semantica 自带一个 Knowledge Explorer 前端,把图谱加载进去后交互体验更完整:
导出图谱:Turtle、Parquet 与 ArangoDB AQL
构图完成后按下游系统选导出器,三个最常用的:
from semantica.export import RDFExporter exporter = RDFExporter() exporter.export(graph, file_path="graph.tttl_check", format="turtle") # 另支持 "json-ld"、"nt"上面演示 RDF 路线(文件名按实际需要命名)。RDF 导出有个细节:confidence 统一规范成xsd:decimal,保证 Turtle、N-Triples、RDF/XML、JSON-LD 四种序列化下词项一致,布尔值和非法指数会被拒绝,避免解析器歧义。
分析引擎场景用 Parquet:dict 输入时每个 key 落一个文件,即entities和relationships各一份,直接喂给 Spark、BigQuery、Databricks。图数据库 ArangoDB 则用ArangoAQLExporter,产出的.aql文件里是可直接执行的 INSERT 语句。此外仓库还提供 CSV、JSON、YAML、GraphML、OWL、Neo4j CSV、Arrow、LPG 等导出器,清单见semantica/export/。
进阶用法:时序边、持久化后端与实体溯源
带时间有效期的关系边
"某人 2018 年起是 A 公司 CEO,2022 年转到 B 公司"这种事实,靠普通边会互相打架。给关系加valid_from/valid_until后,TemporalGraphQuery能按时间点回答:
from semantica.kg import TemporalGraphQuery tq = TemporalGraphQuery(temporal_granularity="day") r2020 = tq.query_at_time(kg, query="", at_time="2020-06-15") r2023 = tq.query_at_time(kg, query="", at_time="2023-01-01")同一人物在不同年份担任不同公司 CEO,两个时间点各自返回当时仍有效的边,互不污染。
把图写进 Neo4j / FalkorDB
内存图进程一结束就没了,生产环境挂持久化后端即可,GraphBuilder收graph_store参数:
from semantica.graph_store import GraphStore, FalkorDBStore store = GraphStore(backend="neo4j", uri="bolt://localhost:7687", user="neo4j", password="password") builder = GraphBuilder(merge_entities=True, graph_store=store) # 也可以:FalkorDBStore(host="localhost", port=6379, graph_name="my_graph")GraphStore通过backend在neo4j、falkordb、age(Apache AGE)之间切换;另有 Amazon Neptune 与 Triplet Store(RDF4J、Blazegraph、Oxigraph、Jena、Anzo)等后端可选。
给每个实体挂上来源
可问责 AI 的底线是"这条事实从哪来"。ProvenanceManager按 W3C PROV-O 模型记录来源链:
from semantica.provenance import ProvenanceManager prov = ProvenanceManager() prov.track_entity("Apple Inc.", "data/report.pdf", metadata={"confidence": 0.98}) sources = prov.get_all_sources("Apple Inc.")get_all_sources返回的每条记录含来源路径、时间戳、置信度与元数据。溯源能力还以*_provenance.py的形式贯穿 ingest、parse、kg、export 等各个模块。
给 Agent 注入上下文:决策追踪与先例检索
如果目标是给 AI Agent 提供带因果和溯源的上下文,AgentContext把向量记忆、知识图谱、决策追踪缝在一个对象里:
from semantica.context import AgentContext, ContextGraph from semantica.vector_store import VectorStore context = AgentContext( vector_store=VectorStore(backend="faiss", dimension=768), knowledge_graph=ContextGraph(advanced_analytics=True), decision_tracking=True, ) context.store("GPT-4 outperforms GPT-3.5 on reasoning benchmarks by 40%")vector_store是必填项。记录一次决策并回查历史先例,防止 Agent 前后矛盾:
decision_id = context.record_decision( category="model_selection", reasoning="GPT-4 benchmark advantage justifies 3x cost increase", outcome="selected_gpt4", confidence=0.91, ) precedents = context.find_precedents("model selection reasoning", limit=5)影响较大的几个参数:retention_days(记忆保留,默认 30 天)、max_memories(默认 10000)、hybrid_alpha(向量检索与图检索的配比,0 偏向量、1 偏图,默认 0.5)、max_expansion_hops(图扩展跳数,默认 2)。这套机制也支撑 GraphRAG 与多 Agent 共享上下文场景。
卡住时的排查路径:扫描件、大语料与内存溢出
实际跑起来会遇到的四个高频故障,按现象对号入座:
⚠️没抽出任何实体:文档大概率是扫描件,PDF 里没有机器可读文本层,DocumentParser检测到无文本层时会发警告。换 OCR 解析器:
from semantica.parse import DoclingParser # pip install semantica[parse-docling] parsed = DoclingParser(enable_ocr=True).parse(sources[0].path)大语料处理慢:两条路叠加。装semantica[gpu]让 embedding 与 ML 推理跑在 CUDA 上;用scan_directory先扫路径(只取元信息不读内容),再逐文档解析、逐份写入持久化后端,避免整库内容同时在内存里。需要可配置并行的多步编排,查semantica/pipeline/与 Pipeline 指南。
大图内存溢出:默认构图在内存 NetworkX 上进行,把graph_store换成FalkorDBStore这类持久化后端,让图数据库承载存储压力。
企业网关上 NER 掉回 pattern 模式:该问题在 v0.5.0 已修复,执行pip install --upgrade semantica升级即可。
延伸阅读
跑通这条链路后,按下面的顺序继续深入:
| 资料 | 内容 |
|---|---|
| docs/quickstart.md | 官方端到端快速上手 |
| docs/concepts.md | 知识图谱、本体、推理引擎的心智模型 |
| docs/modules.md | 各模块关键类与常用调用链 |
| docs/reference/ | 全量 API 参考 |
| cookbook/introduction/ | 26 个入门 Notebook,从摄取到推理 |
| cookbook/advanced/ | 时序图谱、多源集成、Datalog 推理等专题 |
| docs/storage-backends.md | 存储后端全景 |
| docs/guides/pipeline.md | 多步流水线编排 |
下一步建议:拿一份你手头真实的业务文档(比如一份季度报告 PDF),把上面"摄取 → 解析 → 抽取 → 构图"四步原样跑一遍,看看 pattern 路线在你的文本上能抽出多少实体——这个命中率数字,会直接决定你下一步是加 LLM 抽取,还是先补领域关系模板。
【免费下载链接】semanticaGraph-Native Infrastructure for Context and Accountable AI Systems项目地址: https://gitcode.com/GitHub_Trending/sema/semantica
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考