반응형

먼저 필자는 코딩테스트 블로그를 만들고, 코딩테스트와 관련된 내용을 chatGPT에 질문하고, 코딩테스트 문제를 생성하는 서비스를 만드려고 한다.

사용하는 유저 혹은 문제 마다 다 다른 대화내용일텐데,
chatGPT를 사용하는 것처럼 질의응답 내용을 다 파악하여 답할 수 있을까?

 

결론은 그렇지 않다.

 

해당 내용을 기억하지 못하기 떄문에, 기존 대화 내용을 프롬프트에 담아 제공을 해준다.

이를 통해 chatGPT로 하여금 이전 내용을 숙지하여 의도에 맞는 답을 전달해줄 수 있도록 할 수 있는것이다. (물론 토큰 비용은 더 나가겠지만.. 좋은 서비스를 제공하기 위해서는 감안해야 할 듯 하다.)


따라서 나는 경우를 세가지로 나누게 되었다.

  1. 신규 사용자의 첫 질문
  2. 기존 사용자의 첫 코딩테스트 질문
  3. 기존 사용자의 연속된 코딩테스트 질문

경우마다 다 다르게 나누어 프롬프트를 설정한다.

프롬프트는 다음과 같다.

  1. 해당 언어를 주력 기술로 가지고 있는 사용자
  2. 기존 대화에서 현재 질문한 것과 가장 유사한 질문 및 가장 유사하지 않은 질문을 제시한다.
  3. 캐시 메모리를 이용하여, 가장 최근 두 질의응답을 저장해 이를 반환한다.

그렇다면 해당 행동은 RAG라고 볼 수 있을까?

RAG(Retrieval-Augmented Generation)는 외부의 정보를 검색하거나 불러와서 생성 모델의 입력으로 제공하는 방식으로, 본질적으로 검색(검색 및 불러오기) + 생성 접근 방식을 의미한다.

 

유의미한 결과를 도출하기 위해 정보를 다듬어 다시 제공한다는 점에서 RAG라고 볼 수 있다. 물론 주로 사용되고 있는 기술이 외부의 정보를 한데 모아 정보를 통합하여 질문하는 방식이다. 허나 유창한 기술을 사용하지 않더라도 (원칙에 부합하기도 하고) 사용자 입장에서 더 좋은 결과를 획득할 수 있다면 그것도 올바른 방법이지 않을까 필자는 생각한다. 

 

물론 2번 프롬프트에서 BERT모델을 사용하여 벡터화 한 값을 통해 유사한 질문과 가장 유사하지 않은 질문을 제시하기는 한다.

그렇다면 RAG를 어떻게 사용하게 되는지 확인해 보자.

 

  1. Retrieval (검색 및 불러오기)
    • 사용자가 이전에 했던 질문과 답변, 문제 정보 등을 DB(2번 프롬프트)나 캐시(3번 프롬프트)에서 불러온다.
    • 필요한 경우 중요한 부분만 요약하여 정보를 효율적으로 구성한다.(2번 프롬프트)
  2. Augmentation(정보 강화)
    • 불러온 대화 이력이나 문제와 관련된 정보를 프롬프트에 추가하여, 모델이 이전 대화 맥락을 인식할 수 있게 한다.
    • 요약된 이력, 사용자 성향, 특정 질문 패턴 등이 프롬프트에 포함되므로 사용자 맞춤형 답변을 생성하도록 도와준다.
  3. Generation(응답 생성)
    • 최종적으로 강화된 프롬프트를 모델에 입력하여 답변을 생성한다.
    • 이때, 모델은 전달된 프롬프트에 포함된 정보를 참고하여 맥락에 맞는 답변을 하게된다.

이렇게 발전에 흐름에 전지전능하다고 생각되는 GPT도 다 해주는 건 아니기에, 해당내용을 참고하여 API를 잘 다뤄보기 바란다.

 

 

반응형

+ Recent posts