데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      생성형 AI를 다루는 기술에 대하여

      impro 24.09.30
      1,987 4 0
      DEVOTEE 요약
      본 블로그는 생성형 AI와 관련된 여러 기술들, 특히 LLM(Large Language Model)과 프롬프트 엔지니어링에 대해 학습한 내용을 공유합니다. 프롬프트 엔지니어링의 중요성과 랭체인(Langchain)을 통해 AI와 외부 도구를 연결하는 방법을 설명합니다. 저자는 이러한 기술을 활용해 AI와 인간이 서로 보완하며 더 나은 결과를 도출할 수 있다는 점을 강조합니다.
      DEVOTEE 추천 블로그

      시작 하며 (생성형 AI라는 매기의 등장)

      최근 미드저니에 대해 학습하게 되었다. 대학교 동아리로 미술 동호회 활동을 했고, 최근에도 미술 작품을 동호회 전시회에 출품한 적이 있어서 관심이 많은 편이다.

      내가 그렸지만 프롬프트로 그려진 그림들이 신기하다.

      미드저니 생성 그림

      프롬프트: beach, Cuno Amiet --ar 16:9 --s 250 --v 5.2


      미드저니 생성 그림 2

      프롬프트: banner for website, snow, bright color, + pixar, simple, minimal, 3d, illustration --ar 7:1 --s 250 --v 5.2


      딸이 아빠의 작품을 보고 걱정하는 눈치다. 딸은 대학교에서는 동양화를 전공하고 현재 대학원에서 시각디자인을 전공하고 있다.

      “AI가 이런 작품을 만들어 내면 난 도대체 어떤 거를 해야 해?”

      요즘 어느 분야에 있으나 느낄만한 생각이다.

      “AI가 사람을 대체하는 것이 아니라 AI를 활용하는 사람이 그렇지 못한 사람을 대체하는 거야. AI를 활용해서 너의 분야에서 전문성을 더욱 높이는 계기를 만들어야지.”

      누군가가 한 말인데 요즘 마음에 많이 와닿는 말을 꺼냈다.


      매기 효과

      19세기 영국의 역사학자 아놀드 토인비는 강연 등에서 ‘메기 효과’라는 말을 즐겨 사용했다고 한다.


      영국의 수산 시장에서 과거에는 살아 있는 청어를 볼 수 없었다고 한다. 북해 연안에서 잡은 청어를 이송하는 과정에 성미 급한 청어가 죽기 때문이었다.

      그런데 어느 날부터 살아 있는 청어가 보이기 시작했다. 유럽 어부들이 수조에 천적인 메기를 넣어서 청어가 살아남기 위해 몸부림 쳐서 살아있는 채로 운송할 수 있게 되었다는 것이다.

      이 이야기에서 만들어진 용어가 ‘메기 효과’인데 새로운 강적의 출현으로 생태계의 변화가 일어날 때 기존 개체들의 생존력이 더욱 건강해진다는 뜻으로 자주 사용된다.


      최근 ‘생성형 AI’라는 메기가 나타났다. 이 ‘생성형 AI’를 다루는 기술을 배우고 익히지 않으면 이 새로운 생태계에서 도태될 것이고, 이를 잘 다루면 더욱 건강해 질 것이다.

      내친 김에 생성형 AI를 잘 다루는 기술들에 대해 학습한 내용들을 가능한 초보자들도 이해하기 쉽게 정리해 보고자 한다.

      LLM의 원리와 프롬프트 엔지니어링

      그렇다면 생성형 AI라는 메기를 다루는 기술은 어떤 것들이 있을까?

      프롬프트 엔지니어링, 랭체인(Langchain), 라마인덱스(LlamaIndex), 파인튜닝 등 새로운 용어와 기술들이 계속해서 등장하고 있다.


      일단 LLM의 원리를 이해하고 이를 잘 다루는 기술들을 살펴보자.

      LLM의 원리와 프롬프트에 대한 이해

      LLM(Large Language Model)의 원리는 한마디로 말하면 Next token prediction이다. 쉽게 설명하면 다음 단어를 잘 예측하도록 학습되어진 모델이다.

      'token': 컴퓨터가 이해하는 단어라고 생각하면 된다. chatGPT는 사람에게는 1개의 단어로 보이지만 컴퓨터는 3개의 단어(chat, G, PT)로 인식한다.

      토큰 수 계산기 가기

      The sky is

      보통은 위 문장이 나오면 아래와 같은 단어를 생각한다.

      The sky is blue

      그런데 The students opened their …. 라는 문장이 나오면 약간 복잡해 진다.

      LLM의 원리

      the students opened their 다음에 오는 단에 대해 확률적으로 높은 가능성을 가진 단어 중에 선택하는 형태가 될 것이다.

      이런 상황에서 다음 단어를 잘 맞춘다는 것은

      1. 문법을 이해하고,

      2. 세상의 다양한 분야에 대해 이해를 하고 있으며.

      3. 상황(Context)에 대한 이해를 하고 있어야 한다.


      LLM은 일단 세상의 많은 글들이 사전에 학습 되어 있어서, 1번과 2번 조건은 충족되어 있다고 보아야 할 것 같다.

      3번에 대해서는 사용자가 입력하는 프롬프트로 상황을 파악해서 답변하는 원리이다.


      프롬프트는 chatGPT같은 어플리케이션에서 답변을 잘 할 수 있도록 상황(Context)과 실제 궁금한 내용을 구분하지 않고 질문을 던지는 형태이나,

      LLM을 활용한 어플리케이션을 개발할 때는 이런 상황 설명을 구분해서 처리하게 된다.

      즉, LLM과의 연결 시 사용되는 파라미터 중 메시지와 관련해서는 role과 content로 구성되는데 사용자가 입력하는 프롬프트는 system_prompt와 user_prompt로 나누어 처리하게 되어 있다.

      `"messages": [ 
       {"role": "system", "content": system_prompt}, 
       {"role": "user", "content": user_prompt} 
      ]`

      User_prompt는 사용자가 질문을 하거나 지시하는 내용이고, System_prompt는 LLM 입장에서 사전에 인지하고 있어야 할 상황(Context)이다.

      즉, 프롬프트에서 위 3번 조건을 충족하게 되는 것이다.


      더불어, GPT 파라미터 중에 top_k, top_p 등이 있는데, top_k는 확률적으로 높은 top_k개의 단어들을 선정하는 것이고, top_p는 확률적으로 상위 top_p에 해당하는 단어들이 후보로 선택된다.

      즉, top_k=5 & top_p=0.7 이면 확률이 높은 상위 5개의 단어 중에서 누적 확률이 70%에 도달할 때까지의 단어들만 후보로 선택된다.

      프롬프트 엔지니어링을 잘하는 방법

      그렇다면 좋은 프롬프트를 만드는 방법이란 무엇일까? LLM 입장에서 상황 파악이 잘 될 수 있도록 하는 것이 그 원리인데, 크게 3가지 정도로 볼 수있다.

      1. 역할 부여

      • LLM의 작동방식을 너무 장황하게 설명하지 않는 방법으로 역할을 지정하는 것은 매우 중요하다.

      • 예) “넌 지금부터 ㅇㅇ분야에서 아주 뛰어난 전문가야. 다음 묻는 말에 전문가로서 답해줘”

      2. 간결하고 명확하게 지시

      프롬프트 엔지니어링의 기법은 다양하게 있으나 우선 기억해야 할 것은 다음과 같다.

      원하는 내용을 간결하고 명확하게 지시하되 답변 형식, 길이, 예시를 주면 좋다.

      1) 답변 형식

      템플릿(Template)를 주거나 표 형태로 요청하거나, JSON 포맷 등 니즈에 따라서 답변 형식을 요청한다.

      LLM의 답변을 데이터화 처리를 하고자 하는 개발자는 JSON 포맷으로 요청한다.

      2) 답변 길이

      답변 길이는 비용과 연계되니 적절하게 지정해 주는 것이 좋다.

      3) 예시 부여

      LLM은 주어진 예시를 잘 따른다. 1개의 예를 주는 one shot prompting, 여러 개를 주는 few shot prompting, 질문/답변의 예(Q&A set)를 보여주는 방법 등을 사용하자.

      3. 기타 옵션

      1) 언어

      LLM과 우리말로 대화하는 것이 좋을까? 영어로 대화하는 것이 좋을까?

      LLM은 영어로 된 데이터를 더 많이 학습했기 때문에 영어로 물어볼 때 더 답변을 잘한다고 보는 것이 맞을 것 같다.

      다만 사용자가 우리말에 더 익숙하고 성능의 차이가 크지 않기 때문에 우리말로 프롬프트를 해도 무방하다.

      만약 외부 LLM을 활용해서 사업 용으로 계속 쓰는 경우라면 영어로 사용하는 것이 좋겠다.

      미세하나마 성능의 차이가 있고, 토큰 당 과금을 고려하면, 우리 말의 토큰이 영어로 된 토큰 보다 약 2배 정도 크기 되기 때문에 비용 측면에서도 영어로 하는 것이 더 좋을 것 같다.

      2) 문체/어투

      LLM을 활용한 어플리케이션의 성격에 따라 다양한 문체/어투를 예로 보여주면 그에 맞는 문체/어투로 답변해 준다.

      프로그래밍 개발 시에는 보통 system_prompt에 위와 같은 요소들을 고려해서 입력해 놓는다.

      Chain of Thought 기법

      사실 프롬프트 엔지니어링은 앞장에서 언급한 원리와 원칙을 이해하고 사용하면 왠만큼은 LLM 을 다룰 수 있다.

      그러다 보니 프롬프트 엔지니어링 기법들에 대해 많은 프롬프트 엔지니어들이 시행착오와 실험을 거쳐 발견하고 체계화하고 있다.

      이중 구글과 같은 빅테크 기업 엔지니어들도 이러한 연구를 통해 논문으로 작성한 것이 있는데 바로 Chain of Thought 기법이다.

      Chain of Thoughts

      • Source: Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (2022.1.28, Google)

      위 그림처럼 Chain of Thought는 Model이 복잡한 문제를 해결하기 위해,

      문제를 갈라서 생각함으로써 중간 추론단계(intermediate reasoning step)를 거쳐 최종적인 답을 구할 수 있도록 도와준다.

      사람도 복잡한 문제 풀이를 할 때 갈라서 생각하며 정리하니 이는 어쩌면 당연한 원리일 것이다.


      또한 LLM을 실제 사업적으로 활용하려면 할루시네이션을 예방하는 것이 중요한 주제이며 간략히 소개하면 아래와 같은 방법들이 있다.

      할루시네이션을 예방하는 방법

      LLM이 학습한 데이터는 방대한 인터넷 데이터를 포함하는데,

      사실 학습데이터가 충분하지 않거나 일부 검증되지 않은 데이터로 학습되어 있기 때문에 할루시네이션을 100프로 없애기는 쉽지 않다.

      이를 최대한 예방하기 위해서 할루시네이션이 적은 LLM을 선택하는 것이 중요하고 RAG(Retrieval Augmented Generation), 파인 튜닝 등

      기술적인 방법을 사용하거나 프롬프트 상에서는 다음과 같은 방법들도 사용한다.

      • “이거 아주 중요한 거야” 프롬프트 사용

      • “거짓말 없이 답해줘” 프롬프트 사용

      • “진짜야?”라고 되묻기

      • 오직 검증된 출처에서 가져온 정보만을 사용하라고 지시

      • 답변 범위에 대해 제약을 주기 등

      프롬프트 엔지니어링과 랭체인

      LLM을 잘 다루기 위해서 프롬프트 엔지니어링의 중요성은 두말할 필요가 없다.

      그런데 LLM을 활용한 어플리케이션을 만들다 보면 프롬프트 엔지니어링만으로 한계가 있다 보니 프로그래밍적으로 뒷바침 하기 위한 지원 툴들이 생겨 났다.

      랭체인(Langchain), 라마인덱스(LlamaIndex), 시멘틱커널(Symantic Kernel) 등이 있다.

      여기에서는 가장 많이 사용되고 있는 랭체인을 중심으로 설명하도록 하겠다.


      랭체인(LangChain)의 로고는 앵무새로 되어 있는데 이는 LLM의 특징을 잘 표현한 것 같다.

      앵무새가 사람과 대화하는 듯한 영상을 많이 볼 수 있는데 앵무새는 사실 사람의 말을 이해 하고 말하는 것이라기 보다는 소리를 기억하고 잘 따라하는 것이다.

      LangChain

      LLM은 사람의 언어를 학습한 언어 모델로서 마치 앵무새처럼 사람의 언어를 잘 흉내내지만 사실 이해 한다고 보기는 어려운 점이 있다.

      따라서 LLM을 기반으로 보다 지능적인 애플리케이션을 구축하기 위해서는 당연하게도 단순 언어 모델 개발 이상의 작업이 요구된다.


      즉, 언어 모델과 여러 기능 간의 연결이 필요한데 랭체인(LangChain)은 언어 모델(Language model)과

      외부 도구를 마치 사슬(Chain)처럼 엮어 결합시켜 이러한 통합을 간소화하도록 설계된 애플리케이션 개발 프레임워크다.


      랭체인을 활용하여 '생각을 갈라서 처리하기'(Chain of Thought와 유사), '검색, 연산 등을 활용해서 문제 해결하기'(ReAct 기법),

      '내가 가진 문서 기반으로 답변하기'(Embedding과 RAG), '기억을 기반으로 답변하기'(Chat Memory) 등이 있는데, 이라한 기법들을 간략히 살펴보자.

      랭체인으로 사람의 사고 흉내내기

      LLM은 사람의 언어를 잘 흉내내는 언어 모델이고 LLM을 원동력으로 하는 애플리케이션을 구축하기 위해서는 당연하게도 단순 언어 모델 개발 이상의 작업이 요구된다.

      즉, 언어 모델과 여러 기능 간의 연결이 필요한데 랭체인(LangChain)은 언어 모델(Language model)과

      외부 도구를 마치 사슬(Chain)처럼 엮어 결합시켜 이러한 통합을 간소화하도록 설계된 애플리케이션 개발 프레임워크다.


      먼저 사람이 어떤 문제를 풀 때 사고하고 추론하는 경우를 생각해 보자.

      • 사람은 과거의 경험과 기억을 더듬어 보기도 하고

      • 이미 별도로 정리되어 있는 자료를 참고해서 답변하기도 하고

      • 복잡한 논리가 필요한 부분에 대해서는 갈라서 단계적으로 처리하거나

      • 스스로의 힘으로 풀기 어려운 문제가 있으며 구글 검색, 계산기 등 도구를 사용해서 문제를 해결한다.

      이처럼 사람의 사고를 제대로 흉내내기 위해서는 여러 도구와 기법들이 총 망라되어 처리해 주어야 한다. 랭체인은 이러한 일을 도와주는 여러 개발 프레임워크 중 하나다.

      LLM 서비스 개념

      생각을 갈라서 처리하기

      랭체인을 활용해서 복잡한 문제를 갈라서 처리하면 문제를 해결하는데 도움이 될 수 있다.

      마치 Chain of Thoughts 프롬프트 기법처럼 언어 모델은 복잡한 사고가 요구하는 질문에 대하여 도출 과정을 풀어서 처리해야 좋은 성능을 발휘한다.


      복잡한 문제를 프로그래밍적으로 분리해서 처리하는 것을 도와주고 이를 크게 보면 두가지로 나눌 수 있다.

      하나는 분리된 생각들이 순서를 가지고 서로 연결되어 있는 것이고, 다른 하나는 경우의 수를 가지고 갈라서 처리하는 것이다.

      1. 생각을 연결해서 처리하기(SequentailChain)

      Sequential Chain

      위와 같이 단계적으로 진행해야 하는 건에 대해서는 랭체인 모듈 중 SequentialChain 함수를 사용하여

      전단계의 출력 값을 다음 단계의 입력 값으로 연결을 효율적으로 할 수 있도록 도와준다.

       def generate_novel(req: UserRequest) -> Dict[str, str]:
          writer_llm = ChatOpenAI(temperature=0.1, max_tokens=300, model="gpt-3.5-turbo")
      
          # 아이디어 뽑기 체인 생성
          novel_idea_chain = create_chain(writer_llm, STEP1_PROMPT_TEMPLATE, "novel_idea")
      
          # 아웃라인 작성 체인 생성
          novel_outline_chain = create_chain(
              writer_llm, STEP2_PROMPT_TEMPLATE, "novel_outline"
          )
      
          # 플롯 작성 체인 생성
          novel_plot_chain = create_chain(writer_llm, STEP3_PROMPT_TEMPLATE, "novel_plot")
      
          # 챕터 작성 체인 생성
          novel_chapter_chain = create_chain(writer_llm, WRITE_PROMPT_TEMPLATE, "output")
      
          preprocess_chain = SequentialChain(
              chains=[
                  novel_idea_chain,
                  novel_outline_chain,
                  novel_plot_chain,
              ],
              input_variables=["genre", "characters", "news_text"],
              output_variables=["novel_idea", "novel_outline", "novel_plot"],
              verbose=True,
          )

      생성형 AI를 활용한 그림, 음악, 영화 등 창작 분야에서의 AI 적용이 매일 같이 뉴스에 오르고 있고, 최근에는 스토리 창작 분야에서도 사용자들이 늘어나며 많은 관심을 끌고 있다.

      AI를 활용한 스토리 창작을 구현하기 위해서는 스토리 라인의 연결을 효율적으로 할 수 있는 부분이 필요한데

      위와 같이 랭체인의 Sequential Chain을 사용하여 유사한 서비스를 구현해 볼 수 있겠다.

      2. 경우의 수를 구분해서 처리하기(Routing)

      사용자의 질문 의도에 따라서 각각 다른 방식으로 답변할 수 있도록 한다.

      사용자의 의도에 따라 각기 다른 형태의 LLM을 사용하거나 프롬프트를 바꾸거나 외부 Tool을 사용해서 답변을 하는 방식이다.


      사용자의 의도를 파악할 때는 LLM을 사용하는 예가 많은데 '의도' 파악은 잘 되는편이나 그만큼의 delay가 발생한다.

      따라서 답변 시간을 빠르게 유지하기 위해서는 '키워드'를 catch해서 의도 파악을 하는 방식을 병행하는 것이 필요할 것 같다.

      Routing

      내가 가진 자료를 참고해서 답변하기 (RAG와 Embedding)

      에이전트를 구현할 때 LLM에게만 의존하는 것이 아니라 내가 가진 데이터를 기반으로 답변하게 하고 싶을 때 RAG(Retrieval Augmented Generation)을 구현한다.

      사용자가 프롬프트를 입력하면 그 질문 내용과 가장 관련성이 높은 내용을 내가 가진 지식저장소(Vector database)에서 찾아서

      해당 내용을 프롬프트에 추가하여 LLM에게 물어 보는 방식으로 구현하는 것이다.

      RAG 구조

      이를 위해서 벡터 DB (vector database)를 사용한다.

      벡터 DB는 단어나 문장의 유사도를 계산해서 그 유사도가 높은 순으로 검색 결과를 찾아주는데 효과적 효율적 DB이다.

      단어나 문장을 약 1500차원(ChatGPT 기준)의 vector로 변환하는 과정을 임베딩(embedding)이라고 한다.

      임베딩 결과물을 벡터 DB에 저장하고 RAG할 때 마다 불러서 사용한다.

      도구를 사용해서 추론하기, ReAct 기법 (Reasoning + Acting)

      인간이 추론할 때 자신의 지식 뿐만 아니라 외부의 정보를 참고하여 사고하는 것과 유사한 방식으로 “행동”(검색, 연산)과 “추론”의 상호작용을 통해서 답을 찾아가는 기법을 ReAct 기법이라고 한다.

      랭체인에서는 plan_and_execute라는 모듈 형태로 구현 되어 있으며, 사용자의 질문 내용을 가지고 검색, 연산 등 답을 얻는데 필요한 함수에 대한 계획을 세우고 실행하는 형태로 구성되어 있다.

      이렇게 함으로써 현재의 LLM이 감당하지 못하는 부분에 대해서 외부 함수를 사용할 수 있게 지원한다.


      이상 부족하나마 생성형 AI를 다루는 기술 동향에 대해 공부한 내용들에 개인적인 경험과 생각을 넣어서 간략히 정리해 보았습니다.

      혹시 내용상 이견이 있으시거나 정정 사항이 있으시면 의견 부탁드려요.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      impro 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기