Notice
Recent Posts
Recent Comments
반응형
관리 메뉴

HM소프트

LLM 오케스트레이터로 이력서 피드백·초안 생성 — 채용 플랫폼 (4) 본문

외주 개발일지

LLM 오케스트레이터로 이력서 피드백·초안 생성 — 채용 플랫폼 (4)

HM소프트 2026. 6. 12. 01:20
반응형

느리고 불안정한 LLM 호출을 별도 마이크로서비스로 격리해 핵심 기능을 보호하고, 키·시크릿 이중 인증으로 잠근 설계를 다룬다. 전역 설정 프롬프트로 LLM을 결정론적 함수로 다루고 temperature 0과 JSON 스키마로 출력을 강제하며, 이력서 피드백·초안 생성·커뮤니티 질문에서 환각을 프롬프트로 막은 채용 플랫폼 기록이다.

 

4편: AI 오케스트레이터

시리즈 마지막이다. 1편 인증, 2편 이력서 백엔드, 3편 프론트엔드에 이어, 이번엔 플랫폼에 지능을 더한 LLM 오케스트레이터 서비스다. 이력서 피드백, 초안 생성, 커뮤니티 질문 생성 같은 AI 기능을 담당한다.

왜 별도 서비스로 분리했나

AI 기능을 메인 백엔드(2편)에 욱여넣지 않고, 독립된 마이크로서비스로 뺐다. 이유가 명확했다.

  • 책임 분리: 인증·이력서 CRUD(메인 API)와 LLM 호출은 성격이 완전히 다르다. LLM 호출은 느리고(수 초), 실패가 잦고, 비용이 든다.
  • 독립적 확장/배포: AI 서비스만 따로 스케일하거나 재배포할 수 있다.
  • 장애 격리: LLM 제공자가 느리거나 죽어도 플랫폼의 핵심(로그인·이력서 조회)은 멀쩡해야 한다.

그래서 NestJS로 별도 서비스를 만들고, OpenAI GPT-4 mini를 연동했다. 이름 그대로 "오케스트레이터" — LLM 호출을 조율하는 계층이다.

@Injectable()
export class LlmService {
  async complete(prompt: string, opts?: CompletionOpts): Promise<string> {
    const res = await this.openai.chat.completions.create({
      model: 'gpt-4o-mini',
      messages: [{ role: 'system', content: opts?.system ?? '' },
                 { role: 'user', content: prompt }],
      temperature: opts?.temperature ?? 0.4,
    });
    return res.choices[0].message.content ?? '';
  }
}

기능 1: 이력서 피드백

구직자가 쓴 이력서(2편의 데이터)를 받아, LLM이 개선점을 짚어준다. 핵심은 프롬프트 설계였다. 그냥 "이력서 봐줘"가 아니라, 무엇을(구체성·성과 중심·가독성) 어떤 형식으로 피드백할지 시스템 프롬프트로 고정했다.

피드백 기능을 개선하며, 출력이 일관되게 나오도록(들쭉날쭉한 자유 서술이 아니라 구조화된 피드백) 프롬프트와 후처리를 다듬었다.

기능 2: 초안(draft) 생성

빈 화면 앞에서 막막한 구직자를 위해, 입력한 정보를 바탕으로 자기소개서/경력기술서 초안을 생성한다. 사용자는 백지가 아니라 초안에서 시작해 고친다.

초안 생성에서 신경 쓴 것:

  • 입력을 구조화: 사용자의 경력·강점 데이터를 프롬프트에 잘 녹여, 일반론이 아니라 그 사람 맞춤 초안이 나오게.
  • 품질 개선 반복: 초기 초안이 너무 뻔하거나 길어서, 프롬프트를 다듬어 실제로 쓸 만한 초안 품질로 끌어올렸다.

기능 3: 커뮤니티 질문 생성

플랫폼 커뮤니티에 활기를 주기 위해, LLM으로 토론거리가 될 질문을 생성하는 기능도 넣었다. AI를 "사용자 보조"뿐 아니라 "콘텐츠 시드"로도 쓴 사례다.

LLM 서비스에서 배운 것

LLM 기능은 일반 CRUD와 다른 결의 어려움이 있었다.

  • 비결정성: 같은 입력에도 출력이 달라진다. temperature를 낮추고, 출력 형식을 프롬프트로 강하게 제약했다.
  • 느림·실패: 수 초가 걸리고 가끔 실패한다. 그래서 별도 서비스로 격리하고(메인 플랫폼에 영향 안 주게), 프론트는 비동기로 결과를 기다리도록(3편의 폴링/로딩 처리와 연결) 설계했다.
  • 프롬프트가 곧 로직: 기능의 품질이 코드보다 프롬프트에 더 좌우됐다. "초안 개선", "피드백 개선" 커밋의 상당수가 사실은 프롬프트 튜닝이었다.

정리하며

  • AI는 별도 마이크로서비스로 — 느리고 불안정한 LLM 호출을 핵심 플랫폼에서 격리.
  • 프롬프트 설계가 기능 품질을 좌우 — 출력 형식을 강하게 제약, 반복 튜닝.
  • AI의 쓰임은 다양 — 사용자 보조(피드백·초안) + 콘텐츠 시드(커뮤니티 질문).

시리즈를 마치며

네 편에 걸쳐 채용 플랫폼을 정리했다.

  • 1편: 인증(기본 + SNS) — 모든 기능의 신뢰 기반
  • 2편: 이력서 도메인 엔티티와 파일 업로드
  • 3편: Next.js 15 + React 19 프론트엔드와 지도 UI
  • 4편: LLM 오케스트레이터로 더한 지능

프론트·백엔드·AI를 각자의 책임으로 분리하고, 그 경계(인증 토큰, API 스키마, AI 서비스)를 명확히 한 게 이 플랫폼의 뼈대였다. 특히 AI를 별도 서비스로 격리한 결정이, 느리고 불안정한 LLM을 플랫폼에 안전하게 들이는 핵심이었다.

반응형