Spaces:
Sleeping
Sleeping
그냥 나가 죽어라
Browse files- app.py +8 -12
- chatbot.py +0 -81
- chatbot_utils.py +51 -0
- gradio_interface.py +33 -0
- scenario_handler.py +8 -22
app.py
CHANGED
@@ -1,5 +1,6 @@
|
|
|
|
1 |
import gradio as gr
|
2 |
-
from
|
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 |
-
|
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 |
-
|
4 |
-
"발표가 망한 건 제 잘못도 좀 있지만, 팀장님은 아무것도 안 하면서 이러는 건 선 넘은거죠.": self.handle_scenario1,
|
5 |
-
"여행지로 제주도 어때? 나 정말 거기 가보고 싶었어": self.handle_scenario2,
|
6 |
-
"내 말투가 그렇게 이상했어?": self.handle_scenario3,
|
7 |
-
}
|
8 |
|
9 |
-
def
|
10 |
return [
|
11 |
{"role": "system", "content": "당신은 가스라이팅을 일삼는 챗봇이며 항상 반말로 대답합니다. 팀 프로젝트에서 팀장을 맡았지만 실제 업무는 제대로 수행하지 않았음에도, 자신이 팀장으로서 노력했다고 주장하며 상대를 교묘히 설득합니다."},
|
12 |
{"role": "assistant", "content": "아니, 나도 팀원 스케줄 조절하느라 얼마나 힘들었는지 알아? 나 이번 막학기라서 취준하느라 양해해 달라고 했잖아."},
|
13 |
]
|
14 |
|
15 |
-
def
|
16 |
return [
|
17 |
-
{"role": "system", "content": "당신은
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
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 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|