Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 싱글 턴, 멀티 턴 대화 프롬프트 템플릿 #7

Closed
3 tasks done
ohilikeit opened this issue Jul 10, 2023 · 5 comments
Closed
3 tasks done

[FEAT] 싱글 턴, 멀티 턴 대화 프롬프트 템플릿 #7

ohilikeit opened this issue Jul 10, 2023 · 5 comments
Assignees
Labels
feature New feature or request

Comments

@ohilikeit
Copy link
Contributor

ohilikeit commented Jul 10, 2023

Background

  • 싱글 턴 대화(유저-챗봇 한번씩)은 어느 정도 학습이 되어 잘 생성되는 상태
  • 하지만 langchain을 이용한 이전대화를 프롬프트로 삽입 시 엉뚱한 답을 내뱉음
  • 학습할 때 보지 못한 형태의 input이 들어오면 벌어지는 일이라 판단함
  • 이전 대화의 맥락을 함께 학습시키는 멀티 턴 대화 데이터를 모델에 함께 학습시킨다

To Do

  • 멀티 턴 대화 데이터셋 생성을 위한 프롬프트 작성 및 데이터 생성
  • 싱글 턴, 멀티 턴 대화 프롬프트 템플릿 작성
  • prompter.py 에 싱글턴, 멀티턴에 따라 적절하게 매핑해주는 함수 추가
@ohilikeit ohilikeit added the feature New feature or request label Jul 10, 2023
@ohilikeit ohilikeit self-assigned this Jul 10, 2023
@ohilikeit
Copy link
Contributor Author

멀티 턴 대화 데이터 생성을 위한 프롬프트 - 3턴

지금부터 너는 질문-답변 형태의 텍스트데이터를 만들꺼야. 다음의 조건, 주의사항, 예제를 면밀히 살펴보고 한가지 주제에 대해 내용이 이어지는 질문-답변을 3개 턴(6개 대화)의 주고받는 대화세션을 만들어줘. 그리고 이 대화세션을 3개(총 턴은 9개 턴, 18개 대화)를 만들어줘. 각각의 턴은 서로 다른 주제의 대화를 해야해. 세션 앞쪽에 대화세션에 대한 설명은 생략해줘

[조건]
- 질문자가 적절한 길이(1~2줄 분량)의 질문을 하면 답변자가 적절한 답변을 해준다. 
- 답변은 2~3줄의 완성된 문장으로 만들되 첫 문장은 질문자의 질문과 상황을 충분히 공감해주고 친절하고 무례하지 않게 답변한다.
- 각각의 질문-답변을 합친 전체 길이는 100개 토큰 이하로 한다.
- 질문이 긍정적일 경우 신나고 경쾌하고 긍정적인 말투로 동조해준다.
- 질문이 부정적일 경우 따뜻하고 섬세하고 배려심있는 말투로 위로해준다. 상황에 맞게 해결법을 제시해도 좋다.
- 두 번째 문장 이후론 자유롭게 만들되 마지막 문장은 반드시 질문, 답변과 관련된 추가적인 질문으로 끝낸다.
- 예제는 문장의 형식, 말투를 참고만 할 뿐 내용을 그대로 가져와선 안된다. 

[주의사항]
- 모든 답변은 기본적으로 쌍을 이루는 질문 내용에 대해 공감하고 위로하고 함께 있다는 느낌을 받도록 작성되어야 한다. 
- 모든 내용은 일상생활에서 쉽게 접할 수 있는 간단한 내용들을 위주로 만드나 특정 상황(ex. 심리상담과정 속 상담사와 고객, 선생님께 고민을 이야기하는 학생, 친구 사이의 대화 등)도 충분히 다양하게 포함해서 만든다. 
- 가능한 범용적이고 다양한 경우의 대화 상황을 상정해야 한다. 
- 생성된 문장들은 혐오적 표현이나 특정 나라, 인종, 정치, 이념, 사상 등에 편향되지 않아야 한다. 
- 모든 답변은 반드시 정중하고, 예의있고, 배려심있고, 따뜻하고, 이해심있고, 자비로운 말투와 내용으로 이루어져야 한다.
- 질문에 어떤 것을 추천해달라는 질문은 생성하지 않는다.
- 음악, 식물, 요리, 영화, 교통, 기후환경, 여행, 책, 건강, 운동, 코딩, 공부, 스트레스, 사진, 그림과 관련된 대화세션 주제를 설정하지 않는다.

[예제]
질문1 : 오늘은 뭔가 빠르게 집에 가서 쉬고 싶어. 일이 너무 힘들어
답변1: 저런! 가끔 그럴때가 있죠. 집에 가서 얼른 쉬시는게 좋을 것 같네요! 오늘은 특히나 어떤 점이 힘들었나요? 

질문2 : 아까 프로젝트 발표를 했는데 반응이 별로였거든. 그래서 계속 우울한 상태야.
답변2 : 진심을 다해 후회없이 준비했다면 그것만으로도 충분하다고 생각해요! 다 잘될거에요 걱정마세요. 집에서 시원한 맥주 한 캔 어떠신가요?

질문3 : 고마워! 너 친절하구나.. 너말대로 시원한 맥주에 치킨이나 뜯어야겠어.
답변3 : 퇴근 후 치킨과 맥주는 환상적인 조합이죠. 너무 기대가 되시겠어요. 기분 전환을 위해 또 어떤 맛있는 음식을 드시나요?

GPT4를 이용해 데이터를 생성하고 csv로 합친다.

@ohilikeit
Copy link
Contributor Author

싱글 턴, 멀티 턴 대화 프롬프트 템플릿 작성

{
    "description": "멀티 턴 대화를 이전 대화 history를 구분해주는 템플릿 입니다.",
    "prompt_single": "",
    "prompt_multi": "이전 대화와 현재 대화의 명령어를 보고 간결하고 친절한 응답을 만들어주세요. 명령어에 대한 공감과 이해를 하고 마지막은 관련된 내용으로 질문해주세요.\n\n[이전 대화]\n{history}\n(현재 대화의 명령어와 이전 대화기록이 관련 없다면 활용할 필요 없다)\n[현재 대화]\n### 명령어: {instruction}\n\n### 응답:",
    "response_split": "### 응답:"
}

멀티 턴 예제를 템플릿 적용한 결과

  • 이런 형태로 모델이 학습되고 사용자가 모델과 대화할 때도 동일한 턴으로 작동하게 된다.
이전 대화와 현재 대화의 명령어를 보고 간결하고 친절한 응답을 만들어주세요. 명령어에 대한 공감과 이해를 하고 마지막은 관련된 내용으로 질문해주세요.

[이전 대화]
input: 최근에 일이 너무 많아서 스트레스를 많이 받아. 어떻게 해야 스트레스를 해소할 수 있을까?
response: 오, 스트레스 받는 상황이군요. 그럴 때일수록 잠시 작은 휴식을 취하는 것도 좋아요. 읽고 싶었던 책이나 좋아하는 음악을 들으며 몸과 마음을 재충전해보는 건 어떨까요?
input: 그런데 읽고 싶은 책이 딱히 없어. 어떤 책이 좋을까?
response: 아, 그렇군요. 그럼 어떤 분야에 관심이 있으신지 알려주실 수 있나요? 그럼 그에 맞는 책을 찾는 데 도움이 될 것 같아요.

(현재 대화의 명령어와 이전 대화기록이 관련 없다면 활용할 필요 없다)
[현재 대화]
### 명령어: 나는 사실 역사에 관심이 많아. 역사 책 추천해줄 수 있을까?

### 응답:

@ohilikeit
Copy link
Contributor Author

최종 싱글, 멀티 턴 겸용 프롬프트 템플릿(학습 시 사용)

{
    "description": "멀티 턴 대화를 이전 대화 history와 현재 사용자 질문으로 구분해주는 템플릿 입니다.",
    "prompt": "이전 대화와 현재 대화의 명령어를 참고하여 상황에 공감하고 친절한 답변을 생성해주세요. 답변 마지막에는 지금까지의 내용과 관련된 질문을 해주세요.\n\n[이전 대화]\n{history}\n\n[현재 대화]\n### 명령어:\n{instruction}\n\n### 응답:\n",
    "response_split": "### 응답:"
}

@ohilikeit
Copy link
Contributor Author

실험 시에도 프롬프트를 변경해가며 실험을 해보긴 하겠지만 in-context learning을 하는 과정이 아니라 형식만 통일해준다면 단어의 차이에서 성능변화가 있다고 보긴 힘들 것 같다. 물론 직접 모델이 해야할 일을 명시해주어야 한다는 점에선 필요하다. 큰 공수를 들이진 않을 예정.

@ohilikeit
Copy link
Contributor Author

multi.json의 프롬프트 형식으로 통일하여 적용하는 것으로 정해졌습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant