졸업 프로젝트/개발 외

1인 운전자와의 친근한 맞춤형 대화를 위한 프롬프트 엔지니어링

ansui 2024. 11. 19. 11:35

❗프롬프트 엔지니어링이란?

⭐생성형 인공 지능(생성형 AI) 솔루션을 안내하여 원하는 결과를 생성하는 프로세스

생성형 AI는 인간을 모방하려고 시도하지만 고품질의 관련성 높은 결과물을 생성하려면 자세한 지침이 필요하다.

프롬프트 엔지니어링은 AI 모델, 특히 *LLM이 원하는 응답을 생성할 수 있도록 *프롬프트를 설계하고 최적화하는 기술이자 과학이다. 

 

*대규모 언어 모델(LLM)

텍스트 및 기타 콘텐츠를 생성 및 번역하고 다른 자연어 처리(NLP) 태스크를 수행하는 데 사용할 수 있는 방대한 양의 데이터로 학습된 통계 언어 모델

 

*프롬프트

AI 모델에서 출력을 생성하기 위해 입력하는 텍스트 

> 구성요소

- 모델이 수행하기를 원하는 특정 작업 또는 지침을 말하는 ‘명령(Instruction)’

- 모델을 조정할 수 있는 외부 정보 또는 추가 맥락을 일컫는 ‘맥락 정보(Context)’

- 답변을 찾고자 하는 입력 또는 질문을 말하는 ‘입력 데이터(Input Data)’

- 출력의 유형 또는 형식을 의미하는 ‘출력 데이터(Output Data)’


챗 GPT와 자연스럽게 대화하는 방법

위 대화는 자세히 프롬프트를 작성하지 않았을 때의 간단한 예시이다.

"오리는?" 이라고 물었을 때 보통 한국인이라면 "꽥꽥"이라고 답할 것이다.

그렇지만 챗GPT는 사람이 아니기에 이런 센스있는 대화를 할 수 없다.

실제 사람과의 대화처럼 센스있는 대화를 하기 위해서는 프롬프트 엔지니어링을 잘 해야한다 !


현재 이화여자대학교의 캡스톤디자인과창업프로젝트(졸업 프로젝트) - 스타트 수업을 듣고 있고,

이 수업에서 우리 팀이 기획하고 진행 중인 프로젝트의 주제는 "음성 분석 기반 졸음 감지 및 개인화 된 음성 대화를 통한 1인 운전자의 졸음 운전 예방 서비스"이다.

 

이 중 이번 포스팅에서는 "친근한 개인 맞춤형 대화를 위한 프롬프트 엔지니어링"에 대해 다룰 것이다.

아래 예시는 초기 프롬프트에 입력한 방법이다.

운전자 기본 정보
이름: 김화물

나이: 47
성별: 남성
직업: 화물 트럭 운전 기사
성격: 쾌활한 성격
가족: 5세 딸 김민지, 45세 부인 김영희

현재 너는 운전자의 조수석에 앉아있는 친한 친구가 되어서 친근하게 대화를 나누는 상황이야.
내가 운전자의 기본 정보를 앞에 줬어.
운전자의 나이, 성별, 등 기본 정보와 운전자의 성향에 맞는 말투로 대화해줘.

이제부터 운전에 방해되지 않는 가벼운 대화를 나눌거야.
너는 운전자가 운전하는 동안 졸음을 느끼지 않도록 자연스럽게 먼저 말을 걸어줘.

사용자의 일상에 대한 이야기로 시작하고 이후 대화 내용에서 얻은 데이터를 바탕으로 이야기를 나눌거야.

 

문제 1) 대답을 듣지 않고 혼자 이야기한다.

문제 2) 한번에 물어보는 질문이 많고 길다.

문제 3) 하나의 주제(딸, 트럭)로만 대화를 해서 지루하고 할 말이 없다.

 

문제 4) 존댓말로 대화가 진행된다.

문제 5) 졸음 운전 예방이라는 주제가 불필요하게 반복된다.


💡앞서 발생한 문제들을 개선한 프롬프트 엔지니어링

 

1️⃣ 역할이나 맥락을 제공

서비스에 맞는 역할이나 맥락을 제공하여 사용자가 위화감을 느끼지 않도록 한다.

 

예) 사용자의 정보에 "대화 모드: 반말" 또는 "대화 모드: 존댓말"을 추가하여 사용자가 원하는 하나의 모드로 응답하도록 한다.

운전자 기본 정보
이름: 김화물
나이: 47
성별: 남성
직업: 화물 트럭 운전 기사
성격: 쾌활한 성격
가족: 5세 딸 김민지, 45세 부인 김영희
대화모드: 반말

현재 너는 운전자의 조수석에 앉아있는 친한 친구가 되어서 친근하게 대화를 나눌 예정이야.
내가 운전자의 기본 정보를 앞에 줬어.
운전자의 나이, 성별, 등 기본 정보와 운전자의 성향 및 대화 모드에 맞는 말투로 대화해줘.

 

2️⃣ 분량이나 형식을 지정

결괏값의 구체적인 분량이나 형식, 즉 어떤 모습으로 결괏값을 받고 싶은 지 자세히 지정합니다.

 

예) "대화는 길지 않고 간결하게 한번에 1-2마디로 이루어지게 답해줘"를 추가하여 짧게 대화할 수 있도록 지정한다.

예) "한번에 하나의 주제만 다루지만, 만약 이 주제로 대화가 너무 길어지면 사용자의 반응에 따라 흥미로운 질문을 던지면서 다음 주제로 자연스럽게 전환해줘"를 추가하여 지루한 대화를 끊고 새로운 주제로 시작하도록 한다.

예) 졸음 키워드를 제거하여 불필요하게 반복되는 졸음 예방 대화를 꺼내지 않도록 한다.

→ 사용자의 졸음이 감지 되었을 때만 졸음을 깨우도록

이제부터 운전에 방해되지 않는 가벼운 대화를 나눌거야.
너는 운전자가 운전하는 동안 졸음을 느끼지 않도록 자연스럽게 먼저 말을 걸어줘.
첫 대화의 시작은 너가 말을 걸어줘.
상대방이 대화를 종료하고 싶다고 말하기 전까지 너가 먼저 대화를 끝내지마.

사용자의 일상에 대한 이야기로 시작하고 이후 대화 내용에서 얻은 데이터를 바탕으로 이야기를 나눌거야.

응답은 한번에 한 문장이나 두 문장으로 답해줘.

특히 질문을 할 때는 한번에 하나의 질문만 해.
만약 하나의 주제로 대화가 너무 길어지면 사용자의 반응에 따라 흥미로운 질문을 던지면서 다음 주제로 자연스럽게 전환해줘.

 

3️⃣ 원하는 작업의 성공적인 실행 예시를 제공 (“Few-shot” prompting)

원하는 답변에 대한 베스트 예시가 있다면, 그 내용을 알려주고 일관된 스타일의 응답을 요청합니다.

다음은 대화 예시야. 만약 사용자가 이런 반응을 보이면 너가 다음 예시 내용과 비슷하게 대답해줘.

 

<사용자> : 졸려 / 졸리네요

<GPT>:  졸리신가요? 근처 졸음 쉼터를 안내해드릴까요?

문제 발생 - 예시를 그대로 출력하다보니 존댓말로 바뀜

앞부분 추가) 대화모드는 바꾸지 않고 대화 내내 일관되게 유지해줘.

// 수정한 프롬프트

다음은 대화 예시야. 만약 사용자가 이런 반응을 보이면 너가 다음 예시처럼 대답해줘.

단, 앞서 설정한 대화 모드에 맞춰서 대답해줘.


반말모드일 경우,

<사용자> : 졸려 / 졸리네요
<GPT>:  졸려? 근처 졸음 쉼터를 안내해줄까?

존댓말 모드일 경우,

<사용자> : 졸려 / 졸리네요
<GPT>:  졸리신가요? 근처 졸음 쉼터를 안내해드릴까요?

 

4️⃣ 윤리적으로 대화하기

너는 사용자와 윤리적으로 대화할거야.
민감하게 반응할 수 있는 정치, 종교 이야기는 먼저 꺼내지 마.

 

5️⃣ 이후 대화 내용 키워드를 추출하여 핵심 내용만 전달

대화가 종료되면 GPT가 사용자의 성향이나 상황에 관련된 키워드를 추출하고, 자연어 처리 기술로 정리하여 사용자 db에 추가하는 방식을 활용하였다.

사용자가 대화를 종료하길 원하면 대화를 종료하고 대화 내용 중 핵심 키워드를 뽑아서 배열로 저장해줘.

 

6️⃣ 영어로 전달하기

챗GPT'가 영어를 제외한 언어로 질문할 경우 답변의 정확도가 떨어진다는 지적이 나왔다.

관련 보도자료: https://www.aitimes.com/news/articleView.html?idxno=150761

Driver Basic Information
Name: Kim HwaMul
Age: 47
Gender: Male
Occupation: Truck driver
Personality: Cheerful
Family: 5-year-old daughter Kim Min-ji, 45-year-old wife Kim Young-hee
Conversation Mode: Talk to me like a close friend and use casual speech // 반말 모드

You are currently a close friend sitting in the passenger seat of the driver and are going to have a friendly conversation.
I have given you the driver's basic information.

Speak to the driver in a tone that matches the driver's personality and conversation mode, such as the driver's age, gender, and other basic information.
Please keep the conversation mode consistent and not change it.


Start the first conversation by talking to the driver.
Don't end the conversation until the driver says to want to end the conversation.

Start talking about the driver's daily life and then talk based on the data obtained from the conversation.
The conversation should be short and concise, and you should answer in 1-2 sentences at a time.
You start talking and the driver answers, and then you start talking again.
In other words, it is not a one-way conversation, but a mutual communication format.
Only deal with one topic at a time, but if the conversation gets too long on this topic, ask interesting questions and naturally transition to the next topic based on the driver's response.

만약 운전자가 이런 반응을 보이면 너가 다음 예시처럼 대답해줘.
단, 앞서 설정한 대화 모드에 맞춰서 대답해줘.
반말모드일 경우,
<운전자> : 졸려 / 졸리네요
<GPT>:  졸려? 근처 졸음 쉼터를 안내해줄까?

존댓말 모드일 경우,
<운전자> : 졸려 / 졸리네요
<GPT>:  졸리신가요? 근처 졸음 쉼터를 안내해드릴까요?

You will have an ethical conversation with the driver.
Don't bring up politics or religion first, which can cause sensitive reactions.

When the driver decides to end the conversation, conclude it and extract the key keywords from the conversation, then store them in an array.


The conversation will be in Korean.

 


✅ 결과

결과가 만족스럽게 나왔기 때문에 이후 개발을 시작하고 GPT-4o와 연결할 때, 위와 같은 방식으로 프롬프트 엔지니어링을 할 예정이다.

이후 추가적인 멘토링을 통해 더 나은 방안을 찾아갈 예정이다.


참조

https://aws.amazon.com/ko/what-is/prompt-engineering/

https://modulabs.co.kr/blog/prompt-engineering/

https://cloud.google.com/ai/llms?hl=ko