🏃🏻♂️ (원티드x네이버 클라우드) 2024 프롬프톤
에 참가한 내용과 관련 개발 내용을 포함하고 있습니다.
모든 편의 글의 양이 조금 많습니다. 이해 부탁드립니다.
저는 사내 동료분과 함께 원티드와 네이버 클라우드에서 주최한 2024 프롬프톤에 나가게 되었습니다. 평소 업무에서 다양한 프롬프팅과 RAG를 연구중이었고, 이를 기반으로 'AI 성형 코디네이터' 서비스를 RAG, Prompting을 활용하여 대회에 나가게 되었습니다.
그 과정에서 프롬프트 개발, 튜닝부터 개발된 프롬프트의 A/B 테스트 등 다양한 업무를 수행해야 했습니다. 프롬프트 개발은 일반적인 개발과 유사하게 개발과 오류를 잡아 나가는 것은 물론, 기존과 비교해서 더 성능을 좋게 만들어야 하기 때문에 다양한 실험이 동반됩니다. 그리고 그 과정에서 타 서비스로의 프롬프트를 직접 수정해야 하기 때문에, 개발자와 프롬프트 엔지니어가 분리되어 있다면 여러 귀찮은 소통이 오고 가게 됩니다.
이번에 대회를 하며 저희팀도 비슷한 문제를 겪에 되었는데요, wanted의 LaaS (LLM as a Service)를 활용하여 개발을 하며 이런 문제가 많이 해결됐다고 느꼈습니다. 어떤 점이 저희 팀을 프롬프트 지옥에서 구해주었는지 한번 직접 살펴볼까요?
동영상이 편하신 분들은 이 영상을 보시고 2로 넘어가셔도 좋습니다!
우선 저희가 대회 중 사용하도록 제공 받은 원티드의 LaaS의 첫 인상은 이랬습니다. 우선 저희가 보통 사용하는 chatGPT의 API와 매우 유사한 모형이었습니다. 프롬프트를 써보기 위해, 상단에 있는 프로젝트를 선택해주고 프롬프트를 작성하면 됩니다.
한번 간단하게 경력을 바탕으로 소개글을 작성 해주는 프롬프트를 작성해보겠습니다. HCX-004모델은 네이버에서 개발하여 한국어 능력이 우수한 모델이기 때문에, 한국어로 작성해도 문제없이 동작합니다.
이런식으로 간단하게 작성해보았습니다. 시스템 메시지에는 어떤 작업을 수행하는 프롬프트인지, 입력으로는 어떤 내용이 들어가고 출력에는 어떤 내용이 나와야 하는지를 정의해줍니다.
다음 사용자 입력으로 다음과 같이 ${변수명}
으로 포멧을 미리 정의합니다. 그러면 이를 '변수(변하는 값)'으로 사용할 수 있게 됩니다. 사용자가 오른쪽처럼 직접 값을 입력할 수 있게 되고, 프롬프트에 변수가 들어가며 생성이 됩니다.
자 이제 내용을 채우고 제출하기를 클릭한 후, 생성을 기다리면 다음과 같은 결과가 나오게 됩니다. 그러면 저희가 의도한대로, 영어로된 한줄 소개가 짜잔! 하고 나오게 됩니다. 이런식으로 자동으로 프롬프트 포멧을 채워서 생성할 수 있습니다.
자세한 프롬프트 에디터 사용법은 제 이 영상에서 확인하실 수 있고, 언어모델을 고도화하기 위한 프롬프트 개발은 3편에서 다룰 예정입니다.
자 그러면 이제 생성하기 전 상태로 돌리기 위해, 생성된 assistant 옆에 - 버튼을 누르고 저장을 눌러줍니다.
그럼 그림처럼 프리셋을 등록할 수 있는데, 이건 제가 만든 이 포멧을 프리셋으로 저장해두고 매번 사용하거나 할 수 있는 것 입니다. 자신만의 이름을 적고 저장해볼까요? 그러면 프리셋 설정이 업데이트가 완료됩니다.
이제 배포 버튼이 활성화 된 것을 알 수 있습니다. 배포 버튼을 한번 눌러볼까요?
그럼 손쉽게 저희가 만든 프리셋을 배포할 수 있게 됩니다. 간단하죠? 이 배포를 통해 외부 API를 통한 접속이 가능해집니다. 배포하고 이제 배포 관리 탭으로 들어가볼까요?
그럼 이런식으로 배포된 버전이 쭉 나오게 됩니다. 그럼 배포된 버전이 나오게 됩니다. 설명을 위해 프롬프트를 조금씩 수정해서 배포 버전을 여러개 만들어놓았습니다. 여러분께서도 여러번 배포를 하시면 이렇게 버전에 맞게 프리셋이 배포됩니다.
API에서는 최신 버전을 기준으로 호출이 되는데, 최신 버전이 별로여서 만약 예전 버전으로 돌리고 싶다면?
예전 버전을 클릭하고 최신버전으로 설정
을 클릭하면 버전이 이전으로 돌아가게 됩니다. 매우 쉽죠??
이제 만든 모델을 직접 테스트 해봐야겠죠? 제대로 생성이 되는지 평가를 해봐야 하니까요! 자 이제 테스트탭에 들어가봅시다. 먼저 어떤 데이터로 테스트를 할지 데이터를 입력해주어야 합니다.
테스트 가이드 ⓘ
를 클릭하고 테스트 절차를 확인해봅시다.
엑셀에 양식을 맞추어 업로드 하면 손쉽게 테스트가 가능하다고 합니다. 원래 테스트를 위한 복잡한 코드를 작성해야 했던 것과 비교하면 매우매우 쉬워진 것을 알 수 있습니다.
자 여기에 간단하게 내용을 채워볼까요.
이런식으로 내용을 채울 수 있습니다. 그러면 각 입력 파라미터(변수)에 따라 예상 결과(expected result)와 얼마나 유사한지 평가를 진행해볼 수 있습니다. 해당 데이터를 다시 원티드 LaaS로 돌아가 업로드 해줍니다.
다음은 테스크를 누르고 테스크 추가를 해볼까요?
배포한 버전 중 하나를 선택하고 태스크 이름을 작성합니다. 이제 간단한 한줄소개 만들기 테스그 만들 준비가 끝났습니다. 다음을 눌러볼까요?
저희가 업로드한 데이터가 보입니다. 이것을 클릭하고 다음을 눌러주세요.
놀랍게도 저희가 엑셀에서 작성한 행의 이름과 각 파라미터를 연결 지을 수 있게 됩니다. 정확한 생성을 위해 데이터 파일과 파라미터를 잘 연결시켜 줍니다. 이후 다음을 눌러주세요.
이후 다양한 생성 모델을 선택해서 평가할 수 있습니다. 저희는 일단 gpt-4o를 선택해주고, 평가 방법은 간단하게 유사도 평가를 진행해주겠습니다. 이제 저장을 누르면 테스크가 생성된 것을 확인해볼 수 있습니다.
자 생성된 테스크 옆에 실행을 눌러볼까요?
그리고 테스크 이름을 적고, 다음을 누릅니다. 평가방법 선택에서도 바로 저장을 눌러줍니다.
이후 테스크가 실행되여 평가가 실행됩니다.
레포트 창에서 상태가 완료로 변경되면 테스트 리포트를 확인할 수 있습니다. 저희가 작성한 테스트를 클릭해서 리포트를 확인해볼까요?
이후 간단한 요약 정보와 어떤 버전을 사용했는지 확인해볼 수 있고, LaaS가 직접 결과를 생성하여 예상 결과와 비교를 통해 점수를 계산합니다. 여러 복잡한 코드를 통해 해야했던 실험이 이렇게 간단하게 자동화 된 것을 확인해볼 수 있습니다. 진짜 깔끔합니다.
이제 사용한 양을 한번 확인해볼까요? 대시보드를 클릭해줍니다.
그러면 본인이 얼만큼의 토큰을 사용했고, 몇번의 요청을 수행했는지 프리셋 별로 정리해서 보여줍니다.
히스토리를 클릭해볼까요? 제가 입력한 내용, 테스트에 활용한 기록까지 모두 기록으로 보여주게 됩니다.
하나의 히스토리를 눌러보면 어떤 파라미터를 사용했고, 토큰 사용량은 얼마인지, 생성 결과는 어떤지 보여줍니다. 프롬프트 엔지니어 혼자 LaaS 서비스만을 가지고 이런 테스트와 평가가 가능해지는 것입니다. 이를 API로도 활용해줄 수 있습니다. 이 내용은 제 개인 유튜브를 통해 설명드리겠습니다.
마지막으로 LaaS의 샌드박스 기능을 소개합니다.
다시 에디터를 눌러 샌드박스를 눌러주세요. 그러면 샌드 박스 생성하기 탭이 등장합니다. 해당 탭에서 설정을 눌러서 설명을 작성해주세요. 이름과 설명은 해당 프롬프트에 대한 설명이고, 웰컴메시지는 사용자가 들어왔을때 보여지는 내용입니다.
여기서 샌드박스 생성과 관련된 정보를 입력하고 저장을 눌러주세요. 그럼 위의 그림과 같이 바로가기 탭이 등장합니다.
그럼 위와 같이 사용자들이 써볼 수 있는 페이지가 등장합니다! 샌드박스로 사용자가 공개하고 싶은 페이지만 공개할 수 있는 것입니다. 제 링크드인 한줄소개 만들기 기능을 담은 LaaS페이지를 공유드립니다. 이런식으로 다른 분들께 공유도 할 수 있습니다.
왜 그렇다면 이런 LaaS를 사용하는게 좋을까요? 그냥 원래 하던 방식으로 사용하면 안되나요?
네, LaaS를 사용하는게 협업하는 관점에서 매우 효율적입니다.
일반적인 프롬프트 개발 과정은 위와 같습니다. chatGPT와 같은 API를 사용해주어야 하기 때문에, 서버 개발자에게 프롬프트를 수정할 때마다 불필요한 소통을 통해 요청을 해야하고, 개발 요청, 배포 요청, A/B테스트 요청 등 많은 요청사항을 전달해야 합니다. 모니터링, 히스토리 역시 모니터링용 소프트웨어를 따로 요청해서 받아야 합니다.
이는 협업의 관점에서 매우 비효율적입니다. 하지만 LaaS를 사용한다면? 이런 수고스러움이 많이 덜어지게 됩니다. 프롬프팅, LLM과 관련된 모든 개발, 실험, 배포, 모니터링의 과정을 다 LaaS를 통해 즉각적으로 할 수 있기 때문에, 이런 수고스러움을 덜 수 있으며, API를 활용하여 개발하기 서버 개발자는 무수히 많은 요청을 커버할 필요가 없어집니다.
프롬프트를 예전과 같이 API로 활용할 경우 매번 서버에서 정의된 프롬프트를 API에 담아 날려주어야 합니다. 그리고 이 프롬프트가 약간이라도 변경될 경우 서버에서 프롬프트를 수정하는 것은 물론, 코드 레벨에 수정이 이뤄지기도 하기에 서버를 재시작해야하는 일도 빈번하게 발생합니다. 이는 프롬프트 개발자와 서버 개발자 모두에게 큰 부담입니다.
그러나, LaaS를 사용할 경우, 새로운 파라미터를 추가하는 큰 프롬프트 변경이 아닌 경우 서버에서 수정할 내용은 없습니다. 단순히 LaaS에서 저희가 사전에 정의한 프리셋을 수정하기만 하면 되고, 서버에서는 이 프리셋을 선택하여 API를 보내주면 됩니다.
프롬프트 엔지니어는 프롬프트에만, 서버 개발자는 개발에만 집중할 수 있게 되는 것이죠.
단점이 없는 것은 아닙니다. 만약에 프롬프트를 만들고 이를 간단하게 테스트해보며 생성하기를 눌렀다고 해봅시다. 그리고 그 결과가 좋아서 저장을 하고 싶을때, 이 생성 프리셋을 바로 저장하면 생성된 출력까지 프리셋으로 저장되어 원하는 결과가 안나오기도 한다는 것입니다.
그래서 저는 매번 테스트를 해보고 프리셋을 지워서 저장을 해왔습니다. 이 작업이 조금은 귀찮더라구요. 출력결과를 프리셋화 하지 않고 테스트 해볼 수 있는 방법이 있으면 좋을 것 같다는 생각이 들어 이 점을 단점으로 꼽았습니다.
우선 1편에서 간단하게 소개드린 저희팀의 LLM 기반 문서탐색법에 대해 다시 말씀드리겠습니다. 저희는 기존 RAG에서 사용하는 임베딩 기반 Retrieve 방식을 사용할 수 없는 문제가 있었습니다. 그래서 이를 극복하고자 네이버 HCX-004의 우수성을 빌려 각 문서의 요약 내용을 기반으로 적절한 성형에 대한 문서를 찾아주는 LLM Retrieve를 개발하였습니다.
이를 위해 각 문서의 요약 내용을 먼저 시스템 프롬프트로 전달하고, 유저의 질문을 주어 질문에 답할 수 있는 적절한 문서를 고르도록 프롬프팅 합니다. 그리고 이 방식을 아래의 그림처럼 구성합니다.
이는 저희가 사용한 대회에 사용한 총 6개의 프롬프트 프리셋 중 문서의 요약을 바탕으로 문서를 골라주는 'keyword search chain'
프롬프트의 일부입니다. 그리고 앞서 설명드린 것처럼 프리셋에 유저의 질문을 변수로 설정하여 API를 보낼때, 유저의 질문만 파라미터로 전달하면 됩니다. 이제 서버의 API 호출 부분은 이를 바탕으로 개발을 완료합니다.
만약, 프롬프트를 수정하고 싶다면? LaaS에 들어가 프롬프트를 수정하고 동일하게 배포해주면 됩니다. 그러면, 서버를 수정하지 않고도 수정된 결과를 얻을 수 있습니다. 매우 간단하고 쉽죠?
저도 개발자 출신이다보니, API를 호출하는게 편했습니다. 왜냐하면 프롬프트도 제가 작성하고, 백엔드 API개발도 제가 하니까요. 그러다 이번에 팀원분과 역할을 나누어 개발을 하다보니, LaaS의 편리함을 뼈저리게 느끼게 되었습니다.
다음은 이제 더 정확한 결과를 얻기 위해 네이버 언어모델 HCX를 튜닝한 과정에 대해 소개드리고자 합니다. 다음편에서 만나요!
AI 성형 코디네이터 개발 3 (Naver HCX 사용기 및 장단점)
준서님. 안녕하세요. 테디노트 라이브로 처음 뵙고 준서님 유튜브 및 블로그 팔로우 하게 되었어요. 저와 저희 팀도 비슷한 어플을 준비중인데 프롬프트에서 많이 어려움을 겪고 있어요. 공개해주신 키워드 만드는 프롬프트는 너무 감사합니다. 혹시 다른 프롬프트도 공유해 주실 계획이 있으실까요?