Prompt 엔지니어링 LMM을 사용한 Chatbot 제작 강의 리뷰
Prompt 엔지니어링 LMM을 사용한 Chatbot 에 관련한 별도의 posting 입니다. Deeplearning AI 사에서 제공하는 무료 교육을 수강하고 배운점과 느낀점을 적어 보았습니다.
Prompt 엔지니어링과 베이스 LLM을 사용하여 Customized 된 App을 쉽게 만드는 좋은 예가 바로 Chatbot입니다.
이 포스팅에서는 Prompt 엔지니어링 ChatGPT API code를 사용하여 어떻게 간단한 customized 된 chat bot을 만드는 지에 대한 강의 과정을 리뷰해 보도록 하겠습니다.
ChatGPT 자체가 Chat 서비스인데 뭘 별도로 해야 하나

아마 이 포스팅을 읽으시는 분은 ChatGPT 서비스 자체가 챗인터페이스를 지원하는데 왜 따로 chatbogt을 생각해야 하는지 의아해 하실 수 있습니다.
ChatGPT는 이른바 우리가 사람과 대화하면서 궁금한 점을 풀어나가는 일반적인 Base LLM 입니다.
강의에서 만들어 보려고 하는 Chatbot은 ChatGPT와 같은 일반적인 LLM 이 아니라, 피자 주문 접수 직원의 일처럼 특별한 업무에 이미 결정되어 있는 순서대로 일을 처리하는 Chatbot입니다.
텔레그램과 같은 챗 서비스는 별도의 API를 통해 직접 이런 Chatbot을 구현해 볼 수 있습니다. 하지만 코드를 통해 응답을 하기때문에 제한적인 response를 줄 수 밖에 없습니다.
Base LLM을 fine tuning 하여 이런 기능을 제공하는 별도의 Customized 된 LLM을 만들기에는 이른바 비용이 너무 많이 들 수도 있습니다.
이 강의에서는 Prompt 엔지니어링을 통해 간단히 그리고 사람이 고객 응대를 하는 자연스러운 response를 주는 Customized 된 chatbot을 구현해 봅니다.
특성화된 user interaction context를 위한 LLM 내부 특별 장치 – role

LLM 대화의 제약성 그리고 이를 극복하기 위한 별도의 prompting 제작 방식
ChatGPT등 많은 LLM API에 정의되어 있는 “role”이라는 인자는 각 메세지의 출처를 나타내는 속성입니다.
API와 상호작용 할 때 메세지는 항상 특정 역할을 가지고 있으며 이 “role”에 따라 메세지의 의미와 기능이 달라집니다.
- system
- 시스템 메시지는 모델의 동작 방식이나 스타일을 지시하는 데 사용됩니다. 예를 들어, 모델이 특정 톤으로 응답하게 하거나 특정 지침을 따르게 할 수 있습니다.
- user
- 사용자가 모델에게 질문을 하거나 요청을 하는 메세지 입니다.
- ChatGPT 웹 서비스에서 사용자가 입력을 하는 메세지 입니다.
- assistant
- 이 역할은 모델이 생성한 응답을 나타냅니다. assistant 역할은 모델이 user의 요청에 대해 답변을 제공할 때 사용되므로 prompt 엔지니어링시 모델에 답변을 하는 방식의 예를 알려 줄 수 있습니다.
- ChatGPT 웹 서비스에서 우리가 실제로 볼수 있는 시스템에서 제공하는 메세지 입니다.
강의에서 예로 보여진 role별로 정의된 message format입니다. 이른바 Multi-shot prompting으로 사용할 수 있습니다.
messages = [ {'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'}, {'role':'user', 'content':'tell me a joke'}, {'role':'assistant', 'content':'Why did the chicken cross the road'}, {'role':'user', 'content':'I don\'t know'} ]
Prompt 엔지니어링 LMM을 사용한 Chatbot 제작시 고려사항

이른바 Chatbot은 대화를 계속해 나가는 기능입니다. 이런 관점에서 LLM은 약간의 제약이 있습니다.
LLM과의 각 대화(질문 + 대답)는 이른바 각 각 별도로 독립된 상호작용입니다.
따라서 LLM이 대화를 통해 유효한 답변을 하도록 하기 위해서는 각 단계별로 제공되었던 중요한 내용을 차곡 차곡 모았다가 현재 질의의 전에 기존 대화의 context를 제공해야 한다는 점입니다.
이게 살짝 와닿지 않는 부분이긴 합니다. 우리가 일상생활에서 ChatGPT나 Claude같은 LLM Chat service를 사용하는 경우 대화가 끊임없이 연결되는 느낌을 받았기 때문입니다.
아마도 일반 상용 서비스에서는 사용자가 대화한 내용의 context를 저장하고 있는 것 같습니다.
예를 들어 ChatGPT나 Claude free 버젼의 경우 사용자가 사용한 대화가 별도로 저장되어 내 계정으로 접속한 경우 기존 대화를 이어나갈 수 있습니다.
계속해서 context를 연결하는 prompting 제작을 위한 고려
강의에서는 아래와 같은 함수를 사용하여 계속해서 기존의 대화를 prompt로 accumulate하는 별도의 함수를 사용합니다.
def collect_messages(_):.......snip............ context.append({'role':'user', 'content':f"{prompt}"}) response = get_completion_from_messages(context) context.append({'role':'assistant', 'content':f"{response}"}).......snip............ return
그리고 시스템 role에 대한 정의 및 초기 조건을 아래와 같이 줍니다.
context = [ {'role':'system', 'content':"""You are OrderBot, an automated service to collect orders for a pizza restaurant. \You first greet the customer, then collects the order, \and then asks if it's a pickup or delivery. \........snip...............Make sure to clarify all options, extras and sizes to uniquely \identify the item from the menu.\You respond in a short, very conversational friendly style. \The menu includes \pepperoni pizza 12.95, 10.00, 7.00 \cheese pizza 10.95, 9.25, 6.50 \.........snip...............peppers 1.00 \Drinks: \coke 3.00, 2.00, 1.00 \sprite 3.00, 2.00, 1.00 \bottled water 5.00 \"""} ] # accumulate messages
위의 context 초기 값과 사용자로 부터 입력받는 message를 위의 collect_messages와 같은 형태의 함수를 사용하여 진행되는 대화 내용을 계속해서 누적시키고 다음번 응답을 위한 prompt로 만들면 우리가 원하는 형태의 chatbot을 ChatGPT API code를 사용하여 정말 손쉽고 빠르게 만들 수 있습니다.
Prompt 엔지니어링 LMM을 사용한 Chatbot : 결론

Deeplearning AI사에서 제공하는 이 무료 강의를 추천합니다.
아마도 LLM을 사용하시는 많은 분들께서는 주로 Python Language를 사용하실 것 같고 처음 Python 언어를 배우실때에 원하는 패키지를 설치하고 단순히 import하는 것만으로 많은 기능이 제공되는 것을 보고 좋아 하셨을 것이라고 생각합니다.
API 프로그래밍도 그와 별반 다르지 않습니다.
개발의 관점에서 빠른 code change와 빠른 배포는 이른바 MSA기반의 API 프로그래밍의 점점 더 중요해 지고 있습니다.
잘 쓰여진 프롬프트와 이와 결합된 LLM은 마치 훌륭한 script와 같이 간단하지만 강력한 기능을 제공할 수 있음을 확인하였습니다.
아마도 우리는 프로그래머에게 “글 잘쓰기”라는 새로운 역량을 요구하는 시대를 살고 있는지도 모를 일입니다.
LLM을 효과적으로 이용하기 위하여 prompt를 잘 쓰기 위해서는
- 명확하고 구체적인 표현을 사용하여 단순한 구조로 쓰여진 글
- 업무 지시는 사람에게 communication하듯 하지 말고 명확히 단계별로 구분해서 작성된 글
을 염두에 두어야 합니다.
