8 min read

코드잇에서 LLM 어플리케이션을 만든 방법

들어가며

안녕하세요, 코드잇의 프로덕트 팀에서 백엔드 엔지니어로 일하고 있는 Danny입니다. 프로덕트 팀은 코드잇이 공들여 만든 강의를 많은 사람들이 잘 이용할 수 있도록 하는 코드잇 서비스를 만들고 있어요. 저는 그 안에서 Unit-G 소속으로, 개인 사용자들에게 코드잇의 강의를 더욱 잘 전달하기 위한 다양한 시도를 하고 있어요.

LLM(Large Language Model)은 대규모 언어 모델을 의미해요. 이 모델은 아주 많은 양의 텍스트 데이터를 학습해서, 사람처럼 언어를 이해하고 생성할 수 있는 능력을 갖춘 인공지능이에요. 자연어 처리(NLP) 분야에서 많이 쓰이고, 예를 들면 챗봇, 번역, 요약, 글쓰기 같은 곳에서 중요한 역할을 한답니다. 가장 유명한 예시로 OpenAI에서 만든 ChatGPT가 있어요.

LLM을 이용한 어플리케이션 개발은 전통적인 소프트웨어 개발과 본질적으로 다르다고 느껴져요. 전통적인 프로그램은 입력에 대해 항상 동일한 출력을 제공하는 결정론적인 방식으로 동작하는데, LLM과 같은 머신러닝 모델은 같은 입력에도 다양한 출력을 생성할 수 있어서 비결정론적이에요. 그래서 LLM을 활용한 개발은 예상치 못한 결과를 다루는 것이 중요한 과제예요. LLM은 정말 강력한 도구지만, 이를 활용해 안정적이고 신뢰할 수 있는 소프트웨어를 만드는 일은 여전히 많은 도전을 요구해요. 여전히 많은 고민이 현재진행형이지만, 그래도 오늘 LLM을 활용한 어플리케이션을 만드는 이야기를 해보려고 해요.

LLM Assistant를 개발한 이유

프로그래밍 공부를 시작한 친구가 ChatGPT를 이용해서 공부하는 모습을 본 적 있어요. 예전에 제가 공부할 때는 구글 검색을 통해 여러 글을 쭉 읽으면서 중복되는 텍스트를 모으고, 이를 종합해서 개념모델을 세웠어요. 그런데 ChatGPT를 사용하는 친구가 키워드를 기반으로 GPT와의 문답을 통해 개념 모델을 세우는 과정을 보았는데, 정말 놀라웠어요. 궁금한 부분에 대한 간결하고 정확한 응답을 얻을 수 있을 뿐만 아니라, 잘 이해하지 못한 부분을 보충하고, 추가로 궁금한 내용을 계속 물어보면서 개념모델의 영역을 확장하는 모습을 볼 수 있었어요. 소름이 돋기도 했고, 요즘은 공부하기 참 편해졌다는 생각도 들었어요.

범용적으로 만들어진 ChatGPT도 학습에 이토록 큰 도움이 되는데, 프로그래밍 교육을 제공하는 입장에서 이를 활용하면 분명 사람의 학습을 도울 수 있을 거라고 생각했어요. 그래서 강의실에서 사람들에게 도움을 제공하는 AI 어시스턴트를 만들었습니다.

granma.png

네이팜탄을 만드는 법을 알아낸 걸로 유명한 할머니 프롬프트[2]로 사용중인 LLM 모델을 알아내려고 시도하신 유저분이 계셨어요 😄

Guru AI라는 이름

코드잇의 AI 어시스턴트는 ‘Guru’라고 이름 지었어요. ‘Guru’는 산스크리트어로 스승을 의미하는데요. AWS에서 제공하는 Amazon CodeGuru라는 서비스와 이름이 비슷해서 고민했지만, 해당 서비스를 사람들이 많이 이용하지는 않아서(그리고 앞으로도 많이 이용할 것 같지 않아서) Guru로 결정했어요.

환각 최소화

LLM을 교육에 활용할 때 가장 우려되는 부분은 환각(Hallucination)인데요, LLM의 미션은 질문에 대한 정확한 답변을 하는 게 아니기 때문이에요. LLM의 미션은 가장 그럴듯한 자동완성을 제공하는 것이기 때문에, 새로운 개념을 학습하는 사람의 입장에서는 LLM이 제공하는 정보가 사실인지 판단하기가 어려워요. 그리고 LLM을 학습에 활용하는 입장에서, 제공받은 정보의 사실 여부를 계속 구글링하는 것도 비효율적이에요.

환각을 줄이기 위한 방법은 여러 가지가 있지만, 프롬프트에 답변과 관련 있는 지식을 적절한 수준으로 포함하는 것이 중요하다고 해요. [3] 마이크로 소프트의 Bing Chat의 경우에는 사용자의 질문으로부터 웹을 먼저 검색한 뒤 결과로 나온 웹페이지에 기반하여 답변을 생성하는 방식으로 환각 현상을 최소화하고 있어요. [4]

코드잇의 AI 어시스턴트인 Guru는 Codeit의 강의실 페이지에서 강의 내용에 대한 궁금증을 해결하는 어플리케이션이에요. 강의의 맥락과 내용을 프롬프트에 포함하고 답변을 생성하기 때문에, 강의 내용에 관련된 질문에 대해서 환각 현상을 피하고 적절한 답변을 생성할 수 있어요.

private fun createSystemMessages(lesson: Lesson, prompt: String): List<String> {
    val contents = getLessonContents(lesson)

    val lessonContextMessage = """
        The content below is the "${lesson.title}" lesson from Codeit.
        Please refer to the lesson when answering related questions.
    """.trimIndent()

    return mutableListOf(prompt, lessonContextMessage) + contents
}

위와 같이, 레슨에 관련된 텍스트를 이용하여 시스템 메세지를 생성해요.

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "기술블로그를 시작하는 방법을 알려줘"
      }
    ],
    "stream": true
  }'

Guru는 openAI의 chat completions API를 이용하고 있어요. Chat completion API는 위와 같은 형식으로 요청하게 되는데, 이 때 위에서 생성한 시스템 메시지를 추가해서 요청해요.

Untitled (2).png

웹 퍼블리싱 강의에서 메타데이터에 대해서 질문했을때, 강의 맥락에 맞는 답을 주는 것을 알 수 있어요.

프롬프트 평가

사용자들이 AI 어시스턴트를 학습에 잘 활용하고 있는지 알기 위해 지속적으로 답변을 모니터링 하고 있어요. 또한, 사용자로부터 좋아요/싫어요 피드백을 수집하여 답변의 품질과 만족도를 평가할 수 있도록 했어요. 프롬프트는 데이터베이스에서 버전 관리를 하며, 프로덕션 배포 없이도 빠르게 수정할 수 있게 되어 있어요. 만약 답변에 문제가 있는 경우, 프롬프트를 수정하여 같은 문제가 발생하지 않도록 테스트 후 업데이트해요.

Untitled (3).png

위와 같이 데이터베이스에서 프롬프트 수정 내역을 관리하고 있어요.

마치며

시대에 따라서 교육의 방법은 계속해서 발전해 왔고, 지금 시점에서 LLM을 교육에 적절하게 활용하면 더 많은 사람들이 더 좋은 교육을 접할 수 있다고 생각해요. 학습자가 이해가 안 되는 개념이 있을 때, LLM은 이를 위한 설명을 수천, 수만 개도 더 만들 수 있어요. 이 중에는 학습자의 마음에 드는 설명이 있을지도 몰라요. 최소한, LLM은 사람을 얼마든지 기다려 줄 수 있을 거예요.

[1]https://ko.wikipedia.org/wiki/컴퓨터_프로그램

[2] ChatGPT Grandma Exploit https://news.ycombinator.com/item?id=35630801

[3]"A careful and balanced integration of the parametric knowledge within LLMs with external information is crucial to alleviate hallucinations." BHATTACHARYA, Ranjeeta. Strategies to mitigate hallucinations in large language models. Applied Marketing Analytics, 2024, 10.1: 62-67.

[4]”Bing Chat minimizes hallucinations by combining its responses with real-time web searches. This approach allows it to cross-reference information, enhancing accuracy and reducing the chances of generating incorrect data. This method effectively uses AI to fact-check AI, making the responses more reliable” https://www.windowscentral.com/software-apps/bing-chat-now-has-fewer-hallucinations-following-an-update