ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스킬은 키워드가 아니라 '의미'로 불려 온다 — 의미 기반 매칭의 양날
    IT 2026. 7. 28. 23:00
    스킬은 키워드가 아니라 '의미'로 불려 온다 — 의미 기반 매칭의 양날

    로컬 AI 서버를 한 달쯤 굴리다 보니, 에이전트에게 시킬 만한 반복 작업이 수십 개로 늘었다. 사진 정리, 캘린더 동기화, 블로그 초안 작성, 문서 분석… 이런 작업 절차를 하나씩 묶어 둔 것을 스킬(skill)이라 부른다. 스킬은 "이 작업은 이런 순서로, 이런 도구를 써서 처리하라"는 절차서다. 사람이 매번 같은 설명을 반복하지 않도록, 한 번 정리해 두고 에이전트가 알아서 꺼내 쓰게 만든 것이다.

    그런데 스킬을 여러 개 만들고 나서 한 가지가 궁금해졌다. 나는 어떤 스킬도 이름으로 부른 적이 없는데, 어떻게 매번 맞는 스킬이 불려 올까? "지난주 사진 좀 정리해줘"라고만 했는데 사진 정리 스킬이 정확히 깨어났다. 명령어를 외운 적도, 스킬 이름을 댄 적도 없는데 말이다. 이 글은 그 동작의 원리와, 그 원리가 가진 양날 — 편한 만큼 자주 사고를 내는 면 — 에 대한 기록이다.

    배경 — 스킬은 '키워드'가 아니라 '의미'로 깨어난다

    가장 먼저 깨야 할 직관은 이것이다. 스킬은 정해진 명령어나 키워드로 트리거되지 않는다. 대신 각 스킬이 자기 설명문(description, "이 스킬이 무엇을 하는지" 한두 문단으로 적은 글)을 가지고 있고, 사용자의 요청과 그 설명문이 의미적으로 얼마나 가까운가로 선택된다.

    "의미적으로 가깝다"는 건 글자가 겹친다는 뜻이 아니다. 문장을 숫자 벡터(여러 개의 좌표 값으로 이뤄진 점)로 바꾸는 임베딩(embedding)이라는 기술이 있다. 비슷한 뜻의 문장은 이 좌표 공간에서 가까운 점이 되고, 동떨어진 뜻의 문장은 먼 점이 된다 — 지도 위에서 가까운 두 도시가 실제로도 가까운 것과 비슷한 발상이다. "사진 정리해줘"와 "앨범 좀 손봐줘"는 글자가 거의 안 겹치지만, 의미 공간에서는 바로 옆에 찍힌다.

    diagram

    다이어그램 설명. 이 그림은 요청 하나가 어떻게 스킬 하나로 연결되는지를 보여준다. 사용자의 자연스러운 요청이 먼저 의미 벡터로 바뀌고, 그 벡터를 등록된 모든 스킬의 설명과 하나씩 비교해 "가장 뜻이 가까운" 스킬을 고른다. 핵심은 사진 정리 스킬의 설명에 "지난주"나 "정리해줘"라는 단어가 한 글자도 없어도 선택된다는 점이다 — 글자가 아니라 뜻으로 매칭하기 때문이다. 흔한 오해는 "요청에 든 단어가 설명에 들어 있어야 걸린다"고 생각하는 것인데, 실제로는 단어가 전혀 겹치지 않아도 의미만 가까우면 걸린다.

    이 방식의 첫 번째 효과는 동의어를 나열할 필요가 없다는 것이다. 키워드 매칭이었다면 설명에 "사진, 이미지, 앨범, 사진첩, 갤러리, 정리, 정돈, 분류…"를 빠짐없이 적어 둬야 사용자가 어떤 단어를 쓰든 걸렸을 것이다. 의미 매칭에서는 "사진 정리"라는 핵심 의미만 또렷하면, 사용자가 "앨범 손봐줘"라고 하든 "갤러리 좀 치워줘"라고 하든 같은 점 근처로 떨어진다. 설명을 짧고 명확하게 쓰는 게 단어를 욱여넣는 것보다 낫다는 뜻이다.

    문제 — 같은 유연함이 '겹침'을 만든다

    여기까지는 좋은 이야기다. 그런데 같은 메커니즘이 정반대 방향으로도 작동한다. 설명문의 의미가 비슷한 두 스킬이 있으면, 하나의 요청에 둘 다 가깝게 걸린다. 나는 이걸 직접 겪었다. 캘린더 노트를 다루는 스킬이 두 개 있었는데 — 하나는 "캘린더 일정을 지식 저장소로 동기화", 다른 하나는 "동기화된 캘린더 노트를 검토·수정" — "캘린더 좀 봐줘"라는 모호한 요청에 두 스킬의 유사도 점수가 거의 같게 나왔다.

    왜 이런 일이 벌어지는지는 의미 공간을 떠올리면 명확하다. 두 스킬 설명이 모두 "캘린더", "노트", "처리"라는 의미 덩어리를 공유하면, 좌표 공간에서 두 점이 바짝 붙는다. 그 사이에 요청이 떨어지면 어느 쪽이 더 가까운지 한 끗 차이라, 의도와 다른 스킬이 깨어날 수 있다.

    diagram

    다이어그램 설명. 이 그림은 겹침이 생기는 순간을 보여준다. 하나의 모호한 요청이 두 스킬 양쪽에 거의 같은 유사도(0.71 대 0.69)로 걸린다. 두 스킬은 "캘린더"라는 공통 주제를 공유하기 때문에 의미 공간에서 서로 가까이 있고, 그 가까움이 곧 점수 차이가 작다는 결과로 나타난다. 여기서 놓치기 쉬운 함정은 "더 높은 점수가 이기니 괜찮다"는 생각이다. 실제로는 0.71과 0.69의 차이는 측정 노이즈 수준이라, 요청 문장이 조금만 달라져도 순위가 뒤집힌다 — 같은 의도의 요청인데 어떤 날은 동기화가, 어떤 날은 검토가 깨어나는 식의 불안정이 생긴다. 참고로 위 점수는 메커니즘을 설명하기 위해 든 예시 수치이지 실측값이 아니다.

    정리하면 의미 매칭은 하나의 성질이 양면으로 드러나는 구조다. 같은 "의미가 가까우면 끌어온다"는 성질이, 자연스러운 요청을 맞는 스킬로 데려오는 장점이자, 비슷한 설명의 스킬을 한 요청에 겹쳐 거는 단점이 된다. 둘은 켜고 끌 수 있는 별개 기능이 아니라 한 동전의 양면이다.

    방법 — 설명에 '무엇을 하지 않는지'를 써서 의미 공간을 벌린다

    겹침을 줄이는 핵심은 두 스킬 설명을 의미 공간에서 멀어지게 하는 것이다. 그러려면 설명에 "무엇을 하는지"만 쓰면 부족하다. 두 스킬이 둘 다 "캘린더를 다룬다"면 그 공통분모만으로는 점이 붙어 있다. 여기에 "무엇을 하지 않는지"와 경계를 더해 써야 두 점이 벌어진다.

    아래는 같은 두 스킬의 설명을, 경계 없이 쓴 버전과 경계를 넣은 버전으로 비교한 것이다. 비교를 위해 두 다이어그램을 따로 두었다.

    diagram

    ▲ 경계 없는 설명

    다이어그램 설명. 두 스킬 설명이 모두 "캘린더 노트를 처리한다"로만 적혀 있다. 핵심 동사와 명사가 같으니 의미 공간에서 두 점이 거의 포개진다. 이 상태에서는 어떤 요청이 와도 두 스킬이 나란히 걸리고, 어느 쪽이 이길지는 운에 가깝다. "둘 다 캘린더를 다루니 이렇게 쓰는 게 정확하다"는 생각이 오히려 겹침을 만드는 원인이다 — 정확함과 구별 가능함은 다른 문제다.

    diagram

    ▲ 경계 있는 설명

    다이어그램 설명. 같은 두 스킬에 "무엇을 하지 않는지"를 한 줄씩 덧붙였다. 한쪽은 "검토·수정은 하지 않음", 다른 쪽은 "새 일정 가져오기는 하지 않음"이라고 명시했다. 이 부정문이 두 설명의 의미 벡터를 서로 반대 방향으로 밀어내, 좌표 공간에서 점이 또렷이 갈라진다. 그 결과 "새로 들어온 일정 가져와줘"는 첫 번째로, "어제 동기화한 노트 고쳐줘"는 두 번째로 안정적으로 떨어진다. 핵심은 부정문이 단순한 사족이 아니라 의미 좌표를 이동시키는 실제 신호라는 점이다.

    왜 이게 통하는지를 한 단계 더 풀면 이렇다. 임베딩은 문장 전체의 뜻을 좌표로 잡는다. "X를 한다, 단 Y는 하지 않는다"는 문장은 "X를 한다"만 적은 문장과 다른 좌표로 간다 — Y라는 의미가 좌표를 끌어당기기 때문이다. 두 스킬이 서로 상대의 영역을 명시적으로 배제하면, 각자의 점이 상대로부터 멀어지는 쪽으로 이동한다. 동의어를 나열해 점을 한 곳에 모으는 것과 정반대로, 경계를 써서 점을 흩어 놓는 작업이다.

    효과와 트레이드오프 — 경계는 '튜닝'해야 한다

    경계를 넣으면 두 가지를 동시에 얻는다. 첫째, 동의어를 나열하지 않고도 자연스러운 요청이 정확히 트리거된다(의미 매칭의 장점은 그대로 유지). 둘째, 비슷한 스킬끼리의 겹침이 관리된다(단점은 완화). 내 캘린더 스킬 두 개도 경계 문장을 넣은 뒤로는 "동기화"와 "검토" 요청이 엇갈려 깨어나는 일이 사라졌다.

    그런데 여기엔 분명한 트레이드오프가 있다. 경계를 너무 좁게 쓰면, 정작 그 스킬이 불려야 할 요청에도 안 불린다. 설명을 "오직 정확히 이 표현일 때만 작동"에 가깝게 좁히면 의미 공간에서 점이 작아져, 조금만 다르게 말한 요청은 사정권 밖으로 떨어진다. 반대로 경계를 너무 넓게 쓰면 다시 옆 스킬과 겹친다. 결국 적당한 폭을 찾는 경계 튜닝이 필요하다.

    diagram

    다이어그램 설명. 이 그림은 경계 튜닝을 하나의 반복 루프로 보여준다. 설명을 쓴 뒤, 비슷한 주제의 다른 스킬이 있으면 "무엇을 하지 않는지"를 덧붙이고, 의도한 요청으로 실제 트리거를 시험한다. 안 걸리면 너무 좁힌 것이니 표현을 넓히고, 엉뚱한 스킬이 걸리면 겹친 것이니 경계를 더 또렷이 한다 — 정확히 걸릴 때까지 이 시험을 반복한다. 여기서 핵심은 경계가 한 번에 정해지는 값이 아니라 시험으로 좁혀 가는 범위라는 점이다. 흔한 실수는 부정문을 한 줄 넣고 끝냈다고 여기는 것인데, 너무 좁혀 정작 필요할 때 안 깨어나는 쪽으로 과하게 민 경우가 의외로 많다.

    마지막으로, 이 모든 게 사람에게 주는 가치를 한 줄로 정리하면 이렇다. 스킬을 키워드 사전처럼 관리할 필요가 없다는 것 — 동의어를 외워 적는 노동에서 벗어나 "이 스킬이 무엇을 하고 무엇을 하지 않는지"라는 본질만 또렷이 적으면, 에이전트가 자연어 요청을 알아서 맞는 절차로 연결해 준다. 대신 비슷한 스킬이 늘어날수록 경계를 의식적으로 벌려 줘야 한다는 새 책임이 생긴다. 편함과 책임이 같은 메커니즘에서 나온다는 것 — 그게 의미 기반 매칭의 양날이다.


    이 글은 생성형 AI의 도움을 받아 작성되었습니다. 원본 자료를 기반으로 AI가 초안을 생성하고, 작성자가 검토·편집하였습니다.

Designed by Tistory.