OpenSource-Hub

semantica

프레임워크

semantica-agi/semantica

추적 가능한 AI를 위한 그래프 네이티브 컨텍스트 인프라.

개요

Semantica는 엔터프라이즈 데이터를 쿼리 가능한 컨텍스트/지식 그래프로 수집하는 셀프 호스팅 Python 프레임워크로, 결정론적 추론, 의사결정 인텔리전스 및 W3C PROV-O 출처 추적을 제공합니다. RDF와 프로퍼티 그래프를 지원하고, Databricks/Snowflake 커넥터를 내장하고 있으며, 시각화, REST API, CLI 및 MCP 서비스를 제공하여 감사 가능한 AI 시스템을 구축합니다.

README 미리보기

\n\n\n\n### Graph-Native Infrastructure for Context and Accountable AI Systems\n\n#### *The Open Source Palantir for AI Agents*\n\n> Ingest your enterprise data, extract what matters, build a Context Graph and knowledge graph (KG), and run graph analytics and causal reasoning over all of it, with full decision provenance baked in. Explainable, traceable, and trustworthy by design.\n\n**Decision Intelligence  ·  Context Management  ·  Deterministic Reasoning  ·  Ontology Management  ·  Knowledge Modeling  ·  End-to-End Traceability**\n\n**Open Source  ·  Self-Hostable  ·  Auditable  ·  Governed  ·  Zero Vendor Lock-In**\n\n**Polyglot Graph Storage  ·  RDF & LPG Support  ·  W3C Standards  ·  Interoperable**\n\n#### Built for High-Stakes, Regulated Domains\n\n[](https://github.com/semantica-agi/semantica) [](https://github.com/semantica-agi/semantica/network/members) [](https://github.com/semantica-agi/semantica/graphs/contributors) [](https://pypi.org/project/semantica/) [](https://pepy.tech/project/semantica) [](https://www.python.org/) [](https://opensource.org/licenses/MIT) [](https://github.com/semantica-agi/semantica/actions) [](https://deepwiki.com/semantica-agi/semantica)\n\n[](https://getsemantica.ai/) [](https://docs.getsemantica.ai/) [](https://discord.gg/sV34vps5hH) [](https://x.com/BuildSemantica) [](https://www.youtube.com/watch?v=QfnNZg4-dZA) [](CHANGELOG.md)\n\n```bash\npip install semantica\n```\n\n\n\n---\n\n\n\n\n\n\n\n*Knowledge Explorer · Context Graphs · Reasoning Engine · Decision Intelligence · Ontology Hub*\n\n**[▶ Watch the full platform walkthrough](https://www.youtube.com/watch?v=QfnNZg4-dZA)**\n\n\n\n---\n\nMost AI agents act without a trail. They store embeddings, not meaning: context that can't be explained, decisions that can't be audited. In lending, that gap is a compliance exposure, not an inconvenience: an underwrit

FAQ (5)

문제 해결
사용자 지정 포트에서 semantica-explorer를 실행할 때 발생하는 Explorer WebSocket 403 "connection rejected" 오류를 어떻게 해결하나요?

Explorer를 시작하기 전에 정확한 브라우저 origin이 포함되도록 ALLOWED_ORIGINS(또는 EXPLORER_CORS_ORIGINS)를 설정하세요. 기본적으로 http://localhost:5173과 http://127.0.0.1:5173만 허용되며, 동일한 허용 목록이 /ws/graph-updates WebSocket 핸드셰이크에도 적용됩니다.

포트 8020의 경우 다음을 실행하세요:

ALLOWED_ORIGINS="http://127.0.0.1:8020,http://localhost:8020" \
semantica-explorer --graph any_graph.json --port 8020

그런 다음 http://127.0.0.1:8020을 열고, 변수를 변경한 후 서버를 재시작하세요. 이 문제는 Semantica 0.6.7에서 확인되었습니다.

원본 Issue #1257
문제 해결
Semantica 테스트를 graph-embeddings extra 없이 실행할 때 발생하는 "ImportError: gensim is required for Node2Vec" 오류는 어떻게 해결하나요?

선택적 종속성을 설치하거나, slim-core 환경에서 Node2Vec 테스트를 건너뛰세요.

전체 테스트 환경의 경우:

pip install -e ".[dev,graph-embeddings]"

이 명령은 gensim>=4.4.0을 설치합니다. 설치되면 영향을 받는 모든 Node2Vec 테스트가 통과해야 합니다.

gensim이 의도적으로 없는 경우, 영향을 받는 각 테스트 모듈의 상단에 다음 가드를 추가하세요:

pytest.importorskip("gensim")  # Node2Vec requires semantica[graph-embeddings]

다음 파일에 있는 8개의 테스트에 적용하세요:
- tests/context/test_banking_context_graphs_e2e.py
- tests/context/test_context_explainability_regression.py
- tests/kg/test_enhanced_algorithms_e2e.py
- tests/kg/test_provenance_integration.py
- tests/test_030_realworld_comprehensive.py
- tests/vector_store/test_decision_embedding_pipeline.py

gensim 검사를 NodeEmbedder.__init__에서 _train_word2vec()로 옮기지 마세요. slim-core 계약은 생성자가 예외를 발생시키는 것에 의도적으로 의존하며, 이를 통해 호출자가 Node2Vec을 정상적으로 비활성화할 수 있습니다. 이 동작을 필요로 하는 테스트는 test_node_embedder_gensim_missing_hint, test_agent_context_with_graph_builds_without_gensim, test_graph_components_without_gensim_keep_everything_but_node2vec입니다.

원본 Issue #1962
문제 해결
클린 개발 환경 설치에서 tests/kg/test_node_embeddings.py의 pytest ImportError "gensim is required for Node2Vec" 오류를 어떻게 수정하나요?

virtualenv에 선택적 의존성을 설치하세요:

pip install -e ".[graph-embeddings]"

또는 릴리스된 패키지의 경우:

pip install "semantica[graph-embeddings]"

그런 다음 다시 실행하세요:

python -m pytest tests/kg/test_node_embeddings.py -q

리포지토리 테스트 수정의 경우, test_init_gensim_unavailable와 test_init_invalid_method는 gensim 없이 실행되어야 하므로 모듈 수준의 pytest.importorskip("gensim")를 추가하지 마세요. 대신 다음을 수행하세요:

1. pyproject.toml에 마커를 등록하세요:

[tool.pytest.ini_options]
markers = [
    "no_gensim: test runs without the optional gensim dependency"
]

2. 테스트에 no_gensim 마커가 지정되지 않은 한 gensim 의존 테스트를 건너뛰는 autouse 픽스처를 추가하세요:

import pytest
from semantica.kg.node_embeddings import GENSIM_AVAILABLE

@pytest.fixture(autouse=True)
def require_gensim(request):
    if not GENSIM_AVAILABLE and "no_gensim" not in request.keywords:
        pytest.skip("Install semantica[graph-embeddings] to run Node2Vec tests")

3. test_init_gensim_unavailable와 test_init_invalid_method에 @pytest.mark.no_gensim 마커를 지정하세요.

gensim이 없을 때 예상되는 결과: 2개 통과, 31개 건너뜀. gensim이 설치된 경우: 33개 테스트 모두 통과.

원본 Issue #1910
문제 해결
왜 Semantica CSVExporter의 export_relationships가 Neo4j/FalkorDB/Neptune/AGE 엣지에 대해 빈 source_id 및 target_id 컬럼을 출력하나요?

CSVExporter.export_relationships()는 엔드포인트 필드 이름으로 source/source_id와 target/target_id만 인식합니다. 백엔드 형식의 레코드는 start_node_id/end_node_id(Neo4j, FalkorDB, Neptune 및 이름이 변경된 AGE 엣지) 또는 start_id/end_id(raw AGE)를 사용하므로, 정규화 경로는 아무런 오류나 경고 없이 빈 엔드포인트 컬럼을 기록합니다. 수정/우회 방법:

1. **수정(패치)**: semantica/export/csv_exporter.py(export_relationships)에서 메서드 시작 시 레코드를 semantica/export/endpoint_names.py의 canonical_endpoints(SOURCE_ENDPOINT_NAMES/TARGET_ENDPOINT_NAMES를 정의함)를 통해 처리하세요. 이는 Parquet 및 Arrow 익스포터가 이미 사용하고 있는 것과 동일한 방식입니다. 이렇게 하면 모든 백엔드 표기법이 source_id/target_id로 매핑되며, source/target 및 source_id/target_id도 이전과 동일하게 작동합니다.

2. **우회 방법(코드 변경 없음)**: 내보내기 전에 필드 이름을 변경하세요:

record = {"id": "r1", "start_node_id": "alice", "end_node_id": "acme", "type": "WORKS_AT"}
record["source_id"], record["target_id"] = record.pop("start_node_id"), record.pop("end_node_id")
CSVExporter().export_relationships([record], "rel.csv")

3. **대체 경로**: export({"edges": [record]})는 값을 보존하지만 정규화 없이 원래 컬럼 이름(start_node_id/end_node_id)으로 기록합니다. Parquet 및 Arrow 익스포터는 영향을 받지 않습니다.

원본 Issue #2013
문제 해결
FileIngestor의 FileObjects를 사용할 때 GraphBuilder.build()가 빈 그래프를 반환하는 이유는 무엇인가요?

FileObject 인스턴스는 GraphBuilder._process_item()이 이를 인식하지 못하기 때문에 아무런 알림 없이 건너뜁니다. 이 메서드는 텍스트 문자열이나 {"text": ...}와 같은 딕셔너리를 예상합니다. 임시 해결 방법으로, 그래프를 빌드하기 전에 수집된 각 FileObject를 변환하세요:

docs = FileIngestor().ingest_directory("./docs/", recursive=True)
kg = GraphBuilder(merge_entities=True, enable_temporal=True).build(
    [{"text": d.text} for d in docs]
)

PR #1951의 영구 수정 사항은 build()가 FileObject.text에서 텍스트를 직접 추출하도록 하고, 지원되지 않는 소스 타입을 아무 알림 없이 건너뛰는 대신 해당 타입의 이름을 명시하는 경고를 로깅합니다. PR #1951이 포함된 릴리스로 업데이트하거나, main에서 실행 중이라면 해당 변경 사항을 적용하세요.

원본 Issue #1840