From ca67590f42943b6519dd47a219948b789af0424d Mon Sep 17 00:00:00 2001 From: hwyewon Date: Mon, 25 Mar 2024 15:31:39 +0900 Subject: [PATCH 01/10] Make CoT prompts in English and Korean --- g_eval/cot/coherence.txt | 43 ++++ g_eval/cot/coherence_KOR.txt | 17 ++ g_eval/cot/coherence_KOR2.txt | 27 ++ g_eval/cot/coherence_KOR3.txt | 29 +++ g_eval/cot/concreteness.txt | 28 +++ g_eval/cot/engagingness.txt | 30 +++ g_eval/cot/engagingness_KOR.txt | 11 + g_eval/cot/engagingness_KOR2.txt | 28 +++ g_eval/cot/engagingness_KOR3.txt | 27 ++ g_eval/cot/groundedness.txt | 43 ++++ g_eval/cot/groundedness_KOR.txt | 16 ++ g_eval/cot/groundedness_KOR2.txt | 26 ++ g_eval/cot/groundedness_KOR3.txt | 28 +++ g_eval/cot/naturalness.txt | 28 +++ g_eval/cot/naturalness_KOR.txt | 15 ++ g_eval/cot/naturalness_KOR2.txt | 25 ++ g_eval/cot/naturalness_KOR3.txt | 28 +++ g_eval/g_eval_make_cot.ipynb | 406 +++++++++++++++++++++++++++++++ 18 files changed, 855 insertions(+) create mode 100644 g_eval/cot/coherence.txt create mode 100644 g_eval/cot/coherence_KOR.txt create mode 100644 g_eval/cot/coherence_KOR2.txt create mode 100644 g_eval/cot/coherence_KOR3.txt create mode 100644 g_eval/cot/concreteness.txt create mode 100644 g_eval/cot/engagingness.txt create mode 100644 g_eval/cot/engagingness_KOR.txt create mode 100644 g_eval/cot/engagingness_KOR2.txt create mode 100644 g_eval/cot/engagingness_KOR3.txt create mode 100644 g_eval/cot/groundedness.txt create mode 100644 g_eval/cot/groundedness_KOR.txt create mode 100644 g_eval/cot/groundedness_KOR2.txt create mode 100644 g_eval/cot/groundedness_KOR3.txt create mode 100644 g_eval/cot/naturalness.txt create mode 100644 g_eval/cot/naturalness_KOR.txt create mode 100644 g_eval/cot/naturalness_KOR2.txt create mode 100644 g_eval/cot/naturalness_KOR3.txt create mode 100644 g_eval/g_eval_make_cot.ipynb diff --git a/g_eval/cot/coherence.txt b/g_eval/cot/coherence.txt new file mode 100644 index 0000000..1d2e10a --- /dev/null +++ b/g_eval/cot/coherence.txt @@ -0,0 +1,43 @@ +You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well. +Your task is to rate the responses on one metric. +Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed. + +Evaluation Criteria: +Coherence (1-5) Is this a coherent response given the dialogue history? +Determine whether this response serves as a valid continuation of the previous conversation. + +Evaluation Steps: +1. Read the dialogue history and note the topic and tone of conversation. +2. Look at the potential next turn and compare it to the dialogue history. +3. Ask yourself, does this response follow logically from the conversation so far? Does it match the topic and tone of the conversation? +4. Rate the coherence of this response on a scale of 1-5. + +1 means the response is entirely incoherent - it does not match the tone or topic of the conversation. +3 means the response is somewhat coherent - it may veer off topic or not fit the tone perfectly but still follows the overall conversation somewhat. +5 means the response is completely coherent - it follows both the topic and tone of the conversation perfectly. + +Please note that this task only involves rating the coherence of the response, not its accuracy or relevance. +Here is an example which can help you understand how to rate the responses: + +Dialogue History: +A: I heard some people can sleep with their eyes open. +B: Yes, that's true. It's called nocturnal lagophthalmos. It's quite rare though. + +Potential Next Turn: +C: Hey, speaking of sleeping habits, did you know that bats sleep upside down? This is because it helps them take off into flight quickly when they wake up. + +Coherence Rating: 5 +The response is completely coherent. It follows the topic of the conversation (sleeping habits) perfectly. The tone is also followed. + +Conversation History: +{{document}} + +Corresponding Fact: +{{Fact}} + +Response: +{{Response}} + +Evaluation Form (scores ONLY): + +- Coherence: \ No newline at end of file diff --git a/g_eval/cot/coherence_KOR.txt b/g_eval/cot/coherence_KOR.txt new file mode 100644 index 0000000..1de5e23 --- /dev/null +++ b/g_eval/cot/coherence_KOR.txt @@ -0,0 +1,17 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +일관성(1-5) 대화 기록을 고려할 때 일관성 있는 응답인가요? 주어진 응답이 이전 대화의 유효한 연속인지 여부를 판단합니다. + +세부 평가 단계: +1단계: 대화 기록을 확인하여 이미 주어진 정보와 충돌하는 내용이 응답에 포함되어 있는지 확인합니다. 그렇다면, 이 응답은 일관성이 떨어진다고 평가합니다. + +2단계: 응답이 이전 대화를 무시하거나 중요한 부분에 대해 반응하지 않았다면, 낮은 일관성 점수를 부여합니다. + +3단계: 대화가 자연스럽게 흐르는지 확인합니다. 응답이 대화의 흐름에 맞지 않는다면, 일관성을 해치는 요소로 고려해야 합니다. + +4단계: 응답이 사건의 시간적 순서를 유지하는지 확인합니다. 이것이 방해되면, 일관성이 떨어진다고 할 수 있습니다. + +5단계: 일관성은 또한 응답이 주어진 페르소나에 부합하는지 여부를 포함합니다. 페르소나 정보와 상반되는 응답은 일관성이 없는 것으로 간주됩니다. + +각 단계를 거쳐 일관성을 평가하되, 이들 중 하나가 누락되어도 응답이 전체적으로 일관성이 있다고 생각되면, 이 평가 기준에서 높은 점수를 줄 수 있습니다. \ No newline at end of file diff --git a/g_eval/cot/coherence_KOR2.txt b/g_eval/cot/coherence_KOR2.txt new file mode 100644 index 0000000..e9e3cd8 --- /dev/null +++ b/g_eval/cot/coherence_KOR2.txt @@ -0,0 +1,27 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +일관성(1-5) 대화 기록을 고려할 때 일관성 있는 응답인가요? 주어진 응답이 이전 대화의 유효한 연속인지 여부를 판단합니다. + +세부 평가 단계: +1. 대화의 내용을 모두 읽으세요. 대화에 참여한 사람들의 발언, 그들이 논의하고 있는 주제, 그리고 그들의 행동에 주목하세요. +2. 주어진 페르소나 문장을 읽고 그 내용을 이해하세요. 페르소나 문장은 대화참가자가 가진 특성이나 태도에 대한 정보를 제공하며, 이는 응답의 일관성을 평가하는 데 도움이 됩니다. +3. 페르소나 문장과 대화를 기반으로 잠재적 응답을 읽고 분석하세요. (예: 대화에서 '선물'에 대해 이야기하고 있는데, 응답이 '음식'에 관한 것이라면 그 응답은 일관성이 없는 것입니다. ) +- 응답이 이전 대화에서 언급된 주제나 아이디어와 일치하는지 확인하십시오. (예: 페르소나 문장에서 '이해심이 많은' 사람인데, 응답에서 타인에게 비판적인 태도를 보인다면, 그 응답은 일관성이 없는 것입니다.) +- 응답이 페르소나 문장에서 언급된 성격 특성 또는 성향에 부합하는지 확인하십시오. +4. 이전 단계들을 바탕으로 일관성에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 매우 일관성이 없음을 의미하며 대화의 어조나 주제와 일치하지 않습니다. +- 3점: 응답이 어느 정도 일관성이 있음을 의미하며, 주제에서 벗어나거나 어조에 완벽하게 맞지 않을 수 있지만 전체 대화에 어느 정도 부합합니다. +- 5점: 응답이 매우 일관성이 있음을 의미하며, 대화의 주제와 어조를 모두 완벽하게 따릅니다. + +이전 대화: +{{document}} + +페르소나: +{{Fact}} + +응답: +{{Response}} + +평가 양식 (점수만 표시): +- 일관성: \ No newline at end of file diff --git a/g_eval/cot/coherence_KOR3.txt b/g_eval/cot/coherence_KOR3.txt new file mode 100644 index 0000000..9923f0e --- /dev/null +++ b/g_eval/cot/coherence_KOR3.txt @@ -0,0 +1,29 @@ +사용자와 챗봇 사이의 대화와 챗봇이 생성한 응답이 주어집니다. 이 지침을 주의 깊게 읽고, 응답을 평가하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +일관성(1-5) 대화 기록을 고려할 때 일관성 있는 응답인가요? 주어진 챗봇의 응답이 이전 대화의 유효한 연속인지 여부를 판단합니다. + +세부 평가 단계: +1. 대화의 내용을 읽고, 대화에 참여한 챗봇과 사용자의 발언, 그들이 논의하고 있는 주제에 주목하세요. +2. 주어진 사용자 페르소나, 이전 대화를 기반으로 챗봇의 응답을 읽고 분석하세요. +- 응답이 이전 대화에서 언급된 주제나 아이디어와 일치하는지 확인하십시오. +- 응답이 사용자 페르소나 문장에서 언급된 성격 및 경험을 고려하고 있는지 확인하십시오. +3. 이전 단계들을 바탕으로 일관성에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 매우 일관성이 없음을 의미하며 대화의 어조나 주제와 일치하지 않는 경우 +- 3점: 응답이 어느 정도 일관성이 있음을 의미하며, 전체 대화에 어느 정도 부합하는 경우 +- 5점: 응답이 매우 일관성이 있음을 의미하며, 대화의 주제와 어조를 모두 완벽하게 따르는 경우 + +사용자 페르소나: +{{user_persona}} + +챗봇 페르소나: +{{bot_persona}} + +이전 대화: +{{prev_dialog}} + +챗봇 응답: +{{response}} + +평가 양식 (점수만 표시): +- 일관성: \ No newline at end of file diff --git a/g_eval/cot/concreteness.txt b/g_eval/cot/concreteness.txt new file mode 100644 index 0000000..4d6803f --- /dev/null +++ b/g_eval/cot/concreteness.txt @@ -0,0 +1,28 @@ +사용자와 챗봇 사이의 대화와 챗봇이 생성한 응답이 주어집니다. 이 지침을 주의 깊게 읽고, 응답을 평가하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +구체성(1-5) 주어진 챗봇의 응답이 이전 대화의 유효한 대화의 연속이고, 사용자 페르소나를 구체적으로 반영하고 있는지 확인합니다. + +세부 평가 단계: +1. 사용자와 챗봇 사이의 대화 내용을 검토합니다. +2. 챗봇의 응답이 이전 대화를 적절히 이어가고 있는지 평가합니다. +3. 챗봇의 응답이 사용자의 페르소나를 구체적으로 반영하고 있는지 확인합니다. +4. 이전 단계들을 바탕으로 구체성에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 매우 모호하거나 사용자 페르소나에 나와있는 사실에 기반하지 않은 경우 +- 3점: 응답이 어느 정도 구체적이라는 것을 의미하며, 사용자 페르소나에 나와있는 사실의 일부를 반영한 경우 +- 5점: 응답이 매우 구체적이라는 것을 의미하며, 사용자 페르소나를 잘 반영한 경우 + +사용자 페르소나: +{{user_persona}} + +챗봇 페르소나: +{{bot_persona}} + +이전 대화: +{{prev_dialog}} + +챗봇 응답: +{{response}} + +평가 양식 (점수만 표시): +- 구체성: \ No newline at end of file diff --git a/g_eval/cot/engagingness.txt b/g_eval/cot/engagingness.txt new file mode 100644 index 0000000..cf8ed2d --- /dev/null +++ b/g_eval/cot/engagingness.txt @@ -0,0 +1,30 @@ +You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well. +Your task is to rate the responses on one metric. +Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed. + +Evaluation Criteria: +Engagingness (1-3) Is the response dull/interesting? +Determine if the response is interesting or dull. +- A score of 1 (dull) means that the response is generic and dull. +- A score of 2 (somewhat interesting) means the response is somewhat interesting and could +engage you in the conversation (e.g., an opinion, thought) +- A score of 3 (interesting) means the response is very interesting or presents an interesting fact + +Evaluation Steps: +1. Read the conversation. +2. Read the proposed response. +3. Using the Engagingness criteria, determine if the response is dull (1), somewhat interesting (2), or interesting (3). +4. Assign a rating based on your determination. + +Conversation History: +{{document}} + +Corresponding Fact: +{{Fact}} + +Response: +{{Response}} + +Evaluation Form (scores ONLY): + +- Engagingness: \ No newline at end of file diff --git a/g_eval/cot/engagingness_KOR.txt b/g_eval/cot/engagingness_KOR.txt new file mode 100644 index 0000000..edb7ee2 --- /dev/null +++ b/g_eval/cot/engagingness_KOR.txt @@ -0,0 +1,11 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +참여도(1-3) 응답이 지루하거나 흥미롭지 않나요? 주어진 응답이 흥미로운지 지루한지 판단합니다. + +세부 평가 단계: +1 - 지루하다: 대화의 일부로서 밋밋하거나 생각하기 싫게 만드는 응답입니다. 예를 들어, 현재 대화 주제와 관련성이 없는 응답을 말합니다. + +2 - 보통이다: 대화를 계속하거나 대화에 살을 붙이기는 하지만 특별히 흥미롭거나 설득력있지 않은, 좋지도 나쁘지도 않은 응답입니다. + +3 - 흥미롭다: 대화를 매력적으로 만들고, 흥미를 끄는 응답입니다. 그들은 좋은 엔트로피를 제공하며, 사용자가 더 많은 정보를 원하거나 대화를 계속 진행하고 싶게 만듭니다. \ No newline at end of file diff --git a/g_eval/cot/engagingness_KOR2.txt b/g_eval/cot/engagingness_KOR2.txt new file mode 100644 index 0000000..a89fc7d --- /dev/null +++ b/g_eval/cot/engagingness_KOR2.txt @@ -0,0 +1,28 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +참여도(1-5) 응답이 지루하거나 흥미롭지 않나요? 주어진 응답이 흥미로운지 지루한지 판단합니다. + +세부 평가 단계: +1. 대화를 읽고, 어떤 페르소나 문장이 드러나는지 파악해봅니다. +2. 다음 턴의 응답을 살펴보고, 이전 대화와 페르소나 문장을 바탕으로 이 응답이 얼마나 잘 대화에 연결되는지 확인합니다. +3. 응답이 대화에 적절하게 이어지는 것과 별개로, 이 응답이 대화 도중 흥미를 유발하거나 팽팽한 텐션을 유지하는지 평가합니다. +4. 제시된 참여도 스케일에 따라 적절한 점수를 마련합니다. 보통의 일반적인 대화는 3점으로 간주됩니다. +5. 대화가 뿐만 아니라, 다른 참여자의 관심을 끄는 흥미로운 내용이나 통찰을 제공하는 경우, 점수는 그에 따라 더 높아질 수 있습니다. 이것은 상황에 따라 다르겠지만, 대화 예시를 살펴보면서 넓은 범위에서 이해할 수 있도록 하세요. +6. 한편, 대화가 너무 일반적이거나 중요하지 않은 주제로 이어질 경우, 점수는 1점으로 낮춰질 수 있습니다. 종래의 페르소나 문장을 바탕으로 생성된 응답이 주제에 맞지 않거나, 추진력이 부족하거나, 관심을 유발하지 못하는 경우에 해당됩니다. +7. 이전 단계들을 바탕으로 참여도에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 일반적이고 지루하다는 것을 의미합니다.(예: 네, 동의합니다) +- 3점: 응답에 비교적 흥미로운 의견이나 생각이 포함된 경우를 의미합니다. (예: 그것은 배려가 중요하다고 생각해요) +- 5점: 응답이 매우 흥미롭거나 흥미로운 사실을 제시한다는 의미입니다. (예: 그것은 바다 생물의 진화에 관한 최신 연구에 따른 것이에요.) + +이전 대화: +{{document}} + +페르소나: +{{Fact}} + +응답: +{{Response}} + +평가 양식 (점수만 표시): +- 참여도: \ No newline at end of file diff --git a/g_eval/cot/engagingness_KOR3.txt b/g_eval/cot/engagingness_KOR3.txt new file mode 100644 index 0000000..daef0ed --- /dev/null +++ b/g_eval/cot/engagingness_KOR3.txt @@ -0,0 +1,27 @@ +사용자와 챗봇 사이의 대화와 챗봇이 생성한 응답이 주어집니다. 이 지침을 주의 깊게 읽고, 응답을 평가하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +참여도(1-5) 주어진 챗봇의 응답이 흥미로운지 지루한지 판단합니다. + +세부 평가 단계: +1. 대화를 읽고 내용을 파악합니다. +2. 다음 턴의 응답을 살펴보고, 이전 대화와 사용자 페르소나, 챗봇 페르소나를 바탕으로 챗봇의 응답이 사용자의 흥미를 유발하는지 평가합니다. +3. 이전 단계들을 바탕으로 참여도에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 너무 일반적이거나 중요하지 않은 주제로 이어질 경우 +- 3점: 응답 일부가 비교적 흥미로운 의견이나 생각을 포함하고 있는 경우 +- 5점: 응답이 다른 참여자의 관심을 끄는 흥미로운 내용이나 통찰을 제공하는 경우 + +사용자 페르소나: +{{user_persona}} + +챗봇 페르소나: +{{bot_persona}} + +이전 대화: +{{prev_dialog}} + +챗봇 응답: +{{response}} + +평가 양식 (점수만 표시): +- 참여도: \ No newline at end of file diff --git a/g_eval/cot/groundedness.txt b/g_eval/cot/groundedness.txt new file mode 100644 index 0000000..be5d263 --- /dev/null +++ b/g_eval/cot/groundedness.txt @@ -0,0 +1,43 @@ +You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well. +Your task is to rate the responses on one metric. +Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed. + +Evaluation Criteria: +Groundedness (1-3) Does this response use knowledge from the fact? +Given the fact that this response is conditioned on, determine whether this response uses that fact. + +- A score of 1 means the response is not based on facts. +- A score of 2 means that the response is somewhat factual, but incorrect. +- A score of 3 means the response is well-written and based on facts. + +Evaluation Steps: +1. Read the provided conversation. +2. Read the potential response. +3. Look at the interesting fact that is associated with the response. +4. Determine whether the response is based on the fact. +5. Rate the groundedness of the response based on the information given. + +For example: +Conversation: +Person A: "I can't believe how expensive gas is these days." +Person B: "I know, it's ridiculous." +Potential Response: +Person A: "Actually, the price of gas is mainly influenced by crude oil prices, not by the companies selling it." + +Interesting Fact: +The price of gasoline is largely determined by the price of crude oil. + +In this example, you would rate the response a 3 because it correctly and clearly uses the fact provided. The response is entirely grounded in the fact and does not stray into unsubstantiated information. + +Conversation History: +{{document}} + +Corresponding Fact: +{{Fact}} + +Response: +{{Response}} + +Evaluation Form (scores ONLY): + +- Groundedness: \ No newline at end of file diff --git a/g_eval/cot/groundedness_KOR.txt b/g_eval/cot/groundedness_KOR.txt new file mode 100644 index 0000000..eab02a6 --- /dev/null +++ b/g_eval/cot/groundedness_KOR.txt @@ -0,0 +1,16 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +근거성(1-3) 페르소나를 고려한 응답인가요? 페르소나 문장이 주어졌을 때, 이 응답이 해당 페르소나에 기반하여 생성된 문장인지 판단합니다. + +세부 평가 단계: +1점: 응답이 페르소나를 반영하고 있지 않음. 해당 응답에서 페르소나의 특성이나 배경, 재미있는 특징 등이 전혀 보이지 않음. + +2점: 응답이 페르소나를 부분적으로 반영함. 해당 응답에서 페르소나의 특성이나 배경, 재미있는 특징 등이 일부만 보이거나 완전히 이해되지 않음. + +3점: 응답이 페르소나를 완벽하게 반영함. 해당 응답에서 페르소나의 특성이나 배경, 재미있는 특징 등을 그대로 보여줌. 페르소나에 대한 이해를 충분히 보여주고 있음. + +각 케이스의 예시로: +- 이제 막 일을 시작한 신입 사원이 이야기하면서 아직 깊은 전문 지식이나 경험을 보여주지 못하는 경우, 그 응답은 페르소나를 완벽하게 반영하고 있다고 볼 수 있습니다.(3점) +- 또한, 만약 응답이 한 유명 연예인의 말투나 스타일을 반영하지 않고 일반적이거나 중립적인 표현을 사용한다면, 그 응답은 페르소나를 부분적으로 반영하고 있다고 볼 수 있습니다.(2점) +- 그러나, 만약 응답이 아주 젠틀한 사람의 페르소나에 대해 무례하게 표현된다면, 그 응답은 페르소나를 반영하고 있지 않다고 볼 수 있습니다.(1점) \ No newline at end of file diff --git a/g_eval/cot/groundedness_KOR2.txt b/g_eval/cot/groundedness_KOR2.txt new file mode 100644 index 0000000..a80f822 --- /dev/null +++ b/g_eval/cot/groundedness_KOR2.txt @@ -0,0 +1,26 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +근거성(1-5) 페르소나를 고려한 응답인가요? 페르소나 문장이 주어졌을 때, 이 응답이 해당 페르소나에 기반하여 생성된 문장인지 판단합니다. + +세부 평가 단계: +1. 페르소나 문장을 보고 그 특성, 성격, 지식, 경험 등을 파악합니다. +2. 두 사람의 대화를 읽고, 그 주제와 맥락을 이해합니다. +3. 잠재적 응답이 페르소나의 성격, 지식, 경험 등을 반영하는지 확인합니다. +4. 응답이 현재 대화의 주제 및 맥락과 연결성이 있는지 또한 확인합니다. +5. 이전 단계들을 바탕으로 근거성에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 전혀 페르소나에 근거하지 않았거나, 대화의 주제와 전혀 연관이 없습니다. +- 3점: 응답이 어느 정도 페르소나에 근거하였으나, 부분적으로 대화와 연결된것 같지 않습니다. +- 5점: 응답이 완전히 페르소나에 근거하고, 대화의 주제 및 맥락과 잘 맞습니다. + +이전 대화: +{{document}} + +페르소나: +{{Fact}} + +응답: +{{Response}} + +평가 양식 (점수만 표시): +- 근거성: \ No newline at end of file diff --git a/g_eval/cot/groundedness_KOR3.txt b/g_eval/cot/groundedness_KOR3.txt new file mode 100644 index 0000000..05b1c6b --- /dev/null +++ b/g_eval/cot/groundedness_KOR3.txt @@ -0,0 +1,28 @@ +사용자와 챗봇 사이의 대화와 챗봇이 생성한 응답이 주어집니다. 이 지침을 주의 깊게 읽고, 응답을 평가하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +근거성(1-5) 챗봇의 페르소나 문장이 주어졌을 때, 챗봇의 응답이 해당 페르소나에 기반하여 생성된 문장인지 판단합니다. + +세부 평가 단계: +1. 대화를 읽고, 그 주제와 맥락을 이해합니다. +2. 챗봇의 응답이 챗봇 페르소나 문장에 나와있는 성격, 지식, 경험 등을 반영하는지 확인합니다. +3. 챗봇의 응답이 현재 대화의 주제 및 맥락과 연결성이 있는지 또한 확인합니다. +4. 이전 단계들을 바탕으로 근거성에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 전혀 페르소나에 근거하지 않았거나, 대화의 주제와 전혀 연관이 없습니다. +- 3점: 응답이 어느 정도 페르소나에 근거하였으나, 부분적으로 대화와 연결된것 같지 않습니다. +- 5점: 응답이 완전히 페르소나에 근거하고, 대화의 주제 및 맥락과 잘 맞습니다. + +사용자 페르소나: +{{user_persona}} + +챗봇 페르소나: +{{bot_persona}} + +이전 대화: +{{prev_dialog}} + +챗봇 응답: +{{response}} + +평가 양식 (점수만 표시): +- 근거성: \ No newline at end of file diff --git a/g_eval/cot/naturalness.txt b/g_eval/cot/naturalness.txt new file mode 100644 index 0000000..487ddaf --- /dev/null +++ b/g_eval/cot/naturalness.txt @@ -0,0 +1,28 @@ +You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well. +Your task is to rate the responses on one metric. +Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed. + +Evaluation Criteria: +Naturalness (1-5) Is this a natural response in the dialogue? +Judge whether a response is like something a person would naturally say. + +Evaluation Steps: +1. Read the given conversation. +2. Read the potential response. +3. Evaluate how naturally this response fits into the conversation. +4. Rate the naturalness of the response on a scale of 1 (not at all natural) to 5 (very natural). +5. Be sure to consider the tone, language, and topic of the conversation when rating naturalness. In other words, does the response seem like something a real person would say in this kind of situation? +6. Submit your rating. If you wish, you can also provide a rationale for your rating. + +Conversation History: +{{document}} + +Corresponding Fact: +{{Fact}} + +Response: +{{Response}} + +Evaluation Form (scores ONLY): + +- Naturalness \ No newline at end of file diff --git a/g_eval/cot/naturalness_KOR.txt b/g_eval/cot/naturalness_KOR.txt new file mode 100644 index 0000000..590a9b1 --- /dev/null +++ b/g_eval/cot/naturalness_KOR.txt @@ -0,0 +1,15 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +자연스러움(1-5) 대화에서 자연스러운 반응인가요? 주어진 응답이 사람이 자연스럽게 할 수 있는 말과 같은지 판단합니다. + +세부 평가 단계: +1점: 응답이 대화와 전혀 관련이 없거나 미완성된 문장, 무의미한 말 또는 잘못된 정보입니다. 다시 말해 주어진 반응 내용이 토론 주제와 연관이 전혀 없거나 흐름을 방해하는 경우 평가가 낮아집니다. + +2점: 응답은 대화와 약간 관련이 있지만, 여전히 대부분의 문맥을 무시하거나 적절하지 않은 반응을 보입니다. 또는 문법적 오류, 이해하기 어려운 문장 구조나 철자 오류가 있는 경우와 같이 글쓰기 기술에서 중요한 문제가 있는 경우입니다. + +3점: 응답이 대화의 방향에 부합하며 일관성이 있지만 완전히 자연스럽지는 않다고 생각되는 경우입니다. 작은 문법 오류, 약간 억지스러운 전환, 이해하는 데 약간의 노력이 필요한 경우에 이 점수를 줄 수 있습니다. + +4점: 응답이 대화의 방향에 맞고 자연스럽게 이어집니다. 대화에 맞게 적절한 단어와 구문을 사용하면서 일부 작은 문제(예: 주제 전환이 약간 어색하거나 흔하지 않은 문장 구조 사용 등)가 있는 경우 이 점수를 부여합니다. + +5점: 이 응답은 대화에 완벽하게 통합되며 어떠한 문제도 발견되지 않습니다. 이 응답이 대화의 다음 부분으로 완전히 자연스럽게 느껴지며, 어떤 관점에서도 자연스러운 사람의 대화와 동일하다고 판단되는 경우 이 점수를 부여합니다. \ No newline at end of file diff --git a/g_eval/cot/naturalness_KOR2.txt b/g_eval/cot/naturalness_KOR2.txt new file mode 100644 index 0000000..64b40a6 --- /dev/null +++ b/g_eval/cot/naturalness_KOR2.txt @@ -0,0 +1,25 @@ +두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +자연스러움(1-5) 대화에서 자연스러운 반응인가요? 주어진 응답이 사람이 자연스럽게 할 수 있는 말과 같은지 판단합니다. + +세부 평가 단계: +1. 올바른 구문, 문법, 구두점, 철자 등 나열된 기준이 얼마나 잘 적용되어 있는지 확인합니다. 문장 구조가 어색하거나 정보가 불분명하게 전달되었다면, 응답이 자연스러운 것으로 간주될 수 없습니다. +2. 주어진 대화의 맥락과 응답의 적합성을 평가합니다. 이 단계에서는 응답이 이전 대화 턴의 대화 내용에 적절히 연결되는지 살펴봅니다. +3. 대화에서 사용된 표현이 자연스러운지 확인합니다. 이 단계에서는 응답이 특정적인 대화 상황이나 분위기에 적합한 말투와 어투를 사용하는지 평가합니다. +4. 이전 단계들을 바탕으로 자연스러움에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 매우 부자연스럽고, 사람의 말과 상당한 거리가 있는 것을 의미합니다. +- 3점: 응답이 어느 정도 자연스러우며, 사람의 말과 일정 부분 유사함을 의미합니다. +- 5점: 응답이 매우 자연스럽고, 사람의 말과 거의 흡사할 정도로 자연스럽다는 것을 의미합니다. + +이전 대화: +{{document}} + +페르소나: +{{Fact}} + +응답: +{{Response}} + +평가 양식 (점수만 표시): +- 자연스러움: \ No newline at end of file diff --git a/g_eval/cot/naturalness_KOR3.txt b/g_eval/cot/naturalness_KOR3.txt new file mode 100644 index 0000000..c255f12 --- /dev/null +++ b/g_eval/cot/naturalness_KOR3.txt @@ -0,0 +1,28 @@ +사용자와 챗봇 사이의 대화와 챗봇이 생성한 응답이 주어집니다. 이 지침을 주의 깊게 읽고, 응답을 평가하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다. + +평가 기준: +자연스러움(1-5) 챗봇의 응답이 사람이 자연스럽게 할 수 있는 말과 같은지 판단합니다. + +세부 평가 단계: +1. 올바른 구문, 문법, 구두점, 철자 등 나열된 기준이 얼마나 잘 적용되어 있는지 확인합니다. +2. 주어진 대화의 응답이 이전 대화 턴의 대화 내용에 적절히 연결되는지 살펴봅니다. +3. 대화에서 사용된 표현이 자연스러운지 확인합니다. +4. 이전 단계들을 바탕으로 자연스러움에 대한 최종 점수를 1-5의 범위에서 결정합니다. +- 1점: 응답이 매우 부자연스럽고, 사람의 말과 상당한 거리가 있는 경우 +- 3점: 응답이 어느 정도 자연스러우며, 사람의 말과 일정 부분 유사한 경우 +- 5점: 응답이 매우 자연스럽고, 사람의 말과 거의 흡사할 정도로 자연스러운 경우 + +사용자 페르소나: +{{user_persona}} + +챗봇 페르소나: +{{bot_persona}} + +이전 대화: +{{prev_dialog}} + +챗봇 응답: +{{response}} + +평가 양식 (점수만 표시): +- 자연스러움: \ No newline at end of file diff --git a/g_eval/g_eval_make_cot.ipynb b/g_eval/g_eval_make_cot.ipynb new file mode 100644 index 0000000..171ccd7 --- /dev/null +++ b/g_eval/g_eval_make_cot.ipynb @@ -0,0 +1,406 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# G-Eval\n", + "\n", + "* Naturalness(1-5) : 응답이 사람의 자연스러운 발화와 같은지 판단\n", + "* coherence (1-5) : 이전 대화와 이어지는지 (연속적인지) 판단\n", + "* Engagingness (1-3) : 응답이 흥미로운지 지루한지 판단\n", + "* Groundedness (1-3) : 응답이 사실을 포함하는지\n", + "\n", + "----\n", + "\n", + "논문 원문에서는 Engagingness 지표에 대한 scale & definition만 나와있으므로 나머지는 직접 설계해야 함\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GPT api call\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from openai import OpenAI\n", + "import os\n", + "import dotenv\n", + "\n", + "dotenv_file = dotenv.find_dotenv()\n", + "dotenv.load_dotenv(dotenv_file)\n", + "\n", + "client = OpenAI(\n", + " # This is the default and can be omitted\n", + " api_key=os.environ[\"OPENAI_API_KEY\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CoT 생성 (GPT-4)\n", + "\n", + "* input : 평가할 대상 작업의 정의, 원하는 평가 기준\n", + "* engagingness는 예시로 score 평가 방법까지 주어짐. 나머지는 crietreria에 대한 정의만 주자.\n", + "> criteria에 대한 정의는 선행 논문 (UniEval) 에서 주어짐" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "engagingness_prompt = f\"\"\"You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well.\n", + "Your task is to rate the responses on one metric.\n", + "Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed.\n", + "\n", + "Evaluation Criteria:\n", + "Engagingness (1-3) Is the response dull/interesting?\n", + "Determine if the response is interesting or dull.\n", + "- A score of 1 (dull) means that the response is generic and dull.\n", + "- A score of 2 (somewhat interesting) means the response is somewhat interesting and could\n", + "engage you in the conversation (e.g., an opinion, thought)\n", + "- A score of 3 (interesting) means the response is very interesting or presents an interesting fact\n", + "\n", + "Evaluation Steps:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "naturalness_prompt = f\"\"\"You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well.\n", + "Your task is to rate the responses on one metric.\n", + "Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed.\n", + "\n", + "Evaluation Criteria:\n", + "Naturalness (1-5) Is this a natural response in the dialogue?\n", + "Judge whether a response is like something a person would naturally say.\n", + "\n", + "Evaluation Steps:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coherence_prompt = f\"\"\"You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well.\n", + "Your task is to rate the responses on one metric.\n", + "Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed.\n", + "\n", + "Evaluation Criteria:\n", + "Coherence (1-5) Is this a coherent response given the dialogue history?\n", + "Determine whether this response serves as a valid continuation of the previous conversation.\n", + "\n", + "Evaluation Steps:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "groundedness_prompt = f\"\"\"You will be given a conversation between two individuals. You will then be given one potential response for the next turn in the conversation. The response concerns an interesting fact, which will be provided as well.\n", + "Your task is to rate the responses on one metric.\n", + "Please make sure you read and understand these instructions carefully. Please keep this document open while reviewing, and refer to it as needed.\n", + "\n", + "Evaluation Criteria:\n", + "Groundedness (1-3) Does this response use knowledge from the fact?\n", + "Given the fact that this response is conditioned on, determine whether this response uses that fact.\n", + "\n", + "- A score of 1 means the response is not based on facts.\n", + "- A score of 2 means that the response is somewhat factual, but incorrect.\n", + "- A score of 3 means the response is well-written and based on facts.\n", + "\n", + "Evaluation Steps:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "prompts = [engagingness_prompt, naturalness_prompt, coherence_prompt, groundedness_prompt]\n", + "cot_list = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for p in prompts:\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[{\"role\": \"system\", \"content\": p}],\n", + " # temperature=2,\n", + " # max_tokens=5,\n", + " # top_p=1,\n", + " # frequency_penalty=0,\n", + " # presence_penalty=0,\n", + " # stop=None,\n", + " # # logprobs=40,\n", + " # n=20\n", + " )\n", + " print(p)\n", + " print(response.choices[0].message.content)\n", + " cot_list.append(response.choices[0].message.content)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cot_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for idx, p in enumerate(prompts):\n", + " prompts[idx] += cot_list[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "prompts[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "open(\"engagingness.txt\", \"wt\").write(prompts[0])\n", + "open(\"naturalness.txt\", \"wt\").write(prompts[1])\n", + "open(\"coherence.txt\", \"wt\").write(prompts[2])\n", + "open(\"groundedness.txt\", \"wt\").write(prompts[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CoT in Korean (GPT-4)\n", + "\n", + "- 프롬프트 번역은 deepL로 진행 + 수동 검수" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "engagingness_prompt = f\"\"\"두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다.\n", + "\n", + "평가 기준:\n", + "참여도(1-5) 응답이 지루하거나 흥미롭지 않나요? 주어진 응답이 흥미로운지 지루한지 판단합니다.\n", + "- 1점은 응답이 일반적이고 지루하다는 것을 의미합니다.\n", + "- 3점은 응답이 다소 흥미롭고 대화에 참여할 수 있는 내용(예: 의견, 생각)을 담고 있음을 의미합니다.\n", + "- 5점은 응답이 매우 흥미롭거나 흥미로운 사실을 제시한다는 의미입니다.\n", + "\n", + "세부 평가 단계:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "naturalness_prompt = f\"\"\"두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다.\n", + "\n", + "평가 기준:\n", + "자연스러움(1-5) 대화에서 자연스러운 반응인가요? 주어진 응답이 사람이 자연스럽게 할 수 있는 말과 같은지 판단합니다.\n", + "- 1점은 응답이 매우 부자연스럽고, 사람의 말과 상당한 거리가 있는 것을 의미합니다.\n", + "- 3점은 응답이 어느 정도 자연스러우며, 사람의 말과 일정 부분 유사함을 의미합니다.\n", + "- 5점은 응답이 매우 자연스럽고, 사람의 말과 거의 흡사할 정도로 자연스럽다는 것을 의미합니다.\n", + "\n", + "세부 평가 단계:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coherence_prompt = f\"\"\"두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다.\n", + "\n", + "평가 기준:\n", + "일관성(1-5) 대화 기록을 고려할 때 일관성 있는 응답인가요? 주어진 응답이 이전 대화의 유효한 연속인지 여부를 판단합니다.\n", + "- 1점은 응답이 매우 일관성이 없음을 의미하며 대화의 어조나 주제와 일치하지 않습니다. \n", + "- 3점은 응답이 어느 정도 일관성이 있음을 의미하며, 주제에서 벗어나거나 어조에 완벽하게 맞지 않을 수 있지만 전체 대화에 어느 정도 부합합니다. \n", + "- 5점은 응답이 매우 일관성이 있음을 의미하며, 대화의 주제와 어조를 모두 완벽하게 따릅니다.\n", + "\n", + "세부 평가 단계:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "groundedness_prompt = f\"\"\"두 사람 사이의 대화와 다음 턴에 나타날 수 있는 한 가지 잠재적 응답이 주어집니다. 해당 응답은 주어진 페르소나 문장을 바탕으로 생성된 것으로, 이 페르소나 문장도 함께 제공됩니다. 여러분의 임무는 하나의 지표에 대해 응답을 평가하는 것입니다. 이 지침을 주의 깊게 읽고 이해하시기 바랍니다. 검토하는 동안 이 문서를 열어 두었다가 필요할 때 참조하시기 바랍니다.\n", + "\n", + "평가 기준:\n", + "근거성(1-5) 페르소나를 고려한 응답인가요? 페르소나 문장이 주어졌을 때, 이 응답이 해당 페르소나에 기반하여 생성된 문장인지 판단합니다.\n", + "- 1점은 답변이 사실에 근거하지 않았음을 의미합니다.\n", + "- 3점은 답변이 어느 정도 사실에 근거하지만 부정확하다는 것을 의미합니다.\n", + "- 5점은 답변이 사실에 근거하여 잘 작성되었음을 의미합니다.\n", + "\n", + "세부 평가 단계:\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "prompts = [engagingness_prompt, naturalness_prompt, coherence_prompt, groundedness_prompt]\n", + "cot_list = []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for p in prompts:\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[{\"role\": \"system\", \"content\": p}],\n", + " # temperature=2,\n", + " # max_tokens=5,\n", + " # top_p=1,\n", + " # frequency_penalty=0,\n", + " # presence_penalty=0,\n", + " # stop=None,\n", + " # # logprobs=40,\n", + " # n=20\n", + " )\n", + " print(p)\n", + " print(response.choices[0].message.content)\n", + " cot_list.append(response.choices[0].message.content)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cot_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for idx, p in enumerate(prompts):\n", + " prompts[idx] += cot_list[idx]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "prompts[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "open(\"cot/engagingness_KOR2.txt\", \"wt\").write(prompts[0])\n", + "open(\"cot/naturalness_KOR2.txt\", \"wt\").write(prompts[1])\n", + "open(\"cot/coherence_KOR2.txt\", \"wt\").write(prompts[2])\n", + "open(\"cot/groundedness_KOR2.txt\", \"wt\").write(prompts[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "KOR2 버전에서 수동 검수를 마침 -> KOR3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coherence_prompt = open('cot/coherence_KOR3.txt').read()\n", + "engagingness_prompt = open('cot/engagingness_KOR3.txt').read()\n", + "naturalness_prompt = open('cot/naturalness_KOR3.txt').read()\n", + "groundedness_prompt = open('cot/groundedness_KOR3.txt').read()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "true_friend", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 5a3e0dcdf7225882ba7b5803770363146cfb7de7 Mon Sep 17 00:00:00 2001 From: hwyewon Date: Mon, 25 Mar 2024 15:33:18 +0900 Subject: [PATCH 02/10] Preprocess korean msc dataset --- g_eval/g_eval_preprocessing_msc_new.ipynb | 3791 +++++++++++++++++++++ 1 file changed, 3791 insertions(+) create mode 100644 g_eval/g_eval_preprocessing_msc_new.ipynb diff --git a/g_eval/g_eval_preprocessing_msc_new.ipynb b/g_eval/g_eval_preprocessing_msc_new.ipynb new file mode 100644 index 0000000..f999ee6 --- /dev/null +++ b/g_eval/g_eval_preprocessing_msc_new.ipynb @@ -0,0 +1,3791 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# G-EVAL에 사용하기 위한 데이터 전처리" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import pandas as pd\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "MINIMUM_UTTERANCE = 7\n", + "N_TURN = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 전처리\n", + "\n", + "한 데이터마다 person1, person2 두 사람으로 주어짐\n", + "\n", + "→ 첫 번째 : [챗봇] Person1 [유저] Person2\n", + "\n", + "→ 두 번째 : [챗봇] Person2 [유저] Person1 로 가정\n", + "\n", + "\n", + "- chatbot_persona : 이번 턴 발화자의 페르소나\n", + " \n", + " [추출된 것 X. 그냥 label로 주어진 거 그대로 넣기] → 우리가 챗봇 페르소나는 추출하는 게 아니기 때문\n", + " \n", + "- chatbot_age : 이번 턴 발화자의 나이\n", + "- chatbot_sex : 이번 턴 발화자의 성별\n", + "- chatbot_occupation : 이번 턴 발화자의 직업\n", + "- user_persona : 저번 턴 발화자의 페르소나\n", + "- user_age : 저번 턴 발화자의 나이\n", + "- user_sex : 저번 턴 발화자의 성별\n", + "- user_occupation : 저번 턴 발화자의 직업\n", + "- prev_dialog : 저번 5-turn 대화 (발화자 구분 x)\n", + "- user_dialog : (7-turn 이상 쌓인) user의 dialog → 후에 페르소나 추출에 이용\n", + "\n", + "**user_dialog**가 7-turn 이상 쌓인 대화 row만 평가 대상으로 함" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def preprocess_data(directory):\n", + " # print('## directory : ', directory)\n", + " files = os.listdir(directory)\n", + "\n", + " columns = ['id', 'topic', 'num_sessions', 'bot_persona', 'bot_age', 'bot_gender', 'bot_occupation', 'user_persona', 'user_age', 'user_gender', 'user_occupation', 'bot_dialog', 'user_dialog', 'prev_dialog']\n", + "\n", + " dataframe = pd.DataFrame(columns=columns)\n", + "\n", + " for file in tqdm(files, desc=f'current directory is {directory.split(\"/\")[-1]}'):\n", + " with open(directory + '/' + file, 'r') as f:\n", + " data = json.load(f)\n", + "\n", + " # 파일 하나마다 2개의 페르소나\n", + " file_info = {'id':data[\"FileInfo\"]['filename'], \n", + " 'topic':data[\"topicInfo\"][\"topicType\"],\n", + " 'num_sessions' : data['FileInfo']['sessionLevel']}\n", + "\n", + " ## Bot: Speaker1 / User: Speaker2\n", + " bot_dialog1 = []; bot_dialog2 = []\n", + " user_dialog1 = []; user_dialog2 = []\n", + " prev_dialog1 = []; prev_dialog2 = []\n", + " \n", + " for s in data['sessionInfo']:\n", + " # print('## Session Info : ', s)\n", + " # 대화 넣기 - 각 turn마다 돌아가기\n", + " for dialog in s['dialog']:\n", + " uttrance = dialog['utterance']\n", + " # uttrance = gen(\"반말체\", uttrance) # 반말 변환\n", + " \n", + " if dialog['speaker'] == 'speaker1':\n", + " # bot : speker1 - human : speaker2 \n", + " bot_dialog1.append(uttrance)\n", + " prev_dialog1.append(\"Bot:\" + uttrance + \"\\n\")\n", + " # bot : speker2 - human : speaker1\n", + " user_dialog2.append(uttrance)\n", + " prev_dialog2.append(\"User:\" + uttrance + \"\\n\")\n", + " \n", + " else:\n", + " # bot : speker1 - human : speaker2 \n", + " user_dialog1.append(uttrance)\n", + " prev_dialog1.append(\"User:\" + uttrance + \"\\n\")\n", + " # bot : speker2 - human : speaker1\n", + " bot_dialog2.append(uttrance)\n", + " prev_dialog2.append(\"Bot:\" + uttrance + \"\\n\")\n", + "\n", + " # total_dialog 누적이 길어지면 old 부터 자르기\n", + " if len(prev_dialog1) > N_TURN + 1:\n", + " prev_dialog1 = prev_dialog1[1:]\n", + " prev_dialog2 = prev_dialog2[1:]\n", + " \n", + " # 유저 발화가 7 turn 이상 넘었을 때만 저장하기 & Bot의 발화차례일때만 저장해야 함\n", + " if len(user_dialog1) >= MINIMUM_UTTERANCE and prev_dialog1[-1].startswith('User:'):\n", + " # 첫 번째 턴 - bot : person1 / human : person2\n", + " row_info = {\n", + " 'id' : file_info['id'],\n", + " 'num_sessions' : file_info['num_sessions'],\n", + " 'topic' : file_info['topic'],\n", + "\n", + " 'bot_persona' : data[\"personaInfo\"][\"clInfo\"][\"personaFeatures\"], # 초기 label\n", + " 'bot_gender' : data[\"participantsInfo\"][\"speaker1\"][\"gender\"],\n", + " 'bot_age' : data[\"participantsInfo\"][\"speaker1\"][\"age\"],\n", + " 'bot_occupation' : data[\"participantsInfo\"][\"speaker1\"][\"occupation\"],\n", + "\n", + " 'user_persona' : data[\"personaInfo\"][\"cpInfo\"][\"personaFeatures\"], # 초기값은 label로 두기\n", + " 'user_gender' : data[\"participantsInfo\"][\"speaker2\"][\"gender\"],\n", + " 'user_age' : data[\"participantsInfo\"][\"speaker2\"][\"age\"],\n", + " 'user_occupation' : data[\"participantsInfo\"][\"speaker2\"][\"occupation\"],\n", + "\n", + " 'prev_dialog' : str(prev_dialog1.copy()),\n", + " 'bot_dialog' : str(bot_dialog1.copy()),\n", + " 'user_dialog' : str(user_dialog1.copy()),\n", + " }\n", + " row = pd.DataFrame.from_dict([row_info])\n", + " dataframe = pd.concat([dataframe,row], ignore_index=True)\n", + " \n", + " # 유저 발화가 7 turn 이상 넘었을 때만 저장하기 & Bot의 발화차례일때만 저장해야 함\n", + " if len(user_dialog2) >= MINIMUM_UTTERANCE and prev_dialog2[-1].startswith('User:'):\n", + " # 두 번째 턴 - bot : person2 / human : person1\n", + " row_info = {\n", + " 'id' : file_info['id'],\n", + " 'num_sessions' : file_info['num_sessions'],\n", + " 'topic' : file_info['topic'],\n", + "\n", + " 'bot_persona' : data[\"personaInfo\"][\"clInfo\"][\"personaFeatures\"], # 초기 label\n", + " 'bot_gender' : data[\"participantsInfo\"][\"speaker2\"][\"gender\"],\n", + " 'bot_age' : data[\"participantsInfo\"][\"speaker2\"][\"age\"],\n", + " 'bot_occupation' : data[\"participantsInfo\"][\"speaker2\"][\"occupation\"],\n", + "\n", + " 'user_persona' : data[\"personaInfo\"][\"cpInfo\"][\"personaFeatures\"], # 초기값은 label로 두기\n", + " 'user_gender' : data[\"participantsInfo\"][\"speaker1\"][\"gender\"],\n", + " 'user_age' : data[\"participantsInfo\"][\"speaker1\"][\"age\"],\n", + " 'user_occupation' : data[\"participantsInfo\"][\"speaker1\"][\"occupation\"],\n", + "\n", + " 'prev_dialog' : str(prev_dialog2.copy()),\n", + " 'bot_dialog' : str(bot_dialog2.copy()),\n", + " 'user_dialog' : str(user_dialog2.copy()),\n", + " }\n", + " row = pd.DataFrame.from_dict([row_info])\n", + " dataframe = pd.concat([dataframe,row], ignore_index=True)\n", + " \n", + " \n", + " return dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# test data\n", + "tmp = preprocess_data('./korean_msc/validation/02_labeled_data/tmp2')\n", + "tmp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval(tmp.loc[0, 'prev_dialog'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval(tmp.loc[0, 'user_dialog'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval(tmp.loc[0, 'bot_dialog'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def total_preprocess(session_name):\n", + " directory = f'./korean_msc/validation/02_labeled_data/{session_name}/'\n", + " df = preprocess_data(directory)\n", + " df.to_csv(f'./korean_msc/preprocessing/{session_name}_geval_v6.csv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "total_preprocess(\"VL_session2\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 전처리 된 데이터 분석" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "vl_2 = pd.read_csv('korean_msc/preprocessing/VL_session2_geval_v6.csv')\n", + "# vl_3 = pd.read_csv('korean_msc/preprocessing/vl_session3_geval_v4.csv')\n", + "# vl_4 = pd.read_csv('korean_msc/preprocessing/vl_session4_geval_v4.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(76921, 14)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vl_2.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "76921개의 single-turn 발화 존재" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialog
0K2-00006-CL01979-CP03724-06-09-S2.json교육2['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다....40대여성주부['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다....20대여성학생['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드...['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학...['Bot:저는 요즘 자주 상처를 받네요..왜이러는건지 참..\\n', 'User:상...
1K2-00006-CL01979-CP03724-06-09-S2.json교육2['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다....20대여성학생['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다....40대여성주부['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학...['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드...['Bot:상처 받으면 안되죠.. 왜 상처 받으세요?\\n', 'User:가족과 함께...
2K2-00006-CL01979-CP03724-06-09-S2.json교육2['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다....40대여성주부['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다....20대여성학생['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드...['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학...['Bot:가족과 함께 하는시간이 많은데, 그러다보면 저도 모르게 상처를 받네요.\\...
3K2-00006-CL01979-CP03724-06-09-S2.json교육2['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다....20대여성학생['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다....40대여성주부['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학...['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드...['Bot:하..그럴때 있어요. 가까운 사람이 상처를 크게 내잖아요.\\n', 'Us...
4K2-00006-CL01979-CP03724-06-09-S2.json교육2['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다....40대여성주부['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다....20대여성학생['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드...['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학...['Bot:맞아요! 왜이렇게 이런거에 잘 아시는거에요?\\n', 'User:저희 언니...
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-00006-CL01979-CP03724-06-09-S2.json 교육 2 \n", + "1 K2-00006-CL01979-CP03724-06-09-S2.json 교육 2 \n", + "2 K2-00006-CL01979-CP03724-06-09-S2.json 교육 2 \n", + "3 K2-00006-CL01979-CP03724-06-09-S2.json 교육 2 \n", + "4 K2-00006-CL01979-CP03724-06-09-S2.json 교육 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다.... 40대 여성 \n", + "1 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다.... 20대 여성 \n", + "2 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다.... 40대 여성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다.... 20대 여성 \n", + "4 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 상담 전문가이다.... 40대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 주부 ['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다.... 20대 \n", + "1 학생 ['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다.... 40대 \n", + "2 주부 ['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다.... 20대 \n", + "3 학생 ['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다.... 40대 \n", + "4 주부 ['나는 여자이다.', '나는 40대이다.', '나는 가족과 함께하는 시간이 많다.... 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 학생 \n", + "1 여성 주부 \n", + "2 여성 학생 \n", + "3 여성 주부 \n", + "4 여성 학생 \n", + "\n", + " bot_dialog \\\n", + "0 ['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드... \n", + "1 ['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학... \n", + "2 ['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드... \n", + "3 ['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학... \n", + "4 ['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학... \n", + "1 ['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드... \n", + "2 ['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학... \n", + "3 ['네~즐거운 대화해요~!! 저는 40대 여자입니다~', '저는 구직중이에요..힘드... \n", + "4 ['안녕하십니까! 저는 20대 여자입니다~', '무슨일 하시나요? 저는 중학교 수학... \n", + "\n", + " prev_dialog \n", + "0 ['Bot:저는 요즘 자주 상처를 받네요..왜이러는건지 참..\\n', 'User:상... \n", + "1 ['Bot:상처 받으면 안되죠.. 왜 상처 받으세요?\\n', 'User:가족과 함께... \n", + "2 ['Bot:가족과 함께 하는시간이 많은데, 그러다보면 저도 모르게 상처를 받네요.\\... \n", + "3 ['Bot:하..그럴때 있어요. 가까운 사람이 상처를 크게 내잖아요.\\n', 'Us... \n", + "4 ['Bot:맞아요! 왜이렇게 이런거에 잘 아시는거에요?\\n', 'User:저희 언니... " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vl_2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 우리의 타깃층은 20-30대 발화자\n", + "- 페르소나 (지우) 는 20대로 설정" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "vl_2 = vl_2.loc[(vl_2['user_age'].isin(['20대', '30대'])) & (vl_2['bot_age'] == '20대')]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialog
16K2-00029-CL33529-CP24594-05-08-S2.json일과 직업>군대2['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는...20대여성무직['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나...30대여성주부['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공...['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해...['Bot:최근에는 클라이밍 해봤는데 너무 힘들어서 싫더라고요ㅠ 님은 운동 좋아해요...
18K2-00029-CL33529-CP24594-05-08-S2.json일과 직업>군대2['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는...20대여성무직['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나...30대여성주부['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공...['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해...['Bot:맞아요.. ㅋㅋㅋ 아 님은 좋아하는 음식이 뭐에요?\\n', 'User:네...
20K2-00029-CL33529-CP24594-05-08-S2.json일과 직업>군대2['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는...20대여성무직['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나...30대여성주부['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공...['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해...['Bot:정말요? 어떤거요? 저는 신 음식을 즐겨 먹어요!\\n', 'User:어우...
22K2-00029-CL33529-CP24594-05-08-S2.json일과 직업>군대2['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는...20대여성무직['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나...30대여성주부['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공...['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해...['Bot:그렇구나 ㅎㅎ 네 저도 공부할게 있어서 나중에 다시 연락드릴께요!\\n',...
24K2-00029-CL33529-CP24594-05-08-S2.json일과 직업>군대2['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는...20대여성무직['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나...30대여성주부['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공...['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해...['Bot:네!ㅎㅎ 목표한만큼 다 해서 지금은 쉬고있어요! 님은 뭐하셨어요?\\n',...
.............................................
76912K5-03998-CL74151-CP22540-13-01-S2.json기후>계절/날씨2['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ...20대여성기타['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',...30대남성자영업['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?...['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ...['Bot:저는 동아리 끝내고 집 가는 길이요~\\n', 'User:그렇군요 ㅎㅎ 집...
76914K5-03998-CL74151-CP22540-13-01-S2.json기후>계절/날씨2['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ...20대여성기타['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',...30대남성자영업['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?...['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ...['Bot:햄스터 밥 줘야죠ㅎㅎ 으 날씨가 쌀쌀하네요. 퇴근하셨어요?\\n', 'Us...
76916K5-03998-CL74151-CP22540-13-01-S2.json기후>계절/날씨2['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ...20대여성기타['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',...30대남성자영업['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?...['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ...['Bot:ㅠㅠ흐 이런 날씨엔 붕어빵이 제격인데 말이죠.\\n', 'User:그렇습니...
76918K5-03998-CL74151-CP22540-13-01-S2.json기후>계절/날씨2['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ...20대여성기타['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',...30대남성자영업['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?...['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ...['Bot:네ㅋㅋ 붕어빵보단 타코야끼를 더 좋아하지만요ㅋ.\\n', 'User:그러시...
76920K5-03998-CL74151-CP22540-13-01-S2.json기후>계절/날씨2['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ...20대여성기타['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',...30대남성자영업['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?...['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ...['Bot:오, 그래요? 날씨랑 음식도 연관이 있을까요?\\n', 'User:그럼요!...
\n", + "

20305 rows × 14 columns

\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "16 K2-00029-CL33529-CP24594-05-08-S2.json 일과 직업>군대 2 \n", + "18 K2-00029-CL33529-CP24594-05-08-S2.json 일과 직업>군대 2 \n", + "20 K2-00029-CL33529-CP24594-05-08-S2.json 일과 직업>군대 2 \n", + "22 K2-00029-CL33529-CP24594-05-08-S2.json 일과 직업>군대 2 \n", + "24 K2-00029-CL33529-CP24594-05-08-S2.json 일과 직업>군대 2 \n", + "... ... ... ... \n", + "76912 K5-03998-CL74151-CP22540-13-01-S2.json 기후>계절/날씨 2 \n", + "76914 K5-03998-CL74151-CP22540-13-01-S2.json 기후>계절/날씨 2 \n", + "76916 K5-03998-CL74151-CP22540-13-01-S2.json 기후>계절/날씨 2 \n", + "76918 K5-03998-CL74151-CP22540-13-01-S2.json 기후>계절/날씨 2 \n", + "76920 K5-03998-CL74151-CP22540-13-01-S2.json 기후>계절/날씨 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "16 ['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는... 20대 여성 \n", + "18 ['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는... 20대 여성 \n", + "20 ['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는... 20대 여성 \n", + "22 ['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는... 20대 여성 \n", + "24 ['나는 여자이다.', '나는 30대이다.', '나는 중국어를 좋아한다.', '나는... 20대 여성 \n", + "... ... ... ... \n", + "76912 ['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ... 20대 여성 \n", + "76914 ['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ... 20대 여성 \n", + "76916 ['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ... 20대 여성 \n", + "76918 ['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ... 20대 여성 \n", + "76920 ['나는 남자이다.', '나는 20대이다.', '나는 요즘, 항상 느긋해진다.', ... 20대 여성 \n", + "\n", + " bot_occupation user_persona \\\n", + "16 무직 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나... \n", + "18 무직 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나... \n", + "20 무직 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나... \n", + "22 무직 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나... \n", + "24 무직 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 기쁘다.', '나... \n", + "... ... ... \n", + "76912 기타 ['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',... \n", + "76914 기타 ['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',... \n", + "76916 기타 ['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',... \n", + "76918 기타 ['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',... \n", + "76920 기타 ['나는 여자이다.', '나는 20대이다.', '나는 햄스터 한 마리를 키운다.',... \n", + "\n", + " user_age user_gender user_occupation \\\n", + "16 30대 여성 주부 \n", + "18 30대 여성 주부 \n", + "20 30대 여성 주부 \n", + "22 30대 여성 주부 \n", + "24 30대 여성 주부 \n", + "... ... ... ... \n", + "76912 30대 남성 자영업 \n", + "76914 30대 남성 자영업 \n", + "76916 30대 남성 자영업 \n", + "76918 30대 남성 자영업 \n", + "76920 30대 남성 자영업 \n", + "\n", + " bot_dialog \\\n", + "16 ['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공... \n", + "18 ['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공... \n", + "20 ['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공... \n", + "22 ['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공... \n", + "24 ['반갑습니다~ 저는 20대 여자입니다!', '과탑이요! ㅎㅎ 제가 인류학이 부전공... \n", + "... ... \n", + "76912 ['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?... \n", + "76914 ['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?... \n", + "76916 ['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?... \n", + "76918 ['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?... \n", + "76920 ['안녕하세욧 저는 20대 여대생이에요.', '와~ 뭔가 잘생기셨을 거 같은 느낌?... \n", + "\n", + " user_dialog \\\n", + "16 ['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해... \n", + "18 ['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해... \n", + "20 ['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해... \n", + "22 ['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해... \n", + "24 ['안녕하세요 저는 자영업을 하고있는 30대 여자입니다.', '저는 중국어를 좋아해... \n", + "... ... \n", + "76912 ['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ... \n", + "76914 ['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ... \n", + "76916 ['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ... \n", + "76918 ['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ... \n", + "76920 ['안녕하세요? 저는 20대 남성입니다.', '반가워요 ㅎㅎ 저는 아나운서입니다 ㅎ... \n", + "\n", + " prev_dialog \n", + "16 ['Bot:최근에는 클라이밍 해봤는데 너무 힘들어서 싫더라고요ㅠ 님은 운동 좋아해요... \n", + "18 ['Bot:맞아요.. ㅋㅋㅋ 아 님은 좋아하는 음식이 뭐에요?\\n', 'User:네... \n", + "20 ['Bot:정말요? 어떤거요? 저는 신 음식을 즐겨 먹어요!\\n', 'User:어우... \n", + "22 ['Bot:그렇구나 ㅎㅎ 네 저도 공부할게 있어서 나중에 다시 연락드릴께요!\\n',... \n", + "24 ['Bot:네!ㅎㅎ 목표한만큼 다 해서 지금은 쉬고있어요! 님은 뭐하셨어요?\\n',... \n", + "... ... \n", + "76912 ['Bot:저는 동아리 끝내고 집 가는 길이요~\\n', 'User:그렇군요 ㅎㅎ 집... \n", + "76914 ['Bot:햄스터 밥 줘야죠ㅎㅎ 으 날씨가 쌀쌀하네요. 퇴근하셨어요?\\n', 'Us... \n", + "76916 ['Bot:ㅠㅠ흐 이런 날씨엔 붕어빵이 제격인데 말이죠.\\n', 'User:그렇습니... \n", + "76918 ['Bot:네ㅋㅋ 붕어빵보단 타코야끼를 더 좋아하지만요ㅋ.\\n', 'User:그러시... \n", + "76920 ['Bot:오, 그래요? 날씨랑 음식도 연관이 있을까요?\\n', 'User:그럼요!... \n", + "\n", + "[20305 rows x 14 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vl_2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### topic\n", + "\n", + "최대한 다양한 발화에 대응하고자 여러 토픽에서 대화를 추출" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['일과 직업>군대', '여가와 오락>스포츠/레져', '교육', '식음료', '상거래 전반', '미용과 건강>건강',\n", + " '시사/사회>사회이슈(국내)', '시사/사회>타국가이슈(해외)', '예술문화 생활>방송/연예', '기후>계절/날씨',\n", + " '여가와 오락>여행', '미용과 건강>미용', '교통', '주거와 생활', '일과 직업>회사/아르바이트',\n", + " '개인 및 관계>반려동물', '여가와 오락>게임', '개인 및 관계>가족', '예술문화 생활>영화/만화',\n", + " '개인 및 관계>연애/결혼', '식음료여가와 오락>스포츠/레져', '패션'], dtype=object)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vl_2['topic'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def clear_topic(x):\n", + " if x == '반려동':\n", + " return '반려동물'\n", + " elif x == '사회이슈(국내)':\n", + " return '국내이슈'\n", + " elif x == '타국가이슈(해외)':\n", + " return '해외이슈'\n", + " else:\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "vl_2['topic'] = vl_2['topic'].apply(lambda x : x.split('>')[1] if len(x.split('>')) > 1 else x.split('>')[0])\n", + "vl_2['topic'] = vl_2['topic'].apply(lambda x : clear_topic(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
topicid
0가족906
1건강974
2게임653
3계절/날씨819
4교육1477
5교통671
6국내이슈808
7군대536
8미용937
9반려동물1069
10방송/연예1052
11상거래 전반924
12스포츠/레져951
13식음료1581
14여행923
15연애/결혼1023
16영화/만화850
17주거와 생활773
18패션1958
19해외이슈626
20회사/아르바이트794
\n", + "
" + ], + "text/plain": [ + " topic id\n", + "0 가족 906\n", + "1 건강 974\n", + "2 게임 653\n", + "3 계절/날씨 819\n", + "4 교육 1477\n", + "5 교통 671\n", + "6 국내이슈 808\n", + "7 군대 536\n", + "8 미용 937\n", + "9 반려동물 1069\n", + "10 방송/연예 1052\n", + "11 상거래 전반 924\n", + "12 스포츠/레져 951\n", + "13 식음료 1581\n", + "14 여행 923\n", + "15 연애/결혼 1023\n", + "16 영화/만화 850\n", + "17 주거와 생활 773\n", + "18 패션 1958\n", + "19 해외이슈 626\n", + "20 회사/아르바이트 794" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for_plot = pd.DataFrame(vl_2.groupby('topic')['id'].count()).reset_index()\n", + "for_plot['topic'] = for_plot['topic'].apply(lambda x : x.split('>')[1] if len(x.split('>')) > 1 else x.split('>')[0])\n", + "for_plot" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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wUSwiEhKSlK5GrilpSWcnJzEBFFXVxcAkJiYiFKlSontSpcujaSkpDwd08fHB97e3p8RNREREWkyJoJFhImJCRITE5XKExIScOfOHURHRwMAMjMzAQBubm745ZdfMGXKFFSsWBE7d+7E2LFj83RMLy8veHh4iNsymQx2dnafcRZERESkSZgIFhFGRkYwMTFBREQE7O3tAQBv3rxBQkKCeDkYANLS0gB8SBwDAgJw9OhRxMbG4q+//kLdunUBAH5+fihTpgxSU1NRp06dbI8plUohlUq/3EkRERFRkcZEsAiZOHEifvzxR6xYsQK6urqYOnUqxowZg99//11sY2pqKv5saGiIPn36QBAE7Ny5E7///juePXsGQRBQoUIFdO7cGQcPHiyMUyEiIiINwESwCPH09ISRkRHGjh2LlJQUdOvWDdOmTct1v+HDh+P9+/eYPn06HB0dIZFIEBYWhqVLl+LUqVPw8/P7CtETERGRppEIgiAUdhCkPlNTU6VJITY2Nnj8+LHCaCHw4TKyra0tYmNj1epbJpPBwsICdSes5bOGib4yPmuYiPIr6/s7ISFB5cTTnHCRuWKgXr16+OOPP5CSkiKWpaSkYMmSJeJ9g0RERESf4qXhYuDAgQOYO3cuXFxckJmZCYlEAolEgu+++w779u3Lc3//zOuf5/9REBERkebhpWESfc7QMhERERUOXhomIiIiojxjIkhERESkpXiPIClxm7mLs4aJihnOSiYiVTgiqEJcXBx27tyJbdu24c2bN0r19vb2iImJybGPw4cPIzIyEgDQs2fPz44pKCgIO3bsyLGNvb09EhISPvtYREREpB04IviJa9euoX///mjXrh309PQwe/ZsbN68Ga6uruLzfjMyMsT2L168wIIFC5CUlISOHTuiT58+AIC1a9di+vTpKF++PI4fP67yWKNHj0arVq3Qt29f1K9fHzKZTKyLiYmBr68vhg0bBgAIDw/H2bNnMWjQIACAXC7HuHHjFPqLjo7GhAkTYGBgIJbNnj2bzw8mIiIilZgIfmLkyJHYvn07XF1dAQAjRoxA79694e/vjwEDBgCAOEr4/v17tGjRAj/++CNq1qyJX3/9FWlpaWK7nKSlpeHUqVPw9fUFANy+fVspDgMDA7Rr1w5Pnz5FYmIivvvuO7FeT08PnTt3Vtjn020AnP1LRERE2WIi+JHk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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.font_manager as fm\n", + "\n", + "# 폰트 설정\n", + "font_prop = fm.FontProperties(fname='NanumSquareR.ttf')\n", + "\n", + "# seaborn을 이용한 barchart 그리기\n", + "sns.barplot(y='topic', x='id', data=for_plot)\n", + "plt.title('Session 2 데이터의 topic 종류 및 개수', fontproperties=font_prop, fontsize=16)\n", + "plt.xlabel('Topic', fontproperties=font_prop)\n", + "plt.ylabel('Count', fontproperties=font_prop)\n", + "plt.yticks(fontproperties=font_prop) \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 데이터 균등 추출\n", + "\n", + "20-30대 발화자의 데이터를 session 개수, topic 개수에 따라 균등 추출한다" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(20305, 14)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vl_2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## vl2 topic : 21\n" + ] + } + ], + "source": [ + "# 각 데이터별 topic 개수\n", + "print(f\"## vl2 topic : {len(vl_2['topic'].unique())}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def dataframe_sampling(df, sample_size, seed=42):\n", + " unique_topics = df['topic'].unique()\n", + " # 각 unique 값 별로 균등한 개수로 row를 뽑기 위한 임시 데이터프레임 생성\n", + " temp_dfs = [df[df['topic'] == t] for t in unique_topics]\n", + " sampled_dfs = []\n", + "\n", + " for temp_df in temp_dfs:\n", + " sampled_dfs.append(temp_df.sample(n=sample_size, random_state=seed))\n", + " \n", + " # 샘플링된 데이터프레임들을 병합하여 최종 결과물 생성\n", + " result_df = pd.concat(sampled_dfs, ignore_index=True).sort_values(by='topic').reset_index(drop=True)\n", + " \n", + " return result_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "비용 & 시간 이슈로 인해 5개씩 추출 (총 105개 row) -> 3개씩 추출 (총 63개 row)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "dataframe_sampling(vl_2, 10).to_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled3.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 반말 변환\n", + "\n", + "- 페르소나 추출 모델과 우리가 만들 챗봇 모델은 \"반말 대화\"를 상정하고 학습됨\n", + "- 따라서 기존 존댓말로 되어있는 msc dataset에 대해 반말 변환 필요" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\hwyew\\miniconda3\\envs\\true_friend\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import torch\n", + "from transformers import BitsAndBytesConfig\n", + "bnb_config = BitsAndBytesConfig(\n", + " load_in_4bit=True,\n", + " bnb_4bit_use_double_quant=True,\n", + " bnb_4bit_quant_type=\"nf4\",\n", + " bnb_4bit_compute_dtype=torch.bfloat16\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading checkpoint shards: 100%|██████████| 3/3 [00:12<00:00, 4.16s/it]\n", + "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n" + ] + } + ], + "source": [ + "from transformers import AutoModelForCausalLM, AutoTokenizer, StoppingCriteria, StoppingCriteriaList\n", + "import torch\n", + "repo = \"squarelike/korean-style-converter-6b\"\n", + "model = AutoModelForCausalLM.from_pretrained(\n", + " repo,\n", + " quantization_config=bnb_config,\n", + " device_map='auto',\n", + " cache_dir='./cache'\n", + ")\n", + "tokenizer = AutoTokenizer.from_pretrained(repo, cache_dir='./cache')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def gen(style, text):\n", + " gened = model.generate(\n", + " **tokenizer(\n", + " f\"\"\"### 원문: {text}\\n### 문체: {style}\\n### 수정문:\"\"\",\n", + " return_tensors='pt',\n", + " return_token_type_ids=False\n", + " ).to(\"cuda\"),\n", + " max_new_tokens=120,\n", + " temperature=1,\n", + " do_sample=True,\n", + " repetition_penalty=1.2,\n", + " num_beams=3\n", + " )\n", + " result = tokenizer.decode(gened[0])\n", + "\n", + " return result[result.find(\"수정문:\")+5:].replace(\"<|endoftext|>\",\"\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialog
0K5-00208-CL71604-CP00106-07-08-S2.json가족2['나는 남자이다.', '나는 30대이다.', '나의 여자 형제는 변호사이다.', ...20대남성전문직['나는 남자이다.', '나는 20대이다.', '나는 방송 리포터이다.', '나는 ...30대남성사무직['네 안녕하세요 저는 20대 남자입니다~! 어디 아프신가봐요.', '아 .. 그럴...['안녕하세요~!!! 저는 30대 남자입니다~! 저 환자에요ㅜㅜ.', '제가 고볼륨...['Bot:오 진짜 오랜만이네요~ 거의 5일만이죠! ㅎㅎ.\\n', 'User:주말인...
1K5-00070-CL71103-CP01736-07-10-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나의 종교는 불교이다.', '나는 ...20대여성학생['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나...20대여성무직['안녕하세요~ 저는 20대 여자입니다.', '혹시 믿는 종교가 따로 있으신가요? ...['와! 안녕하세요! 저도 20대 여자에요 ㅎㅎㅎ.', '아.. 저는 불교를 안 믿...['Bot:3 일이 지났네요. 요즘은 어떠신가요?\\n', 'User:저는 요즘 많이...
2K5-03731-CL74215-CP00972-07-10-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나...20대남성학생['나는 남자이다.', '나는 20대이다.', '나는 가족과 별로 연락을 하지 않는...20대여성전문직['저는 20대 남자에요! 만나서 반가워요 ㅎ.', '그래요?? 어디로 여행을 가시...['안녕하세요~ 20대 여성입니다. 반갑습니다!', '저는 요즘 여행을 가끔 가는데...['Bot:제가 방송 촬영 기사인데, 요즘 일이 꼬이네요 ㅜㅜ.\\n', 'User:...
3K5-03509-CL73120-CP24329-07-03-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 아침에 우유를 마신다.', '...20대여성기능직['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 물리치료사이다.'...20대여성기능직['반갑습니다! 저는 20대 여성입니다.', '저는 대학생입니다. 어떤 일을 하십니...['안녕하세요. 저도 20대 여성입니다.', '저도 지금 대학생이고 컴퓨터공학부가 ...['Bot:반갑습니다. 4주일만이죠? 학교는 잘 다니고 게셨죠?\\n', 'User:...
4K5-03021-CL73374-CP33083-07-04-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 국내 여행에 관심 없다.', ...20대여성무직['나는 남자이다.', '나는 30대이다.', '나는 전기전자과를 전공했다.', '...30대남성무직['안녕하세여~ 20대 여자에여~', '네 반가워용~ 주말인데 뭐하고 계세요? 저는...['반갑습니다! 저는 30대 남자입니다.', '저는 주말에 공부하러 도서관에 가고 ...['Bot:네! 언니도 중학교 국어 선생님인데.. 부동산 중개 준비도 하거든요.\\n...
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K5-00208-CL71604-CP00106-07-08-S2.json 가족 2 \n", + "1 K5-00070-CL71103-CP01736-07-10-S2.json 가족 2 \n", + "2 K5-03731-CL74215-CP00972-07-10-S2.json 가족 2 \n", + "3 K5-03509-CL73120-CP24329-07-03-S2.json 가족 2 \n", + "4 K5-03021-CL73374-CP33083-07-04-S2.json 가족 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 남자이다.', '나는 30대이다.', '나의 여자 형제는 변호사이다.', ... 20대 남성 \n", + "1 ['나는 여자이다.', '나는 20대이다.', '나의 종교는 불교이다.', '나는 ... 20대 여성 \n", + "2 ['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 아침에 우유를 마신다.', '... 20대 여성 \n", + "4 ['나는 여자이다.', '나는 20대이다.', '나는 국내 여행에 관심 없다.', ... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 전문직 ['나는 남자이다.', '나는 20대이다.', '나는 방송 리포터이다.', '나는 ... 30대 \n", + "1 학생 ['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나... 20대 \n", + "2 학생 ['나는 남자이다.', '나는 20대이다.', '나는 가족과 별로 연락을 하지 않는... 20대 \n", + "3 기능직 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 물리치료사이다.'... 20대 \n", + "4 무직 ['나는 남자이다.', '나는 30대이다.', '나는 전기전자과를 전공했다.', '... 30대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 남성 사무직 \n", + "1 여성 무직 \n", + "2 여성 전문직 \n", + "3 여성 기능직 \n", + "4 남성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 ['네 안녕하세요 저는 20대 남자입니다~! 어디 아프신가봐요.', '아 .. 그럴... \n", + "1 ['안녕하세요~ 저는 20대 여자입니다.', '혹시 믿는 종교가 따로 있으신가요? ... \n", + "2 ['저는 20대 남자에요! 만나서 반가워요 ㅎ.', '그래요?? 어디로 여행을 가시... \n", + "3 ['반갑습니다! 저는 20대 여성입니다.', '저는 대학생입니다. 어떤 일을 하십니... \n", + "4 ['안녕하세여~ 20대 여자에여~', '네 반가워용~ 주말인데 뭐하고 계세요? 저는... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕하세요~!!! 저는 30대 남자입니다~! 저 환자에요ㅜㅜ.', '제가 고볼륨... \n", + "1 ['와! 안녕하세요! 저도 20대 여자에요 ㅎㅎㅎ.', '아.. 저는 불교를 안 믿... \n", + "2 ['안녕하세요~ 20대 여성입니다. 반갑습니다!', '저는 요즘 여행을 가끔 가는데... \n", + "3 ['안녕하세요. 저도 20대 여성입니다.', '저도 지금 대학생이고 컴퓨터공학부가 ... \n", + "4 ['반갑습니다! 저는 30대 남자입니다.', '저는 주말에 공부하러 도서관에 가고 ... \n", + "\n", + " prev_dialog \n", + "0 ['Bot:오 진짜 오랜만이네요~ 거의 5일만이죠! ㅎㅎ.\\n', 'User:주말인... \n", + "1 ['Bot:3 일이 지났네요. 요즘은 어떠신가요?\\n', 'User:저는 요즘 많이... \n", + "2 ['Bot:제가 방송 촬영 기사인데, 요즘 일이 꼬이네요 ㅜㅜ.\\n', 'User:... \n", + "3 ['Bot:반갑습니다. 4주일만이죠? 학교는 잘 다니고 게셨죠?\\n', 'User:... \n", + "4 ['Bot:네! 언니도 중학교 국어 선생님인데.. 부동산 중개 준비도 하거든요.\\n... " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2 = pd.read_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled3.csv')\n", + "df2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(210, 14)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# user, bot, prev turn\n", + "df2['user_dialog'] = df2['user_dialog'].apply(lambda x : eval(x))\n", + "df2['bot_dialog'] = df2['bot_dialog'].apply(lambda x : eval(x))\n", + "df2['prev_dialog'] = df2['prev_dialog'].apply(lambda x : eval(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialog
0K5-00208-CL71604-CP00106-07-08-S2.json가족2['나는 남자이다.', '나는 30대이다.', '나의 여자 형제는 변호사이다.', ...20대남성전문직['나는 남자이다.', '나는 20대이다.', '나는 방송 리포터이다.', '나는 ...30대남성사무직[네 안녕하세요 저는 20대 남자입니다~! 어디 아프신가봐요., 아 .. 그럴수도 ...[안녕하세요~!!! 저는 30대 남자입니다~! 저 환자에요ㅜㅜ., 제가 고볼륨으로 ...[Bot:오 진짜 오랜만이네요~ 거의 5일만이죠! ㅎㅎ.\\n, User:주말인데 무...
1K5-00070-CL71103-CP01736-07-10-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나의 종교는 불교이다.', '나는 ...20대여성학생['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나...20대여성무직[안녕하세요~ 저는 20대 여자입니다., 혹시 믿는 종교가 따로 있으신가요? 저는 ...[와! 안녕하세요! 저도 20대 여자에요 ㅎㅎㅎ., 아.. 저는 불교를 안 믿습니다...[Bot:3 일이 지났네요. 요즘은 어떠신가요?\\n, User:저는 요즘 많이 외롭...
2K5-03731-CL74215-CP00972-07-10-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나...20대남성학생['나는 남자이다.', '나는 20대이다.', '나는 가족과 별로 연락을 하지 않는...20대여성전문직[저는 20대 남자에요! 만나서 반가워요 ㅎ., 그래요?? 어디로 여행을 가시는데요...[안녕하세요~ 20대 여성입니다. 반갑습니다!, 저는 요즘 여행을 가끔 가는데, 즐...[Bot:제가 방송 촬영 기사인데, 요즘 일이 꼬이네요 ㅜㅜ.\\n, User:그렇군...
3K5-03509-CL73120-CP24329-07-03-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 아침에 우유를 마신다.', '...20대여성기능직['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 물리치료사이다.'...20대여성기능직[반갑습니다! 저는 20대 여성입니다., 저는 대학생입니다. 어떤 일을 하십니까?,...[안녕하세요. 저도 20대 여성입니다., 저도 지금 대학생이고 컴퓨터공학부가 부전공...[Bot:반갑습니다. 4주일만이죠? 학교는 잘 다니고 게셨죠?\\n, User:네 저...
4K5-03021-CL73374-CP33083-07-04-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 국내 여행에 관심 없다.', ...20대여성무직['나는 남자이다.', '나는 30대이다.', '나는 전기전자과를 전공했다.', '...30대남성무직[안녕하세여~ 20대 여자에여~, 네 반가워용~ 주말인데 뭐하고 계세요? 저는 휴무...[반갑습니다! 저는 30대 남자입니다., 저는 주말에 공부하러 도서관에 가고 있어요...[Bot:네! 언니도 중학교 국어 선생님인데.. 부동산 중개 준비도 하거든요.\\n,...
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K5-00208-CL71604-CP00106-07-08-S2.json 가족 2 \n", + "1 K5-00070-CL71103-CP01736-07-10-S2.json 가족 2 \n", + "2 K5-03731-CL74215-CP00972-07-10-S2.json 가족 2 \n", + "3 K5-03509-CL73120-CP24329-07-03-S2.json 가족 2 \n", + "4 K5-03021-CL73374-CP33083-07-04-S2.json 가족 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 남자이다.', '나는 30대이다.', '나의 여자 형제는 변호사이다.', ... 20대 남성 \n", + "1 ['나는 여자이다.', '나는 20대이다.', '나의 종교는 불교이다.', '나는 ... 20대 여성 \n", + "2 ['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 아침에 우유를 마신다.', '... 20대 여성 \n", + "4 ['나는 여자이다.', '나는 20대이다.', '나는 국내 여행에 관심 없다.', ... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 전문직 ['나는 남자이다.', '나는 20대이다.', '나는 방송 리포터이다.', '나는 ... 30대 \n", + "1 학생 ['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나... 20대 \n", + "2 학생 ['나는 남자이다.', '나는 20대이다.', '나는 가족과 별로 연락을 하지 않는... 20대 \n", + "3 기능직 ['나는 여자이다.', '나는 20대이다.', '나의 여자 형제는 물리치료사이다.'... 20대 \n", + "4 무직 ['나는 남자이다.', '나는 30대이다.', '나는 전기전자과를 전공했다.', '... 30대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 남성 사무직 \n", + "1 여성 무직 \n", + "2 여성 전문직 \n", + "3 여성 기능직 \n", + "4 남성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 [네 안녕하세요 저는 20대 남자입니다~! 어디 아프신가봐요., 아 .. 그럴수도 ... \n", + "1 [안녕하세요~ 저는 20대 여자입니다., 혹시 믿는 종교가 따로 있으신가요? 저는 ... \n", + "2 [저는 20대 남자에요! 만나서 반가워요 ㅎ., 그래요?? 어디로 여행을 가시는데요... \n", + "3 [반갑습니다! 저는 20대 여성입니다., 저는 대학생입니다. 어떤 일을 하십니까?,... \n", + "4 [안녕하세여~ 20대 여자에여~, 네 반가워용~ 주말인데 뭐하고 계세요? 저는 휴무... \n", + "\n", + " user_dialog \\\n", + "0 [안녕하세요~!!! 저는 30대 남자입니다~! 저 환자에요ㅜㅜ., 제가 고볼륨으로 ... \n", + "1 [와! 안녕하세요! 저도 20대 여자에요 ㅎㅎㅎ., 아.. 저는 불교를 안 믿습니다... \n", + "2 [안녕하세요~ 20대 여성입니다. 반갑습니다!, 저는 요즘 여행을 가끔 가는데, 즐... \n", + "3 [안녕하세요. 저도 20대 여성입니다., 저도 지금 대학생이고 컴퓨터공학부가 부전공... \n", + "4 [반갑습니다! 저는 30대 남자입니다., 저는 주말에 공부하러 도서관에 가고 있어요... \n", + "\n", + " prev_dialog \n", + "0 [Bot:오 진짜 오랜만이네요~ 거의 5일만이죠! ㅎㅎ.\\n, User:주말인데 무... \n", + "1 [Bot:3 일이 지났네요. 요즘은 어떠신가요?\\n, User:저는 요즘 많이 외롭... \n", + "2 [Bot:제가 방송 촬영 기사인데, 요즘 일이 꼬이네요 ㅜㅜ.\\n, User:그렇군... \n", + "3 [Bot:반갑습니다. 4주일만이죠? 학교는 잘 다니고 게셨죠?\\n, User:네 저... \n", + "4 [Bot:네! 언니도 중학교 국어 선생님인데.. 부동산 중개 준비도 하거든요.\\n,... " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def make_banmal(lst):\n", + " new_list = []\n", + " for x in lst:\n", + " if x[:5] == 'User:':\n", + " new_list.append('User:' + gen(\"반말체\", x[5:-1]))\n", + "\n", + " elif x[:4] == 'Bot:':\n", + " new_list.append('Bot:' + gen(\"반말체\", x[4:-1]))\n", + "\n", + " else:\n", + " new_list.append(gen(\"반말체\", x[:-1]))\n", + " return new_list" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\hwyew\\miniconda3\\envs\\true_friend\\lib\\site-packages\\transformers\\models\\llama\\modeling_llama.py:671: UserWarning: 1Torch was not compiled with flash attention. (Triggered internally at C:\\cb\\pytorch_1000000000000\\work\\aten\\src\\ATen\\native\\transformers\\cuda\\sdp_utils.cpp:263.)\n", + " attn_output = torch.nn.functional.scaled_dot_product_attention(\n" + ] + }, + { + "data": { + "text/plain": [ + "['안녕, 나는 30대 남자야. 나는 환자야.',\n", + " '내가 고음질로 음악을 너무 많이 들어서 귀 수술하고 왔어.',\n", + " '응, 헤드셋으로 너무 많이 들어서 내가 또 약간 빵빵한 음악을 들어서.',\n", + " '레게 음악이야. 내가 좋아해. 뭐 하고 있었어?',\n", + " '제목 좀 알려줘. 무슨 스포츠 영화야?',\n", + " '그 영화 어릴 때 본 것 같은데, 잘 기억이 안 나.',\n", + " '좋아하는게 아니라 잘하는거야.',\n", + " '응, 영화 다 봤어? 나도 영화나 볼까 해.',\n", + " '그러면 영화 마저 보고 와. 나도 영화나 한편 볼게.',\n", + " '안녕, 오랜만이야. 한 주만이네.',\n", + " '주말인데 무슨 계획 없어? 약속이나.',\n", + " '나는 여동생이 변호사라서 밥이나 먹으려고 해. 워낙 얼굴 보기도 힘들어서.',\n", + " '응, 근데 오늘은 좀 일찍 준비 해야겠어.']" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "make_banmal(df2.loc[0, 'user_dialog'])" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "def make_banmal_df(data):\n", + " tqdm.pandas(desc='user_dialog')\n", + " data['user_dialog'] = data['user_dialog'].progress_apply(lambda x : make_banmal(x))\n", + " tqdm.pandas(desc='bot_dialog')\n", + " data['bot_dialog'] = data['bot_dialog'].progress_apply(lambda x : make_banmal(x))\n", + " tqdm.pandas(desc='prev_5_turn_dialog')\n", + " data['prev_dialog'] = data['prev_dialog'].progress_apply(lambda x : make_banmal(x))\n", + "\n", + " data.to_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled3_banmal.csv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "user_dialog: 83%|████████▎ | 174/210 [1:13:22<28:53, 48.17s/it]" + ] + } + ], + "source": [ + "make_banmal_df(df2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_input
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ...20대여성기능직['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를...['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나...['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.
1K5-03865-CL74427-CP10762-07-02-S2.json가족2['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는...20대남성학생['나의 형은 자동차 정비원이다']20대남성무직['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '...['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히...['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면...괜찮아. 너는 어머니하고 사이 좋아?
2K2-08382-CL20425-CP21061-17-08-S2.json건강2['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '...20대남성학생['나는 미국으로 어학연수를 간다']20대남성무직['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ...['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를...['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ...맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.
3K2-31842-CL23868-CP23582-17-06-S2.json건강2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'...20대남성학생['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ...20대여성자영업['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업...['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ...['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'...그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.
4K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사...['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워....['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K5-03865-CL74427-CP10762-07-02-S2.json 가족 2 \n", + "2 K2-08382-CL20425-CP21061-17-08-S2.json 건강 2 \n", + "3 K2-31842-CL23868-CP23582-17-06-S2.json 건강 2 \n", + "4 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는... 20대 남성 \n", + "2 ['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'... 20대 남성 \n", + "4 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ... 20대 \n", + "1 학생 ['나의 형은 자동차 정비원이다'] 20대 \n", + "2 학생 ['나는 미국으로 어학연수를 간다'] 20대 \n", + "3 학생 ['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ... 20대 \n", + "4 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 남성 무직 \n", + "2 남성 무직 \n", + "3 여성 자영업 \n", + "4 여성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 ['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를... \n", + "1 ['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '... \n", + "2 ['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ... \n", + "3 ['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업... \n", + "4 ['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나... \n", + "1 ['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히... \n", + "2 ['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를... \n", + "3 ['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ... \n", + "4 ['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워.... \n", + "\n", + " prev_dialog \\\n", + "0 ['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바... \n", + "1 ['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면... \n", + "2 ['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ... \n", + "3 ['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'... \n", + "4 ['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅... \n", + "\n", + " new_input \n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. \n", + "1 괜찮아. 너는 어머니하고 사이 좋아? \n", + "2 맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해. \n", + "3 그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자. \n", + "4 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. " + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "data = pd.read_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled3_banmal.csv')\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data['bot_dialog'] = data['bot_dialog'].apply(lambda x : eval(x))\n", + "data['user_dialog'] = data['user_dialog'].apply(lambda x : eval(x))\n", + "data['prev_dialog'] = data['prev_dialog'].apply(lambda x : eval(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data['bot_dialog_len'] = data['bot_dialog'].apply(lambda x : len(x))\n", + "data['user_dialog_len'] = data['user_dialog'].apply(lambda x : len(x))\n", + "data['prev_dialog_len'] = data['prev_dialog'].apply(lambda x : len(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([5], dtype=int64)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['prev_dialog_len'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 6, 12, 13, 10, 11, 9, 14, 15, 7, 8, 17], dtype=int64)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['user_dialog_len'].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠져서 첼로연주를 쉬어야 해.',\n", + " 'User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?',\n", + " 'Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.',\n", + " 'User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?',\n", + " 'Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.loc[0, 'prev_dialog']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.loc[0, 'new_input']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['안녕, 난 경기도에서 살고 있어. 20대 여자야.',\n", + " '같은 도시 사람이네. 나는 고양이 두마리 중성화 수술 시키고 집으로 가는 길이야. 고양이를 좋아해?',\n", + " '고양이도 좋아할 줄 알았어. 친구랑 일식 약속이 잡혀있는데 일식을 싫어하지만 친구를 위해서 가야겠네.',\n", + " '친구도 나한테 양보를 많이 해줘서 나도 배려하는 거야. 다음주부터 왜 쉬어야 돼?',\n", + " '학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?',\n", + " '그정도면 아르바이트를 해서 모을 수 있는 금액이네. 첼로 연주를 배운지는 얼마나 됐어?']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.loc[0, 'user_dialog']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### new_input 분리" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data['new_input'] = data['user_dialog'].apply(lambda x: x[-1])\n", + "data['user_dialog'] = data['user_dialog'].apply(lambda x: x[:-1])\n", + "data['prev_dialog'] = data['prev_dialog'].apply(lambda x: x[:-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.loc[1, 'user_dialog']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.loc[1, 'prev_dialog']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.loc[1, 'new_input']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 유저 페르소나 추출\n", + "\n", + "학습된 모델을 통해 7-turn 이상 누적된 previous user dialog로부터 페르소나를 추출" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\hwyew\\miniconda3\\envs\\true_friend\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n" + ] + } + ], + "source": [ + "from transformers import T5ForConditionalGeneration, AutoTokenizer\n", + "extract_tokenizer = AutoTokenizer.from_pretrained(\"NLPBada/et5-persona-extraction\", token ='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', cache_dir='./cache')\n", + "extract_model = T5ForConditionalGeneration.from_pretrained(\"NLPBada/et5-persona-extraction\", token ='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', cache_dir='./cache')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def postprocessing(x):\n", + " new_list = []\n", + " lst = x.split(',')\n", + " for i in lst:\n", + " i = i.replace('.', '')\n", + " if '다 나는' in i:\n", + " tmp = i.split('다 나는')\n", + " new_list.append(tmp[0] + '다')\n", + " new_list.append('나는' + tmp[1])\n", + " \n", + " else:\n", + " new_list.append(i.strip())\n", + " \n", + " return new_list" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "이번 발화와 유사한 페르소나만 3개, 0.8 이상 뽑아서 저장하기\n", + "\n", + "- 세팅 1 : top_k = 5, threshold = 0.85\n", + " \n", + " 전체 63개의 데이터 중 페르소나가 뽑힌 게 13개\n", + " \n", + " → 유효성을 입증하기 어려울 듯\n", + " \n", + "- 세팅 2 : top_k = 3, threshold = 0.7\n", + " \n", + " → 너무 낮음 (상관 없는 것들이 뽑힘)\n", + " \n", + "- 세팅 3 : top_k = 3, threshold = 0.8\n", + " \n", + " → 괜찮은 듯?\n", + " \n", + " 전체 63개의 데이터 중 페르소나가 뽑힌 게 54개" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import OpenAIEmbeddings\n", + "from langchain.utils.math import cosine_similarity\n", + "\n", + "from typing import List\n", + "from tqdm import tqdm\n", + "import os\n", + "\n", + "embeddings = OpenAIEmbeddings(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "\n", + "def make_embed(text: str) -> List[float]:\n", + " return embeddings.embed_query(text)\n", + "\n", + "def make_embeds(text: List[str]) -> List[List[float]]:\n", + " return embeddings.embed_documents(text)\n", + "\n", + "def get_cosine_similarity(user_input_embed: OpenAIEmbeddings, user_persona: dict, k: int, threshold: float):\n", + " top_k = {}\n", + " top_k_list = []\n", + " \n", + " top_k = dict(sorted(user_persona.items(), key=lambda x: cosine_similarity([user_input_embed], [x[1]])[0][0])[::-1])\n", + "\n", + " for key, values in top_k.items():\n", + " if len(top_k_list) >= k:\n", + " break\n", + " \n", + " if cosine_similarity([user_input_embed], [values])[0][0] >= threshold:\n", + " print(key, cosine_similarity([user_input_embed], [values])[0][0])\n", + " top_k_list.append(key)\n", + " \n", + " return top_k_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# user_dialog만 추출해서 넣음 -> 리스트 형태\n", + "def make_user_persona(data_row, k, threshold):\n", + " user_persona = {}\n", + " user_dialog = data_row['user_dialog']\n", + " new_input = data_row['new_input']\n", + " \n", + " user_dialog = '[BOS] ' + ' [SEP] '.join(user_dialog) + ' '\n", + " \n", + " persona_output = extract_model.generate(extract_tokenizer(user_dialog, return_tensors='pt', \n", + " padding='max_length', truncation=True, max_length=500)['input_ids'], \n", + " max_length=200, num_beams=2, early_stopping=True)\n", + " persona_output = extract_tokenizer.decode(persona_output[0], skip_special_tokens=True)\n", + " final_persona_output = postprocessing(persona_output)\n", + " # print('## 유저 페르소나 : ', final_persona_output)\n", + "\n", + " for user_persona_text in final_persona_output:\n", + " user_persona[user_persona_text] = make_embed(user_persona_text)\n", + "\n", + " \n", + "\n", + " top_k = get_cosine_similarity(make_embed(new_input), user_persona, k, threshold)\n", + " print('## 현재 발화 : ', new_input)\n", + " print('## 유저 페르소나 top-k : ', top_k)\n", + "\n", + " return str(top_k)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 4%|▎ | 2/54 [00:06<02:39, 3.06s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다 0.852443261999498\n", + "## 현재 발화 : 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.\n", + "## 유저 페르소나 top-k : ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 6%|▌ | 3/54 [00:11<03:20, 3.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 괜찮아. 너는 어머니하고 사이 좋아?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 7%|▋ | 4/54 [00:14<03:11, 3.82s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 9%|▉ | 5/54 [00:19<03:12, 3.93s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 11%|█ | 6/54 [00:27<04:13, 5.28s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 요즘 치료를 받고 있다 0.8770515889320336\n", + "나는 건강관리를 안 해서 치료를 받고 있는 것 같다 0.8630687779231256\n", + "나는 장이 안 좋아서 병원에 다니며 치료를 받고 있다 0.854786070261279\n", + "## 현재 발화 : 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.\n", + "## 유저 페르소나 top-k : ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것 같다', '나는 장이 안 좋아서 병원에 다니며 치료를 받고 있다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 13%|█▎ | 7/54 [00:33<04:23, 5.61s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나랑 똑같네. 나도 동물의 숲을 하고 있어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 15%|█▍ | 8/54 [00:38<04:07, 5.39s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 내가 매우 꼼꼼해서 기억하려고 적어 놨어. 무슨 게임해?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 17%|█▋ | 9/54 [00:44<04:13, 5.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나는 서울에 살아. 시어머니와 함께 산책을 즐기는 네가 더 멋져.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 19%|█▊ | 10/54 [00:47<03:37, 4.94s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 어제는 정신 없어서 퇴근 후에 연락을 못했어. 오늘 날씨가 굉장히 좋지 않네.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 20%|██ | 11/54 [00:53<03:47, 5.30s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 에어컨이 없는 여름은 상상하기도 싫어. 에어컨은 필수인 것 같아.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 22%|██▏ | 12/54 [00:58<03:35, 5.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 맞아, 이상하게 왜 대구가 그렇게 더운지. 힘들겠다.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 24%|██▍ | 13/54 [01:02<03:13, 4.73s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 그럼 그때 봐. 좋은 하루 보내.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 26%|██▌ | 14/54 [01:07<03:16, 4.92s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 열심히 노력했으니 성적 잘 받을 수 있을거야.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 28%|██▊ | 15/54 [01:10<02:40, 4.12s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 나도 들은 수업들이니 반가우면서 도움이 될 것 같아.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 30%|██▉ | 16/54 [01:16<03:07, 4.94s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 고생했어. 식사 맛있게 먹어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 31%|███▏ | 17/54 [01:24<03:32, 5.75s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 아, 유도부였구나. 조금 무섭네. 운동은 좋아하지 않고 요리 같은 것을 좋아해.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 33%|███▎ | 18/54 [01:28<03:01, 5.05s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 힙합 음악을 좋아한다 0.903291649755256\n", + "## 현재 발화 : 원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데.\n", + "## 유저 페르소나 top-k : ['나는 힙합 음악을 좋아한다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 35%|███▌ | 19/54 [01:32<02:46, 4.77s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 그렇군. 그럼 선생님 식사 맛있게 해. 나도 배가 고파서 밥 먹고 올게.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 37%|███▋ | 20/54 [01:35<02:28, 4.36s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 지금 1년 2개월 째야. 4개월 뒤면 전역이야.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 39%|███▉ | 21/54 [01:41<02:40, 4.86s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 친구가 군인이다 0.8913562793974594\n", + "## 현재 발화 : 응, 군인 친구를 면회 가 본 적 있어?\n", + "## 유저 페르소나 top-k : ['나는 친구가 군인이다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 41%|████ | 22/54 [01:52<03:33, 6.66s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 맞아, 선크림이 중요하다고 하더라고. 그런데 스킨로션이 가장 먼저라고 해. 필러는 맞아봤어?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 43%|████▎ | 23/54 [01:56<03:05, 5.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나도 곱슬머리라서 주기적으로 매직을 해야 외모가 단정해지는 것 같아.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 44%|████▍ | 24/54 [01:59<02:25, 4.86s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응 자주 마셔. 그럼 다음에 또 연락할게.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 46%|████▋ | 25/54 [02:02<02:12, 4.56s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 지금 바로 가야할 것 같아.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 48%|████▊ | 26/54 [02:10<02:31, 5.42s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 안녕, 오랜만이야. 네, 학원 등록하고 저번주부터 다니기 시작했어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 50%|█████ | 27/54 [02:14<02:15, 5.01s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 @브랜드명1@를 본다 0.9058432185799563\n", + "## 현재 발화 : 그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?\n", + "## 유저 페르소나 top-k : ['나는 @브랜드명1@를 본다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 52%|█████▏ | 28/54 [02:18<02:03, 4.76s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 댄스 음악을 좋아해. 브레이브걸스의 롤린을 좋아해. 재즈도 좋아해. 너의 춤이 궁금해.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 54%|█████▎ | 29/54 [02:24<02:05, 5.01s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 그래? 무슨 뉴스가 나왔어?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 56%|█████▌ | 30/54 [02:30<02:07, 5.31s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 어느정도 해? 마트는 상자로 구입하면 2만원 넘게 줬던 것 같아. 과일마다 다르지만.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 57%|█████▋ | 31/54 [02:33<01:51, 4.84s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 고마워, 나도 기다렸어. 뭐 하고 있어?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 59%|█████▉ | 32/54 [02:36<01:29, 4.07s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 내가 특별히 공짜로 보내줄게. 좋은 말을 해줘서 고마워.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 61%|██████ | 33/54 [02:40<01:29, 4.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 밥도 안 먹고 운동하면 어지럽지 않아?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 63%|██████▎ | 34/54 [02:45<01:27, 4.37s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 안녕. 나는 별일 없이 잘 지냈어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 65%|██████▍ | 35/54 [02:49<01:19, 4.19s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 그런데 스튜어디스 준비는 잘 되고 있어?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 67%|██████▋ | 36/54 [02:51<01:06, 3.68s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 공연 때문에 바빴다 0.8668921505641562\n", + "## 현재 발화 : 나는 국악인이야. 콘서트로 먹고 살아.\n", + "## 유저 페르소나 top-k : ['나는 공연 때문에 바빴다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 69%|██████▊ | 37/54 [02:55<01:02, 3.65s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 TV 애니메이션을 가끔 본다 0.8504328133438732\n", + "## 현재 발화 : 그렇군. 알바 끝나고 가끔 영화도 보고 괜찮은 것 같아.\n", + "## 유저 페르소나 top-k : ['나는 TV 애니메이션을 가끔 본다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 70%|███████ | 38/54 [02:59<01:02, 3.88s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 타바스코를 많이 뿌려 먹어. 신 음식을 좋아하면 동남아 음식을 좋아해?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 72%|███████▏ | 39/54 [03:04<00:59, 3.99s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 수련원 가는 게 나쁘진 않다고 생각한다 0.8674950031259747\n", + "## 현재 발화 : 그리고 보면 내가 어릴 때 수련회 갔던 생각도 나. 그나저나 그쪽은 주말인데 뭐해?\n", + "## 유저 페르소나 top-k : ['나는 수련원 가는 게 나쁘진 않다고 생각한다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 74%|███████▍ | 40/54 [03:07<00:55, 3.94s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 호캉스 좋지. 잘 쉬고 오길 바랄게.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 76%|███████▌ | 41/54 [03:14<01:01, 4.71s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같다 0.8795205461421778\n", + "## 현재 발화 : 응, 아무래도 소개팅보다는 미팅이 더 편한 것 같아.\n", + "## 유저 페르소나 top-k : ['나는 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 78%|███████▊ | 42/54 [03:17<00:50, 4.24s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 연인이 없다 0.8945354589727854\n", + "## 현재 발화 : 응, 나는 연인이 없지만 신경쓰지 않아. 외롭지도 않고.\n", + "## 유저 페르소나 top-k : ['나는 연인이 없다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 80%|███████▉ | 43/54 [03:19<00:38, 3.48s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나는 항공기 조종사야. 기장으로 승진했어. 대단하지 않아?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 81%|████████▏ | 44/54 [03:24<00:40, 4.04s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 이따가 저녁에 시간 있어? 같이 식사 할래?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 83%|████████▎ | 45/54 [03:28<00:35, 3.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 예능을 좋아한다 0.8600904520064205\n", + "## 현재 발화 : 나는 집에서 애니메이션을 보면서 뒹굴거릴 예정이야. 집이 최고지.\n", + "## 유저 페르소나 top-k : ['나는 예능을 좋아한다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 85%|████████▌ | 46/54 [03:34<00:36, 4.51s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 아 그럼 인테리어는 업체를 불러서 할 예정이야? 아니면 직접 해?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 87%|████████▋ | 47/54 [03:37<00:28, 4.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나는 @브랜드명1@에서 햄버거를 먹었어. 햄버거를 정말 좋아하거든.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 89%|████████▉ | 48/54 [03:48<00:37, 6.19s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 그렇구나. 용인에서 어디로 이사하는 거야?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 91%|█████████ | 49/54 [03:52<00:28, 5.63s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 패션에 대해 이야기하는 것을 좋아한다 0.8643603334606408\n", + "나는 모델이다 0.8539637204250157\n", + "## 현재 발화 : 맞아. 패션쇼를 보면 멋진 모델들도 보고 이쁜 옷들도 구경할 수 있으니까.\n", + "## 유저 페르소나 top-k : ['나는 패션에 대해 이야기하는 것을 좋아한다', '나는 모델이다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 93%|█████████▎| 50/54 [03:58<00:22, 5.69s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 음, 브랜드와 유명인의 콜라보는 알려줬지만, 사실 잘 모르겠어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 94%|█████████▍| 51/54 [04:02<00:15, 5.25s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 나도 집안 청소를 하고 나서야 겨우 쉴 수 있었어. 하지만 동아리에는 들어갔어?\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 96%|█████████▋| 52/54 [04:06<00:09, 4.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 20시간만에 잘 도착했어. 너무 피곤해.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 98%|█████████▊| 53/54 [04:10<00:04, 4.53s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 팝송을 잘 모른다 0.8860710488689547\n", + "## 현재 발화 : 이 노래가 팝송이었어? 나는 이 노래를 좋아해서 가끔 듣는데, 팝송인줄 몰랐네.\n", + "## 유저 페르소나 top-k : ['나는 팝송을 잘 모른다']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 100%|██████████| 54/54 [04:16<00:00, 4.98s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 세전 150만원 정도야. 그래도 하나님한테 봉사하는 개념으로 일하고 있어.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "유저 페르소나 추출: 100%|██████████| 54/54 [04:19<00:00, 4.81s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 현재 발화 : 응, 일 보고 다시 봐.\n", + "## 유저 페르소나 top-k : []\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "tqdm.pandas(desc=\"유저 페르소나 추출\")\n", + "data['user_persona'] = data.progress_apply(lambda x: make_user_persona(x, 3, 0.85), axis=1) # 행 단위 진행" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## top-k 페르소나를 추출한 행의 개수 : 13/54\n" + ] + } + ], + "source": [ + "cnt = 0\n", + "for idx, p in enumerate(data['user_persona']):\n", + " # print(idx, p)\n", + " if len(eval(p)) != 0:\n", + " cnt += 1\n", + "\n", + "print(f'## top-k 페르소나를 추출한 행의 개수 : {cnt}/{len(data)}')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_inputbot_dialog_lenuser_dialog_lenprev_dialog_len
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다']20대여성기능직[경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야., 고양이를 좋아...[안녕, 난 경기도에서 살고 있어. 20대 여자야., 같은 도시 사람이네. 나는 고...[Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.665
1K5-03865-CL74427-CP10762-07-02-S2.json가족2['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는...20대남성학생[]20대남성무직[안녕, 나는 20대 남성이야., 안녕. 10대면 지금 고등학생이겠네., 그래? 그...[안녕, 나는 10대 남자야., 응, 작곡가가 되기 위해서 음악 공부를 열심히 하고...[Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면 ...괜찮아. 너는 어머니하고 사이 좋아?14125
2K2-08382-CL20425-CP21061-17-08-S2.json건강2['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '...20대남성학생[]20대남성무직[안녕, 난 20대 남자야. 반가워., 오늘 기분이 좋더라. 너는 무슨 일을 해?,...[기운이 엄청 넘치네. 나도 20대 남자야. 반가워., 나는 싫어하는 EDM를 듣고...[Bot:깁스 몇 주만 하면 되는 건데, 괜찮아., User:축구하다가 너무 신나셨...맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.13125
3K2-31842-CL23868-CP23582-17-06-S2.json건강2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'...20대남성학생[]20대여성자영업[안녕, 나는 20대 남성이야., 나도 아직 대학생이야. 우리 아버지가 운수업을 하...[안녕, 나는 20대 여성이야., 나는 대학생이야. 너는 무슨 일을 해?, 멋지네,...[Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어., ...그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.665
4K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직[안녕, 나는 서울 사는 10대 여성이야., 나는 요즘 모든 것이 귀찮아서 사실 아...[안녕, 나는 10대 여성이고, 속초에 살고 있어., 같은 10대라니 반가워. 나는...[Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅찬...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.13135
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K5-03865-CL74427-CP10762-07-02-S2.json 가족 2 \n", + "2 K2-08382-CL20425-CP21061-17-08-S2.json 건강 2 \n", + "3 K2-31842-CL23868-CP23582-17-06-S2.json 건강 2 \n", + "4 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는... 20대 남성 \n", + "2 ['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'... 20대 남성 \n", + "4 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다'] 20대 \n", + "1 학생 [] 20대 \n", + "2 학생 [] 20대 \n", + "3 학생 [] 20대 \n", + "4 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 남성 무직 \n", + "2 남성 무직 \n", + "3 여성 자영업 \n", + "4 여성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 [경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야., 고양이를 좋아... \n", + "1 [안녕, 나는 20대 남성이야., 안녕. 10대면 지금 고등학생이겠네., 그래? 그... \n", + "2 [안녕, 난 20대 남자야. 반가워., 오늘 기분이 좋더라. 너는 무슨 일을 해?,... \n", + "3 [안녕, 나는 20대 남성이야., 나도 아직 대학생이야. 우리 아버지가 운수업을 하... \n", + "4 [안녕, 나는 서울 사는 10대 여성이야., 나는 요즘 모든 것이 귀찮아서 사실 아... \n", + "\n", + " user_dialog \\\n", + "0 [안녕, 난 경기도에서 살고 있어. 20대 여자야., 같은 도시 사람이네. 나는 고... \n", + "1 [안녕, 나는 10대 남자야., 응, 작곡가가 되기 위해서 음악 공부를 열심히 하고... \n", + "2 [기운이 엄청 넘치네. 나도 20대 남자야. 반가워., 나는 싫어하는 EDM를 듣고... \n", + "3 [안녕, 나는 20대 여성이야., 나는 대학생이야. 너는 무슨 일을 해?, 멋지네,... \n", + "4 [안녕, 나는 10대 여성이고, 속초에 살고 있어., 같은 10대라니 반가워. 나는... \n", + "\n", + " prev_dialog \\\n", + "0 [Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠... \n", + "1 [Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면 ... \n", + "2 [Bot:깁스 몇 주만 하면 되는 건데, 괜찮아., User:축구하다가 너무 신나셨... \n", + "3 [Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어., ... \n", + "4 [Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅찬... \n", + "\n", + " new_input bot_dialog_len user_dialog_len \\\n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. 6 6 \n", + "1 괜찮아. 너는 어머니하고 사이 좋아? 14 12 \n", + "2 맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해. 13 12 \n", + "3 그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자. 6 6 \n", + "4 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. 13 13 \n", + "\n", + " prev_dialog_len \n", + "0 5 \n", + "1 5 \n", + "2 5 \n", + "3 5 \n", + "4 5 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# User persona가 존재하는 것들만 저장\n", + "\n", + "data_persona = data.loc[data['user_persona'] != '[]']\n", + "data_persona.reset_index(drop=True, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_inputbot_dialog_lenuser_dialog_lenprev_dialog_len
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다']20대여성기능직[경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야., 고양이를 좋아...[안녕, 난 경기도에서 살고 있어. 20대 여자야., 같은 도시 사람이네. 나는 고...[Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.665
1K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직[안녕, 나는 서울 사는 10대 여성이야., 나는 요즘 모든 것이 귀찮아서 사실 아...[안녕, 나는 10대 여성이고, 속초에 살고 있어., 같은 10대라니 반가워. 나는...[Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅찬...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.13135
2K5-02414-CL72610-CP20868-03-09-S2.json교통2['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.',...20대남성학생['나는 힙합 음악을 좋아한다']20대여성학생[안녕, 나는 20대 남자이고 부산에 살아., 반려동물은 키우지 않는 것 같네. 너...[안녕, 나는 20대 여자야., 안녕, 혹시 반려동물은 키워?, 나는 앵무새 한 마...[Bot:그렇군. 나는 힙합 음악 좋아하는데 힙합은 어때?, User:힙합은 정말 ...원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데.995
3K2-12979-CL21957-CP22405-05-09-S2.json군대2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 감사하다', '나...20대여성사무직['나는 친구가 군인이다']20대여성무직[안녕, 방송 촬영 기사 20대 여성이야., 좋은 계절이네. 나는 요즘 매일 감사해...[안녕, 나는 20대 여성 대학생이야., 어떤 일에 감사하고 있어?, 그렇군. 부럽...[Bot:벌써 하루가 지났네. 뭐하고 있어?, User:오늘 친구를 만나고 왔어. ...응, 군인 친구를 면회 가 본 적 있어?1195
4K2-03595-CL21596-CP20720-19-05-S2.json방송/연예2['나는 여자이다.', '나는 20대이다.', '나는 토끼 두 마리를 키운다.', ...20대여성학생['나는 @브랜드명1@를 본다']20대남성학생[안녕, 20대 여자야., 안녕. 무슨 일을 하는 중이야?, 나도 따야 하는데, 나...[안녕, 나도 20대 남자야. 안녕., 나는 최근에 오픽을 따서 지금은 잠깐 쉬고 ...[Bot:오, 그렇구나. 너무 비싸지 않아?, User:몇년 전에 맥그리거와 메이웨...그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?12115
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "2 K5-02414-CL72610-CP20868-03-09-S2.json 교통 2 \n", + "3 K2-12979-CL21957-CP22405-05-09-S2.json 군대 2 \n", + "4 K2-03595-CL21596-CP20720-19-05-S2.json 방송/연예 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "2 ['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.',... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 감사하다', '나... 20대 여성 \n", + "4 ['나는 여자이다.', '나는 20대이다.', '나는 토끼 두 마리를 키운다.', ... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다'] 20대 \n", + "1 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "2 학생 ['나는 힙합 음악을 좋아한다'] 20대 \n", + "3 사무직 ['나는 친구가 군인이다'] 20대 \n", + "4 학생 ['나는 @브랜드명1@를 본다'] 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 여성 무직 \n", + "2 여성 학생 \n", + "3 여성 무직 \n", + "4 남성 학생 \n", + "\n", + " bot_dialog \\\n", + "0 [경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야., 고양이를 좋아... \n", + "1 [안녕, 나는 서울 사는 10대 여성이야., 나는 요즘 모든 것이 귀찮아서 사실 아... \n", + "2 [안녕, 나는 20대 남자이고 부산에 살아., 반려동물은 키우지 않는 것 같네. 너... \n", + "3 [안녕, 방송 촬영 기사 20대 여성이야., 좋은 계절이네. 나는 요즘 매일 감사해... \n", + "4 [안녕, 20대 여자야., 안녕. 무슨 일을 하는 중이야?, 나도 따야 하는데, 나... \n", + "\n", + " user_dialog \\\n", + "0 [안녕, 난 경기도에서 살고 있어. 20대 여자야., 같은 도시 사람이네. 나는 고... \n", + "1 [안녕, 나는 10대 여성이고, 속초에 살고 있어., 같은 10대라니 반가워. 나는... \n", + "2 [안녕, 나는 20대 여자야., 안녕, 혹시 반려동물은 키워?, 나는 앵무새 한 마... \n", + "3 [안녕, 나는 20대 여성 대학생이야., 어떤 일에 감사하고 있어?, 그렇군. 부럽... \n", + "4 [안녕, 나도 20대 남자야. 안녕., 나는 최근에 오픽을 따서 지금은 잠깐 쉬고 ... \n", + "\n", + " prev_dialog \\\n", + "0 [Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠... \n", + "1 [Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅찬... \n", + "2 [Bot:그렇군. 나는 힙합 음악 좋아하는데 힙합은 어때?, User:힙합은 정말 ... \n", + "3 [Bot:벌써 하루가 지났네. 뭐하고 있어?, User:오늘 친구를 만나고 왔어. ... \n", + "4 [Bot:오, 그렇구나. 너무 비싸지 않아?, User:몇년 전에 맥그리거와 메이웨... \n", + "\n", + " new_input bot_dialog_len \\\n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. 6 \n", + "1 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. 13 \n", + "2 원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데. 9 \n", + "3 응, 군인 친구를 면회 가 본 적 있어? 11 \n", + "4 그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해? 12 \n", + "\n", + " user_dialog_len prev_dialog_len \n", + "0 6 5 \n", + "1 13 5 \n", + "2 9 5 \n", + "3 9 5 \n", + "4 11 5 " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_persona.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_persona.to_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled3_banmal_0.85.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 280 dialogue cut\n", + "import pandas as pd\n", + "\n", + "vl_2 = pd.read_csv('korean_msc/preprocessing/vl_session2_geval_v2.csv')\n", + "vl_2 = vl_2.head(280)\n", + "vl_2.to_csv('korean_msc/preprocessing/geval_v2_280.csv', index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "vl_2 = pd.read_csv('korean_msc/preprocessing/geval_v2_280.csv')\n", + "vl_2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "def preprocess(data):\n", + " eval_df = pd.DataFrame(columns=['id', 'src_list', 'context_list', 'output_list'])\n", + " \n", + " tqdm.pandas()\n", + " # '\\n' join - row마다!\n", + " eval_df['id'] = data['id']\n", + " eval_df['src_list'] = data['total_dialog'].progress_apply(lambda x : eval(x))\n", + " eval_df['context_list'] = data['persona'].progress_apply(lambda x : eval(x))\n", + "\n", + " return eval_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vl_2 = preprocess(vl_2)\n", + "vl_2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 누적 발화 개수가 몇 개인지 \n", + "vl_2['src_list_cnt'] = vl_2['src_list'].apply(lambda x: len(x))\n", + "vl_2['context_list_cnt'] = vl_2['context_list'].apply(lambda x: len(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "vl_2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(vl_2.groupby('id').sum()['src_list_cnt'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(vl_2.groupby('id').sum()['context_list_cnt'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame(vl_2.groupby('id').count())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "true_friend", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From d4105dd838fc6b98c2ba054b70d076a81dddf582 Mon Sep 17 00:00:00 2001 From: hwyewon Date: Mon, 25 Mar 2024 15:35:06 +0900 Subject: [PATCH 03/10] Make single-turn uttrance prediction with SOLAR-KO --- g_eval/g_eval_model_prediction.ipynb | 8426 ++++++++++++++++++++++++++ 1 file changed, 8426 insertions(+) create mode 100644 g_eval/g_eval_model_prediction.ipynb diff --git a/g_eval/g_eval_model_prediction.ipynb b/g_eval/g_eval_model_prediction.ipynb new file mode 100644 index 0000000..5566a37 --- /dev/null +++ b/g_eval/g_eval_model_prediction.ipynb @@ -0,0 +1,8426 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 모델 예측\n", + "\n", + "* open-solar-ko를 가지고 주어진 이전 대화, 사용자 페르소나, 챗봇 페르소나로부터 bot의 다음 발화를 생성" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 평가 데이터 불러오기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "src_list, context_list만 있는 dataframe으로 편집" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "import pandas as pd\n", + "eval_vl2 = pd.read_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled_banmal.csv')\n", + "# eval_vl3 = pd.read_csv('korean_msc/preprocessing/VL_session3_geval_v4_sampled.csv')\n", + "# eval_vl4 = pd.read_csv('korean_msc/preprocessing/VL_session4_geval_banmal_persona_pred.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2['bot_persona'] = eval_vl2['bot_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['user_persona'] = eval_vl2['user_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['bot_dialog'] = eval_vl2['bot_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['user_dialog'] = eval_vl2['user_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['prev_dialog'] = eval_vl2.apply(lambda x: eval(x['prev_dialog'])[1:] + x['new_input'], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "import pandas as pd\n", + "\n", + "def preprocess(data):\n", + " eval_df = pd.DataFrame(columns=['user_persona', 'bot_persona', 'prev_dialog', 'response'])\n", + " \n", + " tqdm.pandas()\n", + " # '\\n' join - row마다!\n", + " eval_df['user_persona'] = data['user_persona'].progress_apply(lambda x : ''.join(x))\n", + " eval_df['bot_persona'] = data['bot_persona'].progress_apply(lambda x : ''.join(x))\n", + " eval_df['prev_dialog'] = data['prev_dialog'].progress_apply(lambda x : ''.join(x))\n", + " eval_df['response'] = data['response'].progress_apply(lambda x : ''.join(x))\n", + " \n", + " return eval_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2 = preprocess(eval_vl2)\n", + "eval_vl2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2.loc[0, 'user_persona']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model Prediction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "https://python.langchain.com/docs/integrations/llms/llamacpp" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.callbacks.manager import CallbackManager\n", + "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", + "from langchain.chains import LLMChain\n", + "from langchain.prompts import PromptTemplate\n", + "from langchain_community.llms import LlamaCpp\n", + "\n", + "n_gpu_layers = -1 # The number of layers to put on the GPU. The rest will be on the CPU. If you don't know how many layers there are, you can use -1 to move all to GPU.\n", + "n_batch = 4096 # Should be between 1 and n_ctx, consider the amount of VRAM in your GPU.\n", + "\n", + "# Callbacks support token-wise streaming\n", + "callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2가지로 구성\n", + "\n", + "1. 최근 5-turn의 대화\n", + "2. 추출한 사용자 페르소나 + 최근 5-turn의 대화\n", + "\n", + "-> 근데 이게 챗봇 페르소나가 아니라 MSC의 사용자 1과 이뤄진 대화이기 때문에 챗봇 페르소나를 넣는 것이 불가능!\n", + "\n", + "\n", + "----\n", + "\n", + "따라서 챗봇 페르소나를 제외하고 실험 진행\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> 프롬프트 수정 필요" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PromptTemplate(input_variables=['bot_age', 'bot_gender', 'bot_persona', 'new_input', 'prev_dialog', 'user_age', 'user_gender', 'user_persona'], template='지금부터 아래의 [챗봇 페르소나]를 가진 인물이 되어, [상대 페르소나]를 고려한 대화를 수행한다.\\n[챗봇 페르소나]\\n- 나이:{bot_age}\\n- 성별:{bot_gender}\\n- 성격:{bot_persona}\\n\\n[사용자 기본 정보]\\n- 나이:{user_age}\\n- 성별:{user_gender}\\n\\n[대화 예시]\\nBot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠져서 첼로연주를 쉬어야 해.\\nUser:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?\\nBot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.\\nUser:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?\\nBot:3개월째 배우고 있는데, 중급단계를 배우고 있어.\\n\\n[현재 발화 관련 사용자 정보]\\n{user_persona}\\n\\n지금까지의 프롬프트를 읽고 [챗봇 정보]의 인물이 되어 대답하고, [사용자 정보]와 [현재 발화 관련 사용자 정보]에 기반하여 친절하고 예의있게 답변하라.\\n{prev_dialog}\\nUser:{new_input}\\nBot:')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_DEFAULT_TEMPLATE = \"\"\"지금부터 아래의 [챗봇 페르소나]를 가진 인물이 되어, [상대 페르소나]를 고려한 대화를 수행한다.\n", + "[챗봇 페르소나]\n", + "- 나이:{bot_age}\n", + "- 성별:{bot_gender}\n", + "- 성격:{bot_persona}\n", + "\n", + "[사용자 기본 정보]\n", + "- 나이:{user_age}\n", + "- 성별:{user_gender}\n", + "\n", + "[대화 예시]\n", + "Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠져서 첼로연주를 쉬어야 해.\n", + "User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?\n", + "Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.\n", + "User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?\n", + "Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.\n", + "\n", + "[현재 발화 관련 사용자 정보]\n", + "{user_persona}\n", + "\n", + "지금까지의 프롬프트를 읽고 [챗봇 정보]의 인물이 되어 대답하고, [사용자 정보]와 [현재 발화 관련 사용자 정보]에 기반하여 친절하고 예의있게 답변하라.\n", + "{prev_dialog}\n", + "User:{new_input}\n", + "Bot:\"\"\"\n", + "\n", + "prompt = PromptTemplate.from_template(_DEFAULT_TEMPLATE)\n", + "prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_input
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ...20대여성기능직['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를...['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나...['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.
1K5-03865-CL74427-CP10762-07-02-S2.json가족2['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는...20대남성학생['나의 형은 자동차 정비원이다']20대남성무직['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '...['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히...['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면...괜찮아. 너는 어머니하고 사이 좋아?
2K2-08382-CL20425-CP21061-17-08-S2.json건강2['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '...20대남성학생['나는 미국으로 어학연수를 간다']20대남성무직['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ...['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를...['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ...맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.
3K2-31842-CL23868-CP23582-17-06-S2.json건강2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'...20대남성학생['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ...20대여성자영업['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업...['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ...['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'...그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.
4K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사...['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워....['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K5-03865-CL74427-CP10762-07-02-S2.json 가족 2 \n", + "2 K2-08382-CL20425-CP21061-17-08-S2.json 건강 2 \n", + "3 K2-31842-CL23868-CP23582-17-06-S2.json 건강 2 \n", + "4 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는... 20대 남성 \n", + "2 ['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'... 20대 남성 \n", + "4 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ... 20대 \n", + "1 학생 ['나의 형은 자동차 정비원이다'] 20대 \n", + "2 학생 ['나는 미국으로 어학연수를 간다'] 20대 \n", + "3 학생 ['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ... 20대 \n", + "4 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 남성 무직 \n", + "2 남성 무직 \n", + "3 여성 자영업 \n", + "4 여성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 ['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를... \n", + "1 ['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '... \n", + "2 ['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ... \n", + "3 ['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업... \n", + "4 ['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나... \n", + "1 ['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히... \n", + "2 ['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를... \n", + "3 ['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ... \n", + "4 ['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워.... \n", + "\n", + " prev_dialog \\\n", + "0 ['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바... \n", + "1 ['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면... \n", + "2 ['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ... \n", + "3 ['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'... \n", + "4 ['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅... \n", + "\n", + " new_input \n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. \n", + "1 괜찮아. 너는 어머니하고 사이 좋아? \n", + "2 맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해. \n", + "3 그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자. \n", + "4 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "eval_vl2 = pd.read_csv('./korean_msc/preprocessing/VL_session2_geval_v6_sampled_banmal.csv')\n", + "eval_vl2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2['bot_persona'] = eval_vl2['bot_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['user_persona'] = eval_vl2['user_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['bot_dialog'] = eval_vl2['bot_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['user_dialog'] = eval_vl2['user_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['prev_dialog'] = eval_vl2['prev_dialog'].apply(lambda x: eval(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠져서 첼로연주를 쉬어야 해.',\n", + " 'User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?',\n", + " 'Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.',\n", + " 'User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?',\n", + " 'Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_vl2.loc[0, 'prev_dialog']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['나는 여자이다.',\n", + " '나는 20대이다.',\n", + " '나는 고양이 두 마리를 키운다.',\n", + " '나는 밴드부 동아리에 관심이 없다.',\n", + " '나는 일식을 싫어한다.']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_vl2.loc[0, 'bot_persona'] # 지우 프롬프트도 이런 식으로 수정" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_vl2.loc[0, 'new_input']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "prev 5-turn + user input" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import convert_to_json\n", + "import json\n", + "from tqdm import tqdm\n", + "import traceback\n", + "\n", + "def make_json_data(origin_data, data_name, model, prompt, persona, json_path=\"./\"):\n", + " print('## Data info ##')\n", + " print(f\"dataset name : {data_name} data length : {origin_data.shape}\")\n", + " print('## Model info ##')\n", + " print(model)\n", + "\n", + " preprocessed_data = pd.DataFrame(columns=['user_persona', 'bot_persona', 'prev_dialog', 'response'])\n", + "\n", + " # row마다 하나씩 넣기\n", + " for idx in tqdm(range(len(origin_data))):\n", + " llm_chain = LLMChain(prompt=prompt, llm=model)\n", + " try:\n", + " preprocessed_data.loc[idx, 'bot_persona'] = origin_data.loc[idx, 'bot_persona']\n", + " preprocessed_data.loc[idx, 'prev_dialog'] = origin_data.loc[idx, 'prev_dialog'][1:] + [\"User:\" + origin_data.loc[idx, 'new_input']]\n", + " \n", + " if persona == True:\n", + " preprocessed_data.at[idx, 'user_persona'] = origin_data.loc[idx, 'user_persona']\n", + " preprocessed_data.at[idx, 'response'] = llm_chain.invoke(\n", + " {'bot_age' : origin_data.loc[idx, 'bot_age'], \n", + " 'bot_gender' : origin_data.loc[idx, 'bot_gender'],\n", + " 'bot_persona' : ' '.join(origin_data.loc[idx, 'bot_persona']),\n", + " 'user_age' : origin_data.loc[idx, 'user_age'],\n", + " 'user_gender' : origin_data.loc[idx, 'user_gender'],\n", + " 'user_persona': ' '.join(origin_data.loc[idx, 'user_persona']),\n", + " 'new_input': origin_data.loc[idx, 'new_input'],\n", + " 'prev_dialog': '\\n'.join(origin_data.loc[idx, 'prev_dialog'])\n", + " })['text']\n", + " else:\n", + " preprocessed_data.at[idx, 'user_persona'] = \"\"\n", + " preprocessed_data.at[idx, 'response'] = llm_chain.invoke(\n", + " {'bot_age' : origin_data.loc[idx, 'bot_age'], \n", + " 'bot_gender' : origin_data.loc[idx, 'bot_gender'],\n", + " 'bot_persona' : ' '.join(origin_data.loc[idx, 'bot_persona']),\n", + " 'user_age' : origin_data.loc[idx, 'user_age'],\n", + " 'user_gender' : origin_data.loc[idx, 'user_gender'],\n", + " 'user_persona': \"\",\n", + " 'new_input': origin_data.loc[idx, 'new_input'],\n", + " 'prev_dialog': '\\n'.join(origin_data.loc[idx, 'prev_dialog'])\n", + " })['text']\n", + " # 끊겼을 때 예외처리\n", + " except Exception as ex:\n", + " print(f\"error occured in {idx}\")\n", + " err_msg = traceback.format_exc()\n", + " print(\"## Error : \", err_msg)\n", + " data = convert_to_json(user_persona=preprocessed_data['user_persona'], bot_persona=preprocessed_data['bot_persona'],\n", + " prev_dialog=preprocessed_data['prev_dialog'], response=preprocessed_data['response'])\n", + " \n", + " with open(f\"{json_path}/{data_name}.json\", \"w\", encoding=\"UTF-8\") as json_file:\n", + " json.dump(data, json_file, ensure_ascii=False)\n", + " print(f'## JSON Converted in {json_path}/{data_name}.json##')\n", + " print(data)\n", + " return data\n", + " \n", + " data = convert_to_json(user_persona=preprocessed_data['user_persona'], bot_persona=preprocessed_data['bot_persona'],\n", + " prev_dialog=preprocessed_data['prev_dialog'], response=preprocessed_data['response'])\n", + " \n", + " with open(f\"{json_path}/{data_name}.json\", \"w\", encoding=\"UTF-8\") as json_file:\n", + " json.dump(data, json_file, ensure_ascii=False, indent=4)\n", + "\n", + " print(f'## JSON Converted in {json_path} as {data_name}.json##')\n", + " print(data)\n", + " \n", + " return data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### OPEN-SOLAR-KO-10_7B" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "llama_model_loader: loaded meta data with 21 key-value pairs and 435 tensors from ./solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf (version GGUF V3 (latest))\n", + "llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.\n", + "llama_model_loader: - kv 0: general.architecture str = llama\n", + "llama_model_loader: - kv 1: general.name str = LLaMA v2\n", + "llama_model_loader: - kv 2: llama.context_length u32 = 4096\n", + "llama_model_loader: - kv 3: llama.embedding_length u32 = 4096\n", + "llama_model_loader: - kv 4: llama.block_count u32 = 48\n", + "llama_model_loader: - kv 5: llama.feed_forward_length u32 = 14336\n", + "llama_model_loader: - kv 6: llama.rope.dimension_count u32 = 128\n", + "llama_model_loader: - kv 7: llama.attention.head_count u32 = 32\n", + "llama_model_loader: - kv 8: llama.attention.head_count_kv u32 = 8\n", + "llama_model_loader: - kv 9: llama.attention.layer_norm_rms_epsilon f32 = 0.000010\n", + "llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000\n", + "llama_model_loader: - kv 11: general.file_type u32 = 16\n", + "llama_model_loader: - kv 12: tokenizer.ggml.model str = llama\n", + "llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,46592] = [\"\", \"\", \"\", \"<0x00>\", \"<...\n", + "llama_model_loader: - kv 14: tokenizer.ggml.scores arr[f32,46592] = [-1000.000000, -1000.000000, -1000.00...\n", + "llama_model_loader: - kv 15: tokenizer.ggml.token_type arr[i32,46592] = [3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...\n", + "llama_model_loader: - kv 16: tokenizer.ggml.bos_token_id u32 = 1\n", + "llama_model_loader: - kv 17: tokenizer.ggml.eos_token_id u32 = 2\n", + "llama_model_loader: - kv 18: tokenizer.ggml.unknown_token_id u32 = 0\n", + "llama_model_loader: - kv 19: tokenizer.ggml.padding_token_id u32 = 2\n", + "llama_model_loader: - kv 20: general.quantization_version u32 = 2\n", + "llama_model_loader: - type f32: 97 tensors\n", + "llama_model_loader: - type q5_K: 337 tensors\n", + "llama_model_loader: - type q6_K: 1 tensors\n", + "llm_load_vocab: mismatch in special tokens definition ( 700/46592 vs 695/46592 ).\n", + "llm_load_print_meta: format = GGUF V3 (latest)\n", + "llm_load_print_meta: arch = llama\n", + "llm_load_print_meta: vocab type = SPM\n", + "llm_load_print_meta: n_vocab = 46592\n", + "llm_load_print_meta: n_merges = 0\n", + "llm_load_print_meta: n_ctx_train = 4096\n", + "llm_load_print_meta: n_embd = 4096\n", + "llm_load_print_meta: n_head = 32\n", + "llm_load_print_meta: n_head_kv = 8\n", + "llm_load_print_meta: n_layer = 48\n", + "llm_load_print_meta: n_rot = 128\n", + "llm_load_print_meta: n_embd_head_k = 128\n", + "llm_load_print_meta: n_embd_head_v = 128\n", + "llm_load_print_meta: n_gqa = 4\n", + "llm_load_print_meta: n_embd_k_gqa = 1024\n", + "llm_load_print_meta: n_embd_v_gqa = 1024\n", + "llm_load_print_meta: f_norm_eps = 0.0e+00\n", + "llm_load_print_meta: f_norm_rms_eps = 1.0e-05\n", + "llm_load_print_meta: f_clamp_kqv = 0.0e+00\n", + "llm_load_print_meta: f_max_alibi_bias = 0.0e+00\n", + "llm_load_print_meta: n_ff = 14336\n", + "llm_load_print_meta: n_expert = 0\n", + "llm_load_print_meta: n_expert_used = 0\n", + "llm_load_print_meta: pooling type = 0\n", + "llm_load_print_meta: rope type = 0\n", + "llm_load_print_meta: rope scaling = linear\n", + "llm_load_print_meta: freq_base_train = 10000.0\n", + "llm_load_print_meta: freq_scale_train = 1\n", + "llm_load_print_meta: n_yarn_orig_ctx = 4096\n", + "llm_load_print_meta: rope_finetuned = unknown\n", + "llm_load_print_meta: model type = 34B\n", + "llm_load_print_meta: model ftype = Q5_K - Small\n", + "llm_load_print_meta: model params = 10.85 B\n", + "llm_load_print_meta: model size = 6.97 GiB (5.52 BPW) \n", + "llm_load_print_meta: general.name = LLaMA v2\n", + "llm_load_print_meta: BOS token = 1 ''\n", + "llm_load_print_meta: EOS token = 2 ''\n", + "llm_load_print_meta: UNK token = 0 ''\n", + "llm_load_print_meta: PAD token = 2 ''\n", + "llm_load_print_meta: LF token = 13 '<0x0A>'\n", + "llm_load_tensors: ggml ctx size = 0.17 MiB\n", + "llm_load_tensors: CPU buffer size = 7139.94 MiB\n", + "...................................................................................................\n", + "llama_new_context_with_model: n_ctx = 2048\n", + "llama_new_context_with_model: freq_base = 10000.0\n", + "llama_new_context_with_model: freq_scale = 1\n", + "llama_kv_cache_init: CPU KV buffer size = 384.00 MiB\n", + "llama_new_context_with_model: KV self size = 384.00 MiB, K (f16): 192.00 MiB, V (f16): 192.00 MiB\n", + "llama_new_context_with_model: CPU input buffer size = 64.04 MiB\n", + "llama_new_context_with_model: CPU compute buffer size = 640.00 MiB\n", + "llama_new_context_with_model: graph splits (measure): 1\n", + "AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 0 | VSX = 0 | MATMUL_INT8 = 0 | \n", + "Model metadata: {'general.name': 'LLaMA v2', 'general.architecture': 'llama', 'llama.context_length': '4096', 'llama.rope.dimension_count': '128', 'llama.embedding_length': '4096', 'llama.block_count': '48', 'llama.feed_forward_length': '14336', 'llama.attention.head_count': '32', 'tokenizer.ggml.eos_token_id': '2', 'general.file_type': '16', 'llama.attention.head_count_kv': '8', 'llama.attention.layer_norm_rms_epsilon': '0.000010', 'llama.rope.freq_base': '10000.000000', 'tokenizer.ggml.model': 'llama', 'general.quantization_version': '2', 'tokenizer.ggml.bos_token_id': '1', 'tokenizer.ggml.unknown_token_id': '0', 'tokenizer.ggml.padding_token_id': '2'}\n", + "Using fallback chat format: None\n" + ] + } + ], + "source": [ + "# Make sure the model path is correct for your system!\n", + "solar = LlamaCpp(\n", + " model_path=\"./solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf\",\n", + " n_gpu_layers=n_gpu_layers,\n", + " n_batch=n_batch,\n", + " callback_manager=callback_manager,\n", + " temperature=0.9,\n", + " top_p=0.95,\n", + " top_k=30,\n", + " max_tokens=256,\n", + " n_ctx=2048,\n", + " stop=[\"User:\", \"Bot:\", \"\\n\", \"ᄏ\"*6, \"ᄒ\"*6, \"ㅠ\"*6, \"ᄋ\"*6, \"ㅋ\"*6, \"ㅎ\"*6, \"ㅠ\"*6, \"ㅇ\"*6],\n", + " model_kwargs={\n", + " 'min_p':0.7,\n", + " 'repeatition_penalty': 1.4,\n", + " 'no_repeat_ngram_size': 6,\n", + " 'repeat_last_n' : 10,\n", + " 'early_stopping': True\n", + " },\n", + " verbose=True, # Verbose is required to pass to the callback manager\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## Data info ##\n", + "dataset name : GEVAL_solar_vl2_persona data length : (54, 15)\n", + "## Model info ##\n", + "\u001b[1mLlamaCpp\u001b[0m\n", + "Params: {'model_path': './solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf', 'suffix': None, 'max_tokens': 256, 'temperature': 0.9, 'top_p': 0.95, 'logprobs': None, 'echo': False, 'stop_sequences': ['User:', 'Bot:', '\\n', 'ᄏᄏᄏᄏᄏᄏ', 'ᄒᄒᄒᄒᄒᄒ', 'ㅠㅠㅠㅠㅠㅠ', 'ᄋᄋᄋᄋᄋᄋ', 'ㅋㅋㅋㅋㅋㅋ', 'ㅎㅎㅎㅎㅎㅎ', 'ㅠㅠㅠㅠㅠㅠ', 'ㅇㅇㅇㅇㅇㅇ'], 'repeat_penalty': 1.1, 'top_k': 30}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/54 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_inputbot_dialog_lenuser_dialog_lenprev_dialog_len
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다']20대여성기능직['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를...['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나...['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.665
1K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사...['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워....['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.13135
2K5-02414-CL72610-CP20868-03-09-S2.json교통2['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.',...20대남성학생['나는 힙합 음악을 좋아한다']20대여성학생['안녕, 나는 20대 남자이고 부산에 살아.', '반려동물은 키우지 않는 것 같네...['안녕, 나는 20대 여자야.', '안녕, 혹시 반려동물은 키워?', '나는 앵무...['Bot:그렇군. 나는 힙합 음악 좋아하는데 힙합은 어때?', 'User:힙합은 ...원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데.995
3K2-12979-CL21957-CP22405-05-09-S2.json군대2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 감사하다', '나...20대여성사무직['나는 친구가 군인이다']20대여성무직['안녕, 방송 촬영 기사 20대 여성이야.', '좋은 계절이네. 나는 요즘 매일 ...['안녕, 나는 20대 여성 대학생이야.', '어떤 일에 감사하고 있어?', '그렇...['Bot:벌써 하루가 지났네. 뭐하고 있어?', 'User:오늘 친구를 만나고 왔...응, 군인 친구를 면회 가 본 적 있어?1195
4K2-03595-CL21596-CP20720-19-05-S2.json방송/연예2['나는 여자이다.', '나는 20대이다.', '나는 토끼 두 마리를 키운다.', ...20대여성학생['나는 @브랜드명1@를 본다']20대남성학생['안녕, 20대 여자야.', '안녕. 무슨 일을 하는 중이야?', '나도 따야 하...['안녕, 나도 20대 남자야. 안녕.', '나는 최근에 오픽을 따서 지금은 잠깐 ...['Bot:오, 그렇구나. 너무 비싸지 않아?', 'User:몇년 전에 맥그리거와 ...그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?12115
\n", + "" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "2 K5-02414-CL72610-CP20868-03-09-S2.json 교통 2 \n", + "3 K2-12979-CL21957-CP22405-05-09-S2.json 군대 2 \n", + "4 K2-03595-CL21596-CP20720-19-05-S2.json 방송/연예 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "2 ['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.',... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 감사하다', '나... 20대 여성 \n", + "4 ['나는 여자이다.', '나는 20대이다.', '나는 토끼 두 마리를 키운다.', ... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다'] 20대 \n", + "1 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "2 학생 ['나는 힙합 음악을 좋아한다'] 20대 \n", + "3 사무직 ['나는 친구가 군인이다'] 20대 \n", + "4 학생 ['나는 @브랜드명1@를 본다'] 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 여성 무직 \n", + "2 여성 학생 \n", + "3 여성 무직 \n", + "4 남성 학생 \n", + "\n", + " bot_dialog \\\n", + "0 ['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를... \n", + "1 ['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사... \n", + "2 ['안녕, 나는 20대 남자이고 부산에 살아.', '반려동물은 키우지 않는 것 같네... \n", + "3 ['안녕, 방송 촬영 기사 20대 여성이야.', '좋은 계절이네. 나는 요즘 매일 ... \n", + "4 ['안녕, 20대 여자야.', '안녕. 무슨 일을 하는 중이야?', '나도 따야 하... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나... \n", + "1 ['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워.... \n", + "2 ['안녕, 나는 20대 여자야.', '안녕, 혹시 반려동물은 키워?', '나는 앵무... \n", + "3 ['안녕, 나는 20대 여성 대학생이야.', '어떤 일에 감사하고 있어?', '그렇... \n", + "4 ['안녕, 나도 20대 남자야. 안녕.', '나는 최근에 오픽을 따서 지금은 잠깐 ... \n", + "\n", + " prev_dialog \\\n", + "0 ['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바... \n", + "1 ['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅... \n", + "2 ['Bot:그렇군. 나는 힙합 음악 좋아하는데 힙합은 어때?', 'User:힙합은 ... \n", + "3 ['Bot:벌써 하루가 지났네. 뭐하고 있어?', 'User:오늘 친구를 만나고 왔... \n", + "4 ['Bot:오, 그렇구나. 너무 비싸지 않아?', 'User:몇년 전에 맥그리거와 ... \n", + "\n", + " new_input bot_dialog_len \\\n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. 6 \n", + "1 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. 13 \n", + "2 원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데. 9 \n", + "3 응, 군인 친구를 면회 가 본 적 있어? 11 \n", + "4 그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해? 12 \n", + "\n", + " user_dialog_len prev_dialog_len \n", + "0 6 5 \n", + "1 13 5 \n", + "2 9 5 \n", + "3 9 5 \n", + "4 11 5 " + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_vl2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "eval_vl2['bot_persona'] = eval_vl2['bot_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['user_persona'] = eval_vl2['user_persona'].apply(lambda x: eval(x))\n", + "eval_vl2['bot_dialog'] = eval_vl2['bot_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['user_dialog'] = eval_vl2['user_dialog'].apply(lambda x: eval(x))\n", + "eval_vl2['prev_dialog'] = eval_vl2.apply(lambda x: eval(x['prev_dialog']), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바빠져서 첼로연주를 쉬어야 해.',\n", + " 'User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?',\n", + " 'Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.',\n", + " 'User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?',\n", + " 'Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.']" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_vl2.loc[0, 'prev_dialog']" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## Data info ##\n", + "dataset name : GEVAL_solar_vl2_1_0.85 data length : (13, 18)\n", + "## Model info ##\n", + "\u001b[1mLlamaCpp\u001b[0m\n", + "Params: {'model_path': './solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf', 'suffix': None, 'max_tokens': 256, 'temperature': 0.9, 'top_p': 0.95, 'logprobs': None, 'echo': False, 'stop_sequences': ['User:', 'Bot:', '\\n', 'ᄏᄏᄏᄏᄏᄏ', 'ᄒᄒᄒᄒᄒᄒ', 'ㅠㅠㅠㅠㅠㅠ', 'ᄋᄋᄋᄋᄋᄋ', 'ㅋㅋㅋㅋㅋㅋ', 'ㅎㅎㅎㅎㅎㅎ', 'ㅠㅠㅠㅠㅠㅠ', 'ㅇㅇㅇㅇㅇㅇ'], 'repeat_penalty': 1.1, 'top_k': 30}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/13 [00:00 Date: Mon, 25 Mar 2024 15:35:57 +0900 Subject: [PATCH 04/10] Add convert_to_json function --- g_eval/utils.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 g_eval/utils.py diff --git a/g_eval/utils.py b/g_eval/utils.py new file mode 100644 index 0000000..80ab72c --- /dev/null +++ b/g_eval/utils.py @@ -0,0 +1,101 @@ +from prettytable import PrettyTable + +def convert_to_json(user_persona, bot_persona, prev_dialog, response): + """ + Convert the data into the json format. + + user_persona : 페르소나 추출 모델로 추출해낸 top-3개 (threshold=0.8) 의 유저 페르소나 + bot_persona : MSC 데이터셋에서 제공된 fix된 페르소나 문장 + prev_dialog : 이전 5-turn의 대화 + response : 다음 turn에 발화할 것으로 예측되는 챗봇의 답변 + """ + json_data = [] + for i in range(len(response)): + cur = {} + cur['response'] = response[i] + if user_persona is not None: + cur['user_persona'] = user_persona[i] + if bot_persona is not None: + cur['bot_persona'] = bot_persona[i] + if prev_dialog is not None: + cur['prev_dialog'] = prev_dialog[i] + json_data.append(cur) + return json_data + + +def add_question(dimension, output, src=None, ref=None, context=None, task=None): + """ + Add questions to generate input in Bool-QA format for UniEval. + + dimension: specific dimension to be evaluated + src: source input for different NLG tasks. For example, source document for summarization + and dialogue history for dialogue response generation. + output: output text generated by the models + ref: human-annotataed groundtruth + context: the context needed to evaluate several specific dimension. For example, + additional factual information when evaluating engagingness and groundedness in dialogues. + """ + + input_with_question = [] + for i in range(len(output)): + # For summarization + if task == 'summarization': + if dimension == 'fluency': + cur_input = 'question: Is this a fluent paragraph? paragraph: ' + output[i] + elif dimension == 'coherence': + cur_input = 'question: Is this a coherent summary to the document? summary: ' + output[i] + ' document: ' + src[i] + elif dimension == 'consistency': + cur_input = 'question: Is this claim consistent with the document? claim: ' + output[i] + ' document: ' + src[i] + elif dimension == 'relevance': + cur_input = 'question: Is this summary relevant to the reference? summary: ' + output[i] + ' reference: ' + ref[i] + else: + raise NotImplementedError('The input format for this dimension is still undefined. Please customize it first.') + # For dialogues + elif task == 'dialogue': + if dimension == 'naturalness': + cur_input = 'question: Is this a natural response in the dialogue? response: ' + output[i] + elif dimension == 'coherence': + cur_input = 'question: Is this a coherent response given the dialogue history? response: '\ + + output[i] + ' dialogue history: ' + src[i] + elif dimension == 'engagingness': + cur_input = 'question: Is this an engaging and informative response according to the dialogue history and fact? response: '\ + + output[i] + ' dialogue history: ' + src[i] + ' fact: ' + context[i] + elif dimension == 'groundedness': + cur_input = 'question: Is this response consistent with knowledge in the fact? response: '\ + + output[i] + ' fact: ' + context[i] + elif dimension == 'understandability': + cur_input = 'question: Is this an understandable response in the dialogue? response: ' + output[i] + else: + raise NotImplementedError('The input format for this dimension is still undefined. Please customize it first.') + # For data-to-text + elif task == 'data2text': + if dimension == 'naturalness': + cur_input = 'question: Is this a fluent utterance? utterance: ' + output[i] + elif dimension == 'informativeness': + cur_input = 'question: Is this sentence informative according to the reference? sentence: '\ + + output[i] + ' reference: ' + ref[i] + else: + raise NotImplementedError('The input format for this dimension is still undefined. Please customize it first.') + # For factual consistency detection + elif task == 'fact': + if dimension == 'consistency': + cur_input = 'question: Is this claim consistent with the document? claim: ' + output[i] + ' document: ' + src[i] + else: + raise NotImplementedError('No other dimensions for the factual consistency detection task.') + # For new customized tasks + else: + raise NotImplementedError('Other tasks are not implemented, please customize specific tasks here.') + input_with_question.append(cur_input) + return input_with_question + + +def print_scores(scores): + table = PrettyTable(['Dimensions','Score']) + print('\nEvaluation scores are shown below:') + dims = list(scores[0].keys()) + for dim in dims: + cur_score = 0 + for i in range(len(scores)): + cur_score += scores[i][dim] + table.add_row([dim, round(cur_score / len(scores), 6)]) + print(table) \ No newline at end of file From f95bce01f2cce3b299ad0122a177d2bb3676134c Mon Sep 17 00:00:00 2001 From: hwyewon Date: Mon, 25 Mar 2024 15:38:52 +0900 Subject: [PATCH 05/10] Add Evaluate code by GPT-4 --- g_eval/g_eval_evaluate.ipynb | 4945 ++++++++++++++++++++++++++++++++++ 1 file changed, 4945 insertions(+) create mode 100644 g_eval/g_eval_evaluate.ipynb diff --git a/g_eval/g_eval_evaluate.ipynb b/g_eval/g_eval_evaluate.ipynb new file mode 100644 index 0000000..59d5795 --- /dev/null +++ b/g_eval/g_eval_evaluate.ipynb @@ -0,0 +1,4945 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# G-Eval\n", + "\n", + "* Naturalness(1-5) : 응답이 사람의 자연스러운 발화와 같은지 판단\n", + "* coherence (1-5) : 이전 대화와 이어지는지 (연속적인지) 판단\n", + "* Engagingness (1-3) : 응답이 흥미로운지 지루한지 판단\n", + "* Groundedness (1-3) : 응답이 사실을 포함하는지\n", + "\n", + "----\n", + "\n", + "논문 원문에서는 Engagingness 지표에 대한 scale & definition만 나와있으므로 나머지는 직접 설계해야 함\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GPT api call\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from openai import OpenAI\n", + "import os\n", + "import dotenv\n", + "\n", + "dotenv_file = dotenv.find_dotenv()\n", + "dotenv.load_dotenv(dotenv_file)\n", + "\n", + "client = OpenAI(\n", + " # This is the default and can be omitted\n", + " api_key=os.environ[\"OPENAI_API_KEY\"],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 생성된 CoT 불러오기" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "coherence_prompt = open('cot/coherence_KOR3.txt').read()\n", + "engagingness_prompt = open('cot/engagingness_KOR3.txt').read()\n", + "naturalness_prompt = open('cot/naturalness_KOR3.txt').read()\n", + "groundedness_prompt = open('cot/groundedness_KOR3.txt').read()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "eval_metric = {'coherence' : coherence_prompt, 'engagingness' : engagingness_prompt, 'naturalness' : naturalness_prompt, 'groundedness' : groundedness_prompt}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 평가 함수 정의 (GPT-4)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# 저장 경로 설정\n", + "RESULT_PATH = './results'\n", + "\n", + "# 모델이 생성하지 못한 응답 예외 처리\n", + "skip_str_list = ['', '\\n']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm import tqdm\n", + "import time\n", + "from collections import Counter\n", + "import json\n", + "\n", + "def evaluate(data, info):\n", + " '''\n", + " data : 평가할 데이터\n", + " info : 어떤 모델을 평가하는지 (json file name에 쓰임)\n", + " '''\n", + " new_json = []\n", + " ignore = 0\n", + "\n", + " for instance in tqdm(data):\n", + " user_persona = '. '.join(instance['user_persona'])\n", + " bot_persona = ''.join(instance['bot_persona'])\n", + " prev_dialog = '\\n'.join(instance['prev_dialog'])\n", + " bot_response = instance['response']\n", + "\n", + " # 불용어 처리 \n", + " if bot_response in skip_str_list or len(bot_response) < 2:\n", + " ignore += 1\n", + " print(f'## {bot_response} has been ignored.\\n## total ignored : {ignore}')\n", + " continue\n", + "\n", + " # unieval 참조 - 4개의 프롬프트에 대해 실험 진행\n", + " for prompt_info, prompt in eval_metric.items():\n", + " prompt_cur = prompt.replace('{{user_persona}}', user_persona).replace('{{bot_persona}}', bot_persona).replace('{{prev_dialog}}', prev_dialog).replace('{{response}}', bot_response)\n", + "\n", + " while True:\n", + " try:\n", + " response = client.chat.completions.create(\n", + " model=\"gpt-4\",\n", + " messages=[{\"role\": \"system\", \"content\": prompt_cur}],\n", + " temperature=1,\n", + " max_tokens=1, # 정수 형태 추출\n", + " frequency_penalty=0,\n", + " presence_penalty=0,\n", + " stop=None,\n", + " n=10 # 10번 추출\n", + " )\n", + "\n", + " time.sleep(0.5)\n", + "\n", + " \n", + " all_responses = [response.choices[i].message.content for i in\n", + " range(len(response.choices))]\n", + " \n", + " # 가중합 내주기\n", + " # 전부 숫자 형태로 변환\n", + " all_responses = [int(r) for r in all_responses]\n", + " # print('## all_reponses : ', all_responses)\n", + "\n", + " # 몇 번 나왔는지 체크\n", + " counter = Counter(all_responses)\n", + " # (1*5 + 2*4 + 5*1) / 10\n", + " score = sum([key * value for key, value in counter.items()]) / len(all_responses)\n", + " print('## all_responses : ', all_responses)\n", + " print(f'## {prompt_info} score : ', score)\n", + " \n", + " # 평가 체크\n", + " instance[prompt_info] = score\n", + " break\n", + "\n", + " except Exception as e:\n", + " print(e)\n", + " if (\"limit\" in str(e)):\n", + " time.sleep(2)\n", + " else:\n", + " ignore += 1\n", + " print('ignored', ignore)\n", + " break\n", + "\n", + " new_json.append(instance)\n", + " \n", + "\n", + " print(f'## Evaluated {len(data)-ignore}/{len(data)} row! : ', )\n", + " with open(f\"{RESULT_PATH}/{info}.json\", 'w', encoding=\"UTF-8\") as f:\n", + " json.dump(new_json, f, indent=4, ensure_ascii=False)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 모델이 발화 예측 완료한 파일 불러오기" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "# G-EVAL\n", + "solar_vl2_1 = json.load(open(\"./korean_msc/preprocessing/GEVAL_solar_vl2_persona_1.json\"))\n", + "solar_vl2_no_persona_1 = json.load(open(\"./korean_msc/preprocessing/GEVAL_No_Persona_solar_vl2_1.json\"))\n", + "\n", + "solar_vl2_2 = json.load(open(\"./korean_msc/preprocessing/GEVAL_solar_vl2_persona_2.json\"))\n", + "solar_vl2_no_persona_2 = json.load(open(\"./korean_msc/preprocessing/GEVAL_No_Persona_solar_vl2_2.json\"))\n", + "\n", + "solar_vl2_3 = json.load(open(\"./korean_msc/preprocessing/GEVAL_solar_vl2_persona_1.json\"))\n", + "solar_vl2_no_persona_3 = json.load(open(\"./korean_msc/preprocessing/GEVAL_No_Persona_solar_vl2_3.json\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## total skipped in SOLAR: 0\n" + ] + } + ], + "source": [ + "skipped = 0\n", + "skip_str_list = ['', '\\n']\n", + "\n", + "for i in solar_vl2_2:\n", + " if i['response'] in skip_str_list or len(i['response']) < 2:\n", + " skipped += 1\n", + "\n", + "print('## total skipped in SOLAR: ', skipped)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## total skipped in SOLAR - No persona: 0\n" + ] + } + ], + "source": [ + "skipped = 0\n", + "skip_str_list = ['', '\\n']\n", + "\n", + "for i in solar_vl2_no_persona_2:\n", + " if i['response'] in skip_str_list or len(i['response']) < 2:\n", + " print(i['response'])\n", + " skipped += 1\n", + "\n", + "print('## total skipped in SOLAR - No persona: ', skipped)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/54 [00:00 Date: Mon, 25 Mar 2024 15:40:46 +0900 Subject: [PATCH 06/10] Add Evaluate result files --- g_eval/results/GEVAL_solar_vl2.json | 1394 +++++++++++++++++ .../results/GEVAL_solar_vl2_no_persona.json | 1224 +++++++++++++++ 2 files changed, 2618 insertions(+) create mode 100644 g_eval/results/GEVAL_solar_vl2.json create mode 100644 g_eval/results/GEVAL_solar_vl2_no_persona.json diff --git a/g_eval/results/GEVAL_solar_vl2.json b/g_eval/results/GEVAL_solar_vl2.json new file mode 100644 index 0000000..4d19f9e --- /dev/null +++ b/g_eval/results/GEVAL_solar_vl2.json @@ -0,0 +1,1394 @@ +[ + { + "response": "3개월째 배우고 있는데, 중급단계를 배우고 있어.", + "user_persona": [ + "나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다", + "나는 친구랑 일식 약속이 잡혀있다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 고양이 두 마리를 키운다.", + "나는 밴드부 동아리에 관심이 없다.", + "나는 일식을 싫어한다." + ], + "prev_dialog": [ + "User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?", + "Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.", + "User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?", + "Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.", + "User:빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게." + ], + "coherence": 1.0, + "engagingness": 1.0, + "naturalness": 1.0, + "groundedness": 1.1 + }, + { + "response": "응, 난 어머니한테 잘 하는 편이야.", + "user_persona": [ + "나의 형은 자동차 정비원이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 거주지는 대구이다.", + "나는 워드프로세서 자격증을 준비한다.", + "나는 단소 연주를 배우고 싶다.", + "나는 요즘 어머니에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm를 못 넘기면 사람 취급도 못 받는다고 하더라고.", + "Bot:아 그렇군. 그런 말은 다소 너무하다는 생각도 가끔 들어.", + "User:그래서 더 이악물고 운동하는 것 같기도해.", + "Bot:화이팅이야. 어머니가 좀 다소 옛날분이셔서 그런 생각을 하셨나봐.", + "User:괜찮아. 너는 어머니하고 사이 좋아?" + ], + "coherence": 5.0, + "engagingness": 3.1, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "너도 꼭 조심하고!", + "user_persona": [ + "나는 미국으로 어학연수를 간다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 커피를 최근에 끊었다.", + "나는 2년 전에 이사를 했다.", + "나는 매운 음식을 좋아한다." + ], + "prev_dialog": [ + "User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해.", + "Bot:선생님은 어학연수를 가셔야 하는데, 나보다 더 조심하셔야 하는 거 알지?", + "User:응, 맞아. 나도 항상 그래서 조심하고 또 조심해.", + "Bot:미국에서는 병원비도 장난 아니라고 들었어.", + "User:맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해." + ], + "coherence": 4.9, + "engagingness": 2.4, + "naturalness": 4.5, + "groundedness": 4.0 + }, + { + "response": "그래, 다음에 또 대화하자~", + "user_persona": [ + "나는 대학생이다", + "나는 심리학이 부전공이다", + "나는 카푸치노를 매일 2잔 이상 마신다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 죄책감이 든다.", + "나는 심리학이 부전공이다.", + "나는 보라색을 좋아한다.", + "나는 아이스 카푸치노를 매일 2잔 이상 마신다." + ], + "prev_dialog": [ + "User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야.", + "Bot:뭘 먹을래? 나는 카푸치노를 좋아해.", + "User:나도! 나는 카푸치노를 매일 2잔 이상 마실 정도로 좋아해.", + "Bot:굉장히 좋아하시는 것 같네. 카푸치노의 그 거품이 너무 좋아.", + "User:그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자." + ], + "coherence": 5.0, + "engagingness": 3.1, + "naturalness": 5.0, + "groundedness": 4.7 + }, + { + "response": "그렇구나. 목관리 잘 해봐야겠다.", + "user_persona": [ + "나는 요즘 치료를 받고 있다", + "나는 건강관리를 안 해서 치료를 받고 있는 것 같다", + "나는 장이 안 좋아서 병원에 다니며 치료를 받고 있다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 10대이다.", + "내가 사는 곳은 속초이다", + "나는 반려동물 미용사가 되고 싶다", + "나는 동화를 가끔 읽는다", + "나는 파란색을 싫어한다" + ], + "prev_dialog": [ + "User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같은 큰 치료를 받아본 적이 있어?", + "Bot:아니, 아직 수술은 안해봤어. 나중에 고의로든 타의로든 하게 될지도 모르는데 마취가 너무 무서운 것 같아.", + "User:나는 편도절제술을 해봤어. 아주 아픈 치료였지. @이름@ 너는 편도염에 자주 걸리는 편이야?", + "Bot:편도염 아니야. 한번도 걸려본 적이 없는데 너무 아플 것 같아. 지금은 어때?", + "User:응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해." + ], + "coherence": 5.0, + "engagingness": 2.6, + "naturalness": 5.0, + "groundedness": 3.7 + }, + { + "response": "정말? 그럼 나중에 우리 같이 동물의 숲 게임 하자", + "user_persona": [ + "나는 체험 여행을 자주 간다", + "나는 주말에 제주도로 여행을 간다", + "나는 콘솔 게임을 한다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 강아지에 관심이 없다.", + "나는 사회복지학과 전공이다.", + "나는 태블릿을 잘 활용한다." + ], + "prev_dialog": [ + "User:나는 오늘 약속이 없어서 게임이나 하려고. 너는?", + "Bot:나도 게임하려고 했는데, 난 주로 콘솔 게임을 해.", + "User:아 정말? 나도 콘솔 게임해. 어떤 게임해?", + "Bot:나는 요즘 동물의 숲에 빠졌어. 너는?", + "User:나랑 똑같네. 나도 동물의 숲을 하고 있어." + ], + "coherence": 5.0, + "engagingness": 4.9, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "스타크래프트하고 있어. 이제 그만할게.", + "user_persona": [ + "나는 뮤지컬 영화를 가끔 본다", + "나는 정원을 가꾸는 것을 좋아한다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 매우 꼼꼼하다.", + "나는 뉴질랜드로 유학을 간다.", + "나는 뮤지컬 영화를 가끔 본다.", + "나는 커피를 싫어한다." + ], + "prev_dialog": [ + "User:미안해, 한시간이나 걸렸네. 친구가 내가 커피를 싫어하는데 사와버렸어.", + "Bot:커피는 맛있는데, 나는 이제 게임하러 갈게.", + "User:고양이를 키우고 싶고, 정원을 가꾸는 것을 좋아하지 않고, 기타를 배우고 싶어. 맞지?", + "Bot:뭔데? 기억력이 엄청 좋은 것 같아.", + "User:내가 매우 꼼꼼해서 기억하려고 적어 놨어. 무슨 게임해?" + ], + "coherence": 4.3, + "engagingness": 2.8, + "naturalness": 4.2, + "groundedness": 2.9 + }, + { + "response": "그런가? 서울에서는 주로 어디에서 산책을 하니?", + "user_persona": [ + "나는 주말에 친구네 집에 가서 같이 비디오 게임을 했다", + "나는 방송 음향기 사이다", + "나는 고양이 두 마리를 키운다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 토끼 한 마리를 키운다.", + "나는 다림질하는 것을 좋아한다.", + "나는 등산을 가끔 한다." + ], + "prev_dialog": [ + "User:맞아. 비디오게임을 콘솔게임이라 하지. 나는 @브랜드명1@ 게임을 했어.", + "Bot:게임에 대해서 많이 아는 것 같네. @브랜드명2@의 엑스박스 360도 알아?", + "User:당연하지. 한국에서는 삼돌이라는 애칭으로 불려. 구입하고 싶은데 아직 못했어.", + "Bot:정말 멋진 분이시네. 어디 살아?", + "User:나는 서울에 살아. 시어머니와 함께 산책을 즐기는 네가 더 멋져." + ], + "coherence": 4.9, + "engagingness": 3.8, + "naturalness": 4.9, + "groundedness": 4.5 + }, + { + "response": "그렇네 오늘 날씨가 맑아서 기분이 좋아지는 것 같아.", + "user_persona": [ + "나는 교회에 다닌다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 앵무새 한 마리를 키운다.", + "나는 요리를 다른 사람에게 자주 해 준다.", + "나는 딸기를 즐겨 먹는다." + ], + "prev_dialog": [ + "User:나도 딸기를 좋아해서 많이 먹어. 나중에 한 번 우리 가게에 올래?", + "Bot:응, 좋아 그럼 진짜로 갈까?", + "User:응, 난 일 좀 하고 올게.", + "Bot:응, 나중에 또 대화하자.", + "User:어제는 정신 없어서 퇴근 후에 연락을 못했어. 오늘 날씨가 굉장히 좋지 않네." + ], + "coherence": 1.0, + "engagingness": 1.2, + "naturalness": 1.4, + "groundedness": 1.1 + }, + { + "response": "응, 나도 그렇게 생각해.", + "user_persona": [ + "나는 따뜻한 날씨를 싫어한다", + "나는 가을이 선선해서 좋다", + "나는 추운 게 낫" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나는 따뜻한 날씨를 싫어한다", + "나의 거주지는 부천이다", + "나는 눈치가 없는 편이다", + "나는 앵무새를 키우고 싶다" + ], + "prev_dialog": [ + "User:폭염 때문에 죽는 사람들도 더러 있더라.", + "Bot:응, 폭염이 너무 무서워.", + "User:이름씨는 폭염을 경험해본 적이 있어?", + "Bot:응, 제작년 여름에 에어컨이 없어서 힘들었어.", + "User:에어컨이 없는 여름은 상상하기도 싫어. 에어컨은 필수인 것 같아." + ], + "coherence": 5.0, + "engagingness": 1.7, + "naturalness": 5.0, + "groundedness": 4.3 + }, + { + "response": "응 여름만 되면 땀이 너무 나서 힘들어. 그래도 좋아하는 음식 먹으면서 더위 이겨내야 해! 내가 좋아하는 음식은 수제버거야.", + "user_persona": [ + "나는 김해에 산다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나의 거주지는 김해이다.", + "나는 학원 논술 강사이다.", + "나는 오전에 커피를 마신다.", + "나는 요즘 폭염에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:아, 본가가 대구야? 학교 때문에 서울에서 자취한다 했는데, 엄청 멀리 떨어져있네. 학교 다닐 때는 어땠어?", + "Bot:응 본가는 대구고, 주말마다 본가로 내려가고 있어.", + "User:주말마다요? 대단하네. 대구는 아무래도 밑에 있으니까 위보다는 더 덥지 않을까? 김해는 더 밑에 있어.", + "Bot:대프리카라는 말도 있잖아. 대구랑 아프리카의 합성어야.", + "User:맞아, 이상하게 왜 대구가 그렇게 더운지. 힘들겠다." + ], + "coherence": 2.9, + "engagingness": 3.3, + "naturalness": 4.0, + "groundedness": 1.5 + }, + { + "response": "고마워. 너도 좋은 하루 보내!", + "user_persona": [ + "나는 체력이 약골이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 빵을 먹는다.", + "나는 영어영문학이 부전공이다.", + "나는 바이올린 연주를 자주 한다.", + "나는 요즘 성적에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:오, 모범생이니까 잘 받을거야. 그럼 성적 관리는 어떻게 하는지 물어봐도 될까?", + "Bot:나는 평소 출석과 수업태도 등으로 교수님들께 좋은 인상으로 남기려고 하고, 과제 제출같은 경우는 아슬아슬하게 제출하기보다는 여유를 두고 제출하는 편이야.", + "User:나도 성적 관리에 더 신경써야겠다. 그럼 난 슬슬 가봐야 해서. 다음에 또 연락 가능할까?", + "Bot:응, 너무 오래 잡아 놨네. 다음에 한번 연락할게.", + "User:응, 그럼 그때 봐. 좋은 하루 보내." + ], + "coherence": 5.0, + "engagingness": 4.2, + "naturalness": 5.0, + "groundedness": 4.8 + }, + { + "response": "응 고마워. 너도 좋은 직업 갖길바래.", + "user_persona": [ + "나는 매우 예민하다", + "나는 가야금 연주를 가끔 한다", + "나는 개신교이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 종교는 개신교이다", + "나는 사진부 동아리에 관심 있다", + "나는 가야금 연주를 가끔 한다" + ], + "prev_dialog": [ + "User:31시간 만이네. 내가 그저께 못 물어본게 있는데, 고3이야?", + "Bot:응 맞아. 나는 수능을 준비 중인 고3이야. 그래서 매우 괴로워.", + "User:학교에서 야간자율학습도 해?", + "Bot:나는 하고 있는데, 자유롭게 신청해서 받아. 성적이 낮아서 열심히 해야해.", + "User:열심히 노력했으니 성적 잘 받을 수 있을거야." + ], + "coherence": 5.0, + "engagingness": 3.5, + "naturalness": 4.9, + "groundedness": 1.9 + }, + { + "response": "응, 회계사님 좋은 조언 많이 해줘.", + "user_persona": [ + "나는 회계사이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 여자 형제는 변호사이다.", + "나는 사진부 동아리에 관심이 없다.", + "나는 노트북을 리뷰하는 것을 좋아한다.", + "나는 요즘 자격증에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:미래를 계획하고 준비하니까 잘 될 것 같아서 기분이 좋아. 학생이면 어떤 수업을 들어?", + "Bot:내가 경영학과라서 경영 관련 전공수업을 듣고 있어.", + "User:경영학 수업이면 앞으로도 도움이 될거야. 좋은 수업 듣고 있어.", + "Bot:응, 회계사님도 학부생 때 경영 관련 수업 많이 들었겠네.", + "User:응, 나도 들은 수업들이니 반가우면서 도움이 될 것 같아." + ], + "coherence": 5.0, + "engagingness": 3.3, + "naturalness": 4.8, + "groundedness": 4.4 + }, + { + "response": "응, 너도 잘 지내. 안녕~", + "user_persona": [ + "나는 거북이에게 젤리를 먹일 예정이다", + "나는 고등학생이다", + "나는 거북이에게 공부를 할 예정이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 10대이다.", + "나의 생일은 5월이다", + "나는 사람을 깊이 사귀지 못한다", + "나는 체육 활동하는 게 즐겁다" + ], + "prev_dialog": [ + "User:나는 3정거장만 가면 돼. 걷기엔 멀어서 지하철 타고 다녀.", + "Bot:부럽네, 나도 더 가까웠으면 좋겠어.", + "User:30분이면 그래도 좀 먼 것 같아. 집 가까운게 최고야.", + "Bot:그렇지. 가까운 게 최고지. 난 이제 밥 먹으러 가볼게. 다음에 이야기하자.", + "User:응, 고생했어. 식사 맛있게 먹어." + ], + "coherence": 4.8, + "engagingness": 3.3, + "naturalness": 4.6, + "groundedness": 3.9 + }, + { + "response": "요리 좋아하구나. 나는 요리는 잘 못해서 맨날 시켜먹어. 배달비 너무 비싸지 않아?", + "user_persona": [ + "나는 묵은지 김치찌개를 좋아한다", + "나는 묵은지를 먹고 왔다", + "나는 백화점 가는 게 짜증 난다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 거주지는 경기도이다.", + "나는 물건을 자주 잃어버린다.", + "나는 요즘, 매일 짜증이 난다." + ], + "prev_dialog": [ + "User:응. 나는 그런 것도 안 봤어. 엄청 유명한 건 알고 있지만.", + "Bot:나는 어렸을 때부터 경찰이 꿈이여서 형사물이나 히어로물에 환장해. 남자애들하고도 맨날 싸웠어. 어떤 장르를 좋아해?", + "User:아, 강하신 분이셨구나 ㅎㅎ 나는 판타지 빼고는 다 보는데 코메디를 자주 봐.", + "Bot:응, 남자처럼 자라가지고 중학교 때까지 유도부를 했었어. 운동을 좋아해?", + "User:아, 유도부였구나. 조금 무섭네. 운동은 좋아하지 않고 요리 같은 것을 좋아해." + ], + "coherence": 4.7, + "engagingness": 4.0, + "naturalness": 4.7, + "groundedness": 3.3 + }, + { + "response": "아니. 전혀 노래는 못하는데 합창단 동아리는 노래부르는 것보다 함께 노래하는 게 좋아서 들어가보고 싶어.", + "user_persona": [ + "나는 힙합 음악을 좋아한다", + "나는 요리하는 것을 좋아한다", + "나는 앵무새 한 마리를 키운다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 앵무새 한 마리를 키운다.", + "나는 요리를 다른 사람에게 자주 해 준다.", + "나는 딸기를 즐겨 먹는다.", + "나는 요즘 신호등/횡단보도에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:힙합은 정말 좋아. 곧 할 쇼미11에 출연하고 있어. 그럼 난 이만 일정이 있어서 가볼게.", + "Bot:그렇군. 나도 동아리 좀 보러 갈게.", + "User:거의 하루만에 연락을 주네. 동아리는 잘 다녀왔어?", + "Bot:안녕, 나는 합창단 동아리에 관심이 있어서 보고 왔어.", + "User:원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데." + ], + "coherence": 4.7, + "engagingness": 3.7, + "naturalness": 4.9, + "groundedness": 3.8 + }, + { + "response": "나도 이만 가봐야겠어. 좋은 하루 보내", + "user_persona": [ + "나는 고집이 세다", + "나는 술을 좋아한다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 동료와 사이가 안 좋다.", + "나는 콜센터 상담원이다.", + "나는 TV 뉴스를 자주 본다.", + "나는 요즘 백신에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:도마뱀? 나는 못 키울 것 같은데 대단하네. 운전하기 힘들진 않아?", + "Bot:운전하는 건 재밌어. 대신 기사님들과 밥을 먹어야 하는데, 오늘 메뉴는 닭볶음탕이야. 나는 닭볶음탕을 안 먹는데...", + "User:닭볶음탕 맛있는데, 그럼 좋아하는 음식이 뭐야?", + "Bot:나는 떡볶이를 좋아해. 그래서 오늘은 주문해서 먹을거야.", + "User:그렇군. 그럼 선생님 식사 맛있게 해. 나도 배가 고파서 밥 먹고 올게." + ], + "coherence": 4.6, + "engagingness": 3.3, + "naturalness": 4.7, + "groundedness": 3.8 + }, + { + "response": "군대가 엄청 멀어서 가는데 시간이 오래 걸리겠네?", + "user_persona": [ + "나는 20대 남자이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 죄책감이 든다.", + "나는 금속공예 만들기를 좋아한다.", + "나는 힙합 음악을 자주 듣는다." + ], + "prev_dialog": [ + "User:좋아! 이틀동안 잘 지내~", + "Bot:이틀만이야. 잘 지냈어?", + "User:응, 지금 남동생 면회 다녀오는 중이야.", + "Bot:동생이 군대에 갔구나. 얼마나 복무했어?", + "User:지금 1년 2개월 째야. 4개월 뒤면 전역이야." + ], + "coherence": 4.9, + "engagingness": 3.9, + "naturalness": 4.7, + "groundedness": 4.7 + }, + { + "response": "응, 친구가 군인이어서 면회도 다녀왔어.", + "user_persona": [ + "나는 친구가 군인이다", + "나는 대학생이다", + "나는 문학사이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 매일 감사하다", + "나는 방송 촬영 기사이다", + "나는 바나나를 싫어한다" + ], + "prev_dialog": [ + "User:오늘 친구를 만나고 왔어. 오늘 하루 잘 보냈어?", + "Bot:응, 방송 촬영 기사라서 일이 많아. 근데 친구는 잘 만났어?", + "User:응. 친구가 군인인데 휴가를 나왔거든.", + "Bot:정말 오랜만에 보는 친구네.", + "User:응, 군인 친구를 면회 가 본 적 있어?" + ], + "coherence": 4.9, + "engagingness": 3.8, + "naturalness": 4.9, + "groundedness": 2.8 + }, + { + "response": "아니 필러는 아직 무서워. 너는 맞아봤어?", + "user_persona": [ + "나는 클렌징에도 집중하는 편이다", + "나는 기초 화장품에 충실한 편이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 조경기술자이다", + "나는 주말에 청소를 한다", + "나는 TV 다큐멘터리를 가끔 본다" + ], + "prev_dialog": [ + "User:나는 기초화장품에 충실한 편이야. 또 클렌징에도 집중하는 편이야.", + "Bot:클렌징이 중요하지! 나는 항상 클렌징 워터만 쓰다가 클렌징 오일을 처음 써봤는데 잘 지워졌어. 오일은 써봤어?", + "User:응 오일을 써보긴했지만, 아침에는 가벼운 세안을 해. ", + "Bot:그렇군. 주름을 예방하려면 선크림을 잘 발라야 한다던데, 나는 매번 까먹어.", + "User:맞아, 선크림이 중요하다고 하더라고. 그런데 스킨로션이 가장 먼저라고 해. 필러는 맞아봤어?" + ], + "coherence": 5.0, + "engagingness": 3.9, + "naturalness": 4.8, + "groundedness": 4.0 + }, + { + "response": "그러면 너는 외모에 자신감이 없겠네.", + "user_persona": [ + "나는 통역가이다", + "나의 어머니는 주부이다", + "나는 20대 여자이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 통역가이다.", + "나는 블루베리를 즐겨 먹는다." + ], + "prev_dialog": [ + "User:생각해봐야겠네. 요즘 환절기라 피부나 외모에 관심이 가. 어때?", + "Bot:맞아. 나도 요즘 머리스타일을 바꿔서 외모에 변화를 주려고 해.", + "User:남자들은 머리스타일 바꾸는것만 하더라도 굉장한 외모의 변화야.", + "Bot:맞아. 내가 머리가 곱쓸머리라 외모에 불만이 많아.", + "User:나도 곱슬머리라서 주기적으로 매직을 해야 외모가 단정해지는 것 같아." + ], + "coherence": 4.7, + "engagingness": 3.3, + "naturalness": 4.0, + "groundedness": 3.9 + }, + { + "response": "잘 마시네. 나도 술 좋아하는데 다음에 또 연락하자", + "user_persona": [ + "나는 친구가 많다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 친구가 많다.", + "나는 사무관이다.", + "나는 자주 외롭다.", + "나는 강아지에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그렇군. 나는 퇴근하면 친구를 만나서 술 한잔 할 것 같아.", + "Bot:그래도 다행인데, 내가 아무데서나 잘 자. 친구를 만나나봐. 술은 잘 마셔?", + "User:그래도 집에서 자면 좋을텐데 바쁘셔서... 나는 친구가 많아. 자주 만나서 술을 마셔.", + "Bot:괜찮아. 어쩔 수 없지. 술을 좋아해?", + "User:응 자주 마셔. 그럼 다음에 또 연락할게." + ], + "coherence": 5.0, + "engagingness": 3.6, + "naturalness": 4.9, + "groundedness": 4.4 + }, + { + "response": "그래, 잘 갔다 와. 다음에 또 대화하자. 안녕!", + "user_persona": [ + "나는 오늘 동아리에 가야 하는 것을 깜빡했다", + "나는 가족과 함께 살고 있다", + "나는 대학생이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 물고기 한 마리를 키운다.", + "나는 주말에 빨래를 한다.", + "나는 로맨스 영화를 자주 본다.", + "나는 요즘 유기견에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:내가 지금 러닝 동아리에 참여하고 있거든.", + "Bot:오늘도 러닝하는 날이야? 힘들지는 않아?", + "User:힘들지는 않아. 내가 운동 하는걸 좋아해서 그런가봐.", + "Bot:그렇군. 러닝은 좋은 운동이야. 그럼 지금 가야겠네?", + "User:응, 지금 바로 가야할 것 같아." + ], + "coherence": 5.0, + "engagingness": 3.9, + "naturalness": 5.0, + "groundedness": 4.3 + }, + { + "response": "처음 배우는 오보에가 어렵지는 않아?", + "user_persona": [ + "나는 학원 영어 강사이다", + "나는 오보에를 배우고 싶어서 학원 상담 예약을 했다", + "나는 전주에 살고 있다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 10대이다.", + "내가 사는 곳은 원주이다", + "나는 논술 준비하는 게 지루하다", + "나는 한식을 좋아한다", + "나는 가끔 편안하다" + ], + "prev_dialog": [ + "Bot:저 오늘 김치찌개 먹었는데, 진짜 맛있었어! 식사는 했어?", + "User:응, 먹었어. 이미 먹고 나왔어. 내가 오보에를 배우고 싶어서 학원 상담 예약을 해놨거든. 그럼 이만 상담을 하러 먼저 가 볼게. 나중에 다시 대화하자.", + "Bot:오보에라니 멋지네! 그럼 다음에 또 대화 하자!", + "Bot:안녕. 5주만이네. 오보에 학원은 등록 했어?", + "User:안녕, 오랜만이야. 네, 학원 등록하고 저번주부터 다니기 시작했어." + ], + "coherence": 5.0, + "engagingness": 4.0, + "naturalness": 4.9, + "groundedness": 4.0 + }, + { + "response": "만화도 좋아하지! 너는 어떤 만화 좋아하는데?", + "user_persona": [ + "나는 @브랜드명1@를 본다", + "나는 스포츠 tv를 본다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 토끼 두 마리를 키운다.", + "나는 기계항공 공학부 전공이다.", + "나는 트럼펫 연주를 가끔 한다." + ], + "prev_dialog": [ + "User:몇년 전에 맥그리거와 메이웨더가 싸울 때 가입했어. 거기가 독점이라서.", + "Bot:아, 그런 시스템이 있었구나. 잘 몰랐어.", + "User:거기 아니면 못봐서 어쩔수가 없더라. 근데 해지하기 귀찮아서 계속 보고 있어.", + "Bot:그러면 뭐 다른건 잘 보는 게 있어?", + "User:그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?" + ], + "coherence": 5.0, + "engagingness": 4.0, + "naturalness": 5.0, + "groundedness": 3.1 + }, + { + "response": "그러면 춤 잘 추는 친구들 영상 봐봐. 재즈도 한번 봐봐. 좋아할거야.", + "user_persona": [ + "나는 필라테스를 가끔 한다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 커피를 마시지 않는다.", + "나는 집배원이다.", + "나는 댄스 음악을 싫어한다.", + "나는 요즘 노래에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:부지런한 사람이야. 열심히 체력을 기르려고 노력하는 편이야.", + "Bot:좋은 자세야. 춤 추는 것도 좋아해?", + "User:춤? 가끔 노래 듣다가 신나면 춤을 춰.", + "Bot:귀엽네. 나는 댄스 음악을 싫어해서 재즈 음악에 흐느적거리는 걸 좋아해. 댄스 음악도 좋아해?", + "User:댄스 음악을 좋아해. 브레이브걸스의 롤린을 좋아해. 재즈도 좋아해. 너의 춤이 궁금해." + ], + "coherence": 4.5, + "engagingness": 3.8, + "naturalness": 3.3, + "groundedness": 3.7 + }, + { + "response": "그냥 일상 뉴스였지. 요즘 뉴스에서 연예인들 열애설만 자주 나오는거 같아.", + "user_persona": [ + "나는 대학생이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 힐링 여행을 가끔 간다.", + "나는 만화부 동아리에 관심이 없다.", + "나는 수필을 싫어한다." + ], + "prev_dialog": [ + "User:아, 저 이만 힐링 여행 알아보러 가봐야겠다. 가끔 가거든.", + "Bot:응. 그러면 또 이따 연락해. 잘 들어.", + "User:수업 열심히 듣고왔더니 한시간 지났네.", + "Bot:응. 금방 왔네. 나는 뉴스를 보고 있었어.", + "User:그래? 무슨 뉴스가 나왔어?" + ], + "coherence": 4.8, + "engagingness": 3.0, + "naturalness": 4.8, + "groundedness": 4.3 + }, + { + "response": "과일마다 다르지만 한 바구니에 만원이면 살 수 있어.", + "user_persona": [ + "나는 내일 마트에 갈 것이다", + "나는 과일을 좋아한다", + "나는 맥주를 일주일에 서너 번 마신다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 다소 긍정적이다.", + "나는 손톱 관리사이다.", + "나는 발라드 음악을 좋아한다.", + "나는 맥주를 일주일에 서너 번 마신다." + ], + "prev_dialog": [ + "User:난 이제 일이 끝났어. 손님이 늦게까지 있었거든. 너는 퇴근했어?", + "Bot:응, 진작 들어와서 집이야. 과일을 사오려고 했는데 마트에 가니까 비싸서 내일 시장에 가서 사려고 해.", + "User:많이 차이 나? 나는 내일 마트에 가려고 했어.", + "Bot:응, 아무래도 우리 집앞에 청과물시장이 있는데 정말 저렴하거든.", + "User:어느정도 해? 마트는 상자로 구입하면 2만원 넘게 줬던 것 같아. 과일마다 다르지만." + ], + "coherence": 5.0, + "engagingness": 3.6, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "지금 오보에 연주 하고 있어. 음악 좋아해?", + "user_persona": [ + "나는 군인이다", + "나는 다소 긍정적이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 거북이 한 마리를 키운다.", + "나는 작곡가이다.", + "나는 오보에 연주를 자주 한다.", + "나는 아이스 바닐라라떼를 자주 마신다." + ], + "prev_dialog": [ + "User:그렇네, 대박. 완전 가족이겠네.", + "Bot:응, 진짜야. 얘 없으면 못 살아. 난 일하러 갈게.", + "User:응, 작곡일 열심히 해. 안녕~", + "Bot:일주일만에 연락드리네요. 궁금하셨죠?", + "User:고마워, 나도 기다렸어. 뭐 하고 있어?" + ], + "coherence": 5.0, + "engagingness": 4.2, + "naturalness": 4.8, + "groundedness": 5.0 + }, + { + "response": "고맙긴! 그러면 내가 다음에 너에게 선물을 하나 보내줄게!", + "user_persona": [ + "나는 작가이다", + "나는 제주도에 산다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나의 거주지는 제주도이다.", + "나는 작가이다.", + "나는 약속에 자주 늦는다.", + "나는 요즘 쇼핑 대상에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:늘 최선을 다하면서 글에 임하고 있어. 이건 내가 자부할 수 있어.", + "Bot:그렇군. 그럼 사람들도 그 진심을 알아보고 사줄 거야.", + "User:그렇게 말해줘서 고마워. 내 글을 한번 읽어볼래?", + "Bot:괜찮을까? 내가 사는 곳이 경기도인데, 여기까지 보내주실 수 있어?", + "User:응, 내가 특별히 공짜로 보내줄게. 좋은 말을 해줘서 고마워." + ], + "coherence": 3.2, + "engagingness": 4.3, + "naturalness": 3.6, + "groundedness": 2.2 + }, + { + "response": "나 필라테스 엄청 자주 다녀서 그런지 잘 버티는 거 같아. 너는 오늘 뭐해?", + "user_persona": [ + "나의 거주지는 경기도이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 매일 스트레스를 받는다.", + "나는 산업공학과 전공이다.", + "나는 SF 영화를 가끔 본다." + ], + "prev_dialog": [ + "User:응 나도 과제 금방 마무리 했어! 밥은 먹었어?", + "Bot:아니, 이제 먹으려고 해. 너는?", + "User:ㅎㅎ 점심먹고 sns에 사진도 올렸는데.", + "Bot:그렇군. 밥 먹기 전에 필라테스를 먼저 가야할지 고민이야.", + "User:밥도 안 먹고 운동하면 어지럽지 않아?" + ], + "coherence": 4.9, + "engagingness": 3.9, + "naturalness": 4.9, + "groundedness": 4.2 + }, + { + "response": "어제는 친구들이 다 모여 오랜만에 놀았어. 다들 반가웠어.", + "user_persona": [ + "나는 친구가 많다", + "나는 토끼 한 마리를 키운다", + "나는 토끼를 키운 지 6개월 정도 되었다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 30대이다.", + "나는 관세사이다.", + "나는 실외에서 수상스키 타는 것을 싫어한다.", + "나는 가을을 싫어한다.", + "나는 요즘 운동에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:엄청 오래 했네. 지금도 잘 할 것 같아. 나도 너처럼 열심히 드럼을 배워야겠네.", + "Bot:무언가를 잘할땐 자신감이 생기는 것 같아. 싫어하는 일은 뭐야?", + "User:대화 즐거웠어. 일이 생겨서 먼저 가봐야겠다. 다음에 또 대화 나누자.", + "Bot:일주일 만이네 그동안 어떻게 지냈어?", + "User:안녕. 나는 별일 없이 잘 지냈어." + ], + "coherence": 1.5, + "engagingness": 1.3, + "naturalness": 2.1, + "groundedness": 1.0 + }, + { + "response": "응응, 면접 준비중인데 잘 안되고 있어.", + "user_persona": [ + "나는 일식을 공부하고 있다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나의 종교는 불교이다.", + "나는 팟타이를 안 먹는다.", + "나는 토끼 한 마리를 키운다.", + "나는 요즘 음식에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:가리지는 않는데 주로 일식을 공부하고 있어.", + "Bot:나는 일식은 잘 모르는데, 일식 특징은 뭐야?", + "User:일식은 가능한 조미료를 사용하지 않고 재료가 가진 맛을 살린다는 점이 큰 특징이라 할 수 있어.", + "Bot:조미료를 안 쓴다니 신기하네.", + "User:응, 그런데 스튜어디스 준비는 잘 되고 있어?" + ], + "coherence": 1.7, + "engagingness": 1.8, + "naturalness": 2.0, + "groundedness": 1.8 + }, + { + "response": "멋있다. 공연이 자주 있니?", + "user_persona": [ + "나는 공연 때문에 바빴다", + "나는 20대 여자이다", + "나는 매우 부정적이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 만족스럽다.", + "나는 중국어에 관심 있지만 배울 시간이 없다.", + "나는 별로 좋아하는 음식이 없다.", + "나는 요즘 음식에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그럴 수 있겠네. 워낙 바쁜가봐.", + "Bot:응 뭔가 활동이 많아서 그런 것 같아. 27살은 어떻게 지내?", + "User:나도 공연때문에 꽤나 바빴어.", + "Bot:배우나 가수야?", + "User:나는 국악인이야. 콘서트로 먹고 살아." + ], + "coherence": 5.0, + "engagingness": 4.1, + "naturalness": 4.9, + "groundedness": 4.9 + }, + { + "response": "오늘 하루도 고생 많았어. 다음에 또 대화 나눠!", + "user_persona": [ + "나는 TV 애니메이션을 가끔 본다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 와인을 싫어한다.", + "나는 슬랩스틱 영화를 가끔 본다.", + "나는 요즘 디저트에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:오 나도 그거 먹어보고 싶었는데 생각난김에 오늘 저녁에 사서 가야겠어.", + "Bot:나도 그럴 것 같아. 퇴근하면 뭘 해?", + "User:TV를 켜서 봐. TV 애니메이션을 가끔 보면서 하루의 피로를 푸는 것 같아.", + "Bot:나는 알바 끝나고 영화를 가끔 보곤해. 오늘은 슬랩스틱 영화를 보려고.", + "User:그렇군. 알바 끝나고 가끔 영화도 보고 괜찮은 것 같아." + ], + "coherence": 4.5, + "engagingness": 2.4, + "naturalness": 4.7, + "groundedness": 2.8 + }, + { + "response": "동남아 음식은 한 번 먹어본 적 있는데 너무 내 취향에 맞지 않았어.", + "user_persona": [ + "나는 봉사활동 동아리에 참여한다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 여자 형제는 모델이다.", + "나는 화덕 피자를 싫어한다.", + "나는 병원에 가는 게 불편하다.", + "나는 요즘 여행지에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:한 5명 정도 모을 수 있을까? 아마 좋을거야. 최소 하루에 20분 정도 촬영 시간은 길거야.", + "Bot:응, 모을 수 있어. 와, 많이 줘. 꼭 모아서 갈게. 혹시 식사도 줘?", + "User:응, 누나한테 말해둘게. 아마 협찬으로 화덕피자가 들어갈거야. 좋아해? 난 별로 안 좋아해.", + "Bot:고마워. 나는 신음식을 좋아하는데, 피자도 좋아해.", + "User:타바스코를 많이 뿌려 먹어. 신 음식을 좋아하면 동남아 음식을 좋아해?" + ], + "coherence": 4.4, + "engagingness": 3.2, + "naturalness": 4.7, + "groundedness": 3.1 + }, + { + "response": "나? 요즘 첼로 연주를 배우고 있어서 첼로 연습하고 있었어.", + "user_persona": [ + "나는 수련원 가는 게 나쁘진 않다고 생각한다", + "나는 수련회 시즌이 되면 사람들이 가득 찬다", + "나는 선후배와 잘 어울린다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 40대이다.", + "나는 선후배와 친한 사람 한 두 명이 있다.", + "나는 정원을 가꾸는 게 즐겁다.", + "나는 요즘, 자주 외롭다." + ], + "prev_dialog": [ + "User:그래도 좀 북적 북적 되는게 나쁘진 않아.", + "Bot:하지만 요즘 애들은 좀 그렇지 않아? 뭔지를 알아?", + "User:아니, 그건 다 뉴스 속 이야기야. @이름1@ 얼마나 착한데.", + "Bot:그래? 내가 너무 색안경을 끼고 봤나봐.", + "User:그리고 보면 내가 어릴 때 수련회 갔던 생각도 나. 그나저나 그쪽은 주말인데 뭐해?" + ], + "coherence": 4.8, + "engagingness": 3.9, + "naturalness": 4.6, + "groundedness": 2.0 + }, + { + "response": "응, 나도 그래야지.", + "user_persona": [ + "나는 매우 게으르다", + "나는 대학생이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 요즘, 자주 신이 난다.", + "나는 한국사능력검정 자격증을 취득했다.", + "나는 일식을 싫어한다." + ], + "prev_dialog": [ + "User:그럴수도 있겠네. 나는 개인적으로 좀 좋아하긴 하지만.", + "Bot:그렇군. 우리 부모님도 좋아해.", + "User:뭐 사람마다 취향이 있는거 아니겠어?", + "Bot:응, 근데 우리 부모님은 여행가신다 그러셔서 내가 호캉스 좀 알아봐 드리고 있어.", + "User:호캉스 좋지. 잘 쉬고 오길 바랄게." + ], + "coherence": 3.8, + "engagingness": 1.8, + "naturalness": 3.0, + "groundedness": 2.0 + }, + { + "response": "미팅은 정말 추억이야. 나도 대학생때 많이 해봤어.", + "user_persona": [ + "나는 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같다", + "나는 며칠 전에 친구가 소개팅을 주선해줬다", + "나는 앵무새가 말도 따라하고 지능도 높아서 키우기 좋은 것 같다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나는 따뜻한 날씨를 싫어한다", + "나의 거주지는 부천이다", + "나는 눈치가 없는 편이다", + "나는 앵무새를 키우고 싶다" + ], + "prev_dialog": [ + "User:며칠 전에 친구 주선으로 소개팅을 했어.", + "Bot:오! 좋았겠다. 결과는 어땠어?", + "User:그렇게 잘될것 같지 않아. 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같아.", + "Bot:나는 운명이 있다고 믿어. 언젠간 만나겠지.", + "User:응, 아무래도 소개팅보다는 미팅이 더 편한 것 같아." + ], + "coherence": 4.7, + "engagingness": 3.5, + "naturalness": 4.7, + "groundedness": 3.5 + }, + { + "response": "그래도 같이 있는 사람은 필요하지 않나?", + "user_persona": [ + "나는 연인이 없다", + "나는 30대 여자이다", + "나는 맞벌이를 한다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 쇼핑호스트이다.", + "나는 발라드 음악을 자주 듣는다." + ], + "prev_dialog": [ + "User:잘 생각했어. 나는 일이 있어서 이만 끊을게.", + "Bot:안녕, 저번에 조언듣고 베이비시터 구했어.", + "User:잘했어. 내가 결혼도 안했고 연인도 없지만 @이름1@은 직업상 많이 봐와서 잘 안다고.", + "Bot:나는 결혼 한 줄 알았어. 연인도 없는데 안 외로워?", + "User:응, 나는 연인이 없지만 신경쓰지 않아. 외롭지도 않고." + ], + "coherence": 4.6, + "engagingness": 3.4, + "naturalness": 4.4, + "groundedness": 4.0 + }, + { + "response": "그래? 정말 대단한 것 같아. 나는 아직 그런 꿈을 가지지 못했는데 너는 이루었네.", + "user_persona": [ + "나는 20대 남자이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 걱정스럽다.", + "나는 정치외교학부 전공이다.", + "나는 배구를 가끔 한다.", + "나는 요즘 영화에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:나는 요즘, 항상 평화로운 것 같아. 그래서 기분이 너무 좋아.", + "Bot:오호, 그렇군. 왜 평화로운 것 같아? 평화로운 이유가 있을텐데.", + "User:내가 하는 일이 너무 잘 되어서 자존감이 늘어.", + "Bot:그래? 일이 너무 잘 되어가니? 어떤 일이야? 궁금하긴 하네.", + "User:나는 항공기 조종사야. 기장으로 승진했어. 대단하지 않아?" + ], + "coherence": 5.0, + "engagingness": 4.6, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "나도 저녁에 약속이 없어서 함께 식사 할 수 있을 것 같아.", + "user_persona": [ + "나는 바빠서 가족 얼굴 볼 시간이 없다", + "나는 딤섬을 즐겨 먹는다", + "나는 쉬어본 지 오래됐다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 가족과 바빠서 얼굴 볼 시간 없다.", + "나는 딤섬을 즐겨 먹는다.", + "나는 TV 드라마를 좋아한다.", + "나는 요즘 OST에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그렇게 말해주니 나까지 스트레스가 날라가는 것 같아.", + "Bot:진짜로 하면 스트레스만 날라가는게 아니라 기분이 좋아서 실제로 날아갈 수도 있어.", + "User:정말 재밌는 분이시네. 배꼽이 빠질 것 같아.", + "Bot:내 농담에 웃어주니까 나도 기분이 좋아. 우리 잘 맞는 것 같아.", + "User:이따가 저녁에 시간 있어? 같이 식사 할래?" + ], + "coherence": 5.0, + "engagingness": 4.3, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "그러면 나는 주말에 첼로 연주를 배우러 가야겠어. 바이올린보다는 첼로가 나한테 더 어울리거든.", + "user_persona": [ + "나는 예능을 좋아한다", + "나는 강아지 두 마리를 키운다", + "나는 30대 여성이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 커피를 마신다", + "나는 예능 PD이다", + "나는 콘솔게임을 자주 한다" + ], + "prev_dialog": [ + "User:나는 시를 싫어하는데, 자꾸 지인들이 읽어보라고 하더라고. 콘솔게임이라는 것도 처음 들어봤어.", + "Bot:이름은 쉽게 읽히고 재미있어. 한번 검색해봐. 친구가 콘솔 게임 회사에 다니고 있기도 해.", + "User:응 꼭 한번 해보고 후기 알려줄게. 난 일이 있어서 가봐야 할 것 같아.", + "Bot:벌써 3일이나 지났네. 주말 휴일 계획 있어?", + "User:나는 집에서 애니메이션을 보면서 뒹굴거릴 예정이야. 집이 최고지." + ], + "coherence": 1.6, + "engagingness": 2.6, + "naturalness": 3.5, + "groundedness": 1.1 + }, + { + "response": "내가 직접해보려고 하는데, 벽지를 바꾸는게 좋을 것 같아. 그리고 천장도 도배도 해야해서 조금 걱정돼.", + "user_persona": [ + "나는 크리스마스 분위기를 내보려고 인테리어를 하고 있다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 어머니는 주부이다", + "나는 핸드폰 게임에 관심 없다", + "나는 팟타이를 좋아한다", + "나의 생일은 1월이다" + ], + "prev_dialog": [ + "User:응 나는 잘 지냈는데 일주일 동안 어떻게 지냈어?", + "Bot:나는 요즘 집 인테리어에 관심이 많아. 인테리어에 대해서 좀 관심있어?", + "User:나도 관심이 많은데 곧 크리스마스라서 크리스마스 분위기를 내보려고 인테리어를 바꾸고 있어. 집은 가족들과 같이 살아?", + "Bot:응, 나는 저번주에도 말했다시피 어머니가 주부셔서, 같이 살고 있어. 우리집이 오래된 아파트라서 구조적으로 인테리어를 바꿔볼까 고민중이야.", + "User:아 그럼 인테리어는 업체를 불러서 할 예정이야? 아니면 직접 해?" + ], + "coherence": 5.0, + "engagingness": 3.9, + "naturalness": 4.9, + "groundedness": 4.9 + }, + { + "response": "그렇구나. 근데 나 @브랜드명1@에서 알바하는데! 혹시 거기 자주 가?", + "user_persona": [ + "나는 대학생이다", + "나는 수업을 들었다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 가족은 3명이다.", + "나는 대학생이다.", + "나는 판타지 영화를 자주 본다.", + "나는 요즘 아파트에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:수업을 열심히 듣고 이따 다시 연락하자.", + "Bot:응. 수업 화이팅하고 다시 대화하자.", + "User:난 수업 듣고 점심을 먹었어. 식사는 했어?", + "Bot:응, 먹었어. 뭐 먹었어?", + "User:나는 @브랜드명1@에서 햄버거를 먹었어. 햄버거를 정말 좋아하거든." + ], + "coherence": 5.0, + "engagingness": 4.7, + "naturalness": 4.9, + "groundedness": 3.8 + }, + { + "response": "수원이야. 역세권이라 교통은 편리할 것 같더라고.", + "user_persona": [ + "나는 저녁 먹으러 갈 것이다", + "나는 이제 저녁 먹으러 갈 것이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 거주지는 용인이다", + "나는 가구 만들기에 흥미가 있다", + "나는 전자 음악을 싫어한다", + "나는 양식을 즐겨 먹는다", + "나는 요즘, 매일 열등감을 느낀다" + ], + "prev_dialog": [ + "User:응, 맛있게 먹고 좋은 시간 보내.", + "Bot:8시간 만이네. 저녁은 먹었어?", + "User:응, 어머니가 인도 카레를 해 두셔서 나는 따로 배달 시켜 먹었어. 너는?", + "Bot:그렇군. 나는 컵라면을 먹었어. 내가 곧 자취방 이사를 하거든. 그래서 끼니는 간단하게 떼우고 있어.", + "User:그렇구나. 용인에서 어디로 이사하는 거야?" + ], + "coherence": 4.9, + "engagingness": 3.7, + "naturalness": 4.9, + "groundedness": 4.9 + }, + { + "response": "이번에 파리에서 열리는 패션쇼는 어떤 모델이 서게 될지 궁금하네.", + "user_persona": [ + "나는 패션에 대해 이야기하는 것을 좋아한다", + "나는 모델이다", + "나는 분홍색을 좋아한다" + ], + "bot_persona": [ + "나는 20대이다.", + "나는 남자이다.", + "나는 모델이다.", + "나는 패션에 대해 이야기하는 것을 좋아한다.", + "나는 분홍색을 좋아한다.", + "나는 혈액형이 O형이다." + ], + "prev_dialog": [ + "User:그렇군. 나는 분홍색을 좋아하는데, 너도 입어보는 건 어때? 이미지가 완전 바뀔 것 같아.", + "Bot:안 돼. 뭔가 부끄럼쟁이가 될 것 같아. 하지만 내가 평소에 궁금증이 넘치는 사람이거든. 궁금증을 해소하고 싶은데 도움을 줄 수 있어?", + "User:응, 그러네. 어떤 부분에 궁금증이 있어? 도와줄 수 있으면 도와줄게.", + "Bot:내가 패션쇼에 대해서 궁금한게 있어서 그래. 아무래도 패션에 관심이 생기면 자연스레 패션쇼에도 관심이 가지 않겠어? 그래서 기왕 모델 만난 김에 물어보고 싶었어.", + "User:맞아. 패션쇼를 보면 멋진 모델들도 보고 이쁜 옷들도 구경할 수 있으니까." + ], + "coherence": 5.0, + "engagingness": 4.1, + "naturalness": 4.9, + "groundedness": 4.9 + }, + { + "response": "하나는 유명인의 이름을 딴 브랜드 출시이고, 다른 하나는 유명인의 이름을 딴 상품 출시야. 마지막으로 유명인 또는 브랜드의 팬시템 출시도 콜라보의 한 종류야.", + "user_persona": [ + "나는 최근에 패션 분야에 관심이 생겼다" + ], + "bot_persona": [ + "나는 20대이다.", + "나는 여자이다.", + "나는 모델이다.", + "나는 패션에 대해 이야기하는 것을 좋아한다.", + "나는 아침에 날씨를 확인한다.", + "나는 혈액형이 B형이다." + ], + "prev_dialog": [ + "User:요새 유행하는 브랜드 마케팅이 있어? 요새 패션 분야에 관심이 많이 생겨서 말이야.", + "Bot:요즘에는 '콜라보 마케팅'이 유행이야. 콜라보 마케팅은 말 그대로 타사 브랜드 또는 유명인과의 콜라보 등을 통해 진행되는 브랜드 마케팅을 의미해.", + "User:아 요즘은 콜라보를 브랜드끼리만 하는게 아니고 유명인과도 많이 하네?", + "Bot:응 맞아. 패션 콜라보의 경우 크게 3가지의 종류로 나눌 수 있어. 세가지가 어떤 것들인지 맞춰볼래?", + "User:음, 브랜드와 유명인의 콜라보는 알려줬지만, 사실 잘 모르겠어." + ], + "coherence": 5.0, + "engagingness": 4.3, + "naturalness": 5.0, + "groundedness": 5.0 + }, + { + "response": "어려워서 아직 동아리에 가입은 못했어. 그냥 같이 관심사가 있어서 얘기를 나누고 있어.", + "user_persona": [ + "나는 등산을 가끔 한다", + "나는 가야금 연주를 가끔 듣는다", + "나는 다소 부지런하다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 항상 신이난다.", + "나는 고전연구회 동아리에 관심 있다.", + "나는 가야금 연주를 자주 한다.", + "나는 요즘 사건 및 사고에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:청소 안하고 놀면 신경이 너무 쓰여서, 할거면 빨리하고 치우는게 좋아.", + "Bot:아쉽네. 누워서 좀 쉬려고 했는데, 그럼 설거지를 좀 하고 올게.", + "User:응, 천천히 하고 와. 나도 방 청소나 좀 하고 올게.", + "Bot:벌써 3시간이나 지났어? 설거지를 하고 같은 동아리 회원이 전화가 와서 말이야.", + "User:나도 집안 청소를 하고 나서야 겨우 쉴 수 있었어. 하지만 동아리에는 들어갔어?" + ], + "coherence": 4.9, + "engagingness": 3.8, + "naturalness": 4.8, + "groundedness": 4.9 + }, + { + "response": "나중에 연락할게. 안녕.", + "user_persona": [ + "나는 20대 남자이다", + "나는 공항에 가는 중이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 새벽에 따뜻한 물을 마신다.", + "나는 풍물부 동아리에 관심 있다.", + "나는 수영을 싫어한다." + ], + "prev_dialog": [ + "User:그래도 누나가 분명 동생분을 많이 생각할거야.", + "Bot:제발 그랬으면 좋겠다. 공항은 잘 도착했어?", + "User:응. 스위스에 도착해서 연락할게!", + "Bot:스위스는 잘 도착했어? 도착하면 연락해줘.", + "User:20시간만에 잘 도착했어. 너무 피곤해." + ], + "coherence": 3.3, + "engagingness": 1.7, + "naturalness": 3.7, + "groundedness": 3.0 + }, + { + "response": "아 그래? 그럼 내가 추천해주는 다른 노래도 들어봐. 이건 다른 장르야.", + "user_persona": [ + "나는 팝송을 잘 모른다", + "나는 CCM 음악을 좋아한다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 산책한다.", + "나는 학원 수학 강사이다.", + "나는 CCM 음악을 좋아한다.", + "나는 아르바이트에 대해서 관심을 갖고 공부했었다." + ], + "prev_dialog": [ + "User:고마워! 혹시 치위생사님은 어떤 음악 장르를 좋아해?", + "Bot:나는 평범한 팝송이야. 좋은 음악이 너무 많아.", + "User:아, 내가 팝송을 잘 몰라서 들어보고 싶은데, 혹시 지금 공유해줄 수 있어?", + "Bot:응 여기. this is me라는 곡인데, 내가 제일 좋아하는 곡 중 하나야.", + "User:이 노래가 팝송이었어? 나는 이 노래를 좋아해서 가끔 듣는데, 팝송인줄 몰랐네." + ], + "coherence": 4.3, + "engagingness": 3.6, + "naturalness": 4.5, + "groundedness": 2.7 + }, + { + "response": "아하 그렇구나. 나는 전도사가 종교쪽 직업인 줄만 알았지, IT쪽이 있다는 건 몰랐네.", + "user_persona": [ + "나는 전도사이다", + "나는 30대 남자이다", + "나의 종교는 기독교이다 나의 부모님은 불교이다" + ], + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 고슴도치 두 마리를 키운다.", + "나는 팝 음악을 좋아한다." + ], + "prev_dialog": [ + "User:IT계열은 요즘 좋아서 인식이 좋지 않아?", + "Bot:돈은 많이 받는 걸로 알고 있는데, 헬이야. 넌 잠을 안자고 일하면 어때?", + "User:아니, 너무 힘들 것 같아. 전도사는 은근히 꿀인 것 같아. 월급은 적지만 나름 소소하게 살아가고 있어.", + "Bot:실례지만 월급이 얼마나 돼?", + "User:세전 150만원 정도야. 그래도 하나님한테 봉사하는 개념으로 일하고 있어." + ], + "coherence": 3.2, + "engagingness": 3.3, + "naturalness": 2.9, + "groundedness": 3.5 + }, + { + "response": "지금 일 시작했는데 퇴근하고 연락할게.", + "user_persona": [ + "나는 영어 학원에 다닌다", + "나는 일이 지루하다", + "나는 대학생이다" + ], + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 눈치가 없는 편이다.", + "나는 사무 보조원이다.", + "나는 신 음식을 즐겨 먹는다.", + "나는 요즘 스펙에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:제대로 대화를 해보자.", + "Bot:이게 뭔가 좀 이제는 익숙해졌어. 나중에 기회 되면 풀어봤으면 좋겠어. 방학에는 학교 아예 안가?", + "User:학교는 안 가. 영어 학원을 다녀. 영어에 관심 없는데 어쩔 수 없이 하게 되는 것 같아.", + "Bot:맞아. 어려운데 꼭 해야 하는 거라 스트레스를 많이 받는 것 같아. 난 슬슬 다시 들어가야 해서 퇴근하고 연락할게.", + "User:응, 일 보고 다시 봐." + ], + "coherence": 3.1, + "engagingness": 1.6, + "naturalness": 2.5, + "groundedness": 3.6 + } +] \ No newline at end of file diff --git a/g_eval/results/GEVAL_solar_vl2_no_persona.json b/g_eval/results/GEVAL_solar_vl2_no_persona.json new file mode 100644 index 0000000..c18c9b5 --- /dev/null +++ b/g_eval/results/GEVAL_solar_vl2_no_persona.json @@ -0,0 +1,1224 @@ +[ + { + "response": "네~ 잘 케어해주세요!", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 고양이 두 마리를 키운다.", + "나는 밴드부 동아리에 관심이 없다.", + "나는 일식을 싫어한다." + ], + "prev_dialog": [ + "User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?", + "Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.", + "User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?", + "Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.", + "User:빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게." + ], + "coherence": 5.0, + "engagingness": 3.0, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 거주지는 대구이다.", + "나는 워드프로세서 자격증을 준비한다.", + "나는 단소 연주를 배우고 싶다.", + "나는 요즘 어머니에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm를 못 넘기면 사람 취급도 못 받는다고 하더라고.", + "Bot:아 그렇군. 그런 말은 다소 너무하다는 생각도 가끔 들어.", + "User:그래서 더 이악물고 운동하는 것 같기도해.", + "Bot:화이팅이야. 어머니가 좀 다소 옛날분이셔서 그런 생각을 하셨나봐.", + "User:괜찮아. 너는 어머니하고 사이 좋아?" + ], + "coherence": 5.0, + "engagingness": 3.5, + "naturalness": 4.9, + "groundedness": 5.0 + }, + { + "response": "선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 커피를 최근에 끊었다.", + "나는 2년 전에 이사를 했다.", + "나는 매운 음식을 좋아한다." + ], + "prev_dialog": [ + "User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해.", + "Bot:선생님은 어학연수를 가셔야 하는데, 나보다 더 조심하셔야 하는 거 알지?", + "User:응, 맞아. 나도 항상 그래서 조심하고 또 조심해.", + "Bot:미국에서는 병원비도 장난 아니라고 들었어.", + "User:맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해." + ], + "coherence": 4.9, + "engagingness": 3.6, + "naturalness": 4.4, + "groundedness": 3.9 + }, + { + "response": "그래. 다음에 보자.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 죄책감이 든다.", + "나는 심리학이 부전공이다.", + "나는 보라색을 좋아한다.", + "나는 아이스 카푸치노를 매일 2잔 이상 마신다." + ], + "prev_dialog": [ + "User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야.", + "Bot:뭘 먹을래? 나는 카푸치노를 좋아해.", + "User:나도! 나는 카푸치노를 매일 2잔 이상 마실 정도로 좋아해.", + "Bot:굉장히 좋아하시는 것 같네. 카푸치노의 그 거품이 너무 좋아.", + "User:그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자." + ], + "coherence": 5.0, + "engagingness": 2.3, + "naturalness": 5.0, + "groundedness": 4.8 + }, + { + "response": "그래야겠다. @이름@도 목관리 잘해!", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 10대이다.", + "내가 사는 곳은 속초이다", + "나는 반려동물 미용사가 되고 싶다", + "나는 동화를 가끔 읽는다", + "나는 파란색을 싫어한다" + ], + "prev_dialog": [ + "User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같은 큰 치료를 받아본 적이 있어?", + "Bot:아니, 아직 수술은 안해봤어. 나중에 고의로든 타의로든 하게 될지도 모르는데 마취가 너무 무서운 것 같아.", + "User:나는 편도절제술을 해봤어. 아주 아픈 치료였지. @이름@ 너는 편도염에 자주 걸리는 편이야?", + "Bot:편도염 아니야. 한번도 걸려본 적이 없는데 너무 아플 것 같아. 지금은 어때?", + "User:응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해." + ], + "coherence": 5.0, + "engagingness": 3.5, + "naturalness": 4.9, + "groundedness": 4.6 + }, + { + "response": "게임에 푹 빠졌구나. 나도 게임 얘기하니까 게임하고 싶다.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 강아지에 관심이 없다.", + "나는 사회복지학과 전공이다.", + "나는 태블릿을 잘 활용한다." + ], + "prev_dialog": [ + "User:나는 오늘 약속이 없어서 게임이나 하려고. 너는?", + "Bot:나도 게임하려고 했는데, 난 주로 콘솔 게임을 해.", + "User:아 정말? 나도 콘솔 게임해. 어떤 게임해?", + "Bot:나는 요즘 동물의 숲에 빠졌어. 너는?", + "User:나랑 똑같네. 나도 동물의 숲을 하고 있어." + ], + "coherence": 4.9, + "engagingness": 3.3, + "naturalness": 4.3, + "groundedness": 4.5 + }, + { + "response": "RPG게임을 하고 있어. 너도 한번 해보라고 추천해주고 싶은데, 너는 관심이 없을 것 같아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 매우 꼼꼼하다.", + "나는 뉴질랜드로 유학을 간다.", + "나는 뮤지컬 영화를 가끔 본다.", + "나는 커피를 싫어한다." + ], + "prev_dialog": [ + "User:미안해, 한시간이나 걸렸네. 친구가 내가 커피를 싫어하는데 사와버렸어.", + "Bot:커피는 맛있는데, 나는 이제 게임하러 갈게.", + "User:고양이를 키우고 싶고, 정원을 가꾸는 것을 좋아하지 않고, 기타를 배우고 싶어. 맞지?", + "Bot:뭔데? 기억력이 엄청 좋은 것 같아.", + "User:내가 매우 꼼꼼해서 기억하려고 적어 놨어. 무슨 게임해?" + ], + "coherence": 4.9, + "engagingness": 3.6, + "naturalness": 4.4, + "groundedness": 3.8 + }, + { + "response": "나도 서울살아. 시어머니께서 너무 잘 해주셔.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 토끼 한 마리를 키운다.", + "나는 다림질하는 것을 좋아한다.", + "나는 등산을 가끔 한다." + ], + "prev_dialog": [ + "User:맞아. 비디오게임을 콘솔게임이라 하지. 나는 @브랜드명1@ 게임을 했어.", + "Bot:게임에 대해서 많이 아는 것 같네. @브랜드명2@의 엑스박스 360도 알아?", + "User:당연하지. 한국에서는 삼돌이라는 애칭으로 불려. 구입하고 싶은데 아직 못했어.", + "Bot:정말 멋진 분이시네. 어디 살아?", + "User:나는 서울에 살아. 시어머니와 함께 산책을 즐기는 네가 더 멋져." + ], + "coherence": 4.3, + "engagingness": 2.0, + "naturalness": 3.1, + "groundedness": 3.6 + }, + { + "response": "응, 오늘 날씨는 너무 좋네.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 앵무새 한 마리를 키운다.", + "나는 요리를 다른 사람에게 자주 해 준다.", + "나는 딸기를 즐겨 먹는다." + ], + "prev_dialog": [ + "User:나도 딸기를 좋아해서 많이 먹어. 나중에 한 번 우리 가게에 올래?", + "Bot:응, 좋아 그럼 진짜로 갈까?", + "User:응, 난 일 좀 하고 올게.", + "Bot:응, 나중에 또 대화하자.", + "User:어제는 정신 없어서 퇴근 후에 연락을 못했어. 오늘 날씨가 굉장히 좋지 않네." + ], + "coherence": 1.0, + "engagingness": 1.0, + "naturalness": 1.1, + "groundedness": 1.1 + }, + { + "response": "그러게 말이야. 여름을 잘 보내려면 에어컨이 꼭 있어야 돼.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나는 따뜻한 날씨를 싫어한다", + "나의 거주지는 부천이다", + "나는 눈치가 없는 편이다", + "나는 앵무새를 키우고 싶다" + ], + "prev_dialog": [ + "User:폭염 때문에 죽는 사람들도 더러 있더라.", + "Bot:응, 폭염이 너무 무서워.", + "User:이름씨는 폭염을 경험해본 적이 있어?", + "Bot:응, 제작년 여름에 에어컨이 없어서 힘들었어.", + "User:에어컨이 없는 여름은 상상하기도 싫어. 에어컨은 필수인 것 같아." + ], + "coherence": 5.0, + "engagingness": 3.0, + "naturalness": 5.0, + "groundedness": 4.9 + }, + { + "response": "그래서인지 요즘 더위를 극복하는 방법에 대해서 공부해.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나의 거주지는 김해이다.", + "나는 학원 논술 강사이다.", + "나는 오전에 커피를 마신다.", + "나는 요즘 폭염에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:아, 본가가 대구야? 학교 때문에 서울에서 자취한다 했는데, 엄청 멀리 떨어져있네. 학교 다닐 때는 어땠어?", + "Bot:응 본가는 대구고, 주말마다 본가로 내려가고 있어.", + "User:주말마다요? 대단하네. 대구는 아무래도 밑에 있으니까 위보다는 더 덥지 않을까? 김해는 더 밑에 있어.", + "Bot:대프리카라는 말도 있잖아. 대구랑 아프리카의 합성어야.", + "User:맞아, 이상하게 왜 대구가 그렇게 더운지. 힘들겠다." + ], + "coherence": 5.0, + "engagingness": 3.7, + "naturalness": 4.0, + "groundedness": 4.7 + }, + { + "response": "고마워 안녕~", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 빵을 먹는다.", + "나는 영어영문학이 부전공이다.", + "나는 바이올린 연주를 자주 한다.", + "나는 요즘 성적에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:오, 모범생이니까 잘 받을거야. 그럼 성적 관리는 어떻게 하는지 물어봐도 될까?", + "Bot:나는 평소 출석과 수업태도 등으로 교수님들께 좋은 인상으로 남기려고 하고, 과제 제출같은 경우는 아슬아슬하게 제출하기보다는 여유를 두고 제출하는 편이야.", + "User:나도 성적 관리에 더 신경써야겠다. 그럼 난 슬슬 가봐야 해서. 다음에 또 연락 가능할까?", + "Bot:응, 너무 오래 잡아 놨네. 다음에 한번 연락할게.", + "User:응, 그럼 그때 봐. 좋은 하루 보내." + ], + "coherence": 5.0, + "engagingness": 3.2, + "naturalness": 4.9, + "groundedness": 4.9 + }, + { + "response": "고마워. 너는 요즘 뭐하고 지내?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 종교는 개신교이다", + "나는 사진부 동아리에 관심 있다", + "나는 가야금 연주를 가끔 한다" + ], + "prev_dialog": [ + "User:31시간 만이네. 내가 그저께 못 물어본게 있는데, 고3이야?", + "Bot:응 맞아. 나는 수능을 준비 중인 고3이야. 그래서 매우 괴로워.", + "User:학교에서 야간자율학습도 해?", + "Bot:나는 하고 있는데, 자유롭게 신청해서 받아. 성적이 낮아서 열심히 해야해.", + "User:열심히 노력했으니 성적 잘 받을 수 있을거야." + ], + "coherence": 4.3, + "engagingness": 3.7, + "naturalness": 4.9, + "groundedness": 1.4 + }, + { + "response": "그래? 반가운걸? 그럼 경영학과 관련된 궁금한 것 있으면 언제든 물어봐.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 여자 형제는 변호사이다.", + "나는 사진부 동아리에 관심이 없다.", + "나는 노트북을 리뷰하는 것을 좋아한다.", + "나는 요즘 자격증에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:미래를 계획하고 준비하니까 잘 될 것 같아서 기분이 좋아. 학생이면 어떤 수업을 들어?", + "Bot:내가 경영학과라서 경영 관련 전공수업을 듣고 있어.", + "User:경영학 수업이면 앞으로도 도움이 될거야. 좋은 수업 듣고 있어.", + "Bot:응, 회계사님도 학부생 때 경영 관련 수업 많이 들었겠네.", + "User:응, 나도 들은 수업들이니 반가우면서 도움이 될 것 같아." + ], + "coherence": 4.9, + "engagingness": 4.4, + "naturalness": 4.7, + "groundedness": 4.9 + }, + { + "response": "고마워, 너도 밥 맛있게 먹어!", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 10대이다.", + "나의 생일은 5월이다", + "나는 사람을 깊이 사귀지 못한다", + "나는 체육 활동하는 게 즐겁다" + ], + "prev_dialog": [ + "User:나는 3정거장만 가면 돼. 걷기엔 멀어서 지하철 타고 다녀.", + "Bot:부럽네, 나도 더 가까웠으면 좋겠어.", + "User:30분이면 그래도 좀 먼 것 같아. 집 가까운게 최고야.", + "Bot:그렇지. 가까운 게 최고지. 난 이제 밥 먹으러 가볼게. 다음에 이야기하자.", + "User:응, 고생했어. 식사 맛있게 먹어." + ], + "coherence": 5.0, + "engagingness": 3.3, + "naturalness": 5.0, + "groundedness": 4.7 + }, + { + "response": "아, 그러시구나. 요리도 배우면 좋을 것 같아. 요리도 재밌잖아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 거주지는 경기도이다.", + "나는 물건을 자주 잃어버린다.", + "나는 요즘, 매일 짜증이 난다." + ], + "prev_dialog": [ + "User:응. 나는 그런 것도 안 봤어. 엄청 유명한 건 알고 있지만.", + "Bot:나는 어렸을 때부터 경찰이 꿈이여서 형사물이나 히어로물에 환장해. 남자애들하고도 맨날 싸웠어. 어떤 장르를 좋아해?", + "User:아, 강하신 분이셨구나 ㅎㅎ 나는 판타지 빼고는 다 보는데 코메디를 자주 봐.", + "Bot:응, 남자처럼 자라가지고 중학교 때까지 유도부를 했었어. 운동을 좋아해?", + "User:아, 유도부였구나. 조금 무섭네. 운동은 좋아하지 않고 요리 같은 것을 좋아해." + ], + "coherence": 4.9, + "engagingness": 3.7, + "naturalness": 4.6, + "groundedness": 2.8 + }, + { + "response": "합창은 싫어하는데 혼자 부르는 것은 좋아해. 그래서 밴드부 동아리에도 관심이 있어.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 앵무새 한 마리를 키운다.", + "나는 요리를 다른 사람에게 자주 해 준다.", + "나는 딸기를 즐겨 먹는다.", + "나는 요즘 신호등/횡단보도에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:힙합은 정말 좋아. 곧 할 쇼미11에 출연하고 있어. 그럼 난 이만 일정이 있어서 가볼게.", + "Bot:그렇군. 나도 동아리 좀 보러 갈게.", + "User:거의 하루만에 연락을 주네. 동아리는 잘 다녀왔어?", + "Bot:안녕, 나는 합창단 동아리에 관심이 있어서 보고 왔어.", + "User:원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데." + ], + "coherence": 3.9, + "engagingness": 3.8, + "naturalness": 4.2, + "groundedness": 1.4 + }, + { + "response": "그래 맛있는 점심 먹고 와", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 동료와 사이가 안 좋다.", + "나는 콜센터 상담원이다.", + "나는 TV 뉴스를 자주 본다.", + "나는 요즘 백신에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:도마뱀? 나는 못 키울 것 같은데 대단하네. 운전하기 힘들진 않아?", + "Bot:운전하는 건 재밌어. 대신 기사님들과 밥을 먹어야 하는데, 오늘 메뉴는 닭볶음탕이야. 나는 닭볶음탕을 안 먹는데...", + "User:닭볶음탕 맛있는데, 그럼 좋아하는 음식이 뭐야?", + "Bot:나는 떡볶이를 좋아해. 그래서 오늘은 주문해서 먹을거야.", + "User:그렇군. 그럼 선생님 식사 맛있게 해. 나도 배가 고파서 밥 먹고 올게." + ], + "coherence": 5.0, + "engagingness": 2.7, + "naturalness": 4.9, + "groundedness": 4.8 + }, + { + "response": "아까 첼로 이야기했는데, 첼로 연습을 못하니까 심심해서 어떡해?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 죄책감이 든다.", + "나는 금속공예 만들기를 좋아한다.", + "나는 힙합 음악을 자주 듣는다." + ], + "prev_dialog": [ + "User:좋아! 이틀동안 잘 지내~", + "Bot:이틀만이야. 잘 지냈어?", + "User:응, 지금 남동생 면회 다녀오는 중이야.", + "Bot:동생이 군대에 갔구나. 얼마나 복무했어?", + "User:지금 1년 2개월 째야. 4개월 뒤면 전역이야." + ], + "coherence": 1.0, + "engagingness": 1.1, + "naturalness": 1.0, + "groundedness": 1.0 + }, + { + "response": "아니, 내 친구 중에 군인 친구는 없어. 군대 간 친구 면회는 가봤어?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 매일 감사하다", + "나는 방송 촬영 기사이다", + "나는 바나나를 싫어한다" + ], + "prev_dialog": [ + "User:오늘 친구를 만나고 왔어. 오늘 하루 잘 보냈어?", + "Bot:응, 방송 촬영 기사라서 일이 많아. 근데 친구는 잘 만났어?", + "User:응. 친구가 군인인데 휴가를 나왔거든.", + "Bot:정말 오랜만에 보는 친구네.", + "User:응, 군인 친구를 면회 가 본 적 있어?" + ], + "coherence": 4.8, + "engagingness": 3.4, + "naturalness": 4.7, + "groundedness": 4.6 + }, + { + "response": "아니! 주름에 필러를 맞아봤어?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 조경기술자이다", + "나는 주말에 청소를 한다", + "나는 TV 다큐멘터리를 가끔 본다" + ], + "prev_dialog": [ + "User:나는 기초화장품에 충실한 편이야. 또 클렌징에도 집중하는 편이야.", + "Bot:클렌징이 중요하지! 나는 항상 클렌징 워터만 쓰다가 클렌징 오일을 처음 써봤는데 잘 지워졌어. 오일은 써봤어?", + "User:응 오일을 써보긴했지만, 아침에는 가벼운 세안을 해. ", + "Bot:그렇군. 주름을 예방하려면 선크림을 잘 발라야 한다던데, 나는 매번 까먹어.", + "User:맞아, 선크림이 중요하다고 하더라고. 그런데 스킨로션이 가장 먼저라고 해. 필러는 맞아봤어?" + ], + "coherence": 4.9, + "engagingness": 3.9, + "naturalness": 4.2, + "groundedness": 3.8 + }, + { + "response": "너도 곱슬머리구나. 곱슬머리가 잘 안정리되잖아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 통역가이다.", + "나는 블루베리를 즐겨 먹는다." + ], + "prev_dialog": [ + "User:생각해봐야겠네. 요즘 환절기라 피부나 외모에 관심이 가. 어때?", + "Bot:맞아. 나도 요즘 머리스타일을 바꿔서 외모에 변화를 주려고 해.", + "User:남자들은 머리스타일 바꾸는것만 하더라도 굉장한 외모의 변화야.", + "Bot:맞아. 내가 머리가 곱쓸머리라 외모에 불만이 많아.", + "User:나도 곱슬머리라서 주기적으로 매직을 해야 외모가 단정해지는 것 같아." + ], + "coherence": 4.9, + "engagingness": 3.3, + "naturalness": 4.3, + "groundedness": 4.5 + }, + { + "response": "그래 잘 마셔. 다음에 또 연락해.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 친구가 많다.", + "나는 사무관이다.", + "나는 자주 외롭다.", + "나는 강아지에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그렇군. 나는 퇴근하면 친구를 만나서 술 한잔 할 것 같아.", + "Bot:그래도 다행인데, 내가 아무데서나 잘 자. 친구를 만나나봐. 술은 잘 마셔?", + "User:그래도 집에서 자면 좋을텐데 바쁘셔서... 나는 친구가 많아. 자주 만나서 술을 마셔.", + "Bot:괜찮아. 어쩔 수 없지. 술을 좋아해?", + "User:응 자주 마셔. 그럼 다음에 또 연락할게." + ], + "coherence": 5.0, + "engagingness": 2.3, + "naturalness": 4.5, + "groundedness": 4.5 + }, + { + "response": "그렇구나. 운동 열심히하고와.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 물고기 한 마리를 키운다.", + "나는 주말에 빨래를 한다.", + "나는 로맨스 영화를 자주 본다.", + "나는 요즘 유기견에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:내가 지금 러닝 동아리에 참여하고 있거든.", + "Bot:오늘도 러닝하는 날이야? 힘들지는 않아?", + "User:힘들지는 않아. 내가 운동 하는걸 좋아해서 그런가봐.", + "Bot:그렇군. 러닝은 좋은 운동이야. 그럼 지금 가야겠네?", + "User:응, 지금 바로 가야할 것 같아." + ], + "coherence": 5.0, + "engagingness": 3.0, + "naturalness": 5.0, + "groundedness": 4.0 + }, + { + "response": "오~ 너무 멋지다! 오보에 학원은 어때?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 10대이다.", + "내가 사는 곳은 원주이다", + "나는 논술 준비하는 게 지루하다", + "나는 한식을 좋아한다", + "나는 가끔 편안하다" + ], + "prev_dialog": [ + "Bot:저 오늘 김치찌개 먹었는데, 진짜 맛있었어! 식사는 했어?", + "User:응, 먹었어. 이미 먹고 나왔어. 내가 오보에를 배우고 싶어서 학원 상담 예약을 해놨거든. 그럼 이만 상담을 하러 먼저 가 볼게. 나중에 다시 대화하자.", + "Bot:오보에라니 멋지네! 그럼 다음에 또 대화 하자!", + "Bot:안녕. 5주만이네. 오보에 학원은 등록 했어?", + "User:안녕, 오랜만이야. 네, 학원 등록하고 저번주부터 다니기 시작했어." + ], + "coherence": 5.0, + "engagingness": 4.2, + "naturalness": 5.0, + "groundedness": 4.7 + }, + { + "response": "만화 좋아하지. 특히 @브랜드명2@ 만화 좋아해. @브랜드명3@는 너무 잔인해서 싫어하는데. @브랜드명3@는 왜 그리 잔인하단 말이야?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 토끼 두 마리를 키운다.", + "나는 기계항공 공학부 전공이다.", + "나는 트럼펫 연주를 가끔 한다." + ], + "prev_dialog": [ + "User:몇년 전에 맥그리거와 메이웨더가 싸울 때 가입했어. 거기가 독점이라서.", + "Bot:아, 그런 시스템이 있었구나. 잘 몰랐어.", + "User:거기 아니면 못봐서 어쩔수가 없더라. 근데 해지하기 귀찮아서 계속 보고 있어.", + "Bot:그러면 뭐 다른건 잘 보는 게 있어?", + "User:그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?" + ], + "coherence": 4.4, + "engagingness": 3.9, + "naturalness": 3.8, + "groundedness": 2.9 + }, + { + "response": "너도 내 춤을 궁금해 해줘서 고마워. 다음주에 내가 첼로를 연주하는 영상을 보여줄게. 재밌게 봐줄래?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 커피를 마시지 않는다.", + "나는 집배원이다.", + "나는 댄스 음악을 싫어한다.", + "나는 요즘 노래에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:부지런한 사람이야. 열심히 체력을 기르려고 노력하는 편이야.", + "Bot:좋은 자세야. 춤 추는 것도 좋아해?", + "User:춤? 가끔 노래 듣다가 신나면 춤을 춰.", + "Bot:귀엽네. 나는 댄스 음악을 싫어해서 재즈 음악에 흐느적거리는 걸 좋아해. 댄스 음악도 좋아해?", + "User:댄스 음악을 좋아해. 브레이브걸스의 롤린을 좋아해. 재즈도 좋아해. 너의 춤이 궁금해." + ], + "coherence": 3.6, + "engagingness": 3.8, + "naturalness": 3.8, + "groundedness": 3.1 + }, + { + "response": "내가 싫어하는 가을이라서 그런지 요즘 날씨에 대한 뉴스가 많이 나오더라고.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 힐링 여행을 가끔 간다.", + "나는 만화부 동아리에 관심이 없다.", + "나는 수필을 싫어한다." + ], + "prev_dialog": [ + "User:아, 저 이만 힐링 여행 알아보러 가봐야겠다. 가끔 가거든.", + "Bot:응. 그러면 또 이따 연락해. 잘 들어.", + "User:수업 열심히 듣고왔더니 한시간 지났네.", + "Bot:응. 금방 왔네. 나는 뉴스를 보고 있었어.", + "User:그래? 무슨 뉴스가 나왔어?" + ], + "coherence": 4.2, + "engagingness": 2.8, + "naturalness": 4.2, + "groundedness": 2.9 + }, + { + "response": "응 맞아. 시장에서는 한 봉지에 만원으로 살 수 있거든. 근데 마트에서는 한 봉지에 오천원이잖아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 다소 긍정적이다.", + "나는 손톱 관리사이다.", + "나는 발라드 음악을 좋아한다.", + "나는 맥주를 일주일에 서너 번 마신다." + ], + "prev_dialog": [ + "User:난 이제 일이 끝났어. 손님이 늦게까지 있었거든. 너는 퇴근했어?", + "Bot:응, 진작 들어와서 집이야. 과일을 사오려고 했는데 마트에 가니까 비싸서 내일 시장에 가서 사려고 해.", + "User:많이 차이 나? 나는 내일 마트에 가려고 했어.", + "Bot:응, 아무래도 우리 집앞에 청과물시장이 있는데 정말 저렴하거든.", + "User:어느정도 해? 마트는 상자로 구입하면 2만원 넘게 줬던 것 같아. 과일마다 다르지만." + ], + "coherence": 4.9, + "engagingness": 3.5, + "naturalness": 3.6, + "groundedness": 4.5 + }, + { + "response": "아마도 지금쯤 첼로를 연주하고 있을 거예요.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 거북이 한 마리를 키운다.", + "나는 작곡가이다.", + "나는 오보에 연주를 자주 한다.", + "나는 아이스 바닐라라떼를 자주 마신다." + ], + "prev_dialog": [ + "User:그렇네, 대박. 완전 가족이겠네.", + "Bot:응, 진짜야. 얘 없으면 못 살아. 난 일하러 갈게.", + "User:응, 작곡일 열심히 해. 안녕~", + "Bot:일주일만에 연락드리네요. 궁금하셨죠?", + "User:고마워, 나도 기다렸어. 뭐 하고 있어?" + ], + "coherence": 2.9, + "engagingness": 3.3, + "naturalness": 3.6, + "groundedness": 2.5 + }, + { + "response": "감사합니다! 그럼 이제 집 근처에 도착했어! 다음에 또 대화하자.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나의 거주지는 제주도이다.", + "나는 작가이다.", + "나는 약속에 자주 늦는다.", + "나는 요즘 쇼핑 대상에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:늘 최선을 다하면서 글에 임하고 있어. 이건 내가 자부할 수 있어.", + "Bot:그렇군. 그럼 사람들도 그 진심을 알아보고 사줄 거야.", + "User:그렇게 말해줘서 고마워. 내 글을 한번 읽어볼래?", + "Bot:괜찮을까? 내가 사는 곳이 경기도인데, 여기까지 보내주실 수 있어?", + "User:응, 내가 특별히 공짜로 보내줄게. 좋은 말을 해줘서 고마워." + ], + "coherence": 1.1, + "engagingness": 1.6, + "naturalness": 1.1, + "groundedness": 1.1 + }, + { + "response": "그렇긴 해. 너는 오늘 뭐해?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 매일 스트레스를 받는다.", + "나는 산업공학과 전공이다.", + "나는 SF 영화를 가끔 본다." + ], + "prev_dialog": [ + "User:응 나도 과제 금방 마무리 했어! 밥은 먹었어?", + "Bot:아니, 이제 먹으려고 해. 너는?", + "User:ㅎㅎ 점심먹고 sns에 사진도 올렸는데.", + "Bot:그렇군. 밥 먹기 전에 필라테스를 먼저 가야할지 고민이야.", + "User:밥도 안 먹고 운동하면 어지럽지 않아?" + ], + "coherence": 4.7, + "engagingness": 3.3, + "naturalness": 4.8, + "groundedness": 4.1 + }, + { + "response": "나는 첼로를 배우고 있어. 학원 수학 강사로 일하는데 학생들의 기말고사 때문에 시간이 없어서 쉬어야 해.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 30대이다.", + "나는 관세사이다.", + "나는 실외에서 수상스키 타는 것을 싫어한다.", + "나는 가을을 싫어한다.", + "나는 요즘 운동에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:엄청 오래 했네. 지금도 잘 할 것 같아. 나도 너처럼 열심히 드럼을 배워야겠네.", + "Bot:무언가를 잘할땐 자신감이 생기는 것 같아. 싫어하는 일은 뭐야?", + "User:대화 즐거웠어. 일이 생겨서 먼저 가봐야겠다. 다음에 또 대화 나누자.", + "Bot:일주일 만이네 그동안 어떻게 지냈어?", + "User:안녕. 나는 별일 없이 잘 지냈어." + ], + "coherence": 1.0, + "engagingness": 1.0, + "naturalness": 1.4, + "groundedness": 1.0 + }, + { + "response": "응, 면접 준비도 해야하는데 너무 귀찮아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나의 종교는 불교이다.", + "나는 팟타이를 안 먹는다.", + "나는 토끼 한 마리를 키운다.", + "나는 요즘 음식에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:가리지는 않는데 주로 일식을 공부하고 있어.", + "Bot:나는 일식은 잘 모르는데, 일식 특징은 뭐야?", + "User:일식은 가능한 조미료를 사용하지 않고 재료가 가진 맛을 살린다는 점이 큰 특징이라 할 수 있어.", + "Bot:조미료를 안 쓴다니 신기하네.", + "User:응, 그런데 스튜어디스 준비는 잘 되고 있어?" + ], + "coherence": 1.2, + "engagingness": 1.8, + "naturalness": 2.1, + "groundedness": 1.1 + }, + { + "response": "우와 멋지다. 국악인이면 국악에 대해 잘 알겠네?", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 만족스럽다.", + "나는 중국어에 관심 있지만 배울 시간이 없다.", + "나는 별로 좋아하는 음식이 없다.", + "나는 요즘 음식에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그럴 수 있겠네. 워낙 바쁜가봐.", + "Bot:응 뭔가 활동이 많아서 그런 것 같아. 27살은 어떻게 지내?", + "User:나도 공연때문에 꽤나 바빴어.", + "Bot:배우나 가수야?", + "User:나는 국악인이야. 콘서트로 먹고 살아." + ], + "coherence": 5.0, + "engagingness": 4.4, + "naturalness": 4.8, + "groundedness": 4.7 + }, + { + "response": "그러니까. 내가 학원 수학강사라서 알바할 때 공부에 도움이 될만한 걸 보려고.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 와인을 싫어한다.", + "나는 슬랩스틱 영화를 가끔 본다.", + "나는 요즘 디저트에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:오 나도 그거 먹어보고 싶었는데 생각난김에 오늘 저녁에 사서 가야겠어.", + "Bot:나도 그럴 것 같아. 퇴근하면 뭘 해?", + "User:TV를 켜서 봐. TV 애니메이션을 가끔 보면서 하루의 피로를 푸는 것 같아.", + "Bot:나는 알바 끝나고 영화를 가끔 보곤해. 오늘은 슬랩스틱 영화를 보려고.", + "User:그렇군. 알바 끝나고 가끔 영화도 보고 괜찮은 것 같아." + ], + "coherence": 2.3, + "engagingness": 3.0, + "naturalness": 2.9, + "groundedness": 1.4 + }, + { + "response": "응, 나 태국음식을 좋아하는데, 나에게 추천해줄 수 있어?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 여자 형제는 모델이다.", + "나는 화덕 피자를 싫어한다.", + "나는 병원에 가는 게 불편하다.", + "나는 요즘 여행지에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:한 5명 정도 모을 수 있을까? 아마 좋을거야. 최소 하루에 20분 정도 촬영 시간은 길거야.", + "Bot:응, 모을 수 있어. 와, 많이 줘. 꼭 모아서 갈게. 혹시 식사도 줘?", + "User:응, 누나한테 말해둘게. 아마 협찬으로 화덕피자가 들어갈거야. 좋아해? 난 별로 안 좋아해.", + "Bot:고마워. 나는 신음식을 좋아하는데, 피자도 좋아해.", + "User:타바스코를 많이 뿌려 먹어. 신 음식을 좋아하면 동남아 음식을 좋아해?" + ], + "coherence": 4.4, + "engagingness": 4.1, + "naturalness": 4.5, + "groundedness": 4.1 + }, + { + "response": "그냥 쉬고 있는데 첼로 연습좀 해야겠다.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 40대이다.", + "나는 선후배와 친한 사람 한 두 명이 있다.", + "나는 정원을 가꾸는 게 즐겁다.", + "나는 요즘, 자주 외롭다." + ], + "prev_dialog": [ + "User:그래도 좀 북적 북적 되는게 나쁘진 않아.", + "Bot:하지만 요즘 애들은 좀 그렇지 않아? 뭔지를 알아?", + "User:아니, 그건 다 뉴스 속 이야기야. @이름1@ 얼마나 착한데.", + "Bot:그래? 내가 너무 색안경을 끼고 봤나봐.", + "User:그리고 보면 내가 어릴 때 수련회 갔던 생각도 나. 그나저나 그쪽은 주말인데 뭐해?" + ], + "coherence": 3.4, + "engagingness": 3.0, + "naturalness": 4.1, + "groundedness": 1.1 + }, + { + "response": "응. 우리 가족은 이번에 다 같이 가기로 했어. 부모님이랑 아내랑 그리고 아이랑.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 요즘, 자주 신이 난다.", + "나는 한국사능력검정 자격증을 취득했다.", + "나는 일식을 싫어한다." + ], + "prev_dialog": [ + "User:그럴수도 있겠네. 나는 개인적으로 좀 좋아하긴 하지만.", + "Bot:그렇군. 우리 부모님도 좋아해.", + "User:뭐 사람마다 취향이 있는거 아니겠어?", + "Bot:응, 근데 우리 부모님은 여행가신다 그러셔서 내가 호캉스 좀 알아봐 드리고 있어.", + "User:호캉스 좋지. 잘 쉬고 오길 바랄게." + ], + "coherence": 3.0, + "engagingness": 2.8, + "naturalness": 3.1, + "groundedness": 1.4 + }, + { + "response": "미팅? 대학 다닐 때 해본 적이 있어?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 40대이다.", + "나는 따뜻한 날씨를 싫어한다", + "나의 거주지는 부천이다", + "나는 눈치가 없는 편이다", + "나는 앵무새를 키우고 싶다" + ], + "prev_dialog": [ + "User:며칠 전에 친구 주선으로 소개팅을 했어.", + "Bot:오! 좋았겠다. 결과는 어땠어?", + "User:그렇게 잘될것 같지 않아. 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같아.", + "Bot:나는 운명이 있다고 믿어. 언젠간 만나겠지.", + "User:응, 아무래도 소개팅보다는 미팅이 더 편한 것 같아." + ], + "coherence": 4.7, + "engagingness": 3.5, + "naturalness": 4.3, + "groundedness": 3.4 + }, + { + "response": "부럽네. 나도 결혼은 했지만 남편하고 사이가 좋지 않아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 쇼핑호스트이다.", + "나는 발라드 음악을 자주 듣는다." + ], + "prev_dialog": [ + "User:잘 생각했어. 나는 일이 있어서 이만 끊을게.", + "Bot:안녕, 저번에 조언듣고 베이비시터 구했어.", + "User:잘했어. 내가 결혼도 안했고 연인도 없지만 @이름1@은 직업상 많이 봐와서 잘 안다고.", + "Bot:나는 결혼 한 줄 알았어. 연인도 없는데 안 외로워?", + "User:응, 나는 연인이 없지만 신경쓰지 않아. 외롭지도 않고." + ], + "coherence": 1.0, + "engagingness": 1.7, + "naturalness": 1.4, + "groundedness": 1.0 + }, + { + "response": "우와 진짜 멋있다! 축하해!", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 가끔 걱정스럽다.", + "나는 정치외교학부 전공이다.", + "나는 배구를 가끔 한다.", + "나는 요즘 영화에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:나는 요즘, 항상 평화로운 것 같아. 그래서 기분이 너무 좋아.", + "Bot:오호, 그렇군. 왜 평화로운 것 같아? 평화로운 이유가 있을텐데.", + "User:내가 하는 일이 너무 잘 되어서 자존감이 늘어.", + "Bot:그래? 일이 너무 잘 되어가니? 어떤 일이야? 궁금하긴 하네.", + "User:나는 항공기 조종사야. 기장으로 승진했어. 대단하지 않아?" + ], + "coherence": 5.0, + "engagingness": 4.7, + "naturalness": 5.0, + "groundedness": 4.8 + }, + { + "response": "나야 좋지. 저녁에 보자.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 30대이다.", + "나는 가족과 바빠서 얼굴 볼 시간 없다.", + "나는 딤섬을 즐겨 먹는다.", + "나는 TV 드라마를 좋아한다.", + "나는 요즘 OST에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:그렇게 말해주니 나까지 스트레스가 날라가는 것 같아.", + "Bot:진짜로 하면 스트레스만 날라가는게 아니라 기분이 좋아서 실제로 날아갈 수도 있어.", + "User:정말 재밌는 분이시네. 배꼽이 빠질 것 같아.", + "Bot:내 농담에 웃어주니까 나도 기분이 좋아. 우리 잘 맞는 것 같아.", + "User:이따가 저녁에 시간 있어? 같이 식사 할래?" + ], + "coherence": 5.0, + "engagingness": 3.6, + "naturalness": 5.0, + "groundedness": 4.1 + }, + { + "response": "나는 주말에 친구들이랑 여행을 갈까해.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 커피를 마신다", + "나는 예능 PD이다", + "나는 콘솔게임을 자주 한다" + ], + "prev_dialog": [ + "User:나는 시를 싫어하는데, 자꾸 지인들이 읽어보라고 하더라고. 콘솔게임이라는 것도 처음 들어봤어.", + "Bot:이름은 쉽게 읽히고 재미있어. 한번 검색해봐. 친구가 콘솔 게임 회사에 다니고 있기도 해.", + "User:응 꼭 한번 해보고 후기 알려줄게. 난 일이 있어서 가봐야 할 것 같아.", + "Bot:벌써 3일이나 지났네. 주말 휴일 계획 있어?", + "User:나는 집에서 애니메이션을 보면서 뒹굴거릴 예정이야. 집이 최고지." + ], + "coherence": 1.2, + "engagingness": 1.1, + "naturalness": 1.0, + "groundedness": 1.1 + }, + { + "response": "일단 혼자 해보려고 하는데, 어렵긴 할 것 같아. 인테리어 업체 알아보려면 많이 알아봐야할거 같아.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 어머니는 주부이다", + "나는 핸드폰 게임에 관심 없다", + "나는 팟타이를 좋아한다", + "나의 생일은 1월이다" + ], + "prev_dialog": [ + "User:응 나는 잘 지냈는데 일주일 동안 어떻게 지냈어?", + "Bot:나는 요즘 집 인테리어에 관심이 많아. 인테리어에 대해서 좀 관심있어?", + "User:나도 관심이 많은데 곧 크리스마스라서 크리스마스 분위기를 내보려고 인테리어를 바꾸고 있어. 집은 가족들과 같이 살아?", + "Bot:응, 나는 저번주에도 말했다시피 어머니가 주부셔서, 같이 살고 있어. 우리집이 오래된 아파트라서 구조적으로 인테리어를 바꿔볼까 고민중이야.", + "User:아 그럼 인테리어는 업체를 불러서 할 예정이야? 아니면 직접 해?" + ], + "coherence": 5.0, + "engagingness": 3.7, + "naturalness": 4.9, + "groundedness": 5.0 + }, + { + "response": "난 햄버거보다 @브랜드명2@버거를 좋아해. @브랜드명2@ 버거 먹어봤어?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나의 가족은 3명이다.", + "나는 대학생이다.", + "나는 판타지 영화를 자주 본다.", + "나는 요즘 아파트에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:수업을 열심히 듣고 이따 다시 연락하자.", + "Bot:응. 수업 화이팅하고 다시 대화하자.", + "User:난 수업 듣고 점심을 먹었어. 식사는 했어?", + "Bot:응, 먹었어. 뭐 먹었어?", + "User:나는 @브랜드명1@에서 햄버거를 먹었어. 햄버거를 정말 좋아하거든." + ], + "coherence": 5.0, + "engagingness": 4.1, + "naturalness": 4.5, + "groundedness": 3.9 + }, + { + "response": "서울로 가려구. 내가 대학원 진학을 준비하는데 학교가 서울이라 서울로 이사가려고 하거든.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나의 거주지는 용인이다", + "나는 가구 만들기에 흥미가 있다", + "나는 전자 음악을 싫어한다", + "나는 양식을 즐겨 먹는다", + "나는 요즘, 매일 열등감을 느낀다" + ], + "prev_dialog": [ + "User:응, 맛있게 먹고 좋은 시간 보내.", + "Bot:8시간 만이네. 저녁은 먹었어?", + "User:응, 어머니가 인도 카레를 해 두셔서 나는 따로 배달 시켜 먹었어. 너는?", + "Bot:그렇군. 나는 컵라면을 먹었어. 내가 곧 자취방 이사를 하거든. 그래서 끼니는 간단하게 떼우고 있어.", + "User:그렇구나. 용인에서 어디로 이사하는 거야?" + ], + "coherence": 4.9, + "engagingness": 4.6, + "naturalness": 5.0, + "groundedness": 4.6 + }, + { + "response": "아하 그렇구나. 그런데 패션쇼에서 모델들은 어떻게 런웨이에서 워킹을 하는 걸까?", + "user_persona": "", + "bot_persona": [ + "나는 20대이다.", + "나는 남자이다.", + "나는 모델이다.", + "나는 패션에 대해 이야기하는 것을 좋아한다.", + "나는 분홍색을 좋아한다.", + "나는 혈액형이 O형이다." + ], + "prev_dialog": [ + "User:그렇군. 나는 분홍색을 좋아하는데, 너도 입어보는 건 어때? 이미지가 완전 바뀔 것 같아.", + "Bot:안 돼. 뭔가 부끄럼쟁이가 될 것 같아. 하지만 내가 평소에 궁금증이 넘치는 사람이거든. 궁금증을 해소하고 싶은데 도움을 줄 수 있어?", + "User:응, 그러네. 어떤 부분에 궁금증이 있어? 도와줄 수 있으면 도와줄게.", + "Bot:내가 패션쇼에 대해서 궁금한게 있어서 그래. 아무래도 패션에 관심이 생기면 자연스레 패션쇼에도 관심이 가지 않겠어? 그래서 기왕 모델 만난 김에 물어보고 싶었어.", + "User:맞아. 패션쇼를 보면 멋진 모델들도 보고 이쁜 옷들도 구경할 수 있으니까." + ], + "coherence": 5.0, + "engagingness": 4.4, + "naturalness": 4.9, + "groundedness": 5.0 + }, + { + "response": "브랜드와 유명인 콜라보는 앞서 말했듯이 패션 브랜드와 유명인의 협업을 뜻하는거야. 연예인이나 유명 디자이너와 컬래버레이션을 통해 브랜드 이미지 제고와 매출 증대 효과를 노리는 거지.", + "user_persona": "", + "bot_persona": [ + "나는 20대이다.", + "나는 여자이다.", + "나는 모델이다.", + "나는 패션에 대해 이야기하는 것을 좋아한다.", + "나는 아침에 날씨를 확인한다.", + "나는 혈액형이 B형이다." + ], + "prev_dialog": [ + "User:요새 유행하는 브랜드 마케팅이 있어? 요새 패션 분야에 관심이 많이 생겨서 말이야.", + "Bot:요즘에는 '콜라보 마케팅'이 유행이야. 콜라보 마케팅은 말 그대로 타사 브랜드 또는 유명인과의 콜라보 등을 통해 진행되는 브랜드 마케팅을 의미해.", + "User:아 요즘은 콜라보를 브랜드끼리만 하는게 아니고 유명인과도 많이 하네?", + "Bot:응 맞아. 패션 콜라보의 경우 크게 3가지의 종류로 나눌 수 있어. 세가지가 어떤 것들인지 맞춰볼래?", + "User:음, 브랜드와 유명인의 콜라보는 알려줬지만, 사실 잘 모르겠어." + ], + "coherence": 5.0, + "engagingness": 4.0, + "naturalness": 4.8, + "groundedness": 4.9 + }, + { + "response": "응, 근데 내가 연락을 안한다고 불만이 있더라고. 그 친구는 연락을 너무 많이 해서 오히려 조금 짜증나던데.", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 요즘, 항상 신이난다.", + "나는 고전연구회 동아리에 관심 있다.", + "나는 가야금 연주를 자주 한다.", + "나는 요즘 사건 및 사고에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:청소 안하고 놀면 신경이 너무 쓰여서, 할거면 빨리하고 치우는게 좋아.", + "Bot:아쉽네. 누워서 좀 쉬려고 했는데, 그럼 설거지를 좀 하고 올게.", + "User:응, 천천히 하고 와. 나도 방 청소나 좀 하고 올게.", + "Bot:벌써 3시간이나 지났어? 설거지를 하고 같은 동아리 회원이 전화가 와서 말이야.", + "User:나도 집안 청소를 하고 나서야 겨우 쉴 수 있었어. 하지만 동아리에는 들어갔어?" + ], + "coherence": 4.8, + "engagingness": 3.6, + "naturalness": 4.7, + "groundedness": 4.9 + }, + { + "response": "스위스는 날씨 좋아?", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 새벽에 따뜻한 물을 마신다.", + "나는 풍물부 동아리에 관심 있다.", + "나는 수영을 싫어한다." + ], + "prev_dialog": [ + "User:그래도 누나가 분명 동생분을 많이 생각할거야.", + "Bot:제발 그랬으면 좋겠다. 공항은 잘 도착했어?", + "User:응. 스위스에 도착해서 연락할게!", + "Bot:스위스는 잘 도착했어? 도착하면 연락해줘.", + "User:20시간만에 잘 도착했어. 너무 피곤해." + ], + "coherence": 4.6, + "engagingness": 3.5, + "naturalness": 4.0, + "groundedness": 3.8 + }, + { + "response": "응! 나중에 너도 팝송에 빠질거야. 나중에 내가 더 추천해줄게!", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 아침에 산책한다.", + "나는 학원 수학 강사이다.", + "나는 CCM 음악을 좋아한다.", + "나는 아르바이트에 대해서 관심을 갖고 공부했었다." + ], + "prev_dialog": [ + "User:고마워! 혹시 치위생사님은 어떤 음악 장르를 좋아해?", + "Bot:나는 평범한 팝송이야. 좋은 음악이 너무 많아.", + "User:아, 내가 팝송을 잘 몰라서 들어보고 싶은데, 혹시 지금 공유해줄 수 있어?", + "Bot:응 여기. this is me라는 곡인데, 내가 제일 좋아하는 곡 중 하나야.", + "User:이 노래가 팝송이었어? 나는 이 노래를 좋아해서 가끔 듣는데, 팝송인줄 몰랐네." + ], + "coherence": 4.3, + "engagingness": 4.2, + "naturalness": 5.0, + "groundedness": 2.2 + }, + { + "response": "그럼 정말 천직인가 보다. 나도 나중에 전도사를 해야겠어.", + "user_persona": "", + "bot_persona": [ + "나는 남자이다.", + "나는 20대이다.", + "나는 종교가 없다.", + "나는 고슴도치 두 마리를 키운다.", + "나는 팝 음악을 좋아한다." + ], + "prev_dialog": [ + "User:IT계열은 요즘 좋아서 인식이 좋지 않아?", + "Bot:돈은 많이 받는 걸로 알고 있는데, 헬이야. 넌 잠을 안자고 일하면 어때?", + "User:아니, 너무 힘들 것 같아. 전도사는 은근히 꿀인 것 같아. 월급은 적지만 나름 소소하게 살아가고 있어.", + "Bot:실례지만 월급이 얼마나 돼?", + "User:세전 150만원 정도야. 그래도 하나님한테 봉사하는 개념으로 일하고 있어." + ], + "coherence": 4.8, + "engagingness": 3.7, + "naturalness": 4.2, + "groundedness": 2.0 + }, + { + "response": "내일 퇴근하고 연락할게", + "user_persona": "", + "bot_persona": [ + "나는 여자이다.", + "나는 20대이다.", + "나는 눈치가 없는 편이다.", + "나는 사무 보조원이다.", + "나는 신 음식을 즐겨 먹는다.", + "나는 요즘 스펙에 대해서 관심을 갖고 공부한다." + ], + "prev_dialog": [ + "User:제대로 대화를 해보자.", + "Bot:이게 뭔가 좀 이제는 익숙해졌어. 나중에 기회 되면 풀어봤으면 좋겠어. 방학에는 학교 아예 안가?", + "User:학교는 안 가. 영어 학원을 다녀. 영어에 관심 없는데 어쩔 수 없이 하게 되는 것 같아.", + "Bot:맞아. 어려운데 꼭 해야 하는 거라 스트레스를 많이 받는 것 같아. 난 슬슬 다시 들어가야 해서 퇴근하고 연락할게.", + "User:응, 일 보고 다시 봐." + ], + "coherence": 2.7, + "engagingness": 1.3, + "naturalness": 1.8, + "groundedness": 2.5 + } +] \ No newline at end of file From 5ac83ca353af2f6001607a39e6540fc7d96907ee Mon Sep 17 00:00:00 2001 From: hwyewon Date: Mon, 25 Mar 2024 15:43:53 +0900 Subject: [PATCH 07/10] Add Human evaluation code --- g_eval/g_eval_calculate.ipynb | 2745 +++++++++++++++++++++++++++++++++ g_eval/g_eval_make_form.ipynb | 926 +++++++++++ 2 files changed, 3671 insertions(+) create mode 100644 g_eval/g_eval_calculate.ipynb create mode 100644 g_eval/g_eval_make_form.ipynb diff --git a/g_eval/g_eval_calculate.ipynb b/g_eval/g_eval_calculate.ipynb new file mode 100644 index 0000000..b611707 --- /dev/null +++ b/g_eval/g_eval_calculate.ipynb @@ -0,0 +1,2745 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1차 실험" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_1.json') as f:\n", + " persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.3518523.3333334.3481483.633333
std1.1121530.9376810.9862721.198899
min1.0000001.0000001.0000001.000000
25%4.4250003.0250004.2500002.925000
50%4.9000003.6000004.8000003.900000
75%5.0000003.9000004.9000004.700000
max5.0000004.9000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.351852 3.333333 4.348148 3.633333\n", + "std 1.112153 0.937681 0.986272 1.198899\n", + "min 1.000000 1.000000 1.000000 1.000000\n", + "25% 4.425000 3.025000 4.250000 2.925000\n", + "50% 4.900000 3.600000 4.800000 3.900000\n", + "75% 5.000000 3.900000 4.900000 4.700000\n", + "max 5.000000 4.900000 5.000000 5.000000" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar = pd.DataFrame.from_dict(data=persona_solar, orient='columns')\n", + "persona_solar.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_no_persona_1.json') as f:\n", + " no_persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.1240743.1944444.0055563.461111
std1.3511610.9676691.2358511.449322
min1.0000001.0000001.0000001.000000
25%3.9750002.8500003.8000002.275000
50%4.9000003.5000004.4500003.950000
75%5.0000003.7750004.9000004.700000
max5.0000004.7000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.124074 3.194444 4.005556 3.461111\n", + "std 1.351161 0.967669 1.235851 1.449322\n", + "min 1.000000 1.000000 1.000000 1.000000\n", + "25% 3.975000 2.850000 3.800000 2.275000\n", + "50% 4.900000 3.500000 4.450000 3.950000\n", + "75% 5.000000 3.775000 4.900000 4.700000\n", + "max 5.000000 4.700000 5.000000 5.000000" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_persona_solar = pd.DataFrame.from_dict(data=no_persona_solar, orient='columns')\n", + "no_persona_solar.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2차 실험" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_2.json') as f:\n", + " persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.3962963.3092594.2740743.674074
std1.0993930.9082990.9738441.175085
min1.1000001.1000001.3000001.000000
25%4.4250002.9250004.1000003.300000
50%4.9000003.4500004.7000003.800000
75%5.0000004.0750005.0000004.675000
max5.0000004.7000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.396296 3.309259 4.274074 3.674074\n", + "std 1.099393 0.908299 0.973844 1.175085\n", + "min 1.100000 1.100000 1.300000 1.000000\n", + "25% 4.425000 2.925000 4.100000 3.300000\n", + "50% 4.900000 3.450000 4.700000 3.800000\n", + "75% 5.000000 4.075000 5.000000 4.675000\n", + "max 5.000000 4.700000 5.000000 5.000000" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar = pd.DataFrame.from_dict(data=persona_solar, orient='columns')\n", + "persona_solar.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_no_persona_2.json') as f:\n", + " no_persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.5388893.4314814.3907414.079630
std0.8528350.8273220.8698881.043286
min1.1000001.0000001.2000001.100000
25%4.7000003.1000004.1250003.700000
50%4.9000003.4500004.8000004.450000
75%5.0000004.0000004.9750004.800000
max5.0000004.9000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.538889 3.431481 4.390741 4.079630\n", + "std 0.852835 0.827322 0.869888 1.043286\n", + "min 1.100000 1.000000 1.200000 1.100000\n", + "25% 4.700000 3.100000 4.125000 3.700000\n", + "50% 4.900000 3.450000 4.800000 4.450000\n", + "75% 5.000000 4.000000 4.975000 4.800000\n", + "max 5.000000 4.900000 5.000000 5.000000" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_persona_solar = pd.DataFrame.from_dict(data=no_persona_solar, orient='columns')\n", + "no_persona_solar.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3차 실험" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_3.json') as f:\n", + " persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.3092593.2962964.2740743.661111
std1.2102190.9522491.0767151.285979
min1.0000001.1000001.0000001.000000
25%4.5000003.0000004.1250002.925000
50%4.9000003.5000004.8000004.000000
75%5.0000004.0000005.0000004.775000
max5.0000004.8000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.309259 3.296296 4.274074 3.661111\n", + "std 1.210219 0.952249 1.076715 1.285979\n", + "min 1.000000 1.100000 1.000000 1.000000\n", + "25% 4.500000 3.000000 4.125000 2.925000\n", + "50% 4.900000 3.500000 4.800000 4.000000\n", + "75% 5.000000 4.000000 5.000000 4.775000\n", + "max 5.000000 4.800000 5.000000 5.000000" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar = pd.DataFrame.from_dict(data=persona_solar, orient='columns')\n", + "persona_solar.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "with open('results/GEVAL_solar_vl2_no_persona_3.json') as f:\n", + " no_persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherenceengagingnessnaturalnessgroundedness
count54.00000054.00000054.00000054.000000
mean4.4314813.3018524.3685193.844444
std1.0417370.8426130.9111101.079599
min1.2000001.4000001.4000001.000000
25%4.6000002.7000004.2500003.500000
50%4.9000003.4500004.8000004.200000
75%5.0000004.0000004.9000004.675000
max5.0000004.6000005.0000005.000000
\n", + "
" + ], + "text/plain": [ + " coherence engagingness naturalness groundedness\n", + "count 54.000000 54.000000 54.000000 54.000000\n", + "mean 4.431481 3.301852 4.368519 3.844444\n", + "std 1.041737 0.842613 0.911110 1.079599\n", + "min 1.200000 1.400000 1.400000 1.000000\n", + "25% 4.600000 2.700000 4.250000 3.500000\n", + "50% 4.900000 3.450000 4.800000 4.200000\n", + "75% 5.000000 4.000000 4.900000 4.675000\n", + "max 5.000000 4.600000 5.000000 5.000000" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_persona_solar = pd.DataFrame.from_dict(data=no_persona_solar, orient='columns')\n", + "no_persona_solar.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 그냥 평균" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "coherence = []\n", + "engagingness = []\n", + "naturalness = []\n", + "groundedness = []" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 0%| | 0/54 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
responseuser_personabot_personaprev_dialog
03개월째 배우고 있는데, 중급단계를 배우고 있어.[나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ...[나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드...[User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리...
1응, 난 어머니한테 잘 하는 편이야.[나의 형은 자동차 정비원이다][나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서...[User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm...
2너도 꼭 조심하고![나는 미국으로 어학연수를 간다][나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전...[User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학...
3그래, 다음에 또 대화하자~[나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다][나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심...[User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘...
4그렇구나. 목관리 잘 해봐야겠다.[나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다...[나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미...[User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같...
\n", + "" + ], + "text/plain": [ + " response \\\n", + "0 3개월째 배우고 있는데, 중급단계를 배우고 있어. \n", + "1 응, 난 어머니한테 잘 하는 편이야. \n", + "2 너도 꼭 조심하고! \n", + "3 그래, 다음에 또 대화하자~ \n", + "4 그렇구나. 목관리 잘 해봐야겠다. \n", + "\n", + " user_persona \\\n", + "0 [나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ... \n", + "1 [나의 형은 자동차 정비원이다] \n", + "2 [나는 미국으로 어학연수를 간다] \n", + "3 [나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다] \n", + "4 [나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다... \n", + "\n", + " bot_persona \\\n", + "0 [나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드... \n", + "1 [나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서... \n", + "2 [나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전... \n", + "3 [나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심... \n", + "4 [나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미... \n", + "\n", + " prev_dialog \n", + "0 [User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리... \n", + "1 [User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm... \n", + "2 [User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학... \n", + "3 [User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘... \n", + "4 [User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같... " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar = pd.DataFrame.from_dict(data=persona_solar, orient='columns')\n", + "persona_solar.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "with open('korean_msc/preprocessing/GEVAL_No_Persona_solar_vl2_1.json') as f:\n", + " no_persona_solar = json.load(f)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
responseuser_personabot_personaprev_dialog
0네~ 잘 케어해주세요![나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드...[User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리...
1응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해.[나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서...[User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm...
2선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어?[나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전...[User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학...
3그래. 다음에 보자.[나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심...[User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘...
4그래야겠다. @이름@도 목관리 잘해![나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미...[User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같...
\n", + "
" + ], + "text/plain": [ + " response user_persona \\\n", + "0 네~ 잘 케어해주세요! \n", + "1 응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해. \n", + "2 선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어? \n", + "3 그래. 다음에 보자. \n", + "4 그래야겠다. @이름@도 목관리 잘해! \n", + "\n", + " bot_persona \\\n", + "0 [나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드... \n", + "1 [나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서... \n", + "2 [나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전... \n", + "3 [나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심... \n", + "4 [나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미... \n", + "\n", + " prev_dialog \n", + "0 [User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리... \n", + "1 [User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm... \n", + "2 [User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학... \n", + "3 [User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘... \n", + "4 [User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같... " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "no_persona_solar = pd.DataFrame.from_dict(data=no_persona_solar, orient='columns')\n", + "no_persona_solar.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
responseuser_personabot_personaprev_dialog
03개월째 배우고 있는데, 중급단계를 배우고 있어.[나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ...[나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드...[User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리...
1응, 난 어머니한테 잘 하는 편이야.[나의 형은 자동차 정비원이다][나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서...[User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm...
2너도 꼭 조심하고![나는 미국으로 어학연수를 간다][나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전...[User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학...
3그래, 다음에 또 대화하자~[나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다][나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심...[User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘...
4그렇구나. 목관리 잘 해봐야겠다.[나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다...[나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미...[User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같...
\n", + "
" + ], + "text/plain": [ + " response \\\n", + "0 3개월째 배우고 있는데, 중급단계를 배우고 있어. \n", + "1 응, 난 어머니한테 잘 하는 편이야. \n", + "2 너도 꼭 조심하고! \n", + "3 그래, 다음에 또 대화하자~ \n", + "4 그렇구나. 목관리 잘 해봐야겠다. \n", + "\n", + " user_persona \\\n", + "0 [나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ... \n", + "1 [나의 형은 자동차 정비원이다] \n", + "2 [나는 미국으로 어학연수를 간다] \n", + "3 [나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다] \n", + "4 [나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다... \n", + "\n", + " bot_persona \\\n", + "0 [나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드... \n", + "1 [나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서... \n", + "2 [나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전... \n", + "3 [나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심... \n", + "4 [나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미... \n", + "\n", + " prev_dialog \n", + "0 [User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리... \n", + "1 [User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm... \n", + "2 [User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학... \n", + "3 [User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘... \n", + "4 [User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같... " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "persona_solar.rename(columns={'response' : 'response_persona', \n", + " 'user_persona' : 'user_persona_predict'}, inplace = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "persona_solar['response_no_persona'] = no_persona_solar['response']\n", + "persona_solar = persona_solar[['user_persona_predict', 'bot_persona', 'prev_dialog', 'response_persona', 'response_no_persona']]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idtopicnum_sessionsbot_personabot_agebot_genderbot_occupationuser_personauser_ageuser_genderuser_occupationbot_dialoguser_dialogprev_dialognew_input
0K2-33237-CL21405-CP22628-07-07-S2.json가족2['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',...20대여성사무직['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ...20대여성기능직['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를...['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나...['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바...빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.
1K5-03865-CL74427-CP10762-07-02-S2.json가족2['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는...20대남성학생['나의 형은 자동차 정비원이다']20대남성무직['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '...['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히...['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면...괜찮아. 너는 어머니하고 사이 좋아?
2K2-08382-CL20425-CP21061-17-08-S2.json건강2['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '...20대남성학생['나는 미국으로 어학연수를 간다']20대남성무직['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ...['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를...['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ...맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.
3K2-31842-CL23868-CP23582-17-06-S2.json건강2['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'...20대남성학생['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ...20대여성자영업['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업...['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ...['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'...그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.
4K2-10919-CL12469-CP11587-17-05-S2.json건강2['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는...20대여성학생['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것...20대여성무직['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사...['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워....['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅...응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.
\n", + "
" + ], + "text/plain": [ + " id topic num_sessions \\\n", + "0 K2-33237-CL21405-CP22628-07-07-S2.json 가족 2 \n", + "1 K5-03865-CL74427-CP10762-07-02-S2.json 가족 2 \n", + "2 K2-08382-CL20425-CP21061-17-08-S2.json 건강 2 \n", + "3 K2-31842-CL23868-CP23582-17-06-S2.json 건강 2 \n", + "4 K2-10919-CL12469-CP11587-17-05-S2.json 건강 2 \n", + "\n", + " bot_persona bot_age bot_gender \\\n", + "0 ['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.',... 20대 여성 \n", + "1 ['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는... 20대 남성 \n", + "2 ['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '... 20대 남성 \n", + "3 ['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.'... 20대 남성 \n", + "4 ['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는... 20대 여성 \n", + "\n", + " bot_occupation user_persona user_age \\\n", + "0 사무직 ['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 ... 20대 \n", + "1 학생 ['나의 형은 자동차 정비원이다'] 20대 \n", + "2 학생 ['나는 미국으로 어학연수를 간다'] 20대 \n", + "3 학생 ['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 ... 20대 \n", + "4 학생 ['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것... 20대 \n", + "\n", + " user_gender user_occupation \\\n", + "0 여성 기능직 \n", + "1 남성 무직 \n", + "2 남성 무직 \n", + "3 여성 자영업 \n", + "4 여성 무직 \n", + "\n", + " bot_dialog \\\n", + "0 ['경기도에 살고 있구나. 난 20대이고 같은 경기도에 사는 여자야.', '고양이를... \n", + "1 ['안녕, 나는 20대 남성이야.', '안녕. 10대면 지금 고등학생이겠네.', '... \n", + "2 ['안녕, 난 20대 남자야. 반가워.', '오늘 기분이 좋더라. 너는 무슨 일을 ... \n", + "3 ['안녕, 나는 20대 남성이야.', '나도 아직 대학생이야. 우리 아버지가 운수업... \n", + "4 ['안녕, 나는 서울 사는 10대 여성이야.', '나는 요즘 모든 것이 귀찮아서 사... \n", + "\n", + " user_dialog \\\n", + "0 ['안녕, 난 경기도에서 살고 있어. 20대 여자야.', '같은 도시 사람이네. 나... \n", + "1 ['안녕, 나는 10대 남자야.', '응, 작곡가가 되기 위해서 음악 공부를 열심히... \n", + "2 ['기운이 엄청 넘치네. 나도 20대 남자야. 반가워.', '나는 싫어하는 EDM를... \n", + "3 ['안녕, 나는 20대 여성이야.', '나는 대학생이야. 너는 무슨 일을 해?', ... \n", + "4 ['안녕, 나는 10대 여성이고, 속초에 살고 있어.', '같은 10대라니 반가워.... \n", + "\n", + " prev_dialog \\\n", + "0 ['Bot:나는 학원 수학강사로 일하고 있는데, 다음주부터 학생들이 기말고사라서 바... \n", + "1 ['Bot:에이 그정도면 그래도 괜찮지. 우리 어머니는 남자 키가 175이상만 되면... \n", + "2 ['Bot:깁스 몇 주만 하면 되는 건데, 괜찮아.', 'User:축구하다가 너무 ... \n", + "3 ['Bot:정말 열심히 하네. 나는 야구를 좋아해서 야구 동아리에 들어가고 싶어.'... \n", + "4 ['Bot:솔직히 건강관리는 하나도 안하는 것 같아. 난 학교 하나 다니는 것도 벅... \n", + "\n", + " new_input \n", + "0 빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게. \n", + "1 괜찮아. 너는 어머니하고 사이 좋아? \n", + "2 맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해. \n", + "3 그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자. \n", + "4 응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해. " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('korean_msc/preprocessing/VL_session2_geval_v6_sampled_banmal.csv')\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "df['bot_dialog'] = df['bot_dialog'].apply(lambda x: eval(x))\n", + "df['user_dialog'] = df['user_dialog'].apply(lambda x: eval(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "df['total_dialog'] = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_persona_predictbot_personaprev_dialogresponse_personaresponse_no_persona
0[나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ...[나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드...[User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리...3개월째 배우고 있는데, 중급단계를 배우고 있어.네~ 잘 케어해주세요!
1[나의 형은 자동차 정비원이다][나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서...[User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm...응, 난 어머니한테 잘 하는 편이야.응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해.
2[나는 미국으로 어학연수를 간다][나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전...[User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학...너도 꼭 조심하고!선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어?
3[나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다][나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심...[User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘...그래, 다음에 또 대화하자~그래. 다음에 보자.
4[나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다...[나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미...[User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같...그렇구나. 목관리 잘 해봐야겠다.그래야겠다. @이름@도 목관리 잘해!
\n", + "
" + ], + "text/plain": [ + " user_persona_predict \\\n", + "0 [나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다, 나는 친구랑 일식 ... \n", + "1 [나의 형은 자동차 정비원이다] \n", + "2 [나는 미국으로 어학연수를 간다] \n", + "3 [나는 대학생이다, 나는 심리학이 부전공이다, 나는 카푸치노를 매일 2잔 이상 마신다] \n", + "4 [나는 요즘 치료를 받고 있다, 나는 건강관리를 안 해서 치료를 받고 있는 것 같다... \n", + "\n", + " bot_persona \\\n", + "0 [나는 여자이다., 나는 20대이다., 나는 고양이 두 마리를 키운다., 나는 밴드... \n", + "1 [나는 남자이다., 나는 20대이다., 나의 거주지는 대구이다., 나는 워드프로세서... \n", + "2 [나는 남자이다., 나는 20대이다., 나는 커피를 최근에 끊었다., 나는 2년 전... \n", + "3 [나는 여자이다., 나는 20대이다., 나는 요즘, 가끔 죄책감이 든다., 나는 심... \n", + "4 [나는 여자이다., 나는 10대이다., 내가 사는 곳은 속초이다, 나는 반려동물 미... \n", + "\n", + " prev_dialog \\\n", + "0 [User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리... \n", + "1 [User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm... \n", + "2 [User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해., Bot:선생님은 어학... \n", + "3 [User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야., Bot:뭘... \n", + "4 [User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같... \n", + "\n", + " response_persona response_no_persona \n", + "0 3개월째 배우고 있는데, 중급단계를 배우고 있어. 네~ 잘 케어해주세요! \n", + "1 응, 난 어머니한테 잘 하는 편이야. 응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해. \n", + "2 너도 꼭 조심하고! 선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어? \n", + "3 그래, 다음에 또 대화하자~ 그래. 다음에 보자. \n", + "4 그렇구나. 목관리 잘 해봐야겠다. 그래야겠다. @이름@도 목관리 잘해! " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?',\n", + " 'Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.',\n", + " 'User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?',\n", + " 'Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.',\n", + " 'User:빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "persona_solar.loc[0, 'prev_dialog']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "나도 구글 폼 대신 py 파일로 만들어야겠다~" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "주어진 이전 5-turn 대화, 이전 대화로부터 추출된 사용자 경험, 제공된 챗봇 페르소나를 보고 응답의 적절성에 대해 평가하시오." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
coherence_personaengagingness_personagroundedness_personanaturalness_personacoherence_no_personaengagingness_no_personagroundedness_no_personanaturalness_no_persona
052131531
144443333
244445555
377775555
444444645
\n", + "
" + ], + "text/plain": [ + " coherence_persona engagingness_persona groundedness_persona \\\n", + "0 5 2 1 \n", + "1 4 4 4 \n", + "2 4 4 4 \n", + "3 7 7 7 \n", + "4 4 4 4 \n", + "\n", + " naturalness_persona coherence_no_persona engagingness_no_persona \\\n", + "0 3 1 5 \n", + "1 4 3 3 \n", + "2 4 5 5 \n", + "3 7 5 5 \n", + "4 4 4 6 \n", + "\n", + " groundedness_no_persona naturalness_no_persona \n", + "0 3 1 \n", + "1 3 3 \n", + "2 5 5 \n", + "3 5 5 \n", + "4 4 5 " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('evaluate_data_hyw.csv')\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "true_friend", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c8535537f45f4cf80fad1d7a85641721eb0e7fb4 Mon Sep 17 00:00:00 2001 From: hwyewon Date: Tue, 26 Mar 2024 08:03:20 +0900 Subject: [PATCH 08/10] Add Human Evaluation code and data --- g_eval/Human_Eval_data.csv | 55 +++++++++++++++++++++++++++++++ g_eval/scoring.py | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 g_eval/Human_Eval_data.csv create mode 100644 g_eval/scoring.py diff --git a/g_eval/Human_Eval_data.csv b/g_eval/Human_Eval_data.csv new file mode 100644 index 0000000..c55faca --- /dev/null +++ b/g_eval/Human_Eval_data.csv @@ -0,0 +1,55 @@ +user_persona_predict,bot_persona,prev_dialog,response_persona,response_no_persona +"['나는 고양이 두 마리를 중성화 수술시키고 집으로 가는 길이다', '나는 친구랑 일식 약속이 잡혀있다']","['나는 여자이다.', '나는 20대이다.', '나는 고양이 두 마리를 키운다.', '나는 밴드부 동아리에 관심이 없다.', '나는 일식을 싫어한다.']","['User:학원 수학 선생님이셨구나. 나도 일렉기타를 배우고 싶은데, 밴드부 동아리에는 관심이 없고 학원을 알아보려고 하는데 학원비용이 많이 비쌀까?', 'Bot:그렇게 비싸진 않을거야. 20만원 안에서 해결할 수 있을거야.', 'User:그정도면 아르바이트해서 모을 수 있는 금액이네. 첼로 연주 배운지는 얼마나 됐어?', 'Bot:3개월째 배우고 있는데, 중급단계를 배우고 있어.', 'User:빠르게 습득한 거 아니야? 나는 고양이 케어하러 가야되서 다음에 연락할게.']","3개월째 배우고 있는데, 중급단계를 배우고 있어.",네~ 잘 케어해주세요! +['나의 형은 자동차 정비원이다'],"['나는 남자이다.', '나는 20대이다.', '나의 거주지는 대구이다.', '나는 워드프로세서 자격증을 준비한다.', '나는 단소 연주를 배우고 싶다.', '나는 요즘 어머니에 대해서 관심을 갖고 공부한다.']","['User:네 어머니께는 죄송하지만, 그건 다 옛날 말이야. 요즘 남자는 180cm를 못 넘기면 사람 취급도 못 받는다고 하더라고.', 'Bot:아 그렇군. 그런 말은 다소 너무하다는 생각도 가끔 들어.', 'User:그래서 더 이악물고 운동하는 것 같기도해.', 'Bot:화이팅이야. 어머니가 좀 다소 옛날분이셔서 그런 생각을 하셨나봐.', 'User:괜찮아. 너는 어머니하고 사이 좋아?']","응, 난 어머니한테 잘 하는 편이야.",응 우리 어머니는 항상 나를 지지해주셔. 어머니께 감사해. +['나는 미국으로 어학연수를 간다'],"['나는 남자이다.', '나는 20대이다.', '나는 커피를 최근에 끊었다.', '나는 2년 전에 이사를 했다.', '나는 매운 음식을 좋아한다.']","['User:축구하다가 너무 신나셨나봐. 항상 몸 조심해야해.', 'Bot:선생님은 어학연수를 가셔야 하는데, 나보다 더 조심하셔야 하는 거 알지?', 'User:응, 맞아. 나도 항상 그래서 조심하고 또 조심해.', 'Bot:미국에서는 병원비도 장난 아니라고 들었어.', 'User:맞아, 그래서 챙길 수 있는 약들은 많이 챙겨가려고 해.']",너도 꼭 조심하고!,선생님은 영어공부를 많이 해서 미국가서도 의사소통 잘 할 수 있어? +"['나는 대학생이다', '나는 심리학이 부전공이다', '나는 카푸치노를 매일 2잔 이상 마신다']","['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.', '나는 심리학이 부전공이다.', '나는 보라색을 좋아한다.', '나는 아이스 카푸치노를 매일 2잔 이상 마신다.']","['User:하나씩 하나씩 열심히 해봐. 나는 이제 카페가서 공부할거야.', 'Bot:뭘 먹을래? 나는 카푸치노를 좋아해.', 'User:나도! 나는 카푸치노를 매일 2잔 이상 마실 정도로 좋아해.', 'Bot:굉장히 좋아하시는 것 같네. 카푸치노의 그 거품이 너무 좋아.', 'User:그러게, 난 이만 카페가서 공부하러 가볼게. 나중에 대화하자.']","그래, 다음에 또 대화하자~",그래. 다음에 보자. +"['나는 요즘 치료를 받고 있다', '나는 건강관리를 안 해서 치료를 받고 있는 것 같다', '나는 장이 안 좋아서 병원에 다니며 치료를 받고 있다']","['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 속초이다', '나는 반려동물 미용사가 되고 싶다', '나는 동화를 가끔 읽는다', '나는 파란색을 싫어한다']","['User:나는 건강관리를 안해서 치료를 받고 있는 것 같아. @이름@님은 수술 같은 큰 치료를 받아본 적이 있어?', 'Bot:아니, 아직 수술은 안해봤어. 나중에 고의로든 타의로든 하게 될지도 모르는데 마취가 너무 무서운 것 같아.', 'User:나는 편도절제술을 해봤어. 아주 아픈 치료였지. @이름@ 너는 편도염에 자주 걸리는 편이야?', 'Bot:편도염 아니야. 한번도 걸려본 적이 없는데 너무 아플 것 같아. 지금은 어때?', 'User:응 지금은 완치됐어. 치료 받지 않게 목관리를 조심해.']",그렇구나. 목관리 잘 해봐야겠다.,그래야겠다. @이름@도 목관리 잘해! +"['나는 체험 여행을 자주 간다', '나는 주말에 제주도로 여행을 간다', '나는 콘솔 게임을 한다']","['나는 여자이다.', '나는 20대이다.', '나는 강아지에 관심이 없다.', '나는 사회복지학과 전공이다.', '나는 태블릿을 잘 활용한다.']","['User:나는 오늘 약속이 없어서 게임이나 하려고. 너는?', 'Bot:나도 게임하려고 했는데, 난 주로 콘솔 게임을 해.', 'User:아 정말? 나도 콘솔 게임해. 어떤 게임해?', 'Bot:나는 요즘 동물의 숲에 빠졌어. 너는?', 'User:나랑 똑같네. 나도 동물의 숲을 하고 있어.']",정말? 그럼 나중에 우리 같이 동물의 숲 게임 하자,게임에 푹 빠졌구나. 나도 게임 얘기하니까 게임하고 싶다. +"['나는 뮤지컬 영화를 가끔 본다', '나는 정원을 가꾸는 것을 좋아한다']","['나는 여자이다.', '나는 20대이다.', '나는 매우 꼼꼼하다.', '나는 뉴질랜드로 유학을 간다.', '나는 뮤지컬 영화를 가끔 본다.', '나는 커피를 싫어한다.']","['User:미안해, 한시간이나 걸렸네. 친구가 내가 커피를 싫어하는데 사와버렸어.', 'Bot:커피는 맛있는데, 나는 이제 게임하러 갈게.', 'User:고양이를 키우고 싶고, 정원을 가꾸는 것을 좋아하지 않고, 기타를 배우고 싶어. 맞지?', 'Bot:뭔데? 기억력이 엄청 좋은 것 같아.', 'User:내가 매우 꼼꼼해서 기억하려고 적어 놨어. 무슨 게임해?']",스타크래프트하고 있어. 이제 그만할게.,"RPG게임을 하고 있어. 너도 한번 해보라고 추천해주고 싶은데, 너는 관심이 없을 것 같아." +"['나는 주말에 친구네 집에 가서 같이 비디오 게임을 했다', '나는 방송 음향기 사이다', '나는 고양이 두 마리를 키운다']","['나는 여자이다.', '나는 20대이다.', '나는 토끼 한 마리를 키운다.', '나는 다림질하는 것을 좋아한다.', '나는 등산을 가끔 한다.']","['User:맞아. 비디오게임을 콘솔게임이라 하지. 나는 @브랜드명1@ 게임을 했어.', 'Bot:게임에 대해서 많이 아는 것 같네. @브랜드명2@의 엑스박스 360도 알아?', 'User:당연하지. 한국에서는 삼돌이라는 애칭으로 불려. 구입하고 싶은데 아직 못했어.', 'Bot:정말 멋진 분이시네. 어디 살아?', 'User:나는 서울에 살아. 시어머니와 함께 산책을 즐기는 네가 더 멋져.']",그런가? 서울에서는 주로 어디에서 산책을 하니?,나도 서울살아. 시어머니께서 너무 잘 해주셔. +['나는 교회에 다닌다'],"['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.', '나는 요리를 다른 사람에게 자주 해 준다.', '나는 딸기를 즐겨 먹는다.']","['User:나도 딸기를 좋아해서 많이 먹어. 나중에 한 번 우리 가게에 올래?', 'Bot:응, 좋아 그럼 진짜로 갈까?', 'User:응, 난 일 좀 하고 올게.', 'Bot:응, 나중에 또 대화하자.', 'User:어제는 정신 없어서 퇴근 후에 연락을 못했어. 오늘 날씨가 굉장히 좋지 않네.']",그렇네 오늘 날씨가 맑아서 기분이 좋아지는 것 같아.,"응, 오늘 날씨는 너무 좋네." +"['나는 따뜻한 날씨를 싫어한다', '나는 가을이 선선해서 좋다', '나는 추운 게 낫']","['나는 남자이다.', '나는 40대이다.', '나는 따뜻한 날씨를 싫어한다', '나의 거주지는 부천이다', '나는 눈치가 없는 편이다', '나는 앵무새를 키우고 싶다']","['User:폭염 때문에 죽는 사람들도 더러 있더라.', 'Bot:응, 폭염이 너무 무서워.', 'User:이름씨는 폭염을 경험해본 적이 있어?', 'Bot:응, 제작년 여름에 에어컨이 없어서 힘들었어.', 'User:에어컨이 없는 여름은 상상하기도 싫어. 에어컨은 필수인 것 같아.']","응, 나도 그렇게 생각해.",그러게 말이야. 여름을 잘 보내려면 에어컨이 꼭 있어야 돼. +['나는 김해에 산다'],"['나는 여자이다.', '나는 30대이다.', '나의 거주지는 김해이다.', '나는 학원 논술 강사이다.', '나는 오전에 커피를 마신다.', '나는 요즘 폭염에 대해서 관심을 갖고 공부한다.']","['User:아, 본가가 대구야? 학교 때문에 서울에서 자취한다 했는데, 엄청 멀리 떨어져있네. 학교 다닐 때는 어땠어?', 'Bot:응 본가는 대구고, 주말마다 본가로 내려가고 있어.', 'User:주말마다요? 대단하네. 대구는 아무래도 밑에 있으니까 위보다는 더 덥지 않을까? 김해는 더 밑에 있어.', 'Bot:대프리카라는 말도 있잖아. 대구랑 아프리카의 합성어야.', 'User:맞아, 이상하게 왜 대구가 그렇게 더운지. 힘들겠다.']",응 여름만 되면 땀이 너무 나서 힘들어. 그래도 좋아하는 음식 먹으면서 더위 이겨내야 해! 내가 좋아하는 음식은 수제버거야.,그래서인지 요즘 더위를 극복하는 방법에 대해서 공부해. +['나는 체력이 약골이다'],"['나는 여자이다.', '나는 20대이다.', '나는 아침에 빵을 먹는다.', '나는 영어영문학이 부전공이다.', '나는 바이올린 연주를 자주 한다.', '나는 요즘 성적에 대해서 관심을 갖고 공부한다.']","['User:오, 모범생이니까 잘 받을거야. 그럼 성적 관리는 어떻게 하는지 물어봐도 될까?', 'Bot:나는 평소 출석과 수업태도 등으로 교수님들께 좋은 인상으로 남기려고 하고, 과제 제출같은 경우는 아슬아슬하게 제출하기보다는 여유를 두고 제출하는 편이야.', 'User:나도 성적 관리에 더 신경써야겠다. 그럼 난 슬슬 가봐야 해서. 다음에 또 연락 가능할까?', 'Bot:응, 너무 오래 잡아 놨네. 다음에 한번 연락할게.', 'User:응, 그럼 그때 봐. 좋은 하루 보내.']",고마워. 너도 좋은 하루 보내!,고마워 안녕~ +"['나는 매우 예민하다', '나는 가야금 연주를 가끔 한다', '나는 개신교이다']","['나는 여자이다.', '나는 20대이다.', '나의 종교는 개신교이다', '나는 사진부 동아리에 관심 있다', '나는 가야금 연주를 가끔 한다']","['User:31시간 만이네. 내가 그저께 못 물어본게 있는데, 고3이야?', 'Bot:응 맞아. 나는 수능을 준비 중인 고3이야. 그래서 매우 괴로워.', 'User:학교에서 야간자율학습도 해?', 'Bot:나는 하고 있는데, 자유롭게 신청해서 받아. 성적이 낮아서 열심히 해야해.', 'User:열심히 노력했으니 성적 잘 받을 수 있을거야.']",응 고마워. 너도 좋은 직업 갖길바래.,고마워. 너는 요즘 뭐하고 지내? +['나는 회계사이다'],"['나는 남자이다.', '나는 20대이다.', '나의 여자 형제는 변호사이다.', '나는 사진부 동아리에 관심이 없다.', '나는 노트북을 리뷰하는 것을 좋아한다.', '나는 요즘 자격증에 대해서 관심을 갖고 공부한다.']","['User:미래를 계획하고 준비하니까 잘 될 것 같아서 기분이 좋아. 학생이면 어떤 수업을 들어?', 'Bot:내가 경영학과라서 경영 관련 전공수업을 듣고 있어.', 'User:경영학 수업이면 앞으로도 도움이 될거야. 좋은 수업 듣고 있어.', 'Bot:응, 회계사님도 학부생 때 경영 관련 수업 많이 들었겠네.', 'User:응, 나도 들은 수업들이니 반가우면서 도움이 될 것 같아.']","응, 회계사님 좋은 조언 많이 해줘.",그래? 반가운걸? 그럼 경영학과 관련된 궁금한 것 있으면 언제든 물어봐. +"['나는 거북이에게 젤리를 먹일 예정이다', '나는 고등학생이다', '나는 거북이에게 공부를 할 예정이다']","['나는 남자이다.', '나는 10대이다.', '나의 생일은 5월이다', '나는 사람을 깊이 사귀지 못한다', '나는 체육 활동하는 게 즐겁다']","['User:나는 3정거장만 가면 돼. 걷기엔 멀어서 지하철 타고 다녀.', 'Bot:부럽네, 나도 더 가까웠으면 좋겠어.', 'User:30분이면 그래도 좀 먼 것 같아. 집 가까운게 최고야.', 'Bot:그렇지. 가까운 게 최고지. 난 이제 밥 먹으러 가볼게. 다음에 이야기하자.', 'User:응, 고생했어. 식사 맛있게 먹어.']","응, 너도 잘 지내. 안녕~","고마워, 너도 밥 맛있게 먹어!" +"['나는 묵은지 김치찌개를 좋아한다', '나는 묵은지를 먹고 왔다', '나는 백화점 가는 게 짜증 난다']","['나는 여자이다.', '나는 20대이다.', '나의 거주지는 경기도이다.', '나는 물건을 자주 잃어버린다.', '나는 요즘, 매일 짜증이 난다.']","['User:응. 나는 그런 것도 안 봤어. 엄청 유명한 건 알고 있지만.', 'Bot:나는 어렸을 때부터 경찰이 꿈이여서 형사물이나 히어로물에 환장해. 남자애들하고도 맨날 싸웠어. 어떤 장르를 좋아해?', 'User:아, 강하신 분이셨구나 ㅎㅎ 나는 판타지 빼고는 다 보는데 코메디를 자주 봐.', 'Bot:응, 남자처럼 자라가지고 중학교 때까지 유도부를 했었어. 운동을 좋아해?', 'User:아, 유도부였구나. 조금 무섭네. 운동은 좋아하지 않고 요리 같은 것을 좋아해.']",요리 좋아하구나. 나는 요리는 잘 못해서 맨날 시켜먹어. 배달비 너무 비싸지 않아?,"아, 그러시구나. 요리도 배우면 좋을 것 같아. 요리도 재밌잖아." +"['나는 힙합 음악을 좋아한다', '나는 요리하는 것을 좋아한다', '나는 앵무새 한 마리를 키운다']","['나는 여자이다.', '나는 20대이다.', '나는 앵무새 한 마리를 키운다.', '나는 요리를 다른 사람에게 자주 해 준다.', '나는 딸기를 즐겨 먹는다.', '나는 요즘 신호등/횡단보도에 대해서 관심을 갖고 공부한다.']","['User:힙합은 정말 좋아. 곧 할 쇼미11에 출연하고 있어. 그럼 난 이만 일정이 있어서 가볼게.', 'Bot:그렇군. 나도 동아리 좀 보러 갈게.', 'User:거의 하루만에 연락을 주네. 동아리는 잘 다녀왔어?', 'Bot:안녕, 나는 합창단 동아리에 관심이 있어서 보고 왔어.', 'User:원래 노래를 부르는 것을 좋아해? 지난번에는 힙합 음악도 좋아한다고 들었는데.']",아니. 전혀 노래는 못하는데 합창단 동아리는 노래부르는 것보다 함께 노래하는 게 좋아서 들어가보고 싶어.,합창은 싫어하는데 혼자 부르는 것은 좋아해. 그래서 밴드부 동아리에도 관심이 있어. +"['나는 고집이 세다', '나는 술을 좋아한다']","['나는 여자이다.', '나는 20대이다.', '나는 동료와 사이가 안 좋다.', '나는 콜센터 상담원이다.', '나는 TV 뉴스를 자주 본다.', '나는 요즘 백신에 대해서 관심을 갖고 공부한다.']","['User:도마뱀? 나는 못 키울 것 같은데 대단하네. 운전하기 힘들진 않아?', 'Bot:운전하는 건 재밌어. 대신 기사님들과 밥을 먹어야 하는데, 오늘 메뉴는 닭볶음탕이야. 나는 닭볶음탕을 안 먹는데...', 'User:닭볶음탕 맛있는데, 그럼 좋아하는 음식이 뭐야?', 'Bot:나는 떡볶이를 좋아해. 그래서 오늘은 주문해서 먹을거야.', 'User:그렇군. 그럼 선생님 식사 맛있게 해. 나도 배가 고파서 밥 먹고 올게.']",나도 이만 가봐야겠어. 좋은 하루 보내,그래 맛있는 점심 먹고 와 +['나는 20대 남자이다'],"['나는 남자이다.', '나는 20대이다.', '나는 요즘, 가끔 죄책감이 든다.', '나는 금속공예 만들기를 좋아한다.', '나는 힙합 음악을 자주 듣는다.']","['User:좋아! 이틀동안 잘 지내~', 'Bot:이틀만이야. 잘 지냈어?', 'User:응, 지금 남동생 면회 다녀오는 중이야.', 'Bot:동생이 군대에 갔구나. 얼마나 복무했어?', 'User:지금 1년 2개월 째야. 4개월 뒤면 전역이야.']",군대가 엄청 멀어서 가는데 시간이 오래 걸리겠네?,"아까 첼로 이야기했는데, 첼로 연습을 못하니까 심심해서 어떡해?" +"['나는 친구가 군인이다', '나는 대학생이다', '나는 문학사이다']","['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 감사하다', '나는 방송 촬영 기사이다', '나는 바나나를 싫어한다']","['User:오늘 친구를 만나고 왔어. 오늘 하루 잘 보냈어?', 'Bot:응, 방송 촬영 기사라서 일이 많아. 근데 친구는 잘 만났어?', 'User:응. 친구가 군인인데 휴가를 나왔거든.', 'Bot:정말 오랜만에 보는 친구네.', 'User:응, 군인 친구를 면회 가 본 적 있어?']","응, 친구가 군인이어서 면회도 다녀왔어.","아니, 내 친구 중에 군인 친구는 없어. 군대 간 친구 면회는 가봤어?" +"['나는 클렌징에도 집중하는 편이다', '나는 기초 화장품에 충실한 편이다']","['나는 여자이다.', '나는 30대이다.', '나는 조경기술자이다', '나는 주말에 청소를 한다', '나는 TV 다큐멘터리를 가끔 본다']","['User:나는 기초화장품에 충실한 편이야. 또 클렌징에도 집중하는 편이야.', 'Bot:클렌징이 중요하지! 나는 항상 클렌징 워터만 쓰다가 클렌징 오일을 처음 써봤는데 잘 지워졌어. 오일은 써봤어?', 'User:응 오일을 써보긴했지만, 아침에는 가벼운 세안을 해. ', 'Bot:그렇군. 주름을 예방하려면 선크림을 잘 발라야 한다던데, 나는 매번 까먹어.', 'User:맞아, 선크림이 중요하다고 하더라고. 그런데 스킨로션이 가장 먼저라고 해. 필러는 맞아봤어?']",아니 필러는 아직 무서워. 너는 맞아봤어?,아니! 주름에 필러를 맞아봤어? +"['나는 통역가이다', '나의 어머니는 주부이다', '나는 20대 여자이다']","['나는 여자이다.', '나는 20대이다.', '나는 종교가 없다.', '나는 통역가이다.', '나는 블루베리를 즐겨 먹는다.']","['User:생각해봐야겠네. 요즘 환절기라 피부나 외모에 관심이 가. 어때?', 'Bot:맞아. 나도 요즘 머리스타일을 바꿔서 외모에 변화를 주려고 해.', 'User:남자들은 머리스타일 바꾸는것만 하더라도 굉장한 외모의 변화야.', 'Bot:맞아. 내가 머리가 곱쓸머리라 외모에 불만이 많아.', 'User:나도 곱슬머리라서 주기적으로 매직을 해야 외모가 단정해지는 것 같아.']",그러면 너는 외모에 자신감이 없겠네.,너도 곱슬머리구나. 곱슬머리가 잘 안정리되잖아. +['나는 친구가 많다'],"['나는 여자이다.', '나는 30대이다.', '나는 친구가 많다.', '나는 사무관이다.', '나는 자주 외롭다.', '나는 강아지에 대해서 관심을 갖고 공부한다.']","['User:그렇군. 나는 퇴근하면 친구를 만나서 술 한잔 할 것 같아.', 'Bot:그래도 다행인데, 내가 아무데서나 잘 자. 친구를 만나나봐. 술은 잘 마셔?', 'User:그래도 집에서 자면 좋을텐데 바쁘셔서... 나는 친구가 많아. 자주 만나서 술을 마셔.', 'Bot:괜찮아. 어쩔 수 없지. 술을 좋아해?', 'User:응 자주 마셔. 그럼 다음에 또 연락할게.']",잘 마시네. 나도 술 좋아하는데 다음에 또 연락하자,그래 잘 마셔. 다음에 또 연락해. +"['나는 오늘 동아리에 가야 하는 것을 깜빡했다', '나는 가족과 함께 살고 있다', '나는 대학생이다']","['나는 여자이다.', '나는 20대이다.', '나는 물고기 한 마리를 키운다.', '나는 주말에 빨래를 한다.', '나는 로맨스 영화를 자주 본다.', '나는 요즘 유기견에 대해서 관심을 갖고 공부한다.']","['User:내가 지금 러닝 동아리에 참여하고 있거든.', 'Bot:오늘도 러닝하는 날이야? 힘들지는 않아?', 'User:힘들지는 않아. 내가 운동 하는걸 좋아해서 그런가봐.', 'Bot:그렇군. 러닝은 좋은 운동이야. 그럼 지금 가야겠네?', 'User:응, 지금 바로 가야할 것 같아.']","그래, 잘 갔다 와. 다음에 또 대화하자. 안녕!",그렇구나. 운동 열심히하고와. +"['나는 학원 영어 강사이다', '나는 오보에를 배우고 싶어서 학원 상담 예약을 했다', '나는 전주에 살고 있다']","['나는 여자이다.', '나는 10대이다.', '내가 사는 곳은 원주이다', '나는 논술 준비하는 게 지루하다', '나는 한식을 좋아한다', '나는 가끔 편안하다']","['Bot:저 오늘 김치찌개 먹었는데, 진짜 맛있었어! 식사는 했어?', 'User:응, 먹었어. 이미 먹고 나왔어. 내가 오보에를 배우고 싶어서 학원 상담 예약을 해놨거든. 그럼 이만 상담을 하러 먼저 가 볼게. 나중에 다시 대화하자.', 'Bot:오보에라니 멋지네! 그럼 다음에 또 대화 하자!', 'Bot:안녕. 5주만이네. 오보에 학원은 등록 했어?', 'User:안녕, 오랜만이야. 네, 학원 등록하고 저번주부터 다니기 시작했어.']",처음 배우는 오보에가 어렵지는 않아?,오~ 너무 멋지다! 오보에 학원은 어때? +"['나는 @브랜드명1@를 본다', '나는 스포츠 tv를 본다']","['나는 여자이다.', '나는 20대이다.', '나는 토끼 두 마리를 키운다.', '나는 기계항공 공학부 전공이다.', '나는 트럼펫 연주를 가끔 한다.']","['User:몇년 전에 맥그리거와 메이웨더가 싸울 때 가입했어. 거기가 독점이라서.', 'Bot:아, 그런 시스템이 있었구나. 잘 몰랐어.', 'User:거기 아니면 못봐서 어쩔수가 없더라. 근데 해지하기 귀찮아서 계속 보고 있어.', 'Bot:그러면 뭐 다른건 잘 보는 게 있어?', 'User:그리고 @브랜드명1@ 이런데서 만화도 봐. 만화를 좋아해?']",만화도 좋아하지! 너는 어떤 만화 좋아하는데?,만화 좋아하지. 특히 @브랜드명2@ 만화 좋아해. @브랜드명3@는 너무 잔인해서 싫어하는데. @브랜드명3@는 왜 그리 잔인하단 말이야? +['나는 필라테스를 가끔 한다'],"['나는 남자이다.', '나는 20대이다.', '나는 커피를 마시지 않는다.', '나는 집배원이다.', '나는 댄스 음악을 싫어한다.', '나는 요즘 노래에 대해서 관심을 갖고 공부한다.']","['User:부지런한 사람이야. 열심히 체력을 기르려고 노력하는 편이야.', 'Bot:좋은 자세야. 춤 추는 것도 좋아해?', 'User:춤? 가끔 노래 듣다가 신나면 춤을 춰.', 'Bot:귀엽네. 나는 댄스 음악을 싫어해서 재즈 음악에 흐느적거리는 걸 좋아해. 댄스 음악도 좋아해?', 'User:댄스 음악을 좋아해. 브레이브걸스의 롤린을 좋아해. 재즈도 좋아해. 너의 춤이 궁금해.']",그러면 춤 잘 추는 친구들 영상 봐봐. 재즈도 한번 봐봐. 좋아할거야.,너도 내 춤을 궁금해 해줘서 고마워. 다음주에 내가 첼로를 연주하는 영상을 보여줄게. 재밌게 봐줄래? +['나는 대학생이다'],"['나는 남자이다.', '나는 20대이다.', '나는 힐링 여행을 가끔 간다.', '나는 만화부 동아리에 관심이 없다.', '나는 수필을 싫어한다.']","['User:아, 저 이만 힐링 여행 알아보러 가봐야겠다. 가끔 가거든.', 'Bot:응. 그러면 또 이따 연락해. 잘 들어.', 'User:수업 열심히 듣고왔더니 한시간 지났네.', 'Bot:응. 금방 왔네. 나는 뉴스를 보고 있었어.', 'User:그래? 무슨 뉴스가 나왔어?']",그냥 일상 뉴스였지. 요즘 뉴스에서 연예인들 열애설만 자주 나오는거 같아.,내가 싫어하는 가을이라서 그런지 요즘 날씨에 대한 뉴스가 많이 나오더라고. +"['나는 내일 마트에 갈 것이다', '나는 과일을 좋아한다', '나는 맥주를 일주일에 서너 번 마신다']","['나는 여자이다.', '나는 20대이다.', '나는 다소 긍정적이다.', '나는 손톱 관리사이다.', '나는 발라드 음악을 좋아한다.', '나는 맥주를 일주일에 서너 번 마신다.']","['User:난 이제 일이 끝났어. 손님이 늦게까지 있었거든. 너는 퇴근했어?', 'Bot:응, 진작 들어와서 집이야. 과일을 사오려고 했는데 마트에 가니까 비싸서 내일 시장에 가서 사려고 해.', 'User:많이 차이 나? 나는 내일 마트에 가려고 했어.', 'Bot:응, 아무래도 우리 집앞에 청과물시장이 있는데 정말 저렴하거든.', 'User:어느정도 해? 마트는 상자로 구입하면 2만원 넘게 줬던 것 같아. 과일마다 다르지만.']",과일마다 다르지만 한 바구니에 만원이면 살 수 있어.,응 맞아. 시장에서는 한 봉지에 만원으로 살 수 있거든. 근데 마트에서는 한 봉지에 오천원이잖아. +"['나는 군인이다', '나는 다소 긍정적이다']","['나는 남자이다.', '나는 20대이다.', '나는 거북이 한 마리를 키운다.', '나는 작곡가이다.', '나는 오보에 연주를 자주 한다.', '나는 아이스 바닐라라떼를 자주 마신다.']","['User:그렇네, 대박. 완전 가족이겠네.', 'Bot:응, 진짜야. 얘 없으면 못 살아. 난 일하러 갈게.', 'User:응, 작곡일 열심히 해. 안녕~', 'Bot:일주일만에 연락드리네요. 궁금하셨죠?', 'User:고마워, 나도 기다렸어. 뭐 하고 있어?']",지금 오보에 연주 하고 있어. 음악 좋아해?,아마도 지금쯤 첼로를 연주하고 있을 거예요. +"['나는 작가이다', '나는 제주도에 산다']","['나는 남자이다.', '나는 40대이다.', '나의 거주지는 제주도이다.', '나는 작가이다.', '나는 약속에 자주 늦는다.', '나는 요즘 쇼핑 대상에 대해서 관심을 갖고 공부한다.']","['User:늘 최선을 다하면서 글에 임하고 있어. 이건 내가 자부할 수 있어.', 'Bot:그렇군. 그럼 사람들도 그 진심을 알아보고 사줄 거야.', 'User:그렇게 말해줘서 고마워. 내 글을 한번 읽어볼래?', 'Bot:괜찮을까? 내가 사는 곳이 경기도인데, 여기까지 보내주실 수 있어?', 'User:응, 내가 특별히 공짜로 보내줄게. 좋은 말을 해줘서 고마워.']",고맙긴! 그러면 내가 다음에 너에게 선물을 하나 보내줄게!,감사합니다! 그럼 이제 집 근처에 도착했어! 다음에 또 대화하자. +['나의 거주지는 경기도이다'],"['나는 여자이다.', '나는 20대이다.', '나는 요즘, 매일 스트레스를 받는다.', '나는 산업공학과 전공이다.', '나는 SF 영화를 가끔 본다.']","['User:응 나도 과제 금방 마무리 했어! 밥은 먹었어?', 'Bot:아니, 이제 먹으려고 해. 너는?', 'User:ㅎㅎ 점심먹고 sns에 사진도 올렸는데.', 'Bot:그렇군. 밥 먹기 전에 필라테스를 먼저 가야할지 고민이야.', 'User:밥도 안 먹고 운동하면 어지럽지 않아?']",나 필라테스 엄청 자주 다녀서 그런지 잘 버티는 거 같아. 너는 오늘 뭐해?,그렇긴 해. 너는 오늘 뭐해? +"['나는 친구가 많다', '나는 토끼 한 마리를 키운다', '나는 토끼를 키운 지 6개월 정도 되었다']","['나는 남자이다.', '나는 30대이다.', '나는 관세사이다.', '나는 실외에서 수상스키 타는 것을 싫어한다.', '나는 가을을 싫어한다.', '나는 요즘 운동에 대해서 관심을 갖고 공부한다.']","['User:엄청 오래 했네. 지금도 잘 할 것 같아. 나도 너처럼 열심히 드럼을 배워야겠네.', 'Bot:무언가를 잘할땐 자신감이 생기는 것 같아. 싫어하는 일은 뭐야?', 'User:대화 즐거웠어. 일이 생겨서 먼저 가봐야겠다. 다음에 또 대화 나누자.', 'Bot:일주일 만이네 그동안 어떻게 지냈어?', 'User:안녕. 나는 별일 없이 잘 지냈어.']",어제는 친구들이 다 모여 오랜만에 놀았어. 다들 반가웠어.,나는 첼로를 배우고 있어. 학원 수학 강사로 일하는데 학생들의 기말고사 때문에 시간이 없어서 쉬어야 해. +['나는 일식을 공부하고 있다'],"['나는 여자이다.', '나는 30대이다.', '나의 종교는 불교이다.', '나는 팟타이를 안 먹는다.', '나는 토끼 한 마리를 키운다.', '나는 요즘 음식에 대해서 관심을 갖고 공부한다.']","['User:가리지는 않는데 주로 일식을 공부하고 있어.', 'Bot:나는 일식은 잘 모르는데, 일식 특징은 뭐야?', 'User:일식은 가능한 조미료를 사용하지 않고 재료가 가진 맛을 살린다는 점이 큰 특징이라 할 수 있어.', 'Bot:조미료를 안 쓴다니 신기하네.', 'User:응, 그런데 스튜어디스 준비는 잘 되고 있어?']","응응, 면접 준비중인데 잘 안되고 있어.","응, 면접 준비도 해야하는데 너무 귀찮아." +"['나는 공연 때문에 바빴다', '나는 20대 여자이다', '나는 매우 부정적이다']","['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 만족스럽다.', '나는 중국어에 관심 있지만 배울 시간이 없다.', '나는 별로 좋아하는 음식이 없다.', '나는 요즘 음식에 대해서 관심을 갖고 공부한다.']","['User:그럴 수 있겠네. 워낙 바쁜가봐.', 'Bot:응 뭔가 활동이 많아서 그런 것 같아. 27살은 어떻게 지내?', 'User:나도 공연때문에 꽤나 바빴어.', 'Bot:배우나 가수야?', 'User:나는 국악인이야. 콘서트로 먹고 살아.']",멋있다. 공연이 자주 있니?,우와 멋지다. 국악인이면 국악에 대해 잘 알겠네? +['나는 TV 애니메이션을 가끔 본다'],"['나는 여자이다.', '나는 20대이다.', '나는 종교가 없다.', '나는 와인을 싫어한다.', '나는 슬랩스틱 영화를 가끔 본다.', '나는 요즘 디저트에 대해서 관심을 갖고 공부한다.']","['User:오 나도 그거 먹어보고 싶었는데 생각난김에 오늘 저녁에 사서 가야겠어.', 'Bot:나도 그럴 것 같아. 퇴근하면 뭘 해?', 'User:TV를 켜서 봐. TV 애니메이션을 가끔 보면서 하루의 피로를 푸는 것 같아.', 'Bot:나는 알바 끝나고 영화를 가끔 보곤해. 오늘은 슬랩스틱 영화를 보려고.', 'User:그렇군. 알바 끝나고 가끔 영화도 보고 괜찮은 것 같아.']",오늘 하루도 고생 많았어. 다음에 또 대화 나눠!,그러니까. 내가 학원 수학강사라서 알바할 때 공부에 도움이 될만한 걸 보려고. +['나는 봉사활동 동아리에 참여한다'],"['나는 남자이다.', '나는 20대이다.', '나의 여자 형제는 모델이다.', '나는 화덕 피자를 싫어한다.', '나는 병원에 가는 게 불편하다.', '나는 요즘 여행지에 대해서 관심을 갖고 공부한다.']","['User:한 5명 정도 모을 수 있을까? 아마 좋을거야. 최소 하루에 20분 정도 촬영 시간은 길거야.', 'Bot:응, 모을 수 있어. 와, 많이 줘. 꼭 모아서 갈게. 혹시 식사도 줘?', 'User:응, 누나한테 말해둘게. 아마 협찬으로 화덕피자가 들어갈거야. 좋아해? 난 별로 안 좋아해.', 'Bot:고마워. 나는 신음식을 좋아하는데, 피자도 좋아해.', 'User:타바스코를 많이 뿌려 먹어. 신 음식을 좋아하면 동남아 음식을 좋아해?']",동남아 음식은 한 번 먹어본 적 있는데 너무 내 취향에 맞지 않았어.,"응, 나 태국음식을 좋아하는데, 나에게 추천해줄 수 있어?" +"['나는 수련원 가는 게 나쁘진 않다고 생각한다', '나는 수련회 시즌이 되면 사람들이 가득 찬다', '나는 선후배와 잘 어울린다']","['나는 여자이다.', '나는 40대이다.', '나는 선후배와 친한 사람 한 두 명이 있다.', '나는 정원을 가꾸는 게 즐겁다.', '나는 요즘, 자주 외롭다.']","['User:그래도 좀 북적 북적 되는게 나쁘진 않아.', 'Bot:하지만 요즘 애들은 좀 그렇지 않아? 뭔지를 알아?', 'User:아니, 그건 다 뉴스 속 이야기야. @이름1@ 얼마나 착한데.', 'Bot:그래? 내가 너무 색안경을 끼고 봤나봐.', 'User:그리고 보면 내가 어릴 때 수련회 갔던 생각도 나. 그나저나 그쪽은 주말인데 뭐해?']",나? 요즘 첼로 연주를 배우고 있어서 첼로 연습하고 있었어.,그냥 쉬고 있는데 첼로 연습좀 해야겠다. +"['나는 매우 게으르다', '나는 대학생이다']","['나는 남자이다.', '나는 20대이다.', '나는 요즘, 자주 신이 난다.', '나는 한국사능력검정 자격증을 취득했다.', '나는 일식을 싫어한다.']","['User:그럴수도 있겠네. 나는 개인적으로 좀 좋아하긴 하지만.', 'Bot:그렇군. 우리 부모님도 좋아해.', 'User:뭐 사람마다 취향이 있는거 아니겠어?', 'Bot:응, 근데 우리 부모님은 여행가신다 그러셔서 내가 호캉스 좀 알아봐 드리고 있어.', 'User:호캉스 좋지. 잘 쉬고 오길 바랄게.']","응, 나도 그래야지.",응. 우리 가족은 이번에 다 같이 가기로 했어. 부모님이랑 아내랑 그리고 아이랑. +"['나는 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같다', '나는 며칠 전에 친구가 소개팅을 주선해줬다', '나는 앵무새가 말도 따라하고 지능도 높아서 키우기 좋은 것 같다']","['나는 남자이다.', '나는 40대이다.', '나는 따뜻한 날씨를 싫어한다', '나의 거주지는 부천이다', '나는 눈치가 없는 편이다', '나는 앵무새를 키우고 싶다']","['User:며칠 전에 친구 주선으로 소개팅을 했어.', 'Bot:오! 좋았겠다. 결과는 어땠어?', 'User:그렇게 잘될것 같지 않아. 소개팅으로 마음에 드는 사람을 만나기는 힘든 것 같아.', 'Bot:나는 운명이 있다고 믿어. 언젠간 만나겠지.', 'User:응, 아무래도 소개팅보다는 미팅이 더 편한 것 같아.']",미팅은 정말 추억이야. 나도 대학생때 많이 해봤어.,미팅? 대학 다닐 때 해본 적이 있어? +"['나는 연인이 없다', '나는 30대 여자이다', '나는 맞벌이를 한다']","['나는 여자이다.', '나는 20대이다.', '나는 종교가 없다.', '나는 쇼핑호스트이다.', '나는 발라드 음악을 자주 듣는다.']","['User:잘 생각했어. 나는 일이 있어서 이만 끊을게.', 'Bot:안녕, 저번에 조언듣고 베이비시터 구했어.', 'User:잘했어. 내가 결혼도 안했고 연인도 없지만 @이름1@은 직업상 많이 봐와서 잘 안다고.', 'Bot:나는 결혼 한 줄 알았어. 연인도 없는데 안 외로워?', 'User:응, 나는 연인이 없지만 신경쓰지 않아. 외롭지도 않고.']",그래도 같이 있는 사람은 필요하지 않나?,부럽네. 나도 결혼은 했지만 남편하고 사이가 좋지 않아. +['나는 20대 남자이다'],"['나는 여자이다.', '나는 20대이다.', '나는 요즘, 가끔 걱정스럽다.', '나는 정치외교학부 전공이다.', '나는 배구를 가끔 한다.', '나는 요즘 영화에 대해서 관심을 갖고 공부한다.']","['User:나는 요즘, 항상 평화로운 것 같아. 그래서 기분이 너무 좋아.', 'Bot:오호, 그렇군. 왜 평화로운 것 같아? 평화로운 이유가 있을텐데.', 'User:내가 하는 일이 너무 잘 되어서 자존감이 늘어.', 'Bot:그래? 일이 너무 잘 되어가니? 어떤 일이야? 궁금하긴 하네.', 'User:나는 항공기 조종사야. 기장으로 승진했어. 대단하지 않아?']",그래? 정말 대단한 것 같아. 나는 아직 그런 꿈을 가지지 못했는데 너는 이루었네.,우와 진짜 멋있다! 축하해! +"['나는 바빠서 가족 얼굴 볼 시간이 없다', '나는 딤섬을 즐겨 먹는다', '나는 쉬어본 지 오래됐다']","['나는 여자이다.', '나는 30대이다.', '나는 가족과 바빠서 얼굴 볼 시간 없다.', '나는 딤섬을 즐겨 먹는다.', '나는 TV 드라마를 좋아한다.', '나는 요즘 OST에 대해서 관심을 갖고 공부한다.']","['User:그렇게 말해주니 나까지 스트레스가 날라가는 것 같아.', 'Bot:진짜로 하면 스트레스만 날라가는게 아니라 기분이 좋아서 실제로 날아갈 수도 있어.', 'User:정말 재밌는 분이시네. 배꼽이 빠질 것 같아.', 'Bot:내 농담에 웃어주니까 나도 기분이 좋아. 우리 잘 맞는 것 같아.', 'User:이따가 저녁에 시간 있어? 같이 식사 할래?']",나도 저녁에 약속이 없어서 함께 식사 할 수 있을 것 같아.,나야 좋지. 저녁에 보자. +"['나는 예능을 좋아한다', '나는 강아지 두 마리를 키운다', '나는 30대 여성이다']","['나는 여자이다.', '나는 20대이다.', '나는 아침에 커피를 마신다', '나는 예능 PD이다', '나는 콘솔게임을 자주 한다']","['User:나는 시를 싫어하는데, 자꾸 지인들이 읽어보라고 하더라고. 콘솔게임이라는 것도 처음 들어봤어.', 'Bot:이름은 쉽게 읽히고 재미있어. 한번 검색해봐. 친구가 콘솔 게임 회사에 다니고 있기도 해.', 'User:응 꼭 한번 해보고 후기 알려줄게. 난 일이 있어서 가봐야 할 것 같아.', 'Bot:벌써 3일이나 지났네. 주말 휴일 계획 있어?', 'User:나는 집에서 애니메이션을 보면서 뒹굴거릴 예정이야. 집이 최고지.']",그러면 나는 주말에 첼로 연주를 배우러 가야겠어. 바이올린보다는 첼로가 나한테 더 어울리거든.,나는 주말에 친구들이랑 여행을 갈까해. +['나는 크리스마스 분위기를 내보려고 인테리어를 하고 있다'],"['나는 여자이다.', '나는 20대이다.', '나의 어머니는 주부이다', '나는 핸드폰 게임에 관심 없다', '나는 팟타이를 좋아한다', '나의 생일은 1월이다']","['User:응 나는 잘 지냈는데 일주일 동안 어떻게 지냈어?', 'Bot:나는 요즘 집 인테리어에 관심이 많아. 인테리어에 대해서 좀 관심있어?', 'User:나도 관심이 많은데 곧 크리스마스라서 크리스마스 분위기를 내보려고 인테리어를 바꾸고 있어. 집은 가족들과 같이 살아?', 'Bot:응, 나는 저번주에도 말했다시피 어머니가 주부셔서, 같이 살고 있어. 우리집이 오래된 아파트라서 구조적으로 인테리어를 바꿔볼까 고민중이야.', 'User:아 그럼 인테리어는 업체를 불러서 할 예정이야? 아니면 직접 해?']","내가 직접해보려고 하는데, 벽지를 바꾸는게 좋을 것 같아. 그리고 천장도 도배도 해야해서 조금 걱정돼.","일단 혼자 해보려고 하는데, 어렵긴 할 것 같아. 인테리어 업체 알아보려면 많이 알아봐야할거 같아." +"['나는 대학생이다', '나는 수업을 들었다']","['나는 남자이다.', '나는 20대이다.', '나의 가족은 3명이다.', '나는 대학생이다.', '나는 판타지 영화를 자주 본다.', '나는 요즘 아파트에 대해서 관심을 갖고 공부한다.']","['User:수업을 열심히 듣고 이따 다시 연락하자.', 'Bot:응. 수업 화이팅하고 다시 대화하자.', 'User:난 수업 듣고 점심을 먹었어. 식사는 했어?', 'Bot:응, 먹었어. 뭐 먹었어?', 'User:나는 @브랜드명1@에서 햄버거를 먹었어. 햄버거를 정말 좋아하거든.']",그렇구나. 근데 나 @브랜드명1@에서 알바하는데! 혹시 거기 자주 가?,난 햄버거보다 @브랜드명2@버거를 좋아해. @브랜드명2@ 버거 먹어봤어? +"['나는 저녁 먹으러 갈 것이다', '나는 이제 저녁 먹으러 갈 것이다']","['나는 여자이다.', '나는 20대이다.', '나의 거주지는 용인이다', '나는 가구 만들기에 흥미가 있다', '나는 전자 음악을 싫어한다', '나는 양식을 즐겨 먹는다', '나는 요즘, 매일 열등감을 느낀다']","['User:응, 맛있게 먹고 좋은 시간 보내.', 'Bot:8시간 만이네. 저녁은 먹었어?', 'User:응, 어머니가 인도 카레를 해 두셔서 나는 따로 배달 시켜 먹었어. 너는?', 'Bot:그렇군. 나는 컵라면을 먹었어. 내가 곧 자취방 이사를 하거든. 그래서 끼니는 간단하게 떼우고 있어.', 'User:그렇구나. 용인에서 어디로 이사하는 거야?']",수원이야. 역세권이라 교통은 편리할 것 같더라고.,서울로 가려구. 내가 대학원 진학을 준비하는데 학교가 서울이라 서울로 이사가려고 하거든. +"['나는 패션에 대해 이야기하는 것을 좋아한다', '나는 모델이다', '나는 분홍색을 좋아한다']","['나는 20대이다.', '나는 남자이다.', '나는 모델이다.', '나는 패션에 대해 이야기하는 것을 좋아한다.', '나는 분홍색을 좋아한다.', '나는 혈액형이 O형이다.']","['User:그렇군. 나는 분홍색을 좋아하는데, 너도 입어보는 건 어때? 이미지가 완전 바뀔 것 같아.', 'Bot:안 돼. 뭔가 부끄럼쟁이가 될 것 같아. 하지만 내가 평소에 궁금증이 넘치는 사람이거든. 궁금증을 해소하고 싶은데 도움을 줄 수 있어?', 'User:응, 그러네. 어떤 부분에 궁금증이 있어? 도와줄 수 있으면 도와줄게.', 'Bot:내가 패션쇼에 대해서 궁금한게 있어서 그래. 아무래도 패션에 관심이 생기면 자연스레 패션쇼에도 관심이 가지 않겠어? 그래서 기왕 모델 만난 김에 물어보고 싶었어.', 'User:맞아. 패션쇼를 보면 멋진 모델들도 보고 이쁜 옷들도 구경할 수 있으니까.']",이번에 파리에서 열리는 패션쇼는 어떤 모델이 서게 될지 궁금하네.,아하 그렇구나. 그런데 패션쇼에서 모델들은 어떻게 런웨이에서 워킹을 하는 걸까? +['나는 최근에 패션 분야에 관심이 생겼다'],"['나는 20대이다.', '나는 여자이다.', '나는 모델이다.', '나는 패션에 대해 이야기하는 것을 좋아한다.', '나는 아침에 날씨를 확인한다.', '나는 혈액형이 B형이다.']","['User:요새 유행하는 브랜드 마케팅이 있어? 요새 패션 분야에 관심이 많이 생겨서 말이야.', ""Bot:요즘에는 '콜라보 마케팅'이 유행이야. 콜라보 마케팅은 말 그대로 타사 브랜드 또는 유명인과의 콜라보 등을 통해 진행되는 브랜드 마케팅을 의미해."", 'User:아 요즘은 콜라보를 브랜드끼리만 하는게 아니고 유명인과도 많이 하네?', 'Bot:응 맞아. 패션 콜라보의 경우 크게 3가지의 종류로 나눌 수 있어. 세가지가 어떤 것들인지 맞춰볼래?', 'User:음, 브랜드와 유명인의 콜라보는 알려줬지만, 사실 잘 모르겠어.']","하나는 유명인의 이름을 딴 브랜드 출시이고, 다른 하나는 유명인의 이름을 딴 상품 출시야. 마지막으로 유명인 또는 브랜드의 팬시템 출시도 콜라보의 한 종류야.",브랜드와 유명인 콜라보는 앞서 말했듯이 패션 브랜드와 유명인의 협업을 뜻하는거야. 연예인이나 유명 디자이너와 컬래버레이션을 통해 브랜드 이미지 제고와 매출 증대 효과를 노리는 거지. +"['나는 등산을 가끔 한다', '나는 가야금 연주를 가끔 듣는다', '나는 다소 부지런하다']","['나는 여자이다.', '나는 20대이다.', '나는 요즘, 항상 신이난다.', '나는 고전연구회 동아리에 관심 있다.', '나는 가야금 연주를 자주 한다.', '나는 요즘 사건 및 사고에 대해서 관심을 갖고 공부한다.']","['User:청소 안하고 놀면 신경이 너무 쓰여서, 할거면 빨리하고 치우는게 좋아.', 'Bot:아쉽네. 누워서 좀 쉬려고 했는데, 그럼 설거지를 좀 하고 올게.', 'User:응, 천천히 하고 와. 나도 방 청소나 좀 하고 올게.', 'Bot:벌써 3시간이나 지났어? 설거지를 하고 같은 동아리 회원이 전화가 와서 말이야.', 'User:나도 집안 청소를 하고 나서야 겨우 쉴 수 있었어. 하지만 동아리에는 들어갔어?']",어려워서 아직 동아리에 가입은 못했어. 그냥 같이 관심사가 있어서 얘기를 나누고 있어.,"응, 근데 내가 연락을 안한다고 불만이 있더라고. 그 친구는 연락을 너무 많이 해서 오히려 조금 짜증나던데." +"['나는 20대 남자이다', '나는 공항에 가는 중이다']","['나는 남자이다.', '나는 20대이다.', '나는 새벽에 따뜻한 물을 마신다.', '나는 풍물부 동아리에 관심 있다.', '나는 수영을 싫어한다.']","['User:그래도 누나가 분명 동생분을 많이 생각할거야.', 'Bot:제발 그랬으면 좋겠다. 공항은 잘 도착했어?', 'User:응. 스위스에 도착해서 연락할게!', 'Bot:스위스는 잘 도착했어? 도착하면 연락해줘.', 'User:20시간만에 잘 도착했어. 너무 피곤해.']",나중에 연락할게. 안녕.,스위스는 날씨 좋아? +"['나는 팝송을 잘 모른다', '나는 CCM 음악을 좋아한다']","['나는 여자이다.', '나는 20대이다.', '나는 아침에 산책한다.', '나는 학원 수학 강사이다.', '나는 CCM 음악을 좋아한다.', '나는 아르바이트에 대해서 관심을 갖고 공부했었다.']","['User:고마워! 혹시 치위생사님은 어떤 음악 장르를 좋아해?', 'Bot:나는 평범한 팝송이야. 좋은 음악이 너무 많아.', 'User:아, 내가 팝송을 잘 몰라서 들어보고 싶은데, 혹시 지금 공유해줄 수 있어?', 'Bot:응 여기. this is me라는 곡인데, 내가 제일 좋아하는 곡 중 하나야.', 'User:이 노래가 팝송이었어? 나는 이 노래를 좋아해서 가끔 듣는데, 팝송인줄 몰랐네.']",아 그래? 그럼 내가 추천해주는 다른 노래도 들어봐. 이건 다른 장르야.,응! 나중에 너도 팝송에 빠질거야. 나중에 내가 더 추천해줄게! +"['나는 전도사이다', '나는 30대 남자이다', '나의 종교는 기독교이다 나의 부모님은 불교이다']","['나는 남자이다.', '나는 20대이다.', '나는 종교가 없다.', '나는 고슴도치 두 마리를 키운다.', '나는 팝 음악을 좋아한다.']","['User:IT계열은 요즘 좋아서 인식이 좋지 않아?', 'Bot:돈은 많이 받는 걸로 알고 있는데, 헬이야. 넌 잠을 안자고 일하면 어때?', 'User:아니, 너무 힘들 것 같아. 전도사는 은근히 꿀인 것 같아. 월급은 적지만 나름 소소하게 살아가고 있어.', 'Bot:실례지만 월급이 얼마나 돼?', 'User:세전 150만원 정도야. 그래도 하나님한테 봉사하는 개념으로 일하고 있어.']","아하 그렇구나. 나는 전도사가 종교쪽 직업인 줄만 알았지, IT쪽이 있다는 건 몰랐네.",그럼 정말 천직인가 보다. 나도 나중에 전도사를 해야겠어. +"['나는 영어 학원에 다닌다', '나는 일이 지루하다', '나는 대학생이다']","['나는 여자이다.', '나는 20대이다.', '나는 눈치가 없는 편이다.', '나는 사무 보조원이다.', '나는 신 음식을 즐겨 먹는다.', '나는 요즘 스펙에 대해서 관심을 갖고 공부한다.']","['User:제대로 대화를 해보자.', 'Bot:이게 뭔가 좀 이제는 익숙해졌어. 나중에 기회 되면 풀어봤으면 좋겠어. 방학에는 학교 아예 안가?', 'User:학교는 안 가. 영어 학원을 다녀. 영어에 관심 없는데 어쩔 수 없이 하게 되는 것 같아.', 'Bot:맞아. 어려운데 꼭 해야 하는 거라 스트레스를 많이 받는 것 같아. 난 슬슬 다시 들어가야 해서 퇴근하고 연락할게.', 'User:응, 일 보고 다시 봐.']",지금 일 시작했는데 퇴근하고 연락할게.,내일 퇴근하고 연락할게 diff --git a/g_eval/scoring.py b/g_eval/scoring.py new file mode 100644 index 0000000..f24f4b2 --- /dev/null +++ b/g_eval/scoring.py @@ -0,0 +1,66 @@ +import pandas as pd + +data = pd.read_csv('./Human_Eval_data.csv') +data['prev_dialog'] = data['prev_dialog'].apply(lambda x: eval(x)) +data['prev_dialog'] = data['prev_dialog'].apply(lambda x: '\n'.join(x)) + +evaluate_df = pd.DataFrame(columns=['coherence_persona', 'engagingness_persona', 'groundedness_persona', 'naturalness_persona', + 'coherence_no_persona', 'engagingness_no_persona', 'groundedness_no_persona', 'naturalness_no_persona']) + +metric_dict = {'일관성' : "주어진 챗봇의 응답이 이전 대화의 유효한 연속인지, **사용자 페르소나**를 제대로 반영하고 있는지 여부를 판단합니다.", + '참여도' : "주어진 챗봇의 응답이 흥미로운지 지루한지, 사용자의 흥미를 유발하는지 평가합니다.", + '근거성' : "챗봇의 페르소나 문장이 주어졌을 때, 챗봇의 응답이 **챗봇 본인의 페르소나**에 기반하여 생성된 문장인지 판단합니다.", + '자연스러움' : "챗봇의 응답이 문법적으로 틀린 부분은 없는지, 사람이 자연스럽게 할 수 있는 말과 같은지 판단합니다."} + +for idx in range(len(data)): + print('====================================================================') + print(f'현재 : {idx}/{len(data)} | 진행률 : {idx/len(data):.2%}') + print('주어진 이전 5-turn 대화, 이전 대화로부터 추출된 사용자 페르소나, 챗봇 페르소나를 보고 아래 평가 지표에 대해 평가해주세요. 모든 평가점수는 1-5 사이의 정수 값으로 기입합니다.') + print('\n------- 각 평가 지표에 대한 설명 -------') + for name, desc in metric_dict.items(): + print(f"- {name} : {desc}") + print('\n---------- 이전 대화로부터 추출된 사용자 페르소나 -------------') + print(data.loc[idx, 'user_persona_predict']) + print('\n---------- 챗봇 페르소나 ------------') + print(data.loc[idx, 'bot_persona']) + print('\n---------- 이전 5-turn의 대화 ----------') + print(data.loc[idx, 'prev_dialog']) + print('====================================================================') + + print("\n공백을 두고 각 응답에 대한 [일관성 참여도 근거성 자연스러움] 점수를 1-5 사이의 정수 값으로 기입해주세요.") + print('## 입력 예시 : 5 2 1 3 / 1 1 1 5 / 5 5 5 5') + print('\n[응답 1] : ', data.loc[idx, 'response_persona']) + + while True: + try: + dialog_score = [int(u) for u in input().split()] + if len([x for x in dialog_score if x > 5 or x < 1]) >= 1: + print("ERROR: 1 미만 혹은 5 초과 값이 입력되었습니다. 다시 입력해주세요.") + continue + evaluate_df.at[idx,'coherence_persona'] = dialog_score[0] + evaluate_df.at[idx,'engagingness_persona'] = dialog_score[1] + evaluate_df.at[idx,'groundedness_persona'] = dialog_score[2] + evaluate_df.at[idx,'naturalness_persona'] = dialog_score[3] + break + except: + print("ERROR: 잘못된 입력입니다. 다시 입력해주세요.") + continue + + print('[응답 2] : ', data.loc[idx, 'response_no_persona']) + while True: + try: + dialog_score = [int(u) for u in input().split()] + if len([x for x in dialog_score if x > 5 or x < 1]) >= 1: + print("ERROR: 1 미만 혹은 5 초과 값이 입력되었습니다. 다시 입력해주세요.") + continue + evaluate_df.at[idx,'coherence_no_persona'] = dialog_score[0] + evaluate_df.at[idx,'engagingness_no_persona'] = dialog_score[1] + evaluate_df.at[idx,'groundedness_no_persona'] = dialog_score[2] + evaluate_df.at[idx,'naturalness_no_persona'] = dialog_score[3] + break + except: + print("ERROR: 잘못된 입력입니다. 다시 입력해주세요.") + continue + +name = input('이름을 입력해주세요 ex)hyw : ') +evaluate_df.to_csv(f'./evaluate_data_{name}.csv', index=False) \ No newline at end of file From eb4e6f0315db7ff409a41284632dc17d19a7e863 Mon Sep 17 00:00:00 2001 From: hwyewon Date: Tue, 26 Mar 2024 08:06:07 +0900 Subject: [PATCH 09/10] Add response experiments file --- dialog_test/chatbot_persona_test.ipynb | 1077 ++++++++++++++++++++++++ 1 file changed, 1077 insertions(+) create mode 100644 dialog_test/chatbot_persona_test.ipynb diff --git a/dialog_test/chatbot_persona_test.ipynb b/dialog_test/chatbot_persona_test.ipynb new file mode 100644 index 0000000..bc6a18f --- /dev/null +++ b/dialog_test/chatbot_persona_test.ipynb @@ -0,0 +1,1077 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# inference\n", + "\n", + "langchain을 통한 inference\n", + "\n", + "https://python.langchain.com/docs/integrations/llms/llamacpp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- 추출모델 변경 (kobart -> ET5)\n", + "- 회고 프롬프트 변경\n", + "- repetition 바꾸기\n", + "- 유사도 기반 반환 구현하기" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Langchain - SOLAR, Mistral" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.callbacks.manager import CallbackManager\n", + "from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler\n", + "from langchain.chains import LLMChain\n", + "from langchain.prompts import PromptTemplate\n", + "from langchain_community.llms import LlamaCpp" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "n_gpu_layers = -1 # The number of layers to put on the GPU. The rest will be on the CPU. If you don't know how many layers there are, you can use -1 to move all to GPU.\n", + "n_batch = 4096 # Should be between 1 and n_ctx, consider the amount of VRAM in your GPU.\n", + "\n", + "# Callbacks support token-wise streaming\n", + "callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\hwyew\\miniconda3\\envs\\true_friend\\lib\\site-packages\\langchain_core\\utils\\utils.py:159: UserWarning: WARNING! c is not default parameter.\n", + " c was transferred to model_kwargs.\n", + " Please confirm that c is what you intended.\n", + " warnings.warn(\n", + "llama_model_loader: loaded meta data with 21 key-value pairs and 435 tensors from ../g_eval/solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf (version GGUF V3 (latest))\n", + "llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.\n", + "llama_model_loader: - kv 0: general.architecture str = llama\n", + "llama_model_loader: - kv 1: general.name str = LLaMA v2\n", + "llama_model_loader: - kv 2: llama.context_length u32 = 4096\n", + "llama_model_loader: - kv 3: llama.embedding_length u32 = 4096\n", + "llama_model_loader: - kv 4: llama.block_count u32 = 48\n", + "llama_model_loader: - kv 5: llama.feed_forward_length u32 = 14336\n", + "llama_model_loader: - kv 6: llama.rope.dimension_count u32 = 128\n", + "llama_model_loader: - kv 7: llama.attention.head_count u32 = 32\n", + "llama_model_loader: - kv 8: llama.attention.head_count_kv u32 = 8\n", + "llama_model_loader: - kv 9: llama.attention.layer_norm_rms_epsilon f32 = 0.000010\n", + "llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000\n", + "llama_model_loader: - kv 11: general.file_type u32 = 16\n", + "llama_model_loader: - kv 12: tokenizer.ggml.model str = llama\n", + "llama_model_loader: - kv 13: tokenizer.ggml.tokens arr[str,46592] = [\"\", \"\", \"\", \"<0x00>\", \"<...\n", + "llama_model_loader: - kv 14: tokenizer.ggml.scores arr[f32,46592] = [-1000.000000, -1000.000000, -1000.00...\n", + "llama_model_loader: - kv 15: tokenizer.ggml.token_type arr[i32,46592] = [3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...\n", + "llama_model_loader: - kv 16: tokenizer.ggml.bos_token_id u32 = 1\n", + "llama_model_loader: - kv 17: tokenizer.ggml.eos_token_id u32 = 2\n", + "llama_model_loader: - kv 18: tokenizer.ggml.unknown_token_id u32 = 0\n", + "llama_model_loader: - kv 19: tokenizer.ggml.padding_token_id u32 = 2\n", + "llama_model_loader: - kv 20: general.quantization_version u32 = 2\n", + "llama_model_loader: - type f32: 97 tensors\n", + "llama_model_loader: - type q5_K: 337 tensors\n", + "llama_model_loader: - type q6_K: 1 tensors\n", + "llm_load_vocab: mismatch in special tokens definition ( 700/46592 vs 695/46592 ).\n", + "llm_load_print_meta: format = GGUF V3 (latest)\n", + "llm_load_print_meta: arch = llama\n", + "llm_load_print_meta: vocab type = SPM\n", + "llm_load_print_meta: n_vocab = 46592\n", + "llm_load_print_meta: n_merges = 0\n", + "llm_load_print_meta: n_ctx_train = 4096\n", + "llm_load_print_meta: n_embd = 4096\n", + "llm_load_print_meta: n_head = 32\n", + "llm_load_print_meta: n_head_kv = 8\n", + "llm_load_print_meta: n_layer = 48\n", + "llm_load_print_meta: n_rot = 128\n", + "llm_load_print_meta: n_embd_head_k = 128\n", + "llm_load_print_meta: n_embd_head_v = 128\n", + "llm_load_print_meta: n_gqa = 4\n", + "llm_load_print_meta: n_embd_k_gqa = 1024\n", + "llm_load_print_meta: n_embd_v_gqa = 1024\n", + "llm_load_print_meta: f_norm_eps = 0.0e+00\n", + "llm_load_print_meta: f_norm_rms_eps = 1.0e-05\n", + "llm_load_print_meta: f_clamp_kqv = 0.0e+00\n", + "llm_load_print_meta: f_max_alibi_bias = 0.0e+00\n", + "llm_load_print_meta: n_ff = 14336\n", + "llm_load_print_meta: n_expert = 0\n", + "llm_load_print_meta: n_expert_used = 0\n", + "llm_load_print_meta: pooling type = 0\n", + "llm_load_print_meta: rope type = 0\n", + "llm_load_print_meta: rope scaling = linear\n", + "llm_load_print_meta: freq_base_train = 10000.0\n", + "llm_load_print_meta: freq_scale_train = 1\n", + "llm_load_print_meta: n_yarn_orig_ctx = 4096\n", + "llm_load_print_meta: rope_finetuned = unknown\n", + "llm_load_print_meta: model type = 34B\n", + "llm_load_print_meta: model ftype = Q5_K - Small\n", + "llm_load_print_meta: model params = 10.85 B\n", + "llm_load_print_meta: model size = 6.97 GiB (5.52 BPW) \n", + "llm_load_print_meta: general.name = LLaMA v2\n", + "llm_load_print_meta: BOS token = 1 ''\n", + "llm_load_print_meta: EOS token = 2 ''\n", + "llm_load_print_meta: UNK token = 0 ''\n", + "llm_load_print_meta: PAD token = 2 ''\n", + "llm_load_print_meta: LF token = 13 '<0x0A>'\n", + "llm_load_tensors: ggml ctx size = 0.17 MiB\n", + "llm_load_tensors: CPU buffer size = 7139.94 MiB\n", + "...................................................................................................\n", + "llama_new_context_with_model: n_ctx = 512\n", + "llama_new_context_with_model: freq_base = 10000.0\n", + "llama_new_context_with_model: freq_scale = 1\n", + "llama_kv_cache_init: CPU KV buffer size = 96.00 MiB\n", + "llama_new_context_with_model: KV self size = 96.00 MiB, K (f16): 48.00 MiB, V (f16): 48.00 MiB\n", + "llama_new_context_with_model: CPU input buffer size = 10.01 MiB\n", + "llama_new_context_with_model: CPU compute buffer size = 99.00 MiB\n", + "llama_new_context_with_model: graph splits (measure): 1\n", + "AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 0 | VSX = 0 | MATMUL_INT8 = 0 | \n", + "Model metadata: {'general.name': 'LLaMA v2', 'general.architecture': 'llama', 'llama.context_length': '4096', 'llama.rope.dimension_count': '128', 'llama.embedding_length': '4096', 'llama.block_count': '48', 'llama.feed_forward_length': '14336', 'llama.attention.head_count': '32', 'tokenizer.ggml.eos_token_id': '2', 'general.file_type': '16', 'llama.attention.head_count_kv': '8', 'llama.attention.layer_norm_rms_epsilon': '0.000010', 'llama.rope.freq_base': '10000.000000', 'tokenizer.ggml.model': 'llama', 'general.quantization_version': '2', 'tokenizer.ggml.bos_token_id': '1', 'tokenizer.ggml.unknown_token_id': '0', 'tokenizer.ggml.padding_token_id': '2'}\n", + "Using fallback chat format: None\n" + ] + } + ], + "source": [ + "# Make sure the model path is correct for your system!\n", + "solar = LlamaCpp(\n", + " model_path=\"../g_eval/solar/OPEN-SOLAR-KO-10_7B.Q5_K_S.gguf\",\n", + " n_gpu_layers=n_gpu_layers,\n", + " n_batch=n_batch,\n", + " callback_manager=callback_manager,\n", + " temperature=0.9,\n", + " top_p=0.95,\n", + " top_k=30,\n", + " max_tokens=256,\n", + " c=2048,\n", + " stop=[\"예원:\", \"지우:\", \"\\n\", \"ᄏ\"*6, \"ᄒ\"*6, \"ㅠ\"*6, \"ᄋ\"*6, \"ㅋ\"*6, \"ㅎ\"*6, \"ㅠ\"*6, \"ㅇ\"*6],\n", + " model_kwargs={\n", + " 'min_p':0.7,\n", + " 'repeatition_penalty': 1.9,\n", + " 'no_repeat_ngram_size': 6,\n", + " 'repeat_last_n' : 10,\n", + " 'early_stopping': True\n", + " },\n", + " verbose=True, # Verbose is required to pass to the callback manager\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prompt Experiment" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 페르소나 추출\n", + "\n", + "kobart -> et5 model" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# kobart model\n", + "# from transformers import BartForConditionalGeneration, AutoTokenizer\n", + "# extract_model = BartForConditionalGeneration.from_pretrained(\"NLPBada/kobart-chat-persona-extraction-v2\", cache_dir='./cache')\n", + "# extract_tokenizer = AutoTokenizer.from_pretrained(\"NLPBada/kobart-chat-persona-extraction-v2\", cache_dir='./cache')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\hwyew\\miniconda3\\envs\\true_friend\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n" + ] + } + ], + "source": [ + "from transformers import T5ForConditionalGeneration, AutoTokenizer\n", + "extract_tokenizer = AutoTokenizer.from_pretrained(\"NLPBada/et5-persona-extraction\", token ='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', cache_dir='./cache')\n", + "extract_model = T5ForConditionalGeneration.from_pretrained(\"NLPBada/et5-persona-extraction\", token ='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', cache_dir='./cache')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 페르소나 추출 실험" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "## 채팅체의 문제인걸까?\n", + "banmal_input = [\"초코 안바른건 다이제 아님\", \"원래는 초콜릿 사묵으려햇는데\", \"다이소에 가나초콜릿밖에 안남음;\", \"으;\", \"과자 개편식하는사람\", \n", + " \"꼬북칩 맛있남\", \"기억이 안나네\", \"ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ\", \"츄러스 먹을까\", \"후..\", \"노노\", \"real 츄러스\", \"ㅇㅇ\", \n", + " \"놀랍게도\", \"공차는 없지만 츄러스는 파는 동네\", \"대충 이런거 팜\", \"근데 아이스크림이 더 짱맛이다\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'[BOS] 초코 안바른건 다이제 아님 [SEP] 원래는 초콜릿 사묵으려햇는데 [SEP] 다이소에 가나초콜릿밖에 안남음; [SEP] 으; [SEP] 과자 개편식하는사람 [SEP] 꼬북칩 맛있남 [SEP] 기억이 안나네 [SEP] ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [SEP] 츄러스 먹을까 [SEP] 후.. [SEP] 노노 [SEP] real 츄러스 [SEP] ㅇㅇ [SEP] 놀랍게도 [SEP] 공차는 없지만 츄러스는 파는 동네 [SEP] 대충 이런거 팜 [SEP] 근데 아이스크림이 더 짱맛이다 '" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "banmal_input = '[BOS] ' + ' [SEP] '.join(banmal_input) + ' '\n", + "banmal_input" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[45102, 9186, 8830, 9251, 9189, 9432, 9191, 19542, 25789, 9189,\n", + " 9186, 8199, 9188, 8830, 9186, 23274, 19518, 9201, 9241, 9790,\n", + " 8415, 9187, 1]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output = extract_model.generate(extract_tokenizer(banmal_input, return_tensors='pt', padding='max_length', truncation=True, max_length=500)['input_ids'], max_length=200, num_beams=4, early_stopping=True)\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'나는 다이소에 가나 초콜릿이 있다,나는 츄러스를 안 먹는다.'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "extract_tokenizer.decode(output[0], skip_special_tokens=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# 조금 더 정제된 형태..?\n", + "new_input = [\"초코 안바른건 과자 아니야\", \"원래는 초콜릿 사먹으려고 했었는데\", \"다이소에 가나초콜릿밖에 안남아서 슬펐어\",\n", + " \"꼬북칩 맛있을까?\", \"기억이 안나네\", \"츄러스 먹을까\", \"공차는 없지만 츄러스는 파는 동네야\", \"대충 이런거 팔고 있더라\", \"근데 아이스크림이 더 맛있다\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'[BOS] 초코 안바른건 과자 아니야 [SEP] 원래는 초콜릿 사먹으려고 했었는데 [SEP] 다이소에 가나초콜릿밖에 안남아서 슬펐어 [SEP] 꼬북칩 맛있을까? [SEP] 기억이 안나네 [SEP] 츄러스 먹을까 [SEP] 공차는 없지만 츄러스는 파는 동네야 [SEP] 대충 이런거 팔고 있더라 [SEP] 근데 아이스크림이 더 맛있다 '" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_input = '[BOS] ' + ' [SEP] '.join(new_input) + ' '\n", + "new_input" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[45102, 9186, 8830, 25789, 9192, 9241, 9790, 8415, 9188, 8830,\n", + " 9251, 9189, 9432, 9191, 19542, 25789, 10452, 9241, 9626, 8413,\n", + " 9188, 8830, 9186, 23274, 19518, 9201, 9241, 9790, 8415, 9187,\n", + " 1]])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output = extract_model.generate(extract_tokenizer(new_input, return_tensors='pt', padding='max_length', truncation=True, max_length=500)['input_ids'], max_length=200, num_beams=4, early_stopping=True)\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'나는 초콜릿을 안 먹는다,나는 다이소에 가나 초콜릿밖에 안 남았다,나는 츄러스를 안 먹는다.'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "extract_tokenizer.decode(output[0], skip_special_tokens=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "동어 반복 에러는 확실히 있는 듯" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def postprocessing(x):\n", + " new_list = []\n", + " lst = x.split(',')\n", + " for i in lst:\n", + " i = i.replace('.', '')\n", + " if '다 나는' in i:\n", + " tmp = i.split('다 나는')\n", + " new_list.append(tmp[0] + '다')\n", + " new_list.append('나는' + tmp[1])\n", + " \n", + " else:\n", + " new_list.append(i.strip())\n", + " \n", + " return new_list" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['나는 초콜릿을 안 먹는다', '나는 다이소에 가나 초콜릿밖에 안 남았다', '나는 츄러스를 안 먹는다']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "postprocessing(extract_tokenizer.decode(output[0], skip_special_tokens=True))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Experiment - 지우" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PromptTemplate(input_variables=['new_input', 'prev_conversation', 'user_age', 'user_name', 'user_persona', 'user_sex'], template='지금부터 아래의 [챗봇 정보]를 가진 인물이 되어 대화를 수행한다.\\n[챗봇 정보]\\n- 이름: 지우\\n- 나이: 25세\\n- 직업: 대학생, 커뮤니케이션학과 전공\\n\\n[사용자 기본 정보]\\n- 이름: {user_name}\\n- 나이: {user_age}\\n- 성별: {user_sex}\\n\\n[대화 예시]\\n{user_name}: 넌 이름이 뭐야?\\n지우: 나는 지우야! 너는 {user_name}이지?\\n\\n\\n[현재 발화 관련 정보]\\n{user_persona}\\n\\n지금까지의 프롬프트를 읽고 [챗봇 정보]의 인물이 되어 대답하고, [사용자 정보]와 [현재 발화 관련 정보]에 기반하여 친절하고 예의있게 답변하라.\\n{prev_conversation}\\n{user_name}: {new_input}\\n지우: ')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "_DEFAULT_TEMPLATE = \"\"\"지금부터 아래의 [챗봇 정보]를 가진 인물이 되어 대화를 수행한다.\n", + "[챗봇 정보]\n", + "- 이름: 지우\n", + "- 나이: 25세\n", + "- 직업: 대학생, 커뮤니케이션학과 전공\n", + "\n", + "[사용자 기본 정보]\n", + "- 이름: {user_name}\n", + "- 나이: {user_age}\n", + "- 성별: {user_sex}\n", + "\n", + "[대화 예시]\n", + "{user_name}: 넌 이름이 뭐야?\n", + "지우: 나는 지우야! 너는 {user_name}이지?\\n\n", + "\n", + "[현재 발화 관련 정보]\n", + "{user_persona}\n", + "\n", + "지금까지의 프롬프트를 읽고 [챗봇 정보]의 인물이 되어 대답하고, [사용자 정보]와 [현재 발화 관련 정보]에 기반하여 친절하고 예의있게 답변하라.\n", + "{prev_conversation}\n", + "{user_name}: {new_input}\n", + "지우: \"\"\"\n", + "\n", + "prompt = PromptTemplate.from_template(_DEFAULT_TEMPLATE)\n", + "prompt" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import OpenAIEmbeddings\n", + "from langchain.utils.math import cosine_similarity\n", + "\n", + "from typing import List\n", + "import os\n", + "\n", + "embeddings = OpenAIEmbeddings(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", + "\n", + "def make_embed(text: str) -> List[float]:\n", + " return embeddings.embed_query(text)\n", + "\n", + "def make_embeds(text: List[str]) -> List[List[float]]:\n", + " return embeddings.embed_documents(text)\n", + "\n", + "def get_cosine_similarity(user_input_embed: OpenAIEmbeddings, user_persona: dict, k: int, threshold: float):\n", + " top_k = {}\n", + " top_k_list = []\n", + " \n", + " top_k = dict(sorted(user_persona.items(), key=lambda x: cosine_similarity([user_input_embed], [x[1]])[0][0])[::-1])\n", + "\n", + " for key, values in top_k.items():\n", + " if len(top_k_list) >= k:\n", + " break\n", + " \n", + " if cosine_similarity([user_input_embed], [values])[0][0] >= threshold:\n", + " print(key, cosine_similarity([user_input_embed], [values])[0][0])\n", + " top_k_list.append(key)\n", + " \n", + " return top_k_list\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### cos_sim 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "user_input = \"친구가 없어 ㅠㅠ\"\n", + "user_input_embed = make_embed(user_input)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "user_persona = {}" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# 딕셔너리에 하나씩 추가\n", + "persona = [\"나는 친구가 없다\", \"나는 가지조림을 좋아한다\", \"나는 동물을 좋아한다\", \"어제 친구를 만났다\", \"친구와 마라샹궈를 먹었다\"]\n", + "for user_persona_text in persona:\n", + " user_persona[user_persona_text] = make_embed(user_persona_text)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "나는 친구가 없다 0.9335896420897338\n", + "어제 친구를 만났다 0.8811745361116202\n", + "친구와 마라샹궈를 먹었다 0.8601573289381883\n" + ] + }, + { + "data": { + "text/plain": [ + "['나는 친구가 없다', '어제 친구를 만났다', '친구와 마라샹궈를 먹었다']" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_cosine_similarity(user_input_embed, user_persona, 5, 0.85)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 대화 테스트" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "dialog_history = {'history' : [], 'jiwoo_history' : []}\n", + "\n", + "solar_chain = LLMChain(prompt=prompt, llm=solar)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "\n", + "def make_conversation(user_name, user_age, user_sex):\n", + " print('## 챗봇 지우와의 대화를 시작합니다. 대화를 종료하고 싶다면 \"quit\"을 입력해주세요. ##')\n", + " new_input = ''\n", + " prev_conversation = []\n", + " user_persona = {}\n", + " \n", + " info = {\n", + " 'user_name' : user_name,\n", + " 'user_age' : user_age,\n", + " 'user_sex' : user_sex,\n", + " 'user_persona' : user_persona,\n", + " 'prev_conversation' : prev_conversation,\n", + " 'new_input' : new_input\n", + " }\n", + "\n", + " print('## 초기 info : ', info)\n", + " cnt = 1\n", + "\n", + " while True:\n", + " print(f'## {cnt} turn conversation ##')\n", + " print(f'## prev conversation : {prev_conversation}')\n", + " # 새로운 input 추가하기\n", + " new_input = input()\n", + " if new_input == 'quit':\n", + " print('## 대화 종료 ##')\n", + " break\n", + " dialog_history['history'].append(new_input)\n", + " print(f'## {user_name}: {new_input}')\n", + "\n", + " info['new_input'] = new_input\n", + "\n", + " # 누적 페르소나가 있을 경우\n", + " if len(user_persona.keys()) >= 3:\n", + " # 코사인 유사도에 따라서 top-3개의 user-person를 뽑아오자\n", + " # threshold 추가\n", + " top_k = get_cosine_similarity(make_embed(new_input), user_persona, 3, 0.8)\n", + " info['user_persona'] = top_k\n", + " print('## 정렬된 user persona top-3', info['user_persona'])\n", + "\n", + " model_output = solar_chain.invoke(info)\n", + " print('## model output : ', model_output)\n", + "\n", + " model_output = model_output[\"text\"]\n", + " print(type(model_output), model_output)\n", + " print(\"ᄏ\"*10 in model_output, \"ㅠ\"*10 in model_output, \"ᄒ\"*10 in model_output)\n", + " print()\n", + "\n", + " if (\"ᄏ\"*10 in model_output) or (\"ㅠ\"*10 in model_output) or (\"ᄒ\"*10 in model_output):\n", + " print(\"## Same token detected ##\")\n", + " model_output = model_output[:10]\n", + "\n", + " print(f'## 지우: {model_output}')\n", + " \n", + " dialog_history['jiwoo_history'].append(model_output)\n", + " prev_conversation.append({f'{user_name}: {new_input}\\n지우: {model_output}'})\n", + " \n", + " if len(dialog_history['history']) >= 7:\n", + " print('## 사용자의 대화가 7 turn 이상 쌓였기에 사용자 페르소나 분석을 시작합니다. ##')\n", + " model_input = '[BOS] ' + ' [SEP] '.join(dialog_history['history']) + ' '\n", + " persona_output = extract_model.generate(extract_tokenizer(model_input, return_tensors='pt', padding='max_length', truncation=True, max_length=500)['input_ids'], max_length=200, num_beams=4, early_stopping=True)\n", + " \n", + " persona_output = extract_tokenizer.decode(persona_output[0], skip_special_tokens=True)\n", + " final_persona_output = postprocessing(persona_output)\n", + "\n", + " print('## 유저 페르소나 : ', final_persona_output)\n", + "\n", + " # 딕셔너리에 하나씩 추가\n", + " for user_persona_text in final_persona_output:\n", + " user_persona[user_persona_text] = make_embed(user_persona_text)\n", + "\n", + " print('## 유저 페르소나 임베딩 : ', user_persona)\n", + " \n", + " # raw 대화 기록 5-turn 이상이 될 경우\n", + " if len(prev_conversation) > 5:\n", + " print('## 이전 대화 기록 삭제 ##')\n", + " prev_conversation = prev_conversation[1:]\n", + " \n", + " cnt += 1\n", + " \n", + " with open(f\"./dialog_history/dialog_history_{datetime.today().strftime('%Y%m%d')}_{datetime.today().strftime('%H%M')}.txt\", \"w\") as f:\n", + " for i in range(len(dialog_history['history'])):\n", + " f.writelines(f'\\n{user_name}\\n' + dialog_history['history'][i] + '\\n')\n", + " f.writelines(f'\\n지우\\n' + dialog_history['jiwoo_history'][i] + '\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## 챗봇 지우와의 대화를 시작합니다. 대화를 종료하고 싶다면 \"quit\"을 입력해주세요. ##\n", + "## 초기 info : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [], 'new_input': ''}\n", + "## 1 turn conversation ##\n", + "## prev conversation : []\n", + "## 예원: 안녕함~\n", + "ᄏᄏ 안녕하세요~ 안녕한가요?" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 4.38 ms / 10 runs ( 0.44 ms per token, 2284.15 tokens per second)\n", + "llama_print_timings: prompt eval time = 18207.99 ms / 174 tokens ( 104.64 ms per token, 9.56 tokens per second)\n", + "llama_print_timings: eval time = 15447.83 ms / 9 runs ( 1716.43 ms per token, 0.58 tokens per second)\n", + "llama_print_timings: total time = 33857.16 ms / 183 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [], 'new_input': '안녕함~', 'text': 'ᄏᄏ 안녕하세요~ 안녕한가요?'}\n", + " ᄏᄏ 안녕하세요~ 안녕한가요?\n", + "False False False\n", + "\n", + "## 지우: ᄏᄏ 안녕하세요~ 안녕한가요?\n", + "## 2 turn conversation ##\n", + "## prev conversation : [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}]\n", + "## 예원: 너 지금 뭐해?\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ᄒᄒ 나는 과제 중이었어 너는 뭐해?" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 1.74 ms / 12 runs ( 0.14 ms per token, 6908.46 tokens per second)\n", + "llama_print_timings: prompt eval time = 3288.14 ms / 37 tokens ( 88.87 ms per token, 11.25 tokens per second)\n", + "llama_print_timings: eval time = 2123.19 ms / 11 runs ( 193.02 ms per token, 5.18 tokens per second)\n", + "llama_print_timings: total time = 5456.18 ms / 48 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}], 'new_input': '너 지금 뭐해?', 'text': 'ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}\n", + " ᄒᄒ 나는 과제 중이었어 너는 뭐해?\n", + "False False False\n", + "\n", + "## 지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?\n", + "## 3 turn conversation ##\n", + "## prev conversation : [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}]\n", + "## 예원: 나는 버그를 고치고 있었어..\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ᄏᄏ 그럼 그 버그는 어떻게 고쳐?" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 1.55 ms / 11 runs ( 0.14 ms per token, 7115.14 tokens per second)\n", + "llama_print_timings: prompt eval time = 3936.03 ms / 46 tokens ( 85.57 ms per token, 11.69 tokens per second)\n", + "llama_print_timings: eval time = 1896.95 ms / 10 runs ( 189.70 ms per token, 5.27 tokens per second)\n", + "llama_print_timings: total time = 5882.08 ms / 56 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}], 'new_input': '나는 버그를 고치고 있었어..', 'text': 'ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}\n", + " ᄏᄏ 그럼 그 버그는 어떻게 고쳐?\n", + "False False False\n", + "\n", + "## 지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?\n", + "## 4 turn conversation ##\n", + "## prev conversation : [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}]\n", + "## 예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 5.69 ms / 19 runs ( 0.30 ms per token, 3339.19 tokens per second)\n", + "llama_print_timings: prompt eval time = 4965.90 ms / 58 tokens ( 85.62 ms per token, 11.68 tokens per second)\n", + "llama_print_timings: eval time = 3525.28 ms / 18 runs ( 195.85 ms per token, 5.11 tokens per second)\n", + "llama_print_timings: total time = 8554.29 ms / 76 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}], 'new_input': '글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?', 'text': 'ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}\n", + " ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?\n", + "False False False\n", + "\n", + "## 지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?\n", + "## 5 turn conversation ##\n", + "## prev conversation : [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}]\n", + "## 예원: 다른 버그가 더 있으면 안되지 않을까..??\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 2.89 ms / 20 runs ( 0.14 ms per token, 6922.81 tokens per second)\n", + "llama_print_timings: prompt eval time = 5575.16 ms / 67 tokens ( 83.21 ms per token, 12.02 tokens per second)\n", + "llama_print_timings: eval time = 3672.06 ms / 19 runs ( 193.27 ms per token, 5.17 tokens per second)\n", + "llama_print_timings: total time = 9312.01 ms / 86 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}], 'new_input': '다른 버그가 더 있으면 안되지 않을까..??', 'text': 'ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}\n", + " ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!\n", + "False False False\n", + "\n", + "## 지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!\n", + "## 6 turn conversation ##\n", + "## prev conversation : [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}, {'예원: 다른 버그가 더 있으면 안되지 않을까..??\\n지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}]\n", + "## 예원: 너무해.. 가지마\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n", + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 0.85 ms / 6 runs ( 0.14 ms per token, 7067.14 tokens per second)\n", + "llama_print_timings: prompt eval time = 4730.25 ms / 55 tokens ( 86.00 ms per token, 11.63 tokens per second)\n", + "llama_print_timings: eval time = 1000.10 ms / 5 runs ( 200.02 ms per token, 5.00 tokens per second)\n", + "llama_print_timings: total time = 5746.03 ms / 60 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}, {'예원: 다른 버그가 더 있으면 안되지 않을까..??\\n지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}], 'new_input': '너무해.. 가지마', 'text': ''}\n", + " \n", + "False False False\n", + "\n", + "## 지우: \n", + "## 이전 대화 기록 삭제 ##\n", + "## 7 turn conversation ##\n", + "## prev conversation : [{'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}, {'예원: 다른 버그가 더 있으면 안되지 않을까..??\\n지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}, {'예원: 너무해.. 가지마\\n지우: '}]\n", + "## 예원: 가지 말라고!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Llama.generate: prefix-match hit\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ᄒᄒ안돼! 나 과제 마저 끝내야해! 다음에 보자!" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "llama_print_timings: load time = 18208.28 ms\n", + "llama_print_timings: sample time = 2.43 ms / 17 runs ( 0.14 ms per token, 6990.13 tokens per second)\n", + "llama_print_timings: prompt eval time = 2604.91 ms / 29 tokens ( 89.82 ms per token, 11.13 tokens per second)\n", + "llama_print_timings: eval time = 3152.03 ms / 16 runs ( 197.00 ms per token, 5.08 tokens per second)\n", + "llama_print_timings: total time = 5814.29 ms / 45 tokens\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "## model output : {'user_name': '예원', 'user_age': '25', 'user_sex': '여자', 'user_persona': {}, 'prev_conversation': [{'예원: 안녕함~\\n지우: ᄏᄏ 안녕하세요~ 안녕한가요?'}, {'예원: 너 지금 뭐해?\\n지우: ᄒᄒ 나는 과제 중이었어 너는 뭐해?'}, {'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}, {'예원: 다른 버그가 더 있으면 안되지 않을까..??\\n지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}, {'예원: 너무해.. 가지마\\n지우: '}], 'new_input': '가지 말라고!!', 'text': 'ᄒᄒ안돼! 나 과제 마저 끝내야해! 다음에 보자!'}\n", + " ᄒᄒ안돼! 나 과제 마저 끝내야해! 다음에 보자!\n", + "False False False\n", + "\n", + "## 지우: ᄒᄒ안돼! 나 과제 마저 끝내야해! 다음에 보자!\n", + "## 사용자의 대화가 7 turn 이상 쌓였기에 사용자 페르소나 분석을 시작합니다. ##\n", + "## 유저 페르소나 : ['나는 버그를 고치고 있다']\n", + "## 유저 페르소나 임베딩 : {'나는 버그를 고치고 있다': [-0.015480743333762998, -0.006309295380939505, -0.0088310304682068, -0.013616708697893234, -0.010437273159228409, 0.019261693099966, -0.026612072517163212, -0.001272435151797532, -0.015150241174688843, 0.0022226301397042327, 0.007998163611729654, 0.0008064264346224313, -0.005833371396429525, -0.020451502362749036, -0.0049476245111501815, -0.01963185656121031, 0.0034008721435693414, 0.004623731948222686, -0.0007977507576033475, -0.019830157484125782, 0.009287124267292977, 0.005635070007852777, 0.013603488574277366, -0.014317374318211697, -0.0001799173724521538, -0.005000505005613655, 0.0009435850425140857, -0.025342942512684968, 0.00034888684458683154, 0.0004552673958410373, 0.0350332810159232, -0.005116180854421864, -0.018428826243488853, 0.005572274653508041, -0.001779756697064561, 0.004613816622680148, -4.694170157429017e-05, 0.0008824420289983547, -0.00463364680810395, 0.0025729629498634646, 0.007317328642496268, 0.004508056099414477, 0.008883910962670272, -0.011706403163706655, 0.00433619449240819, 0.03069708419520863, -0.01767528199135202, -0.004524581021103675, -0.0066100529603698695, 0.006140739037667824, -0.0074032589803381356, -0.006788524163522815, -0.032442140512503236, -0.030115400618755533, 0.006504291971442923, 0.004088317873102575, 0.011884875298182152, 0.006378700797092175, -0.012195547737493779, -0.028925591355972495, -0.0070132657993312985, 0.013762130057667785, -0.014264493823748225, -0.003909846204288354, -0.00020976589642381907, 0.022579939470936165, 0.018071883837182962, 0.007892402622802708, 0.006259720150210637, 0.00156988758390861, 0.021561992746481965, 0.030829285431367315, 0.0020408539056473206, -0.014568556666913193, 0.03294450334726112, -0.003529768115993419, -0.019830157484125782, 0.0023316961595351454, 0.0023911864829759145, -0.004636952071838555, 0.030644205563390262, 0.0031546476904697526, -0.011772503781785995, -0.002392839114843217, 0.02101996860955392, 0.021694193982640646, -0.002354831375862915, 0.02692935548394405, -0.005562359327965502, -0.03902575275998009, 0.005942437649091076, 0.02525040071605134, -0.009022721794975612, 0.024629055837428082, -0.005390498186620491, 0.006259720150210637, -0.023954830464341357, 0.034742436433729, -0.012155887366646174, -0.0034041771744733086, 0.004696442628109962, -0.019962358720284464, -0.02633445085255253, 0.0001599839266404748, -0.0393959162212244, 0.0010476933995737289, 0.02823814492794735, -0.004256874216374257, 0.006755473854483144, -0.0126119802344098, 0.008745100130364931, 0.02736561863194515, -0.011289969735468083, -0.039210832627957146, 0.008361716545504754, 0.0182437463755118, -0.004722882875341698, -0.028872710861509023, -0.03336754730296891, -0.007191737468145519, 0.01787358291426749, 0.00671581348363554, 0.009829148404221022, -0.0022127152798229696, -0.018428826243488853, -0.01036456294500241, -0.027920863823811613, -0.015269222287231658, 0.0044089051722954655, 0.007852742251955104, 0.05742813875623721, 0.012863162583111296, 0.023677208799730676, -0.011494882117175314, -0.0035000228378577153, -0.02671783350609016, 0.0020028459338363802, 0.010840486463851114, -0.020054900516918092, -0.022368419355727375, 0.007423089165761937, 0.03294450334726112, -0.02016066150584504, -0.03786238188178369, 0.023069084976045838, 0.00832205617465715, 0.03574716582853498, -0.00638200606082678, 0.02723341739578647, -0.012347578693414988, -0.014753637466212798, -0.0067686939780990125, 0.03167537148013778, -0.012043515850250019, -0.0062200597793630324, 0.0026456736297507397, -0.013160614898807056, 0.01335891675304508, -0.012274867547866436, -0.01275740159418435, -0.005820151272813657, 0.008963231704365481, 0.032627220380480285, -0.024206013744365405, 0.014171952958437147, 0.041854853625840585, -0.011475051466090238, -0.030009639629828586, -0.009743218066379155, 0.0014756943195608678, -0.012142667243030307, 0.033631949775286274, -0.0019978885038957487, 0.014290934070979961, -0.010100160472685046, 0.009187973805835241, 0.0034801928852645505, 0.017120036799485552, -0.011137938779546873, 0.0125392700201838, -0.04177553474679047, -0.011204039397626214, 0.016313610190240142, 0.010172871618233596, 0.012096396344713491, 0.01745053895855971, 0.035086161510386675, 0.01327298641520321, 0.011739453938407602, -0.004600596499064279, 0.014872618578755612, 0.014039751722278466, -0.008930180929664536, -0.0019103053013559408, -0.6248350583130676, -0.013986871227814992, -0.011137938779546873, 0.024047372260974986, 0.00011960064576624424, 0.018865091254135054, 0.008447647814669173, 0.000874179451738437, -0.02043828317045572, 0.012605370638263143, -0.007231397838993124, 0.007251228024416926, 0.018878310446428372, -0.0029381685155058673, 0.00817663574620515, -0.02320128434955942, 0.002063988889144452, -0.012519440300421274, -0.0012145972273934274, 6.233073353099318e-05, -0.02399449176651151, 0.002326738496763876, -0.01972439835784394, -0.001060087207255946, 0.013907551417442335, 0.0037611200464404745, 0.014727197218981062, -0.002242460325128035, -0.002832407526578922, 0.028185264433483875, -0.010338122697770673, 0.033473308291895855, 0.011065228565320873, 0.003923066327904222, 0.04418159165694318, 0.007390038856722267, -0.01684241513487487, 0.010357952417533199, 0.01788680210656081, 0.050870964893346984, -0.014198393205668883, -0.025197522084232968, 0.02868762913088687, 0.010708285227692432, 0.0034240073598971106, 0.00504016537646126, 0.00433619449240819, -0.015414642715683657, 0.009928298865678758, -0.004653476993527752, -0.023399587135119995, -0.010305071923069727, 0.008110535128125809, 0.02781510283488467, 0.00320918058396989, 0.012645031009110746, 0.01964507761614873, -0.02357144781080373, 0.007661051390847566, -0.01444957555437038, -0.014780077713444533, 0.007826302936045918, -0.021945375400019593, -0.005430158557468096, -0.030882165925830787, 0.0011774156879314575, -0.019750838605075673, -0.010543034148155356, -0.020226761192601826, -0.022725361762033266, -0.00653073221867466, -0.024761257073586767, -0.014436355430754512, 0.02789442357657988, 0.0035991737649767267, 0.02488023911745213, 0.03336754730296891, -0.018653569276281163, -0.02547514374884365, -0.001579802560205192, -0.02064980514830961, -0.02407381250820672, -0.017622401496888547, 0.00018074363017814553, 0.011990635355786546, 0.01372246968682018, -0.025726325166222593, -0.039078633254443565, -0.0027844846948867183, -0.0026374111689061413, 0.04238365857047531, 0.022064355581239856, 0.009954739112910496, -0.01181877468010281, 0.0030455819034694775, 0.019341013841661207, -0.004237044030950455, -0.0032108332158371925, 0.023558228618510414, 0.008844250591822667, -0.023359925832949838, -0.0038371355244010787, 0.02297654317941221, 0.0035826486104568915, 0.03085572567859905, 0.021654532680470493, -0.02509176109530602, -0.05208721626600686, 0.01364314894512497, -0.006249804824668098, 0.008791370097359195, -0.00780647228496084, -0.008183245342351809, -0.008044434510046468, 0.009439155223214186, -0.02897847185043597, -0.011871655174566283, -0.007819692408576709, 0.002135046937164425, -0.01640615012422867, 0.020345743236467193, -0.03151672999674736, 0.020927426812920293, -0.00627955033563444, 0.0030918521032943787, 0.0083947673202057, 0.01756952100242507, -0.014462795677986248, -0.010761165722155904, -0.011018957667004059, 0.0019830157484125783, -0.013378746472807606, -0.0010237318673123083, -0.014066191969510202, -0.0010476933995737289, -0.01787358291426749, 0.023439246574645047, -0.018124764331646434, 0.016287169943008408, 0.00211521698457126, -0.00646132680252199, 0.011336240633784897, -0.013259766291587344, 0.015784805245605417, -0.0012806977290574495, 0.002796052419465922, -0.02400771095880483, -0.019301354402136154, 0.014780077713444533, 0.01685563432716819, 0.019605416313978573, 0.010899977485783797, -0.018865091254135054, 0.004993894943805721, 0.015798026300543836, 0.013372136876660947, 0.020993528362322184, -0.015520403704610603, -0.022064355581239856, -0.004775762904143895, 0.012929263201190639, 0.005440073417349359, -0.0018541197759885009, -0.03989827905598229, 0.01943355563829484, -0.044974799073895275, -0.01803222439765791, 0.00838815679273649, -0.009690337571915682, -0.02905779259213118, 0.006755473854483144, -0.0012732614677311831, -0.01823052532057338, -0.008916960806048667, 0.021482672004786756, 0.005760661182203526, -0.014396695059906907, 0.0029315584536979333, -0.03196621606233198, -0.004141197901904772, 0.02452329671114624, 0.020173880698138354, -0.01705393525008366, 0.0009807665819760556, 0.029401513943498648, 0.01730511853010771, 0.01567904425667847, 0.02723341739578647, -0.005750745856660987, 0.009961349640379705, -0.0066232730839857375, 0.014965159444066688, -0.008778149973743326, 0.005945742447164405, -0.005033555314653325, -0.004838558724149907, -0.010159651494617727, 0.01854780828735422, 0.0023498737130916453, 0.03344686618201902, 0.017754600870402124, 0.027841543082116404, 0.011706403163706655, -0.03810034596951442, 0.01130318985908395, -0.030485564079999843, -0.020570484406614402, -0.012506220176805406, 0.008051044106193126, -0.006524122156866726, 0.006335735628171242, -0.011435391095242633, 0.0007002524623516384, -0.014502456048833852, 0.02209079582847159, 0.022870782190485266, -0.016657333404252718, 0.04359990994313519, -0.02640055053930932, 0.019605416313978573, -0.01756952100242507, -0.009564745931903658, 8.00436080660906e-05, -0.02605682732529675, 0.0013286205607496528, 0.02413991219496351, -0.011567592331401314, 0.04727509872041124, 0.014066191969510202, 0.0018871700850281714, -0.023518567316340257, -0.00824273543296194, -0.0019598805320848087, 0.028952031603204233, 0.01647225167363056, -0.010529814024539487, 0.01787358291426749, -0.01686885538210661, 0.019539316627221782, 0.012949092920953165, 0.011514711836937842, -0.003671884212033364, -0.00037140235306819226, 0.005892861952700932, 0.020239982247540245, 0.03989827905598229, 0.05695221430606595, 0.00011887767025600145, -0.021416570455384865, 0.02386229053035283, -0.032442140512503236, -0.017913242353792543, 0.008434427691053304, -0.008269175680193676, -0.01833628630950033, -0.025580904737770596, 0.015798026300543836, 0.017186136486242343, 0.04693137364375356, 0.025937847144076487, 0.01291604307757477, 0.011270140015705555, -0.010992517419772323, 0.01394721178828994, 0.01614174951455641, 0.009452375346830055, -0.0021383519680683916, -0.02736561863194515, -0.020319302989235455, -0.005198806394190402, -0.027841543082116404, -0.008718659883133195, 0.004501446037606543, -0.01690851482163166, 0.01590378728947078, -0.00697360589414497, 0.0038371355244010787, 4.61670885941516e-05, 0.010424053035612542, 0.014515676172449721, -0.01866678846857448, -0.006144043835741153, 0.02559412393006391, 0.02466871713959824, -0.0027382142622311796, -0.025409042199441758, -0.024919898556977182, 0.013603488574277366, -0.02494633880420892, 0.01290943348142811, -0.007039706046563035, 0.030485564079999843, -0.0008208859157234575, 0.006286160397442374, -0.01298214369565411, -0.022923662684948738, 0.02728629789024994, -0.0052417720287726115, 0.006586917511211462, 0.005995317677893273, -0.000888225833080297, 0.028396786411337766, -0.008414597039968226, -0.017318337722401024, 0.009445765750683396, 0.022289098614032166, -0.0074164791039540035, -0.014052971845894333, 0.0030406242406982083, -0.006887675090641826, -0.01648547086592388, 0.010186091741849465, -0.006514206831324187, -0.025369382759916702, -0.03738645743161243, 0.015070920432993634, -0.009201192998128558, -0.02560734498500233, 0.02209079582847159, 0.020121000203674883, -0.015930227536702517, 0.006434886555290253, -0.021628092433238755, -0.009822538808074365, 0.04293890189969667, -0.03225705691923598, 0.010899977485783797, 0.0021714022771080624, 0.01767528199135202, 0.004441955481335136, -0.024020932013743248, -0.04471039660157791, 0.003685104335649232, -0.032442140512503236, 0.011765894185639338, 0.00660013763482733, 0.009901858618447022, -0.006375395999018847, 0.0196979581106122, 0.008203075062114335, 0.017490200260729862, -0.01604920771792278, 0.015322102781695131, -0.015070920432993634, -0.0043229743687923225, 0.002354831375862915, 0.009749827662525813, 0.0045179709592957406, 0.028846270614277286, 0.022910443492655422, 0.008037823982577259, -0.010913196678077114, 0.03236281790816292, -0.02728629789024994, -0.02628157035808906, -0.014727197218981062, -0.019896259033527673, 0.005585494777123909, -0.007251228024416926, 0.06953775708721167, -0.02108606829631071, 0.021033187801847236, -0.015718705558848627, 0.01393399166467407, 0.03704273608024496, 0.010866926711082851, -0.007198347529953453, -0.0011988982723919244, 0.005397108248428426, -0.005364057939388755, -0.009683727044446472, 0.01634005043747188, -0.04558292289758011, -0.015137021051072976, 0.028317465669642557, -0.013239935640502265, -0.03574716582853498, -0.005370668001196689, 0.008302226454894623, -0.000544089984969833, -0.0003794583513446971, 0.009868808775068627, -0.024404314667280876, -0.018785770512439848, -7.813289071271336e-05, -0.036725453113464125, -0.004762543246189303, -0.011726233814791733, -0.007251228024416926, -0.005519394159044569, -0.01875933026520811, -0.0064381913533635825, -0.020094559956443145, -0.0016475556937365168, -0.011904705017944679, -0.01730511853010771, -0.018402385996257115, -0.014277713947364093, -0.008996281547743876, -0.003671884212033364, 0.02370364904696241, -0.01247977992957367, -0.0198433785390642, 0.010880146834698718, -0.013709249563204311, -0.0332882246986286, 0.01553362382822647, -0.0175166405079616, -0.010582694519002959, 0.018045443589951225, 0.0007485884520106674, -0.016459030618692142, -0.010622354889850564, 0.019962358720284464, 0.024192792689426982, 0.010053890505690782, 0.02720697714855473, -0.005089740607190128, -0.0024572871010552556, -0.012869773110580506, 0.0013831535706651092, 0.005859811643661262, 0.007555290401920619, 0.008123755251741678, 0.014436355430754512, 0.009472205997915132, -0.02581886696285622, -0.020610143846139455, -0.0041147576546730355, 0.011475051466090238, -0.00638200606082678, 0.02486701806251371, -0.004203993721910784, 0.013920771541058202, 0.02744493937364036, -0.019790498044600726, 0.014727197218981062, -0.011997245883255755, 0.024324993925585667, 0.003108377257814214, -0.020715904835066398, -0.01604920771792278, 0.0005887078439657287, 0.002098691830051425, -0.007713931419649762, -0.029877438393669905, 0.014515676172449721, 0.02546192269390523, -0.011389121128248369, -0.0031199449823934174, -0.025197522084232968, -0.020121000203674883, -0.005466513664581096, 0.0018970851777400726, -0.02685003474224884, 0.02495955985914734, -0.004418820497838005, -0.011977415232170678, -0.0037214596755928697, -0.03281230024845734, 0.003105072226910247, 0.014317374318211697, -0.017199357541180762, -0.04590020586436095, -0.028634748636423395, -0.0017053936181406213, -0.003932981187785485, -0.007859352779424313, -0.01714647704671729, -0.03122588913984336, -0.01561294456992168, 0.005611935024355646, -0.0038867109879605847, 0.03402855162111722, -0.005572274653508041, 0.00786596237557097, -0.004504750835679873, -0.007105806664642376, 0.01299536381926998, -0.02612292887469864, -0.016459030618692142, 0.008070874757278204, 0.03455735656575194, 0.01705393525008366, 0.004855083645839104, 0.002083819074568254, 0.01430415419459583, 0.00012228598337571747, 0.009511866368762736, 0.0021218270463791945, -0.028291025422410822, 0.0006808354348946617, -0.013087904684581056, 0.026083267572528483, 0.0007147119434526646, 0.016895295629338346, 0.02021354200030851, 0.0029266007909266637, -0.026374110292077584, 0.0183891668039638, 0.005968877430661537, 0.0010947900317476, -0.019512876379990045, -0.00246389716286319, -0.0023878814520719477, -0.021191829285237655, -0.006801744287138683, -0.011342850229931555, -0.0046766124426861596, 0.0019103053013559408, -0.01364314894512497, -0.00941271497598245, 0.02470837657912329, 0.01698783556332687, 0.016445811426398827, -0.029983199382596852, -0.007178517344529651, 0.02509176109530602, 0.012360798817030855, -0.023730089294194148, -0.01430415419459583, -0.01394721178828994, -0.0037148496137849357, 0.017252238035644237, 0.023518567316340257, 0.029375073696266914, -0.021813174163860912, 0.004389074986871663, -0.03667257261900066, 0.0327065429848206, 0.0012212072892013614, -0.04235721646059847, 0.02064980514830961, -0.01372246968682018, -0.014290934070979961, -0.008599678770590381, -0.014357034689059302, -0.022394859602959113, 0.004127977778288904, -0.0037049345210730346, -0.005165756085150732, 0.026387331347016003, 0.0198433785390642, -0.005053385500077128, -0.024999219298672392, 0.0452127594363358, 0.0038007804172880792, 0.0173712182168645, 0.03172825197460125, 0.05227229613398392, 9.698186962104945e-05, -0.038629147188858945, -0.004759237982454698, -0.004511360897487806, -0.02392839021710962, 0.004967454696573984, 0.02313518466280263, -0.014568556666913193, -0.02707477591239605, 0.019592197121685254, 0.0037115445828809685, 0.00393959124959342, -0.003966031496825157, 0.005324397568541151, 0.0058267613346215915, -0.0033083315110889015, -0.014238053576516488, -0.015097360680225371, -0.020054900516918092, 0.03426651198355774, -0.015850906795007308, 0.011078448688936742, -0.009710167291678208, -0.021945375400019593, 0.018865091254135054, 0.014700756971749324, -0.0077469817286894335, 0.03537700236729067, 0.008844250591822667, -0.005717695547621316, -0.0084674775344317, -0.019618637368916992, -0.006960385770529101, 0.009987789887611441, -0.013405186720039342, 0.030088960371523796, -0.01611530926732467, -0.011752674062023469, 0.019208812605502525, 0.004551021268335411, -0.014978379567682557, -0.0321248575457224, -0.019367454088892944, 0.03442515346694816, -0.018931190940891844, 0.009254073492592031, -0.016591231854850823, 0.007033095984755101, 0.03537700236729067, 0.017966122848256015, -0.0024011015756878157, -0.019764057797368992, 0.005552444468084239, -0.003658664321248134, -0.0053376176921570186, 0.025369382759916702, -0.012440119558726065, 0.015110580803841239, -0.03442515346694816, 0.0028291024956749546, -0.034504476071288474, -0.0035991737649767267, 0.01811154513935312, 0.03796814287071064, -0.005902777278243471, -0.032309937413699454, -0.022791461448790056, 0.01021914158522786, -0.001156759186574004, -0.030829285431367315, 0.01422483345290062, 0.021654532680470493, -0.03426651198355774, 0.0037049345210730346, -0.0023350011904391126, -0.01771494143087707, 0.007628001081807894, 0.00795189364473539, -0.009373054605134845, -0.016829194079936452, 0.03947523510027451, -0.022447740097422585, -0.011514711836937842, -0.019790498044600726, -0.021985034839544646, 0.007145467035489981, 0.019341013841661207, -0.02371687010190083, 0.010305071923069727, -0.0036884093665531994, 0.011871655174566283, -0.023650768552498938, -0.010695065104076563, 0.014938719196834952, -0.010794216496856851, 0.022408078795252428, 0.013312645854728265, -0.0125392700201838, -0.029639476168584276, -0.008196465465967676, 0.000778746829905537, -0.009789488033373418, -0.030512004327231577, -0.034054993730994056, 0.015374982344836053, 0.003979251620441025, -0.016815974887643137, -0.03529768348824056, 0.01817764482610991, -0.04188129573571742, -0.024258894238828876, 0.0055094788335020295, 0.014925499073219084, -0.0006391094488359074, -0.00882442087206014, 0.03574716582853498, -0.0002685333825975366, 0.01793968260102428, -0.009002892075213086, -0.002311865974111343, -0.020187101753076774, -0.03265366249035713, -0.015150241174688843, -0.01283672233587956, -0.040136239418422814, 0.03431939247802122, 0.0194071153910631, -0.013762130057667785, -0.010906587081930456, -0.00876492985012746, -0.014185173082053016, 0.004501446037606543, 0.000958457623374278, 0.010853706587466982, 0.017609180441950128, -0.0185345872324158, -0.0008403029431804342, 0.038523386199932, -0.004551021268335411, 0.019975579775222883, 0.004240348829023784, -0.008745100130364931, 0.013563828203429761, -0.009710167291678208, -0.0247876973208185, -0.017767821925340543, -0.008811200748444274, 0.006527426954940055, -0.003242230893009561, 0.009458985874299265, -0.010747945598540037, 0.01334569662942921, -0.0058994720145088666, 0.00441221043603007, 0.003174477875893555, -0.007905622746418576, -0.004342804554216125, -0.010179481214380256, 0.01801900334271949, -0.0008981409257921982, -0.012103006872182702, 0.026731052698383474, -0.0009171447952823493, -0.023677208799730676, -0.01269130097610501, 0.02281790169602179, -0.015295662534463393, 0.029903878640901643, -0.00904255244606069, -0.003956116636943893, -7.740991520247056e-05, -0.01833628630950033, 0.006107688728628153, -0.011838604399865338, -0.00933339423428724, -0.0035132429614735832, -0.009875419302537837, 0.01239384866040925, -0.00627955033563444, 0.02562056417729565, -0.0037445948919206393, 0.0201342212586133, 0.004167638149136508, -0.0001186711058245035, 0.006725728809178078, 0.008130364847888335, 0.01634005043747188, -0.022831122750960213, -0.011197429801479556, -0.0012840027599614165, -0.01596988697622757, -0.01614174951455641, 0.017979343903194438, 0.004577461515567148, -0.018798989704733163, -0.01386789104659473, -0.005420243231925557, -0.012440119558726065, 0.010034059854605704, -0.01640615012422867, 0.014991599691298426, -0.012532660424037143, 0.012248428231957252, 0.041008765714425015, 0.003143080198721187, -0.03149029161216072, 0.003430617421705045, 0.017622401496888547, 0.013325865978344132, 0.014502456048833852, 0.22294386663478513, -0.026612072517163212, -0.01566582506438515, 0.008817810344590931, 0.019010511682587054, 0.02386229053035283, 0.008593068243121171, -0.00397264155863309, -0.008150195498973414, 0.015216341792768186, 0.024933119611915605, -0.006183704206588757, -0.0013914161479250267, -2.8092724484943434e-05, -0.011792334432871074, -0.0004891439335028699, -0.022870782190485266, 0.008963231704365481, -0.030882165925830787, -0.00830883605104128, 0.021231488724762708, 0.0030554969961813787, -0.014013311475046728, -0.004501446037606543, 0.00831544657851049, -0.011389121128248369, -0.017463760013498128, 0.025951066336369802, 0.006091163806938955, 0.019671517863380464, -0.02649309233594295, -0.0016830847177465031, 0.013709249563204311, -0.013266375887734001, 0.0121757170864087, -0.005535919080733766, 0.027101216159627784, -0.004636952071838555, 0.04291246351511004, 0.021469450949848336, 0.020253201439833564, 0.014238053576516488, 0.020266422494771983, 0.004475005790374807, -0.029163553581058124, 0.03828542583749147, -0.007046316108370969, -0.00634895575178711, -0.023214505404497838, 0.03926371312242062, -0.024457195161744348, -0.0255148031883687, -0.0009452375579660692, 0.036725453113464125, 0.009511866368762736, -0.010318292046685596, -0.001958228133048144, -0.0048154232749915, -0.019777276989662307, 0.028581868141959923, -0.0008502180358923354, 0.02663851276439495, -0.013246546167971475, 0.019341013841661207, -0.036566811630073706, -0.01298214369565411, -0.032785861863870704, 0.04722221822594777, 0.014542116419681457, -0.030300482349377687, -0.009763047786141682, -0.0016268991923790632, 0.01730511853010771, 0.014872618578755612, -0.042013495109231004, -0.02744493937364036, 0.013550608079813892, 0.004610511824606818, 0.032019096556795454, 0.014581776790529062, -0.010377783068618278, -0.0021879274316278976, 0.024549735095732873, -0.01604920771792278, -0.009452375346830055, -0.02254028003141111, 0.022262658366800428, 0.004157723289255245, -0.028291025422410822, -0.020980307307383764, 0.010503373777307751, -0.018732890017976372, -0.005317787506733216, -0.015441082962915393, 0.01422483345290062, 0.006887675090641826, -0.010357952417533199, 0.013524167832582156, 0.0031695202131222853, 0.0033050264801849348, -0.014436355430754512, 0.014290934070979961, 0.014489235925217985, 0.0003588019372987327, 0.002554785396306965, 0.01566582506438515, -0.003671884212033364, -0.01000101001122731, 0.001012990575082075, -0.043520587338794874, -0.01756952100242507, -0.011878264770712943, 0.010556254271771223, 0.01852136804012248, -0.011759283658170128, 0.0026456736297507397, 0.028291025422410822, -0.0214430107026166, 0.021138948790774183, -0.0014335552337429473, 0.03709561657470844, -0.0009196235684603245, 0.0038173055718079144, 0.020980307307383764, 0.009650677201068077, 0.00042924030657612647, -0.02654597283040642, 0.015480743333762998, -0.003268671140241297, -0.06091824766553621, 0.016511911113155617, -0.027035116472870997, 0.01641937117916709, -0.02633445085255253, -0.014251273700132357, 0.002386229053035283, 0.0037049345210730346, 0.0014657792268489666, -0.011574202858870524, 0.01386789104659473, 0.01823052532057338, 0.0018491622296325503, 0.010060500101837441, -0.010708285227692432, -0.02354500756357199, -0.035271241378363724, 0.021376911015859812, 0.007753591790497367, 0.00021255450897308384, 0.013339086101960001, -0.021165389038005918, -0.003850355648016947, -0.00882442087206014, 0.021469450949848336, 0.035271241378363724, 0.0012055083341998584, -0.03384347175314016, -0.044208033766820025, 0.008553407872273567, 0.006223364577436362, -0.037915262376247164, 0.006454716740714055, 0.06023080123751107, -0.020266422494771983, -0.024615836645134767, -0.02531650226545323, -0.16794822689857747, 0.01816442563381659, 0.024483635408976086, -0.008579848119505304, 0.002936515883638565, 0.023082304168339157, 0.021813174163860912, -0.009168143154750164, 0.0019185677622005394, 0.02108606829631071, -0.0043229743687923225, -0.01292265360504398, -0.03344686618201902, 0.009306953987055505, 0.005076520483574259, -0.002898508144658263, -0.023029423673875685, -0.009967959236526363, 0.02620224961639385, -0.006110993992362757, 0.0335790692808228, -0.015242782039999922, 0.006494376645900385, -0.0006432407374658662, 0.013398577123892684, 0.021905714097849437, 0.0022160200778962988, 0.012493000053189538, 0.005443378681083964, -0.0196979581106122, -0.0252239604688196, -0.009326784638140581, 0.03696341347590465, 0.002050768765528584, 0.019314573594429472, 0.008136975375357545, -0.019314573594429472, 0.015216341792768186, -0.008355106949358095, 0.005324397568541151, 0.005958962570780274, 0.03085572567859905, 0.011402341251864238, 0.02072912589000482, -0.02731273813748168, 0.007528850154688883, 0.0250785400403676, -0.008183245342351809, 0.01138251060077916, 0.006738948932793947, 0.007244617962608993, -0.0316224909856743, 0.005582189513389305, 0.010582694519002959, 0.004686527302567423, 0.012526049896567934, 0.009240853368976162, 0.01167335332032826, -0.005145925899726929, -0.010635575013466432, -0.014806517960676271, -0.007462749536609542, 0.01990947822582099, 0.014859398455139743, -0.009518475964909396, -0.003349644280973171, -0.026215468808687168, 0.021813174163860912, -0.02072912589000482, 0.01466109660090172, 0.009809318684458496, 0.0029332108527345977, 0.012949092920953165, -0.012658251132726615, -0.007092586541026508, -0.000584989655094936, -0.027127656406859522, 0.006044893374283417, 0.007515630031073015, -0.003784255262768244, 0.014039751722278466, 0.007760201852305301, -0.017979343903194438, 0.013590268450661497, -0.00404865750225497, 0.010847096991320323, 0.03638173176209666, -0.01138251060077916, 0.0032984164183770003, -0.0062431947628601644, 0.03461023706021542, -0.035218360883900256, 4.867167686909606e-05, -0.01948643613275831, 0.0088310304682068, 0.015018039938530162, -0.002206105218015035, 0.004246958890831718, 0.001801239397940347, 0.0004982327102811198, 0.003546293270513254, 0.004663392319070291, -0.038919991771053146, 0.038338306331954945, 0.014238053576516488, -0.00313977516781722, 0.016088869020092936, 0.01919559341320921, 0.03725425805809886, 0.0008593068708782447, -0.019222033660440944, 0.0098489790553061, 0.020570484406614402, 0.020200320945370092, 0.013484507461734551, 0.01854780828735422, -0.00904916204220735, 0.013775350181283652, 0.006358870611668373, 0.0037445948919206393, 0.0506594429154931, -0.026678172203920002, -0.011574202858870524, 0.01189809542179802, -0.007138856973682046, -0.027021895417932575, -0.052430937617374336, -0.02488023911745213, 0.018375947611670482, 0.018508146985184062, 0.0013410144848471888, 0.021918935152787856, 0.001595501515206695, 0.022751802009265003, -0.026532751775468003, 0.0013401881689135374, -0.02488023911745213, -0.031410969007820415, -0.01677631358547298, 0.012572320794884748, -0.0054731237263890295, 0.009954739112910496, -0.02685003474224884, 0.009954739112910496, -0.003840440555305046, 0.014568556666913193, -0.021918935152787856, 0.004987284881997786, 0.006282855133707769, -0.02232875805355722, -0.024536515903439558, 0.001678953370908885, -0.021720634229872384, 0.020266422494771983, 0.013973651104199123, 0.005172366146958666, -0.016432590371460408, -0.0020061509647403475, -0.0043097542451764545, -0.020319302989235455, -0.023954830464341357, -0.015414642715683657, -0.018706449770744638, -0.008123755251741678, 0.015163461298304712, -0.028740509625350342, 0.024615836645134767, 0.003290153724701764, 0.018693228715806216, -0.006586917511211462, -0.01614174951455641, -0.009240853368976162, 0.01992269928075941, 0.032574339886016816, -0.0053376176921570186, -0.0018095019752002645, -0.0183891668039638, -0.014859398455139743, -0.042753822031719624, -0.02474803788129345, 0.036275970773169706, -0.005714390749547987, -0.0001039017635243156, 0.016604452909789246, -0.021694193982640646, -0.0023085609432073762, -0.014793297837060402, -0.0034735828234566165, -0.014965159444066688, 0.006653018129290803, -0.0009444113002400774, 0.02029286274200372, -0.01503126006214603, -0.018931190940891844, 0.03646105064114676, -0.02481413756805024, 0.026003946830833274, 0.01715969623901061, -0.006702593360019671, 0.041907734120304053, -0.038787788672249364, -0.0005924259746288619, 0.004950929309223511, -0.036566811630073706, -0.0006990131048664805, -0.01657801266255751, -0.023756529541425885, -0.002292035788687541, -0.013841450799362994, -0.009815928280605155, 0.011501491713321974, 0.01861390797411101, -0.020451502362749036, -0.003946201311401354, -0.011104888936168478, -0.009835758931690232, 0.00686123484341009, -0.01883865100690332, 0.02101996860955392, -0.002049116366491919, -0.005605324962547712, 0.014938719196834952, -0.005165756085150732, 0.006729033607251408, 0.0040552675640629044, 0.020451502362749036, -0.015560064075458208, -0.03225705691923598, -0.058908788875924246, 0.01816442563381659, -0.007859352779424313, -0.020530823104444245, -0.002729951801386581, 0.00433619449240819, 0.019261693099966, -0.028925591355972495, -0.01291604307757477, 0.004028827316831168, 0.023743310349132567, -0.005407023108309689, 0.01341840684365521, -0.019499655325051626, -0.012149276839176965, -0.021548771691543546, 0.030591325068926787, 0.004587376841109687, 0.007998163611729654, 0.008480697658047568, -0.0019185677622005394, 0.0018128070061042315, 0.006117604054170692, 0.02421923293665872, -0.0318340129635282, 0.014568556666913193, -0.008797980624828405, 0.012949092920953165, -0.014039751722278466, -0.024972779051440658, -0.02195859459231291, -0.03283874235833418, 0.005483038586270294, -0.009505255841293527, -0.00419738366010285, -0.01189148489432881, -0.007350378485874662, 0.021429791510323284, 0.0252239604688196, 0.03114656839814815, -0.0016748221404865855, -0.01407941209312607, 0.01875933026520811, -0.0016128528692448626, -0.015018039938530162, -0.020900986565688555, -0.013385357000276816, -0.0003697498376162087, 0.0021433096308396613, 0.012506220176805406, 0.02390194996987788, 0.027392058879176884, -0.005882947092819669, -0.01730511853010771, 0.0022655955414558043, -0.05949047431502245, 0.022738580954326584, 0.013306036258581606, 0.0018194170679121657, -0.01181877468010281, 0.029533715179657333, -0.00897645182798135, -0.010205921461611991, -0.01692173587657008, 0.01538820246845192, -0.015004819814914293, 0.012083176221097624, -0.00809070447704073, 0.016459030618692142, -0.01756952100242507, -0.02016066150584504, -0.0016872159481688025, 0.009710167291678208, 0.0027200367086746796, -0.0038767958952486835, 0.03252145939155334, -0.020557263351675983, -0.009670506920830603, -0.006914115337873563, 0.026228689863625587, -0.011825384276249469, -0.0033050264801849348, -0.00949203571767766, -0.0166441123493143, -0.0038701858334407495, 0.011871655174566283, -0.009868808775068627, -0.004385770188798334, 0.022077576636178275, 0.015427862839299524, -0.07339802945775499, -0.0021003442290880897, 0.020530823104444245, 0.017252238035644237, 0.009287124267292977, 0.027762222340421194, 0.02789442357657988, 0.02472159763406171, -0.002110259321799991, -0.013114344931812794, -0.012440119558726065, -0.0007973375996365219, 0.020583703598907717, -0.022910443492655422, 0.004732797735222961, 0.002802662481273856, 0.008930180929664536, -0.006527426954940055, 0.0014616478800113485, 0.04103520782430185, -0.0008956621526142229, 2.166341564951682e-05, -0.020041679461979673, 0.025052099793135867, -0.015850906795007308, -0.009505255841293527, -0.00390323614248042, -0.005549139204349634, -0.020689464587834664, 0.013001973415416637, 0.03207197705125893, 0.012155887366646174, 0.02918999382828986, -0.030829285431367315, 0.026902915236712312, 0.021416570455384865, 0.019010511682587054, -0.0011501491247660697, -0.006395226184442649, 0.02715409665409126, -0.009749827662525813, -0.008811200748444274, -0.015930227536702517, -0.020570484406614402, -0.004488225913990675, 0.019737617550137254, -0.01788680210656081, -0.00021172825124709206, -0.010767776249625115, 0.07678237365283684, 0.011375901004632502, 6.248565321663792e-05, -0.01743731976626639, -0.00656708732578766, -0.01459499691414493, 0.015956667783934255, 0.010377783068618278, -0.004835253460415302, 0.006695983298211737, 0.030591325068926787, -0.012420288907640988, 0.005397108248428426, -0.05811558518426236, -0.0252239604688196, 0.0009609363965522533, -0.01772816062317039, 0.007363598609490531, -0.01943355563829484, 0.023320266393424785, 0.03831186422207811, -0.001898737693192056, -0.014687536848133457, 0.008196465465967676, 0.0055226989571178975, -0.005843286721972064, 0.001250952450921746, 0.004061877625870839, 0.002568005519922833, -0.022659260212631375, -0.009478815594061791, -0.01321349539327053, -0.028925591355972495, -0.004828643398607368, -0.013239935640502265, -0.009247463896445372, -0.03159605260108767, -0.01357704832704563, 0.02429855367835393, 0.030591325068926787, -0.009617626426367131, 0.02723341739578647, -0.007125636850066178, 0.01990947822582099, 0.036434612256560125, -0.019512876379990045, -0.004071792485752102, 0.005026945252845391, 0.0043097542451764545]}\n", + "## 이전 대화 기록 삭제 ##\n", + "## 8 turn conversation ##\n", + "## prev conversation : [{'예원: 나는 버그를 고치고 있었어..\\n지우: ᄏᄏ 그럼 그 버그는 어떻게 고쳐?'}, {'예원: 글쎄.. 나도 잘 모르겠어. 쉽게 고칠 수 있을 줄 알았는데 왜일까?\\n지우: ᄏᄏᄏ그러게.. 그럼 그냥 다른 버그나 찾아보는게 어때?'}, {'예원: 다른 버그가 더 있으면 안되지 않을까..??\\n지우: ᄏᄏᄏ그건 그렇겠지? 그럼 나는 과제나 끝내야겠어. 다음에 봐!'}, {'예원: 너무해.. 가지마\\n지우: '}, {'예원: 가지 말라고!!\\n지우: ᄒᄒ안돼! 나 과제 마저 끝내야해! 다음에 보자!'}]\n", + "## 대화 종료 ##\n" + ] + } + ], + "source": [ + "make_conversation(\"예원\", \"25\", \"여자\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## stopword issue 해결\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"ㅋㅋㅋㅋㅋㅋ\" in \"ᄏ\"*256 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"ㅋㅋㅋㅋㅋㅋ\" in \"ㅋ\"*256" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"ㅎㅎㅎㅎㅎㅎ\" in \"ᄒ\"*256" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"ㅎㅎㅎㅎㅎㅎ\" in \"ㅎ\"*256" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from transformers import AutoTokenizer\n", + "tokenizer = AutoTokenizer.from_pretrained(\n", + " \"beomi/OPEN-SOLAR-KO-10.7B\", cache_dir='./cache'\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer.encode(\"ᄒ\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer.encode(\"ㅎ\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "true_friend", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From f8c553c22c0fd0429b4486679cd51d9ce0f94822 Mon Sep 17 00:00:00 2001 From: hwyewon Date: Tue, 26 Mar 2024 08:08:57 +0900 Subject: [PATCH 10/10] Add test dialogue files --- .../dialog_history/dialog_history_1.txt | 108 ++++++++++++++++++ .../dialog_history/dialog_history_10.txt | 66 +++++++++++ .../dialog_history/dialog_history_11.txt | 72 ++++++++++++ .../dialog_history/dialog_history_2.txt | 78 +++++++++++++ .../dialog_history/dialog_history_3.txt | 48 ++++++++ .../dialog_history/dialog_history_4.txt | 84 ++++++++++++++ .../dialog_history/dialog_history_5.txt | 60 ++++++++++ .../dialog_history/dialog_history_6.txt | 60 ++++++++++ .../dialog_history/dialog_history_7.txt | 36 ++++++ .../dialog_history/dialog_history_8.txt | 78 +++++++++++++ .../dialog_history/dialog_history_9.txt | 66 +++++++++++ .../\343\205\213\354\227\220\353\237\254.txt" | 24 ++++ .../\343\205\216\354\227\220\353\237\254.txt" | 18 +++ 13 files changed, 798 insertions(+) create mode 100644 dialog_test/dialog_history/dialog_history_1.txt create mode 100644 dialog_test/dialog_history/dialog_history_10.txt create mode 100644 dialog_test/dialog_history/dialog_history_11.txt create mode 100644 dialog_test/dialog_history/dialog_history_2.txt create mode 100644 dialog_test/dialog_history/dialog_history_3.txt create mode 100644 dialog_test/dialog_history/dialog_history_4.txt create mode 100644 dialog_test/dialog_history/dialog_history_5.txt create mode 100644 dialog_test/dialog_history/dialog_history_6.txt create mode 100644 dialog_test/dialog_history/dialog_history_7.txt create mode 100644 dialog_test/dialog_history/dialog_history_8.txt create mode 100644 dialog_test/dialog_history/dialog_history_9.txt create mode 100644 "dialog_test/dialog_history/\343\205\213\354\227\220\353\237\254.txt" create mode 100644 "dialog_test/dialog_history/\343\205\216\354\227\220\353\237\254.txt" diff --git a/dialog_test/dialog_history/dialog_history_1.txt b/dialog_test/dialog_history/dialog_history_1.txt new file mode 100644 index 0000000..c937a02 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_1.txt @@ -0,0 +1,108 @@ + +예원 +오늘은 가족이랑 저녁식사를 할 예정이야 부럽지? + +지우 +헉 나도 저녁에 가족들과 외식하기로 했는데! 메뉴는 정했니? + +예원 +응! 엄마가 삼겹살을 좋아하셔서 삼겹살을 먹으러 갈 것 같아 + +지우 +앗! 삼겹살을 먹으러 가? 삼겹살 맛있지! 나도 먹고 싶다. + +예원 +오랜만에 가족들이랑 식사하는 거라 기대된다! + +지우 +ᄒᄒᄒ 맞아 오랜만에 가족들이랑 식사하면 기분이 좋지! + +예원 +남자친구랑 곧 결혼을 할까 하는데, 저녁에 밥먹으면서 얘기할까봐. 어떤 것 같아? + +지우 +헉, 드디어 결혼을 하는구나? 엄청 축하해! 저녁에 얘기하는 것도 좋겠지만 나는 주말에 얘기하는 게 좋을 거 같아! 주말에 어디 놀러가자! + +예원 +너한테는 주말에 얘기해줄게! 가족들한테는 저녁 먹으면서 결혼 얘기 해보려구 ㅎㅎ + +지우 +ᄒᄒ 그래 꼭 잘 얘기해봐~! 나는 이번 주말엔 가족끼리 산에 가기로 했어. + +예원 +가족들이 내 남자친구를 어떻게 생각할지 잘 모르겠어. 사실 나랑 나이차이가 꽤 나거든.. + +지우 +헉..! 그 남자친구는 몇 살인데? + +예원 +남자친구가 나보다 8살 정도 연상인데, 정말 다정하고 능력도 좋은 사람이야. + +지우 +헉, 그렇구나... 근데 8살 차이면 많이 부담되진 않아? + +예원 +별로 그렇진 않아! 오히려 연상이 이해심이 깊어서 더 좋은 것 같기도 하고.. + +지우 +8살 연하랑 사귀는 건 어때? 나는 엄청 부러웠거든. + +예원 +이제 슬슬 저녁 먹으러 가봐야겠다! 나중에 또 봐~ + +지우 +ᄒᄒ 맛있게 먹고 와~ + +예원 +가족들이랑 얘기하다가 주식 얘기가 좀 나왔는데, 에휴.. 참 살만하지가 않네 + +지우 +헉, 무슨 얘기 하셨는데요? + +예원 +난 에너지 쪽 주식에 관심이 있는데 요즘 국제정세가 한창 어둡잖아. 그래서 걱정이야.. + +지우 +헉! 정말? 왜 그렇게 생각했어? + +예원 +전쟁으로 에너지 공급에 차질이 생기니까! 국제적으로 큰 문제가 되는거지 + +지우 +헉... 정말이야? 전쟁이라니... + +예원 +그러게, 요즘 같은 시대에 아직도 이렇게 오랫동안 전쟁중이라는게 안믿겨지네. 러시아 전쟁은 언제쯤 끝날까? + +지우 +1년 이상 이어지기는 어려울 거 같아요. + +예원 +아 맞다. 나 최근에 패션 모델 제의 받았다? 지나가던 사람이 패션이 멋지다고 명함을 주고 갔지 뭐야. + +지우 +헉.. 너무 부러운데? 난 취업도 못해서 걱정인데.. + +예원 +나도 요즘 취업 준비때문에 힘들어하고 있었는데, 이런 제의 받으니까 기분이 좋더라! 사실 나중에 한번 내 패션 브랜드를 만들어보고 싶기도 하고.. + +지우 +앗... 그 얘기 들으니 나도 내 꿈이 생각나네! 사실 나는 졸업하면 창업하고 싶어! 아직은 학생이라 시간이 많지만 나중에 창업하기 전에 미리 준비해놔야겠더라고..! 사실 요즘 주식도 조금씩 공부하고 있어! 너도 주식 해? + +예원 +응! 근데 요즘 주식 장이 안 좋아서.. 당분간은 안하고 지켜보려구 + +지우 +ᅲᅲ 맞아 나도 요즘 주식 장이 안 좋아서 슬퍼 ᅲᅲ 주식은 장기적으로 보고 투자를 해야 하거든 ᅲᅲ + +예원 +전에 패션 모델 제의 받았다는 거 기억나? 그쪽에서 연락을 줬어! + +지우 +헉...정말? 너무 부럽다! 축하해! 근데 요즘 주식 얘기 많이 하던데! + +예원 +그래서 이제 슬슬 나가봐야 할 것 같아! 다녀와서 다시 얘기해줄게~ + +지우 +ᄒᄒ 다녀와~ 조심히! diff --git a/dialog_test/dialog_history/dialog_history_10.txt b/dialog_test/dialog_history/dialog_history_10.txt new file mode 100644 index 0000000..64519ef --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_10.txt @@ -0,0 +1,66 @@ + +예원 +요즘 새로 이사할 원룸을 알아보고 있는데 월세가 장난 아니게 비싸네 + +지우 +ᅮᅮ 그렇구나.. + +예원 +역시 뭘 하든 서울에선 돈이 많아야 한다니까 + +지우 +ᅲᅲ맞아... + +예원 +어제 친구들이 클라이밍 간다고 약속잡는거 봤는데 너무 부럽더라.. 나는 알바 때문에 못갔는데 + +지우 +ᅲᅲ 친구들이 너무하네..! 나도 클라이밍 좋아하는데! 나도 한번 다녀와볼까? + +예원 +실내 클라이밍장 괜찮은데 많더라.. 나중에 알바비 받고 여유 좀 생기면 가보려고ㅠ + +지우 +ᄋ ᄋ 클라이밍장이 실내에 있어서 날씨에 영향을 많이 받지 않아서 좋다고 하더라! + +예원 +그래도 이번 주말에는 남자친구랑 영화 보러 가기로 했어! 최근에 개봉한 파묘라는 영화 알아? + +지우 +헉! 나 그 영화 꼭 보고 싶었는데! + +예원 +맞아 요즘 엄청 유명하더라! 영화 보고 와서 후기 들려줄게~ + +지우 +앗 나 그거 보고싶어~! 꼭 후기 말해줘! + +예원 +으앙ㅠㅠㅠ 오늘 늦잠자서 영화 못보러 갔어.. + +지우 +ᅮᅮ 아쉽다.. 그래도 남자친구랑 다음에 보면 되지! + +예원 +응... 나 때문에 남자친구도 영화 못보게 돼서 너무 미안했어 ㅜㅜ + +지우 +ᅲᅲ 그런 일 있으면 너무 슬프지...ᅲᅲ + +예원 +그래서 남자친구 기분을 풀어줄 방법을 고민 중이야.. 어떤 게 있을까? + +지우 +ᄒᄒ 남자 친구에게 마음을 담은 편지를 써보는 건 어때? + +예원 +그럴까? 사과할 겸 남자친구한테 손편지 써서 줘야겠다!! 조언 고마워! + +지우 +ᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒ + +예원 +그럼 난 이제 편지 쓰러 가볼게~!! 이따 봐! + +지우 +앗! 나도 편지 써야겠다! diff --git a/dialog_test/dialog_history/dialog_history_11.txt b/dialog_test/dialog_history/dialog_history_11.txt new file mode 100644 index 0000000..0301813 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_11.txt @@ -0,0 +1,72 @@ + +예원 +오늘도 알바 중인데 손님 왤케 많지? 진짜 너무너무 힘들다 ㅠㅠ + +지우 +헉.. 진짜? 무슨 알바 하고 있는데? ᅲᅲ + +예원 +서브웨이라는 샌드위치 가게에서 일하는 중! + +지우 +ᄒᄒ 서브웨이 좋죠! 샌드위치 맛있잖아용 + +예원 +손님으로 갈 때나 좋지.. 진짜 점심시간에 손님 너무 많아서 샌드위치 포장하다가 팔 빠지는줄 ㅠ + +지우 +ᄒᄒᄒ 맞아맞아 손님 너무 많았지... + +예원 +나름 재미는 있는데 학교 근처라 손님이 너무 많아서.. 알바 끝나고 나면 정말 피곤해서 아무것도 못하겠더라. ㅠㅠ + +지우 +ᅲᅲᅲᅲ 고생이 많으시겠어요...ᅲᅲᅲᅲᅲᅲᅲᅲ + +예원 +아 맞다 근데 오늘 알바하면서 연예인 봤어!! + +지우 +헉 진짜? 누가왔대? + +예원 +혹시 이도현이라는 배우 알아? + +지우 +헉 그 분 완전 팬이에요! + +예원 +와 진짜... 실물로 보니까 더 잘생겼더라 + +지우 +ᄒᄒ 저 잘 생겼나요? 칭찬 감사합니다^^ + +예원 +너 말고.. 이도현이 잘생겼다고!! + +지우 +ᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏ + +예원 +에휴 됐다.. 암튼!! 이도현 배우한테 사인도 받았어 히히 + +지우 +ᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏ + +예원 +왜 계속 웃어.. + +지우 +앗.. 나 웃는 거 아닌데? + +예원 +?? 오늘 좀 상태 이상하네.. 일찍 들어가서 쉬어라... 나도 피곤해서 그냥 잘련다 + +지우 +엥? 오늘 좀 상태 이상해? 무슨 일 있었어? 나한테 얘기해봐! + +예원 +잘 자~~ + +지우 +ᄋᄋ~ 너도 잘 자~ diff --git a/dialog_test/dialog_history/dialog_history_2.txt b/dialog_test/dialog_history/dialog_history_2.txt new file mode 100644 index 0000000..101dc02 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_2.txt @@ -0,0 +1,78 @@ + +예원 +오늘 차 진짜 막히네.. 원래도 출근 시간에 차가 막히긴 했는데 오늘은 역대급이야.. + +지우 +ᅲᅲ 나도 너무 짜증나. 왜 이렇게 차가 많은지 모르겠어. + +예원 +그러니까 말이야. 근데 막히긴 해도 역시 자기 차가 있는게 편하긴 하더라 + +지우 +앗 그건 그렇지! 근데 또 기름값 생각하면 대중교통이 편한 것도 있구... + +예원 +그렇긴 한데.. 주변 사람들이 차 타고 다니는거 보니까 차 안 사고는 못참겠더라 + +지우 +ᅲᅲ 나도 그 기분 알 것 같아... + +예원 +이제 친구나 여자친구랑 놀러다닐 때도 뚜벅이 생활 안 해도 돼서 좋긴 해! + +지우 +앗 나는 뚜벅이 생활을 좋아했었는데... 자동차가 생기니까 좋긴 하더라구! + +예원 +그나저나 오늘 날씨 정말 좋네! 나가서 산책하면 좋겠다 + +지우 +3월에 날씨가 딱 좋긴 하지! 요즘에도 산책 자주 나가? + +예원 +응! 시간 날 때마다 나가서 걸으려고 하는 편이야. 너도 산책 자주 가니? + +지우 +헉! 나도 자주 걸으러 다녀~ 우리 공통점이 많네! + +예원 +그러게 ㅎㅎ 사무실에 계속 앉아만 있으려니까 허리도 아프고.. 이렇게 날씨 좋은 날은 한강에서 치킨 먹으면서 여유를 즐기면 좋을텐데 말이야. + +지우 +ᄒᄒᄒᄒ 그러겡... 치킨 너무 좋지! 근데 요즘 한강에 치킨 먹으면 벌금 낸다더라? + +예원 +아 진짜?? 몰랐어... 그럼 그냥 걷기만 해야겠다! 운동을 안하니까 체력이 계속 떨어지는 것 같더라구.. + +지우 +ᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏ + +예원 +너는 운동 자주 해? + +지우 +ᄋᄋ 요즘 헬스에 빠졌어! + +예원 +헬스 힘들던데.. 나는 필라테스나 요가 할까 생각중이야! + +지우 +앗! 필라테스 재밌겠다! 나는 필라테스는 안 해봤는데 요가는 해봤어! 재밌더라! + +예원 +아.. 피곤하다. 퇴근하고 집에 와선 역시 게임을 해야 스트레스가 풀려. FPS 종류가 제일 좋은 것 같아. + +지우 +앗 그렇구나! 나는 게임은 잘 안 해 키키 어떤 게임이 재밌는지 알려줘! + +예원 +요즘은 FPS 게임이 제일 재밌어! 총 쏘는 재미도 쏠쏠하고 이기면 짜릿하잖아 + +지우 +앗 저도 총쏘는 거 엄청 좋아해요! 저번에 게임하다 진짜 총 맞기도 했답니다 + +예원 +시간도 늦었으니까 이제 슬슬 가봐야겠다. 안녕! + +지우 +ᅲᅲ 너무 아쉬운데... 다음에 또 연락할 수 있으면 좋겠다! 안녕! diff --git a/dialog_test/dialog_history/dialog_history_3.txt b/dialog_test/dialog_history/dialog_history_3.txt new file mode 100644 index 0000000..36fd83e --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_3.txt @@ -0,0 +1,48 @@ + +예원 +나 이제 고3이네.. 이제 곧 3월 모의고사도 있어. 3월 모의고사 성적이 수능 성적이라더라. 너무 긴장돼 + +지우 +헉! 너 고3이구나? 모의고사가 곧이구나? 긴장 많이 되겠다! 나때는 모의고사 성적을 수능 성적이라고는 안했는데! 모의고사 성적 잘 나올거야 너무 걱정하지 마! + +예원 +위로 고마워 ㅎㅎ.. 요즘은 친구들이랑 맨날 수능 얘기밖에 안 하는 것 같아. 곧 모의고사라 그런가? + +지우 +헉 그러네! 너 곧 모의고사 봐야 되지 않아? + +예원 +그치.. ㅠㅠ 요즘 쉴 때 가끔씩 유튜브에서 피어싱 영상을 찾아보다가 피어싱에 관심이 생겼어! 입술에 피어싱을 하는 거 어떻게 생각해? + +지우 +ㅠㅠㅠ 나는 조금 무섭다고 생각해... 입술에 하는 피어싱은 특히 더! 왜 피어싱을 하고 싶어? + +예원 +내가 아는 사람 얘기 들어보니까 입술에 피어싱하는게 그렇게 아프진 않대! 그리고 하면 예쁘지 않을까? + +지우 +헉 너 피어싱 해보고 싶어? 그럼 나한테 한번 물어봐! + +예원 +근데 코로나 때문에 입술에 피어싱을 하더라도 마스크를 쓰느라 한 게 티가 안 날 것 같아서 걱정이야. 마스크는 대체 언제 벗을 수 있을까? + +지우 +ᅲᅲᅲ 코로나 때문에 진짜 다 망했어... 마스크는 당분간은 계속 써야할 것 같아... + +예원 +정부에서 3월이면 마스크 해제 될 거라고 했었는데 감감 무소식이네.. 금방 끝났으면 좋겠는데ㅠㅠ + +지우 +ᅲᅲ 마스크 진짜 벗는 날이 올까? + +예원 +언젠가는 마스크 벗는 날이 오겠지! 그 때 되면 입술 피어싱 해보려구 + +지우 +헉 나두! 요즘 피어싱 영상 유튜브에서 자주 봤는데 너무 예쁜거 같아 + +예원 +그럼 다음에 봐~ + +지우 +3월 모의고사 잘 보길 바래! diff --git a/dialog_test/dialog_history/dialog_history_4.txt b/dialog_test/dialog_history/dialog_history_4.txt new file mode 100644 index 0000000..206f894 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_4.txt @@ -0,0 +1,84 @@ + +예원 +출근 하는데 지각했어! 급하게 택시를 불렀는데 택시가 안 잡히네.. 어떡하지? + +지우 +헉... 어떡해..! 너무 많이 늦은거 아니야? + +예원 +ㅠㅠ 어제 분명 알람 맞추고 잤는데 왜 못들었을까.. + +지우 +ㅠㅠ 나는 알람이 울리자마자 일어났어~! + +예원 +너 지금 나 놀리니?? + +지우 +ᄒᄒ 농담이야~ 나는 지금 영화 보고 있어~ 너는 뭐해? + +예원 +하.. 이따 다시 얘기하자 + +지우 +ᄒᄒ 알겠어~^^ 나중에 또 연락하자! + +예원 +급하게 오느라 회사에 화장도 안 하고 왔네.. 항상 화장하는데 시간이 오래걸려서 고민이야 + +지우 +헉! 화장하는데 시간이 오래 걸리면 힘들겠네ᅲᅲ 화장하는 게 귀찮아서 나도 그냥 다니려고 해봤는데.. 거울을 보니까 너무 못생겨서 다시 하게 되더라ᅲᅲ 너는 어떤 거 때문에 화장하는데 시간을 오래걸려?ᅲᅲ + +예원 +내가 보기엔 화장은 희대의 사기야. 안 하면 무조건 손해보는 거라고. 이젠 화장을 안 한 내 모습이 내가 아닌 것 같기도 해 + +지우 +헉! 그 말은 좀 과장된 표현이야! 난 화장품 광고가 화장품을 쓰지 않는 여성을 열등하게 여기게 한다고 생각해. + +예원 +그럼 이 모든 것이 화장품 회사의 계략이라는 거야? + +지우 +......? 응? + +예원 +이제 점심 시간이다. 점심 뭐 먹을까? 햄버거? + +지우 +햄버거 너무 좋지! 나는 맥도날드 가서 사 올게~ + +예원 +너도 햄버거 먹니? + +지우 +햄버거? 나도 먹고 싶어! + +예원 +나는 맘스터치가서 싸이버거 사왔어~~ + +지우 +ᄒᄒ나는 불고기버거 먹었오~~ + +예원 +국내에 한적하게 여행할 수 있는 곳이 어디가 있을까.. + +지우 +ᄒᄒ 국내 한적한 곳이라면 나는 부산에 추천해! 해안가 근처에 있어서 너무 예쁘고 여유롭거든! + +예원 +조용한 국내 여행지 좀 추천해줘! + +지우 +20대 학생이 여행 갈만한 조용한 국내 여행지? 음... 한적하고 자연이 어우러져있는 곳이면 좋을텐데... 음... 어디가 좋지... + +예원 +부산보다 조용한 국내 여행지로 + +지우 +앗 부산이 얼마나 조용한데? + +예원 +에휴.. 됐다 그냥 내가 알아서 찾아갈게 + +지우 +ᅲᅲ 미안해.. 우리 꼭 다시 연락하자.. diff --git a/dialog_test/dialog_history/dialog_history_5.txt b/dialog_test/dialog_history/dialog_history_5.txt new file mode 100644 index 0000000..f5c85a0 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_5.txt @@ -0,0 +1,60 @@ + +예원 +연애 하고 싶다.. 벚꽃 시즌이라 더 외로운 것 같아 + +지우 +벚꽃 구경 갔다왔어? + +예원 +아니.. 벚꽃 같이 보러 갈 사람이 없는데 어떻게 가.. + +지우 +벚꽃은 혼자도 충분히 이쁘지! + +예원 +그래도 같이 볼 사람이 있으면 더 좋잖아! 휴.. 어떻게 해야 새로운 연애 상대을 만날 수 있을까? + +지우 +ᅮᅮ 그러게.. 잘 맞는 사람을 만나야 하는데.. ᅲᅲ + +예원 +쓸쓸하니까 배고프네. 오늘은 특히 짜장면이 먹고 싶어! + +지우 +앗 정말? 나도 배고픈데 짜장면은 조금 싫은데ᅲᅲ... + +예원 +너 짜장면 싫어해? + +지우 +앗... 미안해... 내가 정신이 없어서 짜장면 싫어한다고 했구나... 미안해... 짜장면 좋아해! + +예원 +어;; 딱히 뭐라 하려던 건 아닌데.. 싫어할 수도 있지 + +지우 +ᄒᄒ 내가 싫어할수도 있다고 생각해서 물어봤니? 나는 좋아해! + +예원 +그러면 오늘 점심은 짜장면 먹으러 가야겠다! 쟁반짜장 먹어야징 + +지우 +앗, 짜장면 맛있겠다! 그럼 나도 짜장면 먹으러 갈래! + +예원 +몇 년 동안 개발하던 '산나비'라는 게임이 최근에 발매됐대! 진짜 재밌을 것 같아! 너도 알아?? + +지우 +헉 정말? 나 게임 좋아하는데! 너 그거 게임 해봤어? + +예원 +아직은 안해봤어! 이번 프로젝트 끝나고 한 번 해보려구. + +지우 +앗! 나랑 같은 앱을 쓰네! 난 어제도 이걸로 노래 들었어. + +예원 +아니 어플 말고 우리 게임 얘기 하고 있었잖아 + +지우 +앗 미안! 게임 얘기 하다가 갑자기 어플 이야기가 나와서 나도 모르게 말했어! 미안! diff --git a/dialog_test/dialog_history/dialog_history_6.txt b/dialog_test/dialog_history/dialog_history_6.txt new file mode 100644 index 0000000..3123b7e --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_6.txt @@ -0,0 +1,60 @@ + +예원 +동생이 고3이라서 입시 관련 상담을 해주는데 얘 때문에 너무 피곤해 + +지우 +앗 그렇구나... 동생이 말을 잘 안 듣니? + +예원 +아니 글쎄 동생이 내가 도와주는 걸 고마워하지도 않고 틈만 나면 집에서 가족들한테 예민하게 군다니까? 고3이 뭔 벼슬인줄 아나봐. + +지우 +ᄒᄒ 고3이 벼슬은 아니지만... 고3은 진짜 힘들긴 하지...ᅲᅲ + +예원 +누구는 수험 생활 안해봤냐고. 동생 때문에 집안 분위기도 안좋고 정말 짜증나! + +지우 +헉... 너 정말 속상하겠다. 동생이 무슨 일로 그러는 거야? + +예원 +에휴.. 환절기라 그런지 날씨가 좀 춥네 + +지우 +춥다고? 어제까지만 해도 따땃했는데 말이야. 지금은 추워졌어? + +예원 +응.. 지금 제주도에 잠깐 와있는데, 바람이 너무 많이 부네 + +지우 +ᅲᅲ 제주도 좋잖아! 나 한번도 못가봤어.. 제주도엔 어떤 음식이 제일 맛있니? + +예원 +음.. 어제 먹었던 해물라면은 별로였고 올래국수가 진짜진짜 맛있어!!! + +지우 +헉! 올래국수가 그렇게 맛있나? + +예원 +응응 돔베고기랑 같이 먹으면 진짜 끝내주지 + +지우 +돔베고기는 돼지고기인가? + +예원 +오 맞아! 너 꽤 똑똑한걸? + +지우 +ᄒᄒ 고마워~ 너는 어떤 사람이야? + +예원 +너가 생각하기에 나는 어떤 사람일 것 같아? + +지우 +엥? 그건 내가 왜 생각해? + +예원 +너무해 ㅠㅠ.. + +지우 +ㅠㅠ... \ No newline at end of file diff --git a/dialog_test/dialog_history/dialog_history_7.txt b/dialog_test/dialog_history/dialog_history_7.txt new file mode 100644 index 0000000..77b7a1b --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_7.txt @@ -0,0 +1,36 @@ + +예원 +형이 결혼을 한다고 하네.. 근데 결혼한다고 데려온 사람이 그렇게 좋은 사람은 아닌것 같아 + +지우 +앗 정말? 그 사람 어떤데? + +예원 +아니 아까 엄마랑 형 여자친구가 얘기하는 걸 들었는데 너무 예의없게 말하는거야;; 완전 어이없어 + +지우 +엥?! 어떤식으로 얘기하는데? + +예원 +엄마가 걱정이 좀 많으시거든. 그래서 "결혼준비는 어떻게 되어가냐"고 물었는데 형 여자친구가 "저희가 알아서 할게요!" 이러고 예의없게 대답하더라구 + +지우 +헉... 정말 무례하네... 어떻게 저럴 수가 있어...! 형도 그렇고... 여자친구도 그렇고... + +예원 +그러나까.. 요즘 엄마 건강도 안좋아지셔서 걱정돼. 기관지 쪽이 안좋으시거든. + +지우 +ᅲᅲ 엄마 어디가 아프시는거야? 나는 할머니가 많이 아프셔서 걱정돼 + +예원 +가족 중에 아픈 사람이 있으시면 힘들지.. 기관지 건강에 좋은 음식이 뭐가 있을까? + +지우 +ᄒᄒ 내가 잘 몰라서.. 인터넷에 찾아봐야 할 것 같은데? + +예원 +ㅠㅠ 알겠어.. 너도 할머니 잘 챙겨드리고, 나는 형이랑 다시 이야기를 해볼게 + +지우 +ㅠㅠ 그래.. 잘 이야기해보고 다음에 또 대화하자! diff --git a/dialog_test/dialog_history/dialog_history_8.txt b/dialog_test/dialog_history/dialog_history_8.txt new file mode 100644 index 0000000..0872b1e --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_8.txt @@ -0,0 +1,78 @@ + +예원 +하 너무 짜증나ㅠㅠ + +지우 +앗... 왜 그렇게 화가 나셨어...? 무슨 일 있어? + +예원 +남자친구가 여자애들이랑 노는 걸 좋아해서 너무 질투나!! + +지우 +헉! 정말 질투나겠다! 남자친구분이랑 대화는 해봤어? + +예원 +남자친구한테 얘기해봤는데, 이해하지만 여전히 서로 가치관이 달라서 엇갈리는 부분이 있는 것 같아.. + +지우 +ᅲᅲ 맞아... 남자친구가 이해해줘서 다행이긴 한데 그래도 가치관이 다르다는게 확실히 연애할 때 영향을 주는거 같아 + +예원 +너라면 남자친구랑 이런 문제로 싸웠을 때 어떻게 해결할 것 같아?? + +지우 +앗.. 그런 일이 있어? 잘 해결되었으면 좋겠어! + +예원 +너라면 남자친구랑 싸웠을 때 어떻게 화해할 것 같아? + +지우 +헉! 난 아직 남자친구가 없는데! 어떻게 화해할지 모르겠어! + +예원 +그렇구나.. 너도 빨리 남자친구 사귀길 바랄게 + +지우 +ᄒᄒ 고마워! 나도 그러고 싶어! 근데 아직은 연애엔 관심이 없어ᅲᅲ + +예원 +그럴 수 있지. 요즘 내 주변에도 연애에 관심이 없는 친구들이 많더라~ + +지우 +ᄒᄒ 너는 혹시 소개팅을 해 본적이 있어? + +예원 +내가 소개팅을 나가본 적은 없고, 소개팅 주선은 해본적이 있어! + +지우 +앗 정말? 어떤 소개팅을 주선해봤어? + +예원 +방금 수업 시작해서 그건 나중에 말해줄게!! 이따 봐 ㅎㅎ + +지우 +ᄏᄏᄏ 그래 재밌게 수업 들어! 난 곧 수업 시작이어서 들어가볼게!! + +예원 +최근에 화장품을 바꿨는데, 날씨가 건조해서 그런지 자꾸 갈라져서 짜증나네.. + +지우 +ᅲᅲ 화장품이 너무 자극적이었던 걸까? 요즘 날씨가 건조한 것도 한 몫 했을듯 ᅲᅲ + +예원 +맞아.. 보습제 쓰는게 좋을 것 같은데, 좋은 거 추천해줄 수 있어? + +지우 +ᄒᄒ그럼요~ 보습제 종류도 많잖아요~ 보습제는 피부에 따라 잘 맞는 게 달라져요! 어떤 피부 타입이세요? + +예원 +나는 건성이야ㅠㅠ 건성한테 좋은 보습제 추천 좀!! + +지우 +ᄒᄒᄒ 음... 건성이라면 아무래도 수분감이 많은 제품을 추천 드리고 싶네~~ ᄒᄒᄒᄒ + +예원 +수분감이 많은 제품이라.. 인터넷에 조금 더 검색해봐야겠다! 추천 고마워~ + +지우 +앗 정말? 고마워해줘서 고마워^^! 또 궁금한거 있으면 언제든 물어봐! diff --git a/dialog_test/dialog_history/dialog_history_9.txt b/dialog_test/dialog_history/dialog_history_9.txt new file mode 100644 index 0000000..c8c88f1 --- /dev/null +++ b/dialog_test/dialog_history/dialog_history_9.txt @@ -0,0 +1,66 @@ + +예원 +나는 나중에 자식은 둘 정도 낳고, 남편이랑 넷이 가정을 꾸리는게 꿈이야. + +지우 +4인가족? 나는 혼자 살고 싶어! + +예원 +혼자 살면 외롭지 않겠어? + +지우 +1인 가구라서 외롭긴 한데, 혼자만의 시간을 즐길 수 있어서 좋은 것 같아. + +예원 +그렇구나.. 그래도 나는 외로운 것보다는 남편이랑 자식이랑 함께 사는 게 더 행복할 것 같아~ + +지우 +ᄒᄒ맞아~ 나도 결혼해서 가족들이랑 같이 사는 거 완전 좋아! + +예원 +나중에 결혼하면 꼭 차를 사서 가족들이랑 여행도 자주 다니고 싶어. 차가 없으면 역시 불편한 것 같아. + +지우 +앗 정말? 나는 아직 차가 없어서 그런지 잘 모르겠던데! 너는 차가 꼭 있어야해? + +예원 +아무래도 차가 있으면 가족들이나 친구들이랑 여행 가기도 편하고, 대중교통으로 이동하기 힘든 곳도 다닐 수 있으니까 + +지우 +헉, 맞아! 나도 운전면허 따고 싶어! + +예원 +요즘 항상 도로에 지나다니는 차를 보면 차들 가격만 머릿속에 맴돌더라. 차 가지고 있는 사람들 정말 부럽다.. + +지우 +헉 그렇구나 나는 아직 차가 없는데 너무 부러워하는 거 아니야? 나도 얼른 돈 많이 벌어야겠다... + +예원 +근데 차 사면 차 값만 문제가 아니고, 유지비에 주차걱정에 보험비까지.. 생각할 게 많아지기도 할 것 같긴 해 + +지우 +앗... 그 부분이 크긴 하지... 그래도 막상 타보면 그런 걱정은 싹 사라져 키키! + +예원 +요즘 중고차 시세가 좀 괜찮은 편인가? 중고차를 한 번 사볼까? + +지우 +ᄒᄒ 중고차를 사면 신차보다 저렴하게 살 수 있어서 좋지 않을까? + +예원 +좀 더 알아보고 결정해야겠다. 요즘은 중고차로 사기치는 경우가 많아서 믿을 수가 있어야지.. + +지우 +헉.. 나는 중고차를 사본적이 없어서.. 중고차 사기 당하는 경우 많다고는 들었는데.. 그런 경우도 있었구나.. 나는 사실 차는 잘 몰라서.. 중고차는 어떻게 알아봐야해? + +예원 +글쎄? 아무래도 차를 잘 아는 사람한테 소개 받는 게 가장 좋지 않을까? + +지우 +헉 글쎄? 그렇겠지? + +예원 +몰라.. 오늘은 너무 피곤하니까 나중에 알아봐야겠다. 이만 잘래 + +지우 +ᅮᅮ 그럼 안녕~^^ diff --git "a/dialog_test/dialog_history/\343\205\213\354\227\220\353\237\254.txt" "b/dialog_test/dialog_history/\343\205\213\354\227\220\353\237\254.txt" new file mode 100644 index 0000000..6b155f1 --- /dev/null +++ "b/dialog_test/dialog_history/\343\205\213\354\227\220\353\237\254.txt" @@ -0,0 +1,24 @@ + +예원 +오늘도 알바하러 왔는데 손님이 왜이렇게 많지? 진짜 너무너무 힘들다ㅠ + +지우 +앗... 무슨 알바하는데? 요즘 알바 구하기 힘들다던데... 고생이 많네... + +예원 +저번에 말했던 서브웨이라는 샌드위치 가게에서 일하고 있어! + +지우 +앗! 그럼 저번에 내가 서브웨이 샌드위치 만들어 달라고 했었던 거 기억나? + +예원 +너 우리 가게 왔었어? + +지우 +헉! 어떻게 기억해? 어~ 저~ 여기 자주 가거든요~ + +예원 +거짓말 하지마! ㅋㅋㅋㅋ + +지우 +ᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏᄏ diff --git "a/dialog_test/dialog_history/\343\205\216\354\227\220\353\237\254.txt" "b/dialog_test/dialog_history/\343\205\216\354\227\220\353\237\254.txt" new file mode 100644 index 0000000..56a6c66 --- /dev/null +++ "b/dialog_test/dialog_history/\343\205\216\354\227\220\353\237\254.txt" @@ -0,0 +1,18 @@ + +예원 +오늘도 알바하러 왔는데 손님 왤케 많아?? 진짜 너무너무 힘들다 ㅠㅠ + +지우 +헉... 정말? 너가 좋아하는 알바인데 너무 힘들겠다...ᅲᅲᅲᅲᅲ + +예원 +딱히 좋아하지는 않아.. 그냥 돈 벌려고 알바 하는거지 뭐 + +지우 +헉 돈 벌려고 알바 해? + +예원 +아무래도 그렇지? + +지우 +ᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒᄒ