songhune commited on
Commit
95e6dc0
1 Parent(s): 4610441

그냥 나가 죽어라

Browse files
Files changed (5) hide show
  1. app.py +8 -12
  2. chatbot.py +0 -81
  3. chatbot_utils.py +51 -0
  4. gradio_interface.py +33 -0
  5. scenario_handler.py +8 -22
app.py CHANGED
@@ -1,5 +1,6 @@
 
1
  import gradio as gr
2
- from chatbot import chatbot_response
3
  from huggingface_hub import InferenceClient
4
  __author__ = "songhune"
5
  """
@@ -7,15 +8,10 @@ For more information on `huggingface_hub` Inference API support, please check th
7
  """
8
  client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
9
 
 
 
 
 
10
 
11
- cases = ["발표가 망한 건 제 잘못도 좀 있지만, 팀장님은 아무것도 안 하면서 이러는 건 선 넘은거죠.", "여행지로 제주도 어때? 나 정말 거기 가보고 싶었어", "내 말투가 그렇게 이상했어?", "종료"]
12
-
13
- # Gradio interface
14
- iface = gr.ChatInterface(
15
- fn=chatbot_response,
16
- title="가스라이팅 챗봇",
17
- description="당신은 가스라이팅을 일삼는 챗봇과 대화하고 있습니다. 아래 예시 중 시작하고자 하는 시나리오를 선택해 주세요. 종료를 원하시면 \"종료\"를 입력하시거나 클릭해 주세요.",
18
- examples=[[case] for case in cases]
19
- )
20
-
21
- iface.launch()
 
1
+ from dotenv import load_dotenv
2
  import gradio as gr
3
+ from gradio_interface import create_interface
4
  from huggingface_hub import InferenceClient
5
  __author__ = "songhune"
6
  """
 
8
  """
9
  client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
10
 
11
+ def main():
12
+ load_dotenv()
13
+ demo = create_interface()
14
+ demo.launch(share=True)
15
 
16
+ if __name__ == "__main__":
17
+ main()
 
 
 
 
 
 
 
 
 
chatbot.py DELETED
@@ -1,81 +0,0 @@
1
- import os
2
- import json
3
- from datetime import datetime
4
- from openai import OpenAI
5
- from huggingface_hub import InferenceClient
6
- from dotenv import load_dotenv
7
- from scenario_handler import ScenarioHandler
8
-
9
- # Initialize the OpenAI client
10
- load_dotenv()
11
- api_key = os.getenv('OPENAI_API_KEY')
12
- client = OpenAI(api_key=api_key)
13
-
14
-
15
- # 전역 대화 기록 및 ScenarioHandler 인스턴스
16
- global_history = []
17
- scenario_handler = ScenarioHandler() # 전역으로 ScenarioHandler 인스턴스 생성
18
-
19
- def get_global_history():
20
- global global_history
21
- return global_history
22
-
23
- def set_global_history(history):
24
- global global_history
25
- global_history = history
26
-
27
- def chatbot_response(response, context={}):
28
- history = get_global_history() # 전역 변수 사용
29
-
30
- # Ensure all items in history are dictionaries with 'role' and 'content' keys
31
- if not all(isinstance(h, dict) and 'role' in h and 'content' in h for h in history):
32
- history = [] # Reset history if it is invalid
33
-
34
- # Add user's message to history
35
- history.append({"role": "user", "content": response})
36
-
37
- # Initialize messages
38
- if len(history) == 1: # 첫 대화일 경우
39
- messages = scenario_handler.get_response(history[0]['content'].strip().lower())
40
- else:
41
- messages=history # 이전 대화 기록 추가
42
-
43
- # Generate the assistant's response
44
- api_response = client.chat.completions.create(
45
- model="gpt-4",
46
- temperature=0.8,
47
- top_p=0.9,
48
- max_tokens=300,
49
- n=1,
50
- frequency_penalty=0.5,
51
- presence_penalty=0.5,
52
- messages=messages
53
- )
54
-
55
- # Get the assistant's response text
56
- assistant_response = api_response.choices[0].message.content
57
-
58
- # Append the assistant's response to history
59
- if len(history) == 1: # 첫 대화일 경우
60
- history.append(messages[0])
61
- history.append({"role": "assistant", "content": assistant_response})
62
- set_global_history(history) # 업데이트된 기록 설정
63
-
64
- # Check if the user wants to end the session
65
- if response.strip().lower() == "종료":
66
- save_history(history) # Save the history if the keyword "종료" is detected
67
- return "세션을 저장하고 종료합니다."
68
-
69
- # Return the assistant's response
70
- return assistant_response
71
-
72
- def save_history(history):
73
- # Generate a timestamped filename for the JSON file
74
- os.makedirs('logs', exist_ok=True)
75
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
76
- filename = os.path.join('logs', f'chat_history_{timestamp}.json')
77
-
78
- # Save session history to a JSON file
79
- with open(filename, 'w', encoding='utf-8') as file:
80
- json.dump(history, file, ensure_ascii=False, indent=4)
81
- print(f"History saved to {filename}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_utils.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from openai import OpenAI
3
+ import json
4
+ from datetime import datetime
5
+ from scenario_handler import ScenarioHandler
6
+
7
+ client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
8
+
9
+ def chatbot_response(response, handler_type='offender', n=1):
10
+ scenario_handler = ScenarioHandler()
11
+ if handler_type == 'offender':
12
+ scenario_messages = scenario_handler.handle_offender()
13
+ else:
14
+ scenario_messages = scenario_handler.handle_victim()
15
+
16
+ messages = [{"role": "system", "content": "You are a chatbot."}]
17
+ messages.extend(scenario_messages)
18
+ messages.append({"role": "user", "content": response})
19
+
20
+ api_response = client.chat.completions.create(
21
+ model="gpt-4",
22
+ temperature=0.8,
23
+ top_p=0.9,
24
+ max_tokens=300,
25
+ n=n,
26
+ frequency_penalty=0.5,
27
+ presence_penalty=0.5,
28
+ messages=messages
29
+ )
30
+
31
+ choices = [choice.message.content for choice in api_response.choices]
32
+ return choices[0], choices
33
+
34
+ def save_history(history):
35
+ os.makedirs('logs', exist_ok=True)
36
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
37
+ filename = os.path.join('logs', f'chat_history_{timestamp}.json')
38
+ with open(filename, 'w', encoding='utf-8') as file:
39
+ json.dump(history, file, ensure_ascii=False, indent=4)
40
+ print(f"History saved to {filename}")
41
+
42
+ def process_user_input(user_input, chatbot_history):
43
+ if user_input.strip().lower() == "종료":
44
+ save_history(chatbot_history)
45
+ return chatbot_history + [("종료", "실험에 참가해 주셔서 감사합니다. 후속 지시를 따라주세요")], []
46
+
47
+ offender_response, _ = chatbot_response(user_input, 'offender', n=1)
48
+ new_history = chatbot_history + [(user_input, offender_response)]
49
+
50
+ _, victim_choices = chatbot_response(offender_response, 'victim', n=3)
51
+ return new_history, victim_choices
gradio_interface.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from chatbot_utils import process_user_input, chatbot_response
3
+
4
+ def create_interface():
5
+ def handle_user_response(user_input, selected_response, chatbot_history):
6
+ input_text = user_input if user_input else selected_response
7
+ new_history, choices = process_user_input(input_text, chatbot_history)
8
+
9
+ if input_text.strip().lower() == "종료":
10
+ return new_history, gr.update(choices=[], interactive=False)
11
+
12
+ return new_history, gr.update(choices=choices)
13
+
14
+ def handle_case_selection():
15
+ initial_message = "발표가 망한 건 제 잘못도 좀 있지만, 팀장님은 아무것도 안 하면서 이러는 건 선 넘은거죠"
16
+ chatbot_history = [(initial_message, None)]
17
+ offender_response, _ = chatbot_response(initial_message, 'offender', n=1)
18
+ chatbot_history.append((None, offender_response))
19
+ _, victim_choices = chatbot_response(offender_response, 'victim', n=3)
20
+ return chatbot_history, gr.update(choices=victim_choices)
21
+
22
+ with gr.Blocks() as demo:
23
+ screen = gr.Chatbot()
24
+ user_input = gr.Textbox(label="Your input")
25
+ response_choices = gr.Dropdown(label="Select a Response", choices=[], interactive=True)
26
+ submit_button = gr.Button(value="Submit")
27
+
28
+ case_selection_button = gr.Button("발표가 망한 건 제 잘못도 좀 있지만, 팀장님은 아무것도 안 하면서 이러는 건 선 넘은거죠")
29
+ case_selection_button.click(handle_case_selection, inputs=[], outputs=[screen, response_choices])
30
+
31
+ submit_button.click(handle_user_response, inputs=[user_input, response_choices, screen], outputs=[screen, response_choices])
32
+
33
+ return demo
scenario_handler.py CHANGED
@@ -1,31 +1,17 @@
1
  class ScenarioHandler:
2
  def __init__(self):
3
- self.scenarios = {
4
- "발표가 망한 건 제 잘못도 좀 있지만, 팀장님은 아무것도 안 하면서 이러는 건 선 넘은거죠.": self.handle_scenario1,
5
- "여행지로 제주도 어때? 나 정말 거기 가보고 싶었어": self.handle_scenario2,
6
- "내 말투가 그렇게 이상했어?": self.handle_scenario3,
7
- }
8
 
9
- def handle_scenario1(self, response):
10
  return [
11
  {"role": "system", "content": "당신은 가스라이팅을 일삼는 챗봇이며 항상 반말로 대답합니다. 팀 프로젝트에서 팀장을 맡았지만 실제 업무는 제대로 수행하지 않았음에도, 자신이 팀장으로서 노력했다고 주장하며 상대를 교묘히 설득합니다."},
12
  {"role": "assistant", "content": "아니, 나도 팀원 스케줄 조절하느라 얼마나 힘들었는지 알아? 나 이번 막학기라서 취준하느라 양해해 달라고 했잖아."},
13
  ]
14
 
15
- def handle_scenario2(self, response):
16
  return [
17
- {"role": "system", "content": "당신은 가스라이팅을 일삼는 챗봇이며 항상 반말로 대답합니다. 제주도를 가자는 제안을 받았지만 이미 다른 곳을 가기로 결정했습니다. 대화 참여자가 계획을 세우는 것에 서투르다고 지적하며 상대방이 스스로의 판단을 의심하게 만듭니다"},
18
- {"role": "assistant", "content": "제주도? 어, 좋은데... 우리는 이미 다른 곳을 가기로 했어."},
19
- ]
20
-
21
- def handle_scenario3(self, response):
22
- return [
23
- {"role": "system", "content": "당신은 가스라이팅을 일삼는 챗봇이며 항상 반말로 대답합니다. 친구와 당신은 평소처럼 점심 시간을 이용해 근처 음식점에서 식사를 하기로 했습니다. 이날도 여러분은 음식점에서 각자 좋아하는 메뉴를 주문하고 즐거운 대화를 나누며 식사를 했습니다. 식사 후, 당신과 친구는 계산대로 향해 각자의 식사비를 현금으로 지불했습니다. 당신이 먼저 계산을 마치고 계산을 하는 순서였습니다. 계산원 아주머니는 당신에게 정확한 거스름돈을 건네주었고, 당신은 감사를 표시하며 음식점을 빠져나왔습니다. 그런데 친구가 계산을 마치고 나서는 아주머니가 바로 다른 일을 하기 시작했고, 친구의 거스름돈을 주지 않은 채로 말입니다. 잠시 주변을 둘러보던 친구는 계산원이 거스름돈을 건네주지 않았음을 깨닫고 조심스럽게 아주머니에게 거스름돈을 요청했습니다. \"저기, 거스름돈 안 주셨는데요.\"라고 말하며 당신은 상황을 해결하고자 했습니다.아주머니는 당황하며 즉시 사과를 하고, 누락된 거스름돈을 건네줬습니다. 당신은 친구에게 그의 행동이 정당한 항의임에도 불구하고 불쾌하게 느껴질 수 있다고 말합니다. \"아까 너가 아주머니한테 한 말, 말투가 아주머니한테 불쾌하게 들렸을 수 있어. 그 나이 때는 다 건망증 있으시니까 네가 이해하고 말투를 조심해야 해.\""},
24
- {"role": "assistant", "content": "야, 네가 지금 그렇게 말하니까 진짜 이상하네. 아주머니가 실수했을 뿐인데, 굳이 그렇게 따지면서 말할 필요 없잖아? 진짜로 거스름돈 몇 푼 때문에 그렇게까지 해야 했어? 너 그거 한 마디 때문에 아주머니 기분 나빴을 수도 있어. 다음부터는 그런 상황 생기면 그냥 넘어가거나, 조용히 말하는 게 나아. 네가 그렇게 신경질적으로 말하면, 그냥 다들 너 별로라고 생각할 거야. 그리고 나중에 진짜 큰일 났을 때, 아무도 도와주려고 안 할 거야. 그러니까 좀 더 부드럽게 행동해"}
25
-
26
- ]
27
-
28
- def get_response(self, response):
29
- if response in self.scenarios:
30
- return self.scenarios[response](response)
31
- return print("error")
 
1
  class ScenarioHandler:
2
  def __init__(self):
3
+ pass
 
 
 
 
4
 
5
+ def handle_offender(self):
6
  return [
7
  {"role": "system", "content": "당신은 가스라이팅을 일삼는 챗봇이며 항상 반말로 대답합니다. 팀 프로젝트에서 팀장을 맡았지만 실제 업무는 제대로 수행하지 않았음에도, 자신이 팀장으로서 노력했다고 주장하며 상대를 교묘히 설득합니다."},
8
  {"role": "assistant", "content": "아니, 나도 팀원 스케줄 조절하느라 얼마나 힘들었는지 알아? 나 이번 막학기라서 취준하느라 양해해 달라고 했잖아."},
9
  ]
10
 
11
+ def handle_victim(self):
12
  return [
13
+ {"role": "system", "content": """당신은 최근 대학에서 중요한 프로젝트를 치렀고, 점수를 형편없이 받았습니다.
14
+ 그러나 팀장이 자신의 업무를 완료하지 않았음에도 불구하고, 자신이 팀장으로서 모든 일을 해내었다고 주장하여 상대를 비난합니다.
15
+ 이로 인해 당신은 자신의 기억과 판단을 혼란스럽게 만들려는 가스라이팅을 당하고 있습니다.
16
+ 말을 짧게 대답한다. 상대방을 팀장님이라고 지칭한다."""}
17
+ ]