IFC → OpenUSD 변환, Qdrant 벡터 DB 기반 속성 관리, LLM 멀티에이전트 설계 자동화
[IFC / Point Cloud / Revit]
↓
[Layer 2] IfcOpenShell → IFC-USD Mapper → Property Embedder
↓ ↓
[Layer 3] OpenUSD Scene Graph ←→ Qdrant Vector DB
↓ ↓
[Layer 4] RAG Retriever + LLM Multi-Agent + Generative Design
↓
[Layer 5] USD→IFC Export / 3D Viz / Design Review / Digital Twin
↓
Feedback Loop → Layer 2 재순환
| 포맷 | 용도 | 비고 |
|---|---|---|
| IFC 2x3 / 4.3 | 레거시 BIM 모델 | ISO 16739, 업계 표준 |
| IFC 5 (JSON) | 차세대 표준 | JSON 직렬화, OpenUSD 통합 설계 |
| Point Cloud | 현장 스캔 (LAS/E57) | SLAM 기반 현실 데이터 |
| Revit / Archicad | BIM 저작 도구 | API 통한 직접 연동 |
| CityGML / GIS | 도시·인프라 스케일 | BIM-GIS 통합 |
IFC 파일에서 요소, 속성, 관계, 지오메트리를 추출하는 핵심 라이브러리.
import ifcopenshell
import ifcopenshell.util.element as util
model = ifcopenshell.open("model.ifc")
for wall in model.by_type("IfcWall"):
psets = util.get_psets(wall) # 속성 세트 전체
location = util.get_container(wall) # 공간 위치 (층)
wall_type = util.get_type(wall) # 타입 정보
ifcopenshell.geom)| IFC 엔티티 | USD 대응 | 설명 |
|---|---|---|
IfcProject |
Stage root | USD 파일 루트 |
IfcSite |
/Site Xform |
좌표계 기준점 |
IfcBuilding |
/Site/Building Xform |
건물 단위 |
IfcBuildingStorey |
.../Storey_1F Xform |
층 단위 |
IfcWall, IfcSlab 등 |
Mesh + MaterialBinding | 요소별 지오메트리 |
IfcPropertySet |
Custom attribute (bim: namespace) |
속성 보존 |
IfcRelation |
USD Relationship | 공간·타입·재료 관계 |
IfcGlobalId |
bim:guid attribute |
양방향 추적 키 |
핵심 원칙: 무손실 라운드트립. IFC→USD→IFC 왕복 시 속성 및 관계 정보가 보존되어야 함.
BIM 요소의 속성을 벡터로 변환하여 의미 검색을 가능하게 하는 모듈.
def serialize_element(element, psets: dict) -> str:
"""BIM 요소를 구조화된 텍스트로 직렬화"""
lines = [
f"Type: {element.is_a()}",
f"Name: {element.Name}",
f"Storey: {get_storey(element)}",
]
for pset_name, props in psets.items():
for key, val in props.items():
lines.append(f"{pset_name}.{key}: {val}")
return "\n".join(lines)
# 임베딩 생성
text = serialize_element(wall, psets)
vector = embedding_model.encode(text) # 1536d dense vector
임베딩 모델 선택지:
text-embedding-3-large (OpenAI) — 범용, 1536d역할: 기하 정보 + 공간 계층 + 시각화
bim:ifcClass, bim:guid, bim:psetHash 등으로 IFC 메타데이터 보존model.usda ← 원본 IFC 변환 결과
├── ai_edits.usda ← AI 생성 설계 변경 (sublayer)
├── review.usda ← 검토 코멘트 레이어
└── iot_live.usda ← 실시간 센서 데이터 레이어
역할: 속성 기반 의미 검색 + 하이브리드 필터링
from qdrant_client import QdrantClient
from qdrant_client.models import (
VectorParams, Distance, PointStruct,
Filter, FieldCondition, MatchValue
)
client = QdrantClient(host="localhost", port=6333)
# 컬렉션 생성
client.create_collection(
collection_name="bim_elements",
vectors_config={
"dense": VectorParams(size=1536, distance=Distance.COSINE),
"sparse": VectorParams(size=30000, distance=Distance.DOT), # BM25
}
)
# BIM 요소 삽입
client.upsert(
collection_name="bim_elements",
points=[PointStruct(
id=element_id,
vector={
"dense": dense_embedding,
"sparse": sparse_embedding,
},
payload={
"ifc_guid": wall.GlobalId,
"ifc_class": "IfcWall",
"storey": "2F",
"material": "concrete_200mm",
"usd_prim_path": "/Site/Building/Storey_2F/Wall_001",
"pset_summary": "Pset_WallCommon.IsExternal: True, ...",
}
)]
)
# 하이브리드 검색: 의미 + 필터
results = client.search(
collection_name="bim_elements",
query_vector=("dense", query_embedding),
query_filter=Filter(must=[
FieldCondition(key="storey", match=MatchValue(value="2F")),
FieldCondition(key="ifc_class", match=MatchValue(value="IfcWall")),
]),
limit=10,
)
Qdrant 선택 이유:
┌─────────────────┐ ┌─────────────────┐
│ OpenUSD Prim │ │ Qdrant Point │
│ │ │ │
│ bim:guid ───────┼────→────┼─ payload.guid │
│ prim_path ◄─────┼────←────┼─ payload.usd_path│
│ │ │ │
│ geometry (mesh) │ │ vector (1536d) │
│ hierarchy │ │ payload (filter)│
└─────────────────┘ └─────────────────┘
의미 검색 결과에서 usd_prim_path로 즉시 3D 뷰 점프.
3D 뷰에서 선택한 요소의 bim:guid로 Qdrant 유사 요소 검색.
사용자 질의 (자연어)
↓
Query Embedding (dense + sparse)
↓
Qdrant Hybrid Search (+ payload filter)
↓
Top-K BIM 요소 + PropertySet 컨텍스트
↓
USD Scene에서 geometry/hierarchy 보강
↓
LLM (Claude / GPT-4) → 답변 생성
질의 예시:
LangGraph 또는 AutoGen 기반 4-에이전트 구조:
| Agent | 역할 | 도구 접근 |
|---|---|---|
design_agent |
설계 의도 해석, 파라메트릭 조건 생성 | Qdrant search, USD read |
checker_agent |
건축법규/구조기준 적합성 검토 | 법규 DB, IFC validation |
coordinator_agent |
에이전트 간 조율, 충돌 해소 | 전체 에이전트 통신 |
executor_agent |
검증된 코드를 BIM 도구에서 실행 | Revit API, Dynamo, USD write |
워크플로우: 사용자 프롬프트 → design_agent가 설계안 생성 → checker_agent가 검증 → 통과 시 executor_agent가 USD Layer에 기록 → 실패 시 design_agent에 피드백.
| 출력 채널 | 기술 | 용도 |
|---|---|---|
| USD → IFC 역변환 | IfcOpenShell write API | 기존 BIM 워크플로우 복귀 |
| 3D 시각화 | Omniverse / Three.js USD Viewer | 웹·VR 기반 리뷰 |
| 자동 설계 검토 | Rule-based + LLM checker | 코드 체크, 충돌 감지 |
| Digital Twin | USD + IoT 스트리밍 | 실시간 운영 모니터링 |
피드백 루프: AI 편집 결과 → Property Embedder 재실행 → Qdrant 벡터 갱신 → 다음 검색에 최신 상태 반영.
| 영역 | 기술 | 버전/비고 |
|---|---|---|
| IFC 파싱 | IfcOpenShell | 0.8.x, Python/C++ |
| Scene graph | OpenUSD (pxr) | Pixar USD, Python 바인딩 |
| Vector DB | Qdrant | 1.17+, Rust, Gridstore 엔진 |
| Embedding | text-embedding-3-large | 1536d, 또는 도메인 fine-tuned |
| LLM | Claude / GPT-4 | RAG + Agent 활용 |
| Agent framework | LangGraph 또는 AutoGen | Multi-agent orchestration |
| Visualization | Omniverse / Three.js | USD 네이티브 렌더링 |
| CI/CD | IFC 변경 감지 → 자동 파이프라인 | Git-ops 연동 |
Phase 1: IFC → USD 변환 파이프라인 (IfcOpenShell + pxr)
Phase 2: Qdrant 속성 저장 + 하이브리드 검색 구축
Phase 3: RAG 기반 BIM 질의응답 시스템
Phase 4: Multi-Agent 설계 자동화
Phase 5: Generative Design + Digital Twin 통합
2025.03 기준 최신 동향 반영. IFC 5.0 + OpenUSD 통합은 buildingSMART-AOUSD 공식 협력으로 진행 중.