자연어에서 JSON 기반 키워드 구조 추출하기

kiwi_jelly·2025년 11월 26일

졸프

목록 보기
1/4

졸업 프로젝트 과정에서 가장 어려웠던 부분 중 하나는
제각각 쓰여 있는 포트폴리오 텍스트를 ‘구조화된 데이터’로 바꾸는 것이었다.

포트폴리오는 완전한 자연어였기에, 이런 자유형 텍스트를 그대로 벡터 임베딩하면 잡음이 많아지고,
정확한 매칭 결과를 만들기 어려웠다.

그래서 우리는 LLM 기반 JSON 구조화 파이프라인을 만들어
포트폴리오를 하나의 통일된 데이터 포맷으로 변환했다.

1. 왜 JSON 구조가 필요했나?

포트폴리오 텍스트는 다음과 같은 문제가 있다.

  1. 서술 방식이 제각각이라 기계적으로 파싱 불가

  2. 키워드가 숨어 있거나 문장 속에 묻혀 있음

  3. 역할(Role), 도메인(Domain), 기술(Skill), 문제 해결 경험(Action) 등이 뒤섞여 있음

우리가 원하는 건 이거였다:

✔ 어떤 프로젝트인지
✔ 어떤 문제를 해결했는지
✔ 어떤 기술을 사용했는지
✔ 어떤 역할을 맡았는지
✔ 어떤 성과를 냈는지

이러한 내용을 구조화된 DB에 저장하고, 추후 매칭에 사용하고 싶었다.
따라서 사용자가 본인의 포트폴리오를 STAR 기법에 맞게 작성하게 하고,
LLM을 사용하여 해당 포트폴리오를 JSON으로 변환하는 방식을 채택했다.

2. 우리가 사용한 JSON 스키마

아래는 실제 프로젝트에서 사용한 JSON 포맷이다.

{
  "S": {
    "domain": [],
    "problem_type": []
  },
  "T": {
    "goal": [],
    "role": []
  },
  "A": {
    "hard_skills": [],
    "responsibility": [],
    "deliverables": [],
    "problem_solving": []
  },
  "R": {
    "impact": [],
    "growth": []
  }
}

3. Prompt 설계: 구조화의 핵심

가장 중요한 건 Prompt를 어떻게 짜느냐였다.

다음과 같은 원칙을 사용했다:

✔ 1) 포맷 강제

LLM에게 “꼭 이 JSON 그대로 반환해라”라고 강하게 명시.

✔ 2) S/T/A/R 항목 설명 포함

각 항목이 의미하는 바를 LLM이 정확히 이해하도록 설명을 달았다.

✔ 3) 예시 제공 (Few-shot)

예시를 주면 추출 정확도가 30~50% 증가한다.

✔ 4) 원문 문장 지칭 금지

문장을 그대로 복사해 넣지 말고 “의미 기반 요약”을 요구.

4. 실제 Prompt 예시

당신은 포트폴리오 텍스트를 구조화하는 분석 도구입니다.
아래의 S/T/A/R JSON 포맷에 맞춰 정확하게 구조화하세요.
형식은 반드시 JSON만 출력하세요.

<S/T/A/R 정의 생략…>

<사용자 입력 텍스트>
{{portfolio_text}}

5. 결과물 예시

입력: (실제 포트폴리오는 훨씬 길고, star에 맞게 작성됨)

"저는 Node.js 기반 API 서버 개발을 담당했으며, 로그인 기능과 DB 스키마 설계를 맡았습니다. 캐싱을 도입해 응답속도를 개선했습니다.”

출력(JSON):

{
"S": {
"domain": ["SW_DEV"],
"problem_type": ["성능 저하"]
},
"T": {
"goal": ["성능 개선"],
"role": ["Backend"]
},
"A": {
"hard_skills": ["Node.js"],
"responsibility": ["API 서버 설계 및 구현", "로그인/회원가입 기능 개발"],
"deliverables": ["DB 스키마 설계"],
"problem_solving": ["캐싱 도입으로 서버 부하 감소"]
},
"R": {
"impact": ["평균 응답속도 40% 개선"],
"growth": ["데이터 기반 성능 개선의 중요성 이해"]
}
}

6. 기술적 난관 & 해결 방법

  • 임베딩 기반 유사도 매칭 적용
    • 현재는 대부분이 자연어이기에, 단순히 “완전일치”로는 제대로 된 매칭이 이루어지지 않음. 따라서 임베딩 기술을 적용해보려 함
  • 매칭 알고리즘 수정
  • 프롬프트의 질문과, 포트폴리오의 내용이 너무 다름
    • 질문 작성자의 T.goal : “팀워크가 잘 되는 사람을 찾기”
    • 포트폴리오 작성자의 T.goal : “검색의 정확도를 개선하기”
    • 이런 식으로 너무 다름
    • 현재로는 질문 작성자가 원하는 가상의 이상적인 후보의 포트폴리오 키워드를 제공하고, 해당 키워드를 가상의 포트폴리오 키워드와 db 에 있는 포트폴리오 키워드를 비교
    • 해당 방식도 문제가 많아, json 스키마를 바꾸거나 fine-tuning을 적용하는 등 새로운 해결 방식을 강구 중에 있음

7. 이 구조화를 어디에 쓰는가?

JSON 구조화된 데이터는 다음 단계로 이어진다.

✔ Embedding 생성

→ JSON의 각 키워드들을 벡터로 변환

✔ Similarity 기반 매칭

→ 사용자 프롬프트 vs DB 포트폴리오 매칭

✔ 추천 정확도 증가

구조화된 데이터는
임베딩 모델이 의미를 훨씬 잘 파악하게 해준다.

8. 마무리

이 시스템 덕분에
포트폴리오 데이터가 깔끔하게 통일된 JSON 형태로 정리되었고,
Embedding 기반 매칭 로직도 안정적으로 동작할 수 있었다.

LLM은 “자료를 예쁘게 써주는 도구”가 아니라
“자연어를 인식"할 때 가장 큰 힘을 발휘하는 것 같았다.

profile
In lapidem

0개의 댓글