FACET — Text를 위한 기능 인식 계약 확장 언어
AI 시대를 위한 결정론적 마크업 언어입니다.
<div align="center">
<img src="https://raw.githubusercontent.com/rokoss21/FACET/main/assets/logo.png" alt="FACET Logo" width="100%" height="auto" style="max-width: 600px;">
<br>
<h3>🚀 Text를 위한 기능 인식 계약 확장 언어</h3>
<p><em>AI 시스템을 위한 사람이 읽기 쉬우면서 기계가 결정론적인 지침입니다.</em></em></p>
</div>
spec
status
mime
ext
author
<!-- PyPI badges -->
PyPI version
PyPI downloads
Python versions
License
✨ FACET이란 무엇인가?
FACET은 AI 시스템을 위한 지침을 작성, 관리 및 실행하기 위한 마크업 언어입니다. 일반 텍스트의 명확성과 코드의 엄격함을 결합하여 재현 가능한(reproducible) AI 파이프라인을 구축합니다.
모든 FACET 문서는 **단일한 표준 JSON(canonical JSON)**으로 컴파일됩니다. YAML 스타일의 모호성이나 숨겨진 마법은 없습니다. 버전 v1.1에서는 FACET을 모듈성, 로직, 정적 타이핑 및 순수 변환 파이프라인(lenses)을 갖춘 **컴파일 타임 설정 언어(compile-time configuration language)**로 만듭니다.
🧠 FACET은 어떻게 작동하는가?
+------------------+ +------------------+ +-----------------+
| | | | | |
| .facet 파일 | --> | FACET Parser | --> | Canonical JSON |
...
작성 시에는 읽기 쉬운 .facet 파일을 작성합니다. 참조 파서(reference parser)는 임포트(imports)를 확장하고, 변수를 해결하며, 조건문(conditionals)을 적용하고, 타입/계약(types/contracts)을 검증하며, 순수 렌즈 파이프라인(pure lens pipelines)을 실행하여 다운스트림 도구들이 신뢰할 수 있는 단일 표준 JSON을 생성합니다.
🚀 혁신성 (왜 지금인가, 왜 FACET인가)
현대 AI 스택은 임시방편적인 프롬프트, 취약한 스크립트, 모호한 설정값들이 뒤섞여 홍수처럼 빠져듭니다. FACET은 이를 **계약(contracts)**과 **결정론적 방식(determinism)**으로 대체합니다.
- 설계 단계부터 결정론적: 하나의 소스 → 하나의 표준 JSON. 예상치 못한 변수가 없습니다.
- 계약 기반 프롬프팅 (Contract-first prompting):
@output을 사용하여 모델 응답에 JSON Schema를 강제할 수 있습니다. 프롬프트는 더 이상 문자열이 아니라 보장이 담긴 API가 됩니다.
- 컴파일 타임 지능:
@import, @vars, @var_types, 그리고 if="EXPR"는 실행 전에도 모듈성, 매개변수화, 정적 검사를 제공합니다.
- 순수 변환 파이프라인 (Pure transformation pipeline): 렌즈(Lenses) (
|>) — I/O나 사이드 이펙트가 없는 내장 결정론적 함수들(예: choose(seed)/shuffle(seed)).
- 보안 모델: 가져오기 허용 목록 (Import allowlists), 샌드박스화된 렌즈, 환경에 대한 암묵적인 접근 부재.
FACET은 단순히 AI를 설정하는 것이 아니라, 지침 자체를 프로그래밍합니다.
🥊 FACET 대 기존 옵션들
| 기능 / 도구 | YAML + JSON | Jsonnet/Cue | 템플릿팅 (Jinja/Mustache) | FACET |
|---|
| 표준적이고 결정론적인 직렬화 | ⚠️ 의존함 | ✅ | ❌ (런타임 텍스트) | ✅ |
| ... | | | | |
FACET은 설정값의 가독성과 AI 오케스트레이션에 특화된 DSL이 제공하는 **보장(guarantees)**을 결합합니다.
🧩 핵심 개념 (v1.1)
- 페이싯 및 계약(Facets & Contracts): 구조화된 블록 (
@system, @user, @plan, @output, …).
- 모듈성(Modularity): 결정론적
merge / replace를 사용하는 @import.
- 변수(Variables):
@vars 및 문자열 보간법 {{path}}; 스칼라 치환 $name.
- 정적 타이핑(Static Typing): 컴파일 시점에
type/enum/min/max/pattern을 강제하는 @var_types.
- 조건문(Conditionals): 모든 페이싯 또는 리스트 항목에 대한
if="EXPR" (런타임 평가 없음).
- 렌즈(Lenses): 순수하고 안전한 변환 (
value |> lensA |> lensB(...)) (결정론적 choose(seed)/shuffle(seed) 포함).
- 보안(Security): 허용 목록 기반 임포트, 샌드박스화된 렌즈, 암묵적인 환경 변수 읽기 방지.
📖 작동 구문 (Syntax in Action)
# 1) 프롬프트 조각 및 계약 재사용
@import "common/prompts.facet"
@import(path="common/output_contracts.facet", strategy="merge")
...
✅ 읽기 쉬움 • ✅ 동적 • ✅ 재현 가능 • ✅ 계약 강제
🧭 정규화 파이프라인 (Canonization Pipeline) (결정론적)
- 임포트(Imports) → 2. 변수 해상도(Variable resolution) → 3.
@var_types 검증 →
- 조건부 필터링(Conditional filtering) → 5. 앵커/별칭(Anchors/Aliases) → 6. 렌즈(Lenses) →
- 정규화된 JSON 구성(안정적인 키 순서)
컴파일 타임 페이싯(@import, @vars, @var_types)은 최종 JSON에 나타나지 않습니다.
🧪 정규화된 JSON (예시)
{
"system": {
"_attrs": { "role": "Deep Technical Expert" }
...
(정확한 내용은 선택된 시드와 입력 값에 따라 달라지며, 구조와 순서는 결정론적입니다.)
🧰 설치 (Installation)
요구 사항: Python ≥ 3.9
⚡ 설치 후 60초 동적 프롬프트
- 파일 생성:
cat > my_prompt.facet << EOF
@vars
mode: "user"
...
2. "사용자(user)" 모드로 실행 (시스템 블록 없음):
```bash
facet canon --var "mode=user" my_prompt.facet
- "전문가(expert)" 모드로 실행 (시스템 블록 포함):
facet canon --var "mode=expert" my_prompt.facet
Python API
from facet_lang import canonize
doc = """@user
...
CLI
facet canon --resolve=all samples/complex.facet
...
🧠 FACET 시스템 프롬프트
FACET_SYSTEM_PROMPT.md는 LLM이 구문 및 표준화 규칙을 따라 유효한 .facet 파일을 생성하도록 돕습니다.
이를 에이전트/도구링에서 시스템 메시지로 사용하여 네이티브하게 FACET을 생성하는 데 사용하십시오.
🔐 보안 모델 (필수 사항)
- 임포트(Imports): 허용 목록화된 루트만 가능하며, 네트워크 URL이나 경로 이스케이프는 불가능합니다.
- 변수(Variables): 암묵적인 환경 변수 읽기는 불가합니다. 호스트가 명시적으로 전달해야 합니다.
- 조건문(Conditionals): 전용 파서(eval 사용 불가).
- 렌즈(Lenses): 샌드박싱, 시간 초과 설정, I/O/시간/랜덤 접근 불가; 결정론적인
choose/shuffle는 명시적인 seed가 필요합니다.
🧭 FACET 사용 시점 (실제 활용 사례)
- SLA가 적용되는 엔터프라이즈 프롬프트: 출력 계약을 강제하여 안정적인 다운스트림 파이프라인을 구축할 수 있습니다.
- 다중 환경 오케스트레이션: 하나의 소스에서
if="EXPR"/@vars를 사용하여 파일 확산 없이 개발/스테이징/운영(dev/staging/prod) 환경 관리가 가능합니다.
- 에이전트 파이프라인:
@import를 통해 공유 라이브러리를 사용하고, 렌즈를 통해 결정론적인 변환을 수행할 수 있습니다.
- AB 테스트 및 시드 기반 변형: 프롬프트 대안에 대해 재현 가능한
choose(seed)/shuffle(seed)를 사용할 수 있습니다.
❓ FAQ (가질 수 있는 반론)
“왜 전용 언어가 필요한가요? YAML + JSONSchema로는 안 되나요?”
YAML은 여전히 모호하며 일반적으로 외부 접착제/스크립트가 필요합니다. FACET은 임포트 → 타이핑 → 조건문 → 렌즈 → 표준화된 JSON까지 단일 결정론적 파이프라인을 제공합니다.
“왜 Cue나 Jsonnet을 사용하지 않나요?”
그것들은 범용 목적의 언어입니다. FACET은 AI에 특화되어 있습니다: @output 계약, 내장 렌즈, 명시적인 조건문 의미론, I/O/랜덤성 금지, 그리고 기본적으로 결정론성을 제공합니다.
“보안은 어떻게 유지하나요?”
규격에는 샌드박싱과 제한 사항(§12 참조)이 포함되어 있습니다. 렌즈는 순수하며(I/O 없음), 임포트는 허용 목록화되고, 변수는 호스트에 의해 명시적으로 제공됩니다.
🗺️ 로드맵
✅ v1.1 — 기반 다지기 (Foundation)
- 규격 확정, 참조 파서 강화, 샘플 및 문서 확장 예정.
- LSP (VS Code/JetBrains/Zed/NeoVim): 실시간 진단(realtime diagnostics), 자동 완성(autocomplete), 호버 정보(hovers).
- SDKs: TypeScript / Rust (Python과 함께).
- CI/CD: 정규화 및 스키마 검사를 위한 준비된 GitHub Actions.
🔮 Vision — 오케스트레이션 스택
- FACET MCP Server: 고성능 에이전트 우선(agent-first) 런타임.
- Plugin Registry: 엄선되고 격리된(sandboxed) 렌즈 생태계.
- Playground: 시각적 정규화 및 학습.
🤝 기여 (Contributing)
- Discussions: 아이디어, 제안, 쇼케이스
- Issues: 버그 및 작업(tasks)
- PRs: 기능, 수정 사항, 문서
👤 작성자 (Author)
Emil Rokossovskiy — @rokoss21
📄 라이선스 (License)
MIT — LICENSE 참조