관계의 그물망 — 오행, 십신, 합충형파해를 코드로

 


사주명리의 진짜 복잡도는 22개의 글자 자체가 아니라, 글자들 사이의 "관계"에 있다. 오행의 상생상극, 십신의 10가지 분류, 합충형파해의 수십 가지 조합. 이 관계의 그물망을 코드로 옮기는 과정은 프로젝트에서 가장 도전적이면서도 가장 흥미로운 부분이었다.

오행 상생상극: 두 가지 구현 방식

오행의 상생상극은 사주 분석의 가장 기본적인 축이다. 목은 화를 생하고, 화는 토를 생하고, 토는 금을 생하고, 금은 수를 생하고, 수는 목을 생한다. 상극은 목이 토를 극하고, 토가 수를 극하고, 수가 화를 극하고, 화가 금을 극하고, 금이 목을 극한다.

이 관계를 코드로 구현하는 방법은 크게 두 가지다.

첫 번째는 매핑 테이블 방식이다. "목이 화를 생한다"는 관계를 직접 테이블로 작성한다. 명시적이고 읽기 쉽다. 코드를 보면 도메인 관계가 바로 눈에 들어온다. 수정이나 검증도 쉽다.

두 번째는 인덱스 연산 방식이다. 오행을 목(0), 화(1), 토(2), 금(3), 수(4)로 인덱싱하면, 상생은 (현재 + 1) % 5이고, 상극은 (현재 + 2) % 5다. 간결하고 수학적으로 우아하다. 오행의 순환 구조를 코드의 모듈러 연산으로 표현한 것이다.

두 방식 모두 장점이 있어서 프로젝트에서는 둘 다 유지하기로 했다. 매핑 테이블은 데이터 참조와 검증에, 인덱스 연산은 런타임 계산에 사용한다. 중복처럼 보일 수 있지만, 실제로는 각자의 역할이 다르다.

매핑 테이블은 "이 관계가 맞는가"를 확인할 때 쓴다. 코드 리뷰에서, 테스트에서, 디버깅에서 테이블을 보면 바로 확인할 수 있다. 인덱스 연산은 분석 엔진 내부에서 빠른 판별이 필요할 때 쓴다. 두 방식의 결과가 항상 일치하는지를 테스트로 검증해두면, 어느 쪽을 써도 안전하다.

십신 분석: 일간 기준의 10가지 관계

십신(十神)은 사주 해석에서 가장 중요한 분석 체계 중 하나다. 일주의 천간, 즉 일간을 기준으로 나머지 7개 글자와의 관계를 분류하는 것이다.

기본 원리는 이렇다. 일간과 다른 글자의 오행 관계를 먼저 본다. 같은 오행이면 비겁, 내가 생하는 오행이면 식상, 나를 생하는 오행이면 인성, 내가 극하는 오행이면 재성, 나를 극하는 오행이면 관성. 이렇게 다섯 가지 기본 관계가 나온다.

여기서 음양 구분이 추가된다. 같은 관계라도 음양이 같으면 "편(偏)", 다르면 "정(正)"이 된다. 비겁은 비견/겁재로, 식상은 식신/상관으로, 인성은 편인/정인으로, 재성은 편재/정재로, 관성은 편관/정관으로 나뉜다. 5가지 기본 관계가 음양에 따라 10가지로 확장되는 것이다. 그래서 "십신"이다.

코드로 구현할 때 핵심은 이 판별 로직이 "일간이 누구인가"에 따라 완전히 달라진다는 점이다. 일간이 甲(양목)일 때와 丁(음화)일 때, 같은 庚(양금)에 대한 십신이 다르다. 甲 기준으로 庚은 편관이지만, 丁 기준으로 庚은 정재다. 일간이 10가지, 상대가 10가지(천간 기준)이므로 100가지 조합의 십신 매핑이 필요하다.

이 100가지 매핑을 직접 만드는 것은 비효율적이다. 대신 오행 상생상극 로직과 음양 판별 로직을 조합하면 자동으로 십신이 결정된다. 규칙 기반 계산이 매핑 테이블보다 유지보수에 유리한 영역이다.

합충형파해: 관계의 폭발

합충형파해(合沖刑破害)는 사주명리에서 글자들 사이의 특별한 상호작용을 다루는 체계다. 이것을 코드로 옮기는 과정이 이 프로젝트에서 가장 데이터가 많은 작업이었다.

천간합부터 보자. 천간끼리의 합은 5쌍이다. 甲己합, 乙庚합, 丙辛합, 丁壬합, 戊癸합. 각 합은 특정 오행으로 변한다. 甲己가 만나면 토로 변하고, 乙庚이 만나면 금으로 변한다.

지지의 관계는 훨씬 복잡하다. 삼합(三合)은 4조다. 寅午戌(인오술)이 모이면 화국, 巳酉丑(사유축)이 모이면 금국, 申子辰(신자진)이 모이면 수국, 亥卯未(해묘미)가 모이면 목국. 방합(方合)도 4조다. 寅卯辰(인묘진)은 동방 목국, 巳午未(사오미)는 남방 화국, 申酉戌(신유술)은 서방 금국, 亥子丑(해자축)은 북방 수국.

육합(六合)은 6쌍이다. 子丑합, 寅亥합, 卯戌합, 辰酉합, 巳申합, 午未합. 각 합마다 변하는 오행이 있다.

육충(六沖)도 6쌍이다. 子午충, 丑未충, 寅申충, 卯酉충, 辰戌충, 巳亥충.

형(刑)은 3유형이다. 무은지형(寅巳申), 무례지형(丑戌未), 자형(辰辰, 午午, 酉酉, 亥亥).

파(破)와 해(害)도 각각 여러 쌍이 있다.

이 모든 조합을 나열하면 상당한 분량이다. 천간합 5쌍, 삼합 4조, 방합 4조, 육합 6쌍, 육충 6쌍, 형 3유형, 파 6쌍, 해 6쌍. 각 조합에 관련 속성(변화하는 오행, 성립 조건 등)까지 포함하면 데이터의 양이 만만치 않다.

AI가 대량 데이터 테이블을 한 번에 생성하다

이 데이터 테이블들을 구현하면서 AI의 강점을 가장 극적으로 체감한 순간이 있었다. 합충형파해의 모든 조합을 코드로 생성해달라고 요청했을 때, AI가 한 번에 정확한 데이터 테이블을 생성한 것이다.

천간합 5쌍과 각각의 합화 오행. 삼합 4조와 각각의 합화 오행, 왕지/생지/묘지 구분. 방합 4조와 각각의 오행. 육합 6쌍과 합화 오행. 육충 6쌍. 형의 3유형과 해당하는 지지 조합. 이 모든 것이 한 번의 응답에 담겨 나왔다.

직접 타이핑했다면 어떻게 됐을까. 먼저 참고 자료를 펼쳐놓고, 한 쌍씩 입력하고, 오타가 없는지 확인하고. 오행이 한자라서 입력하기 불편하고, 비슷한 글자끼리 헷갈리기 쉽다. 寅과 卯, 辰과 巳, 酉와 戌. 한 글자만 잘못 들어가도 분석 결과가 틀어진다.

AI가 생성한 데이터의 정확성은 놀라웠다. 설계 문서에 정리된 내용과 대조했을 때, 오류가 거의 없었다. 사주명리의 합충형파해 데이터는 학술적으로 잘 정립된 체계이기 때문에, AI 학습 데이터에 정확한 정보가 충분히 포함된 결과일 것이다.

물론 "거의 없었다"지 "전혀 없었다"는 아니다. 검증은 반드시 필요했고, 실제로 한두 군데 수정이 필요한 부분이 있었다. 하지만 전체를 직접 타이핑하는 것과 비교하면, AI 생성 + 검증이 시간과 정확도 양쪽에서 월등했다.

12운성과 음간 순행/역행 논쟁

12운성(十二運星)은 오행의 에너지가 태어나서 성장하고, 절정에 달하고, 쇠퇴하고, 사라지고, 다시 태어나는 생명주기를 12단계로 표현한 체계다. 장생, 목욕, 관대, 건록, 제왕, 쇠, 병, 사, 묘, 절, 태, 양.

구현 자체는 매핑 테이블로 처리할 수 있다. 각 천간이 12개의 지지에서 어떤 운성을 가지는지를 표로 만들면 된다. 하지만 여기서 프로젝트의 두 번째 학파 차이를 만났다. 음간의 순행/역행 논쟁이다.

양간(甲, 丙, 戊, 庚, 壬)의 12운성은 학파 간 이견이 없다. 甲이 寅에서 장생하고, 卯에서 목욕하고, 순행한다는 것에 모두 동의한다.

문제는 음간(乙, 丁, 己, 辛, 癸)이다. 한 학파는 음간이 역행한다고 본다. 양간이 시계 방향으로 12단계를 거치면, 음간은 반시계 방향으로 거친다는 것이다. 다른 학파는 음간도 순행한다고 본다. 역행을 적용하지 않는다.

AI에게 이 논쟁에 대해 물었을 때, "현대 명리학의 다수가 음간 역행을 적용합니다"라는 답이 돌아왔다. 그런데 여기서 조심해야 할 것이 있다. "다수"가 반드시 "정답"은 아니다. 학파의 선택이다.

이 부분에서도 2편의 설계 원칙을 적용했다. 기본값은 현대 명리학 다수의 의견을 따라 음간 역행을 적용하되, 설정으로 순행으로 변경할 수 있는 구조를 만들었다. AI의 의견을 참고하되, 최종 설계 결정에는 유연성을 확보한 것이다.

관계의 계층 구조

합충형파해를 모두 구현하고 나서 한 발 물러나 보니, 이 관계들이 계층 구조를 이루고 있다는 것이 보였다.

가장 기본적인 층은 오행 상생상극이다. 두 글자의 오행이 어떤 관계인가.

그 위에 십신 층이 있다. 일간 기준으로 오행 관계와 음양을 결합해 10가지 관계를 분류한다.

그리고 합충형파해 층이 있다. 특정 글자 조합이 만들어내는 특수한 상호작용이다.

12운성은 별도의 축이다. 오행의 에너지 상태를 평가하는 것이라서, 관계라기보다는 "상태"에 가깝다.

이 계층 구조를 코드 아키텍처에 반영했다. 오행 분석 모듈 위에 십신 분석 모듈이 있고, 합충형파해 분석 모듈이 있고, 12운성 분석 모듈이 있다. 각 모듈은 자기 아래 층의 결과를 참조한다. 이 구조가 설계 문서를 통해 AI에게 전달됐기 때문에, AI가 생성하는 코드도 이 계층을 자연스럽게 따랐다.

규칙의 양과 코드의 양

이 편을 마무리하면서 느낀 것은, 사주명리는 "규칙이 많은 도메인"이라는 것이다. 타로가 "데이터가 많은 도메인"이었다면, 사주는 "규칙이 많은 도메인"이다.

타로에서 가장 많은 시간이 걸린 것은 78장의 해석 텍스트를 생성하는 것이었다. 사주에서 가장 많은 시간이 걸린 것은 글자들 사이의 관계 규칙을 빠짐없이 정확하게 코드로 옮기는 것이었다.

이 차이가 AI 협업의 양상도 달라지게 했다. 타로에서 AI는 "콘텐츠 생성자"에 가까웠다. 해석 텍스트를 만들어내는 역할. 사주에서 AI는 "도메인 번역자"에 가깝다. 사주학의 규칙 체계를 코드의 데이터 구조와 로직으로 번역하는 역할. 같은 AI 협업이지만, 도메인에 따라 AI의 역할이 달라진다.

이 과정에서 배운 것

첫째, 구현 방식이 하나일 필요는 없다. 오행 상생상극에서 매핑 테이블과 인덱스 연산을 모두 유지한 것처럼, 각 방식의 장점을 살리는 것이 하나를 억지로 고르는 것보다 나을 수 있다.

둘째, AI는 대량의 정형 데이터를 한 번에 정확하게 생성하는 데 뛰어나다. 합충형파해처럼 조합이 많고 정확성이 중요한 데이터에서 AI의 강점이 극대화된다.

셋째, 도메인에 따라 AI의 역할이 달라진다. 콘텐츠 생성, 도메인 번역, 로직 구현 등 AI가 가장 효과적인 역할은 프로젝트마다 다르다.

다음 편 예고

22개의 글자와 그 사이의 관계를 모두 코드로 옮겼다. 이제 이 체계의 진짜 출발점으로 돌아갈 때다. 사주 분석의 첫 단계는 생년월일시를 사주 팔자로 변환하는 것이고, 이 변환에 필요한 만세력 엔진이 필요하다. 한국천문연구원 절기 데이터, korean-lunar-calendar 라이브러리, 그리고 진태양시 보정 알고리즘. 달력의 세계가 생각보다 훨씬 복잡하다는 것을, 6편에서 확인하게 될 것이다.

댓글

이 블로그의 인기 게시물

사랑을 직접 올리지 않는 설계

감정을 변수로 옮기다 — 3계층 감정 모델

시작의 충동 — "타로 웹앱을 만들어볼까?"