#빌드로그#키코#LLM#프롬프트

에세이에서 카드 덱으로 — AI 리딩의 어색한 문장을 고치며 배운 것

명당까치 키코는 한 자리를 실제 지형 데이터로 측정한 뒤, 그 결과와 이용자의 고민을 엮어 글로 풀어 주는 풍수 서비스입니다. 측정은 코드가 하고, 글은 언어 모델이 씁니다. 이 둘의 경계를 어디에 긋느냐가 2026년 9월 한 달 동안 가장 많이 바뀐 부분이었습니다.

이 글은 리딩 화면을 긴 에세이에서 카드 덱으로 바꾸고, 그 카드에 들어가는 문장을 다듬으며 배운 것들의 기록입니다. 결론부터 말하면, 문장이 이상할 때 고쳐야 할 것은 대개 모델이 아니라 저희가 씌운 틀과 재료였습니다.

에세이의 문제

처음 키코의 유료 리포트는 3D 지도 위에 장면 카드가 하나씩 넘어가는 긴 에세이였습니다. 측정 결과가 엄격하게 검증된 형식으로 모델에 들어가고, 모델은 그것을 다시 말하기만 했습니다. 정확했지만 길었고, 측정값이 줄줄이 나열되었습니다. “숫자 나열은 읽기 싫다”는 반응이 나왔고, 휴대폰에서 끝까지 읽는 사람을 기대하기 어려웠습니다.

9월 15일: 카드 릴, 그리고 첫 설계

그래서 리딩을 세로로 넘기는 카드 묶음, 즉 카드 릴로 바꿨습니다. 첫 설계는 이랬습니다.

  • 결제 전 무료 카드 네 장은 언어 모델 없이 브라우저가 계산했습니다. 열두 가지 “집의 유형” 이름, 다섯 단계 등급, 방위와 색으로 된 행운 키트, 그리고 결제 문.
  • 결제 뒤에는 모델이 정해진 칸에 문장만 채웠습니다. 목적별로 정해 둔 질문 세 개에 대한 답, 처방 카탈로그 항목마다 한 문장, 오늘 할 일 하나, 맺음말.

정해진 칸, 정해진 이름표, 정해진 처방 목록. 통제하기 쉬운 구조였습니다. 그런데 이틀 만에 뒤집혔습니다.

9월 17일: “파이프라인은 사실을 정하고, 문장은 하나도 정하지 않는다”

만드는 쪽에서 나온 판단은 이랬습니다. 브라우저가 정해진 규칙으로 찍어 낸 글을 읽고 싶어 하는 사람은 없다. 사람들은 계산기가 아니라 세상에서 가장 똑똑한 사람에게 상담받기를 기대한다.

그래서 규칙을 하나로 정리했습니다. 파이프라인은 사실을 정하고, 문장은 하나도 정하지 않는다. 집 유형 이름표 열두 개와 그에 딸린 문구 예순세 개, 등급 이름 다섯 개, 행운 키트의 고정 칸, 목적별 고정 질문을 모두 지웠습니다. 처방 카탈로그는 이제 메뉴일 뿐이고, 모델이 자기 말로 다시 씁니다. 카드가 몇 장일지(3~9장), 어떤 순서로 무슨 제목을 달지도 모델이 정합니다.

파이프라인이 내는 것은 측정한 지형 사실, 옛 기록, 그 사람에게 계산된 방향, 처방 메뉴입니다. 측정한 지형만큼은 모델이 바꿀 수 없습니다. 같은 화면의 3D 지도가 같은 데이터를 그리고 있어서, 글이 뒤집으면 그림과 글이 어긋나기 때문입니다.

점수도 같은 날 모델에게 넘겼습니다. 엔진이 규칙 합으로 계산하던 숫자를 참고로도 주지 않습니다. 주면 베끼고, 그러면 자유를 준 시늉만 한 채 결정론이 그대로 남기 때문입니다. 맞바꾼 것도 분명히 적어 두었습니다. 같은 자리라도 묻는 사람이 다르면 점수가 다를 수 있고, 자리끼리 견주는 기준이 약해집니다.

저자가 둘이면 모순이 생깁니다

방향에서도 비슷한 일이 있었습니다. 처음에는 여덟 방향의 좋고 나쁨을 표로 통째로 넘겼는데, 글에서 “남쪽은 좋은데 남서쪽이 최악”처럼 앞뒤가 맞지 않는 말이 나왔습니다. 처음에는 나쁜 방향을 빼고 좋은 방향 넷만 주는 것으로 막았습니다. 하지만 원래 사고의 원인은 나쁜 방향을 말해서가 아니라, “남쪽이 좋다”는 모델의 말과 “피할 방향 남서”라는 파이프라인의 말처럼 저자가 둘이었기 때문이었습니다. 그래서 다시 여덟 방향을 모두 주고, 요구는 하나만 남겼습니다. 네가 한 말끼리 어긋나지 마라.

무료 카드를 없앤 이유

결제 전 맛보기 카드도 같은 문제를 안고 있었습니다. 맛보기 카드는 그 사람을 모르고 쓰는 글이라 자리와 목적만으로 저장해 두고 방문자들이 나눠 썼습니다. 그러다 보니 같은 경복궁을 결제 문 앞에서는 “뒷산 업고 트인 마당터”, 결제 뒤에는 “왕이 앉았던 저녁 자리”처럼 다른 이름으로 불렀습니다. 값싼 일반론 한 장이 진짜 리딩의 첫인상을 깎아 먹었습니다.

그래서 무료 카드를 아예 없앴습니다. 결제 전 화면에 남은 것은 둘입니다. 그 자리를 측정한 그대로 그린 지도, 그리고 생년월일과 호칭, 진짜 묻고 싶은 것, 누구와 무엇을 하려는지, 걱정을 받는 문 하나입니다. 결제 전에 개인화된 미끼가 사라지니 전환이 떨어질 수 있다는 것도 알고 내린 결정입니다. 이제 문은 지도와 가격만으로 설득해야 합니다.

팔택 계산은 왜 코드에 남겼나

“모델에게 다 맡긴다면서, 생년으로 좋은 방향을 보는 팔택 계산은 왜 코드가 하느냐”는 질문이 당연히 나왔습니다. 그래서 직접 시험했습니다.

  • 열 사람의 본명궁과 좋은 방향 넷을 모델에게 직접 풀게 했더니, 입춘 경계에 걸린 생일과 1900년생까지 포함해 10명 중 10명을 맞혔습니다. 거친 층위는 아주 잘합니다.
  • 그런데 여덟 방향 하나하나의 구성을 세 사람에 대해 같은 질문으로 세 번 물었더니, 24칸 중 20칸, 9칸, 15칸(83%, 38%, 63%)을 맞혔고 세 번의 답이 서로 달랐습니다.

문제는 그 고운 층위가 곧 저희가 파는 문장이라는 점입니다. “동쪽으로 머리를 두면 몸이 편해진다”와 “기운이 살아난다”는 서로 다른 방향의 뜻에서 나옵니다. 그래서 선을 이렇게 그었습니다. 파이프라인과 모델의 경계가 아니라, 정답이 있는 것과 좋은 답이 있는 것의 경계입니다. 본명궁은 전통 안에 정답이 있고, 틀려도 읽는 사람이 알아챌 방법이 없습니다. 그러니 계산은 코드가 합니다. 그 뜻을 얼마나 무게 있게, 말할지 말지는 모델이 정합니다. 프롬프트도 “옛 방식은 하나가 아니다”라고 밝히고, 다른 방식을 써도 된다고 말합니다.

정답이 있는 쪽은 끝까지 정확해야 하니 입춘 시각도 직접 계산하도록 고쳤습니다. 원래는 2월 3~5일생을 통째로 “판정 불가, 전년”으로 처리했는데, 입춘이 2월 4일이었던 해의 2월 5일생은 분명히 그해 사람이라 띠도 방향도 틀리고 있었습니다. 이제 태양의 겉보기 황경이 315도가 되는 시각을 그 시절 한국 표준시로 계산하고(공식 발표값과 10분 안에서 일치), 입춘 시각 앞뒤 20분 안에 걸린 생일만 판정을 미룹니다. 그럴 때는 두 갈래를 나란히 모델에게 주어 물러서서 말할 수 있게 합니다.

규칙을 쌓을수록 글이 나빠졌다

카드 릴로 옮긴 뒤 9월 15일부터 23일까지, 어색한 문장이 보일 때마다 시스템 프롬프트에 금지 규칙을 하나씩 보탰습니다. 결과는 나빴습니다. 프롬프트는 9KB로 불었고 금지 규칙은 열여섯 줄이 됐습니다. 한 문장을 고치면 다음 생성에서 다른 기괴한 문장이 쏟아졌습니다.

돌아보면 원인은 넷이었고, 전부 저희 쪽에 있었습니다.

  1. 형식 — 글을 JSON 문자열 칸에 글자 수 제한을 달아 쓰게 했습니다.
  2. 규칙 더미 — 지적마다 금지 규칙을 하나씩 늘렸습니다.
  3. 전면 금지 — 풍수 용어를 통째로 막자 모델이 에두른 말을 지어냈습니다.
  4. 재료의 이상한 한국어 — 모델에게 주는 재료를 저희가 이상하게 썼습니다.

넷째가 가장 뼈아팠습니다. 재료에 “240도(여덟 방향 중 5방향쯤)“라고 적었더니 글에 “그 감싸는 폭이 자그마치 다섯 방향 몫”이 나왔습니다. “좌청룡 측 능선 피복 비율: 0.6”처럼 한국어 낱말로 쓴 영어 명세서를 줬더니 “가림은 열에 여섯” 같은 말투가 그대로 옮겨졌습니다. 모델은 재료의 말투를 따라 했을 뿐입니다.

문자열 치환기라는 실수

어려운 말을 쉬운 말로 바꾸는 치환기도 만들었다가 지웠습니다. 한국어는 낱말 사이 경계가 분명하지 않아서 부분 문자열을 바꾸면 멀쩡한 낱말이 부서지고, 받침이 바뀌면서 조사가 틀립니다. “해 지기 전에”의 “지기”를 바꿔 “해 땅의 기운 전에”가 됐고, “배수구를”의 “수구”를 바꿔 “배물이 빠져나가는 목를”이 됐습니다. 일상 문장 14개로 시험해 보니 12개가 망가졌습니다. 지금은 어려운 말을 찾기만 하고, 고치는 일은 문장째 다시 쓰는 모델에게 맡깁니다. 그리고 찾는 목록에 무언가를 더하기 전에, 일상 문장 모음을 먼저 통과시키도록 시험을 둡니다.

9월 23일: 재료를 자료로

먼저 재료부터 고쳤습니다. 측정값에서 JSON을 직접 만들고, 방향이 있는 것은 절대 방위와 집 기준 방향과 산 이름을 한데 묶었습니다. 경복궁이라면 동쪽은 낙산, 서쪽은 인왕산입니다. 예전에는 “좌청룡 측”이 동쪽의 낙산이라는 사실을 아무도 묶어 주지 않아서, 모델이 인왕산을 왼쪽으로 찍고 “서쪽 창문” 이야기까지 지어냈습니다.

같은 무렵 왼쪽·오른쪽 문제도 정리했습니다. 풍수 관례의 왼쪽(동)과 화면 지도의 왼쪽이 거꾸로라서, 집 밖의 것은 동서남북으로만 말하게 했습니다. 재료 어디에도 왼쪽·오른쪽이 없게 했더니 리딩에서도 사라졌습니다.

9월 27일: 자유로운 글쓴이, 정면충돌만 고치는 검토자

그래도 남은 질문이 있었습니다. 요즘 언어 모델과 한국어로 대화하면 기괴한 문장이 거의 없는데, 왜 이 서비스의 글은 고쳐도 고쳐도 부자연스러울까. 답은 틀이었습니다. 그래서 구조를 바꿨습니다.

  • 글쓴이는 역할, 말투, 목표, 출력 형식만 담은 짧은 시스템 프롬프트(3.2KB 미만)를 받고, 마크다운으로 자유롭게 씁니다. 카드는 제목 줄로 나뉠 뿐이고, 파서는 글자를 건드리지 않습니다.
  • 검토자는 자료와 정면으로 어긋나는 문장만 “원문 → 고친 문장” 형태로 고칩니다. 애매하면 통과시킵니다. 검토가 실패하면 글쓴이의 원고를 그대로 냅니다.
  • JSON 칸과 글자 수 제한, 중간의 편집 단계를 걷어 냈습니다. 모델 호출은 보통 세 번에서 두 번으로 줄었습니다.

같은 날 한 가지를 보완했습니다. 검토자가 “왼팔 하나가 살짝 짧아” 같은 문장을 비유라며 통과시켰습니다. 검토자가 무능해서가 아니라 “비유는 고치지 않는다, 애매하면 통과”라는 지시를 따랐기 때문입니다. 그래서 코드가 확실히 찾을 수 있는 것, 즉 풍수 용어와 몸에 빗댄 좌우 표현은 코드가 문장째 찾아서 “반드시 고칠 문장”으로 검토자에게 넘깁니다. 확실한 것은 코드가 찾고, 판단이 필요한 것은 모델이 고칩니다.

목적마다 박혀 있던 질문도 걷어 냈습니다. 이사 리딩에는 “잠이 깊어지는 방” 같은 질문이 고정돼 있어서, 첫 카드가 이용자의 진짜 질문 대신 잠 이야기로 시작했습니다. 이제 목적은 “의뢰인은 이 자리로 이사를 고민한다” 같은 첫 문장 하나로만 전달합니다.

9월 29일: 뜻 없는 숫자를 없애다

마지막으로 재료 속의 뜻 없는 숫자를 정리했습니다. “우리 지도와 맞은 것: 4”는 무엇이 맞았는지 알 수 없는 숫자였고, “56%“는 무엇의 56%인지, “5m”가 좁은 건지 넓은 건지 모델이 알 수 없었습니다. 그래서 측정마다 그 값이 무엇의 몇 %, 몇 m인지를 쉬운 말로 붙였고, 지식 베이스의 규칙 23개 모두에 무엇을 보는 규칙인지 설명을 달았습니다. 처방마다 “이 자리에서 해당한 규칙 때문인지, 목적에 맞춘 것인지” 고른 까닭도 함께 줍니다. 옛 기록은 “뒤를 받치는 큰 산 · 북악산 · 북 · 맞음”처럼 주장 하나하나로 풀었습니다. 시험이 지식 베이스 전체를 대조하므로, 앞으로 규칙이나 측정이 새로 생기면 설명 없이는 시험이 실패합니다.

정리: 어색한 문장이 보이면

이 한 달의 교훈을 순서로 적으면 이렇습니다. 어색한 문장이 보이면,

  1. 그 말투가 재료(JSON 값, 라벨)에서 왔는지 먼저 찾는다.
  2. 형식 제약(칸, 글자 수)이 원인인지 본다.
  3. 사실 오류라면 검토자의 몫이다.
  4. 글쓴이 프롬프트에 규칙을 더하는 것은 마지막 수단이다.

그리고 경계는 “코드냐 모델이냐”가 아니라 “정답이 있느냐, 좋은 답이 있느냐”에 긋습니다. 정답이 있는 계산은 코드가 끝까지 책임지고, 좋은 답이 필요한 문장은 모델에게 맡깁니다.

리딩은 kiko.jocoding.io에서 자리를 고르고 고민을 적으면 받아 볼 수 있습니다. 키코의 리딩은 전통 풍수를 현대 지형 데이터로 다시 읽어 보는 문화·오락 콘텐츠이며, 계약이나 투자 같은 실제 결정의 근거로 쓰지 않으시길 부탁드립니다.

← 목록으로 돌아가기