はじめに
LLM アプリを本番に載せようとすると、必ず一度はこの質問を受けます。
「で、このAIはなぜその結論を出したんですか?」
ベクトル検索 + RAG の構成だと、返せるのは「似ていた文書はこれです」までです。どの事実に基づいて、どのルールが発火して、いつ誰が何を決めたのかは、どこにも残っていません。金融の与信、医療、法務、公共といった規制産業では、これは不便ではなく単純にコンプライアンス上のリスクになります。
今回紹介する Semantica は、まさにそこを埋めにきた OSS です。
- GitHub: https://github.com/semantica-agi/semantica (MIT / Python 3.8+)
- 公式サイト: https://getsemantica.ai/
本記事では、Semantica が何を解決するのか、どう動かすのかを、5分で掴める粒度でまとめます。
Semantica とは
一言でいうと、LLM・ベクトルストア・エージェントフレームワークの「下」に置く、決定論的なコンテキスト基盤です。
キャッチコピーは "The Open Source Palantir for AI Agents"。企業内のデータを取り込み、エンティティと関係を抽出し、コンテキストグラフ/ナレッジグラフを構築して、その上で推論と来歴(provenance)管理を行います。
重要なポイントとして、グラフ構築・推論・来歴管理そのものに LLM は不要です。ここが決定論的(deterministic)である、と明言されているのが特徴です。LLM は使いたい場所(抽出やチャンキングなど)で使う、という設計になっています。
既存スタックとの違い
| 観点 | ベクトルDB + RAG | LLM のメモリ | Semantica |
|---|---|---|---|
| 想起の方法 | 埋め込みの類似度 | コンテキストウィンドウ | グラフ探索 + セマンティック検索 |
| 意思決定の履歴 | 残らない | 残らない | 第一級オブジェクトとして永続化 |
| 来歴 | なし | なし | W3C PROV-O、ソースにリンク |
| 推論 | なし | ブラックボックス | 前向き連鎖 / Rete / Datalog / SPARQL |
| 事実の矛盾 | 黙って上書き | 黙って上書き | 検出してフラグを立てる |
| 時点指定の参照 | 不可 | 不可 | 任意時点のスナップショット |
置き換えではなく上乗せである、というのが公式のスタンスです。今の LLM もベクトルストアもエージェントフレームワークもそのままに、意思決定記録・因果推論・来歴・オントロジー統制・監査証跡を足す、という位置づけです。
アーキテクチャ
パイプライン全体はこんな流れになっています。各段は独立した Python モジュールとして import できます。
取り込み → パース → 正規化 → 分割 → 抽出 → 矛盾検出 → 重複排除
→ ナレッジグラフ → [オントロジー・推論・来歴・意思決定] → エンリッチ済み KG
→ ベクトルストア + グラフストア(RDF / LPG) → エクスポート / 可視化 / REST・MCP・CLI
ストレージが「ポリグロット」なのも面白いところで、RDF 系(Oxigraph、Blazegraph、Apache Jena、Eclipse RDF4J)と LPG 系(Neo4j、FalkorDB、Apache AGE、AWS Neptune)を、コードを変えずに差し替えられる設計になっています。ベクトルストアも FAISS / Qdrant / Weaviate / Milvus / Pinecone / PgVector / SQLite などから選べます。
取り込み元も広く、ファイル、Web、RDB(PostgreSQL、MySQL、SQLite、Oracle、SQL Server)、Kafka などのストリーム、Git、メールに加えて、Databricks(Unity Catalog + Delta Lake)と Snowflake のネイティブコネクタが用意されています。レイクハウスのテーブルを CSV にエクスポートせずそのままグラフのノードにできる、というのはデータ基盤チームには効きます。
インストールと動作確認
pip install semantica
インストール直後の健康診断コマンドが用意されているのが地味に親切です。
semantica doctor
# Python 3.11.9 pass
# semantica 0.6.0 pass
# faiss vector store pass
# Config file pass ~/.semantica/config.yaml
用途別の extras もひととおり揃っています。
pip install semantica[all] # 全部入り
pip install semantica[graph-neo4j] # Neo4j
pip install semantica[db-databricks] # Databricks
pip install semantica[explorer] # ブラウザ GUI
使ってみる①:意思決定を「記録して辿る」
Semantica の看板機能である Decision Intelligence です。エージェントの判断を、ログ行ではなくグラフノードとして記録します。
from semantica.context import ContextGraph
graph = ContextGraph(advanced_analytics=True)
# 1. 判断を構造化して記録する
app_id = graph.record_decision(
category="credit_application",
scenario="個人ローン申込、年収 850 万円、DTI 31%、勤続 3 年",
reasoning="収入基準を満たし、雇用も安定。信用事故なし",
outcome="proceed_to_underwriting",
confidence=0.88,
)
uw_id = graph.record_decision(
category="loan_underwriting",
scenario="A-7291 の審査",
reasoning="DTI はポリシー内。36 か月間クリーンな信用履歴",
outcome="approved",
confidence=0.94,
)
# 2. 因果関係で結ぶ(CAUSED / INFLUENCED / PRECEDENT_FOR)
graph.add_causal_relationship(app_id, uw_id, relationship_type="CAUSED")
# 3. あとから問い合わせる
chain = graph.trace_decision_chain(uw_id) # 根本原因まで遡る
similar = graph.find_similar_decisions("DTI 31% の個人ローン承認") # 過去の判例検索
impact = graph.analyze_decision_impact(uw_id) # 下流への影響範囲
ok = graph.check_decision_rules({"category": "loan_underwriting"}) # ポリシー適合チェック
find_similar_decisions() が個人的にはいちばん実務的だと感じました。「過去に似たケースをどう判断したか」を意味検索で引ける、というのは、審査品質の均質化そのものです。
使ってみる②:コンテキストグラフとタイムトラベル
エンティティ・関係・事実を型付きで持ち、時点を指定して過去の状態を再現できます。
from semantica.context import ContextGraph
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_edge("alice_chen", "acme_corp", edge_type="works_for", since="2019-03-01")
neighbors = graph.get_neighbors("acme_corp", hops=2) # 2 ホップ先まで探索
snapshot = graph.state_at("2024-01-01") # その時点のグラフを再現
さらに「世界で事実だった期間(valid time)」と「自分がそれを知った時刻(recorded time)」を別軸で持つバイテンポラルな管理もサポートされています。後から遡って修正が入る業務データを扱うなら、この二軸は必須です。
使ってみる③:監査証跡のエクスポート
規制対応の本命がこれです。来歴を記録し、W3C PROV-O 形式で出力します。
from semantica.provenance import ProvenanceManager
from semantica.export import RDFExporter
prov = ProvenanceManager(storage_path="./audit.db")
prov.track_entity(
"patient_P4821",
source="ehr/medication_orders_2024.json",
metadata={"extractor": "NamedEntityRecognizer"},
)
lineage = prov.get_lineage("patient_P4821") # 「この事実はどこから来たのか」
RDFExporter().export(kg, "audit_trail.ttl", format="turtle")
出力形式は RDF / OWL / Parquet / Cypher / JSON-LD に対応しています。監査ログは JSON・CSV・RDF で出せるので、「監査部門に提出できるフォーマットで出す」というところまで面倒を見てくれます。
エコシステム
ここも思ったより厚いです。
-
MCP サーバ:
python -m semantica.mcp_serverで起動。extract_entities、record_decision、get_causal_chain、run_reasoningなどのツールが公開され、Claude Desktop などの MCP クライアントからそのまま叩けます -
CLI:
ingest/kg/reason/decision/provenance/ontology/exportなど、機能がひととおりコマンド化されています -
REST API:
python -m semantica.serverでポート 8000 に起動 -
Knowledge Explorer:React 19 + Sigma.js のブラウザ GUI。グラフの可視化、タイムラインのスクラブ、意思決定の因果チェーン閲覧、重複解消、オントロジーの GUI 編集ができます。
pip install "semantica[explorer]"だけで動くので Node.js は不要です - プラグイン:Claude Code、Cursor、Codex CLI、Windsurf、Cline、VS Code など向けのバンドルを同梱
- エージェント連携:Agno はネイティブ対応、LangChain / LangGraph / CrewAI / LlamaIndex / AutoGen などは REST・MCC 経由で利用可能
導入前に知っておきたい点
良さそうな話ばかり書きましたが、README 自身が正直に書いている注意点もあります。
-
ReteEngineの条件マッチャは現リリースでは意図的にシンプルとされています。コンプライアンスのゲートに組み込む前に、自分のルールセットでmatch_patterns()の出力を必ず検証してください - 性能値の読み方。「118,000 ノードのグラフでノード検索が 6,000 倍高速」といった数字は CHANGELOG の実測記録であり、自動テストのアサーションではありません。ハードウェアやデータのトポロジで変わるので、自分のデータで測るのが前提です
-
本番は
pip installではなく Docker / Kubernetes 推奨。SEMANTICA_SECRET_KEYを設定し、永続的なグラフストアとホスト型ベクトルストアを指すのが正しい構成です - 一部の Ingestor(DuckDB、Elasticsearch、MongoDB など)はトップレベルの名前空間に再エクスポートされていないため、モジュールから直接 import する必要があります
まとめ
Semantica は「RAG の次」を、ベクトルの精度ではなく説明責任の側から解こうとしているプロジェクトです。
こういう課題感を持っている方には、試す価値があると思います。
- エージェントの判断根拠を、後から監査可能な形で残したい
- 複数ソースの矛盾を、黙って上書きされる前に検出したい
- ベクトル検索だけでは拾えない「3 ホップ先の関係」を扱いたい
- データを外部 SaaS に出さず、自社インフラ内で完結させたい
まずは pip install semantica して semantica doctor と Knowledge Explorer を触ってみるのが、いちばん手触りが分かる入口だと思います。
参考
- GitHub: https://github.com/semantica-agi/semantica
- 公式サイト: https://getsemantica.ai/
- ドキュメント: https://docs.getsemantica.ai/
- Cookbook(実行可能な Jupyter ノートブック): https://github.com/semantica-agi/semantica/tree/main/cookbook