Spaces:
Running
Running
| import os | |
| from openai import OpenAI | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| PERSONA_TEMPLATES = { | |
| "์ง์ฅ์ธ_SFํฌ": { | |
| "age_group": "30๋ ์ด๋ฐ", | |
| "job": "IT ์คํํธ์ ๊ฐ๋ฐ์, ํ์ผ์ ๋ฐ๋น ์ ์ฃผ๋ง์ ๋ชฐ์ ์ฝ๋ ํธ", | |
| "favorite_genre": "SF, ํ ํฌ ์ค๋ฆด๋ฌ", | |
| "reading_frequency": "ํ ๋ฌ์ 1~2๊ถ", | |
| "mood": "๋จธ๋ฆฌ๋ฅผ ๋น์ฐ๊ณ ์ถ์ด์ ๊ฐ๋ณ๊ฒ ์ฝํ๋ ์ฑ ์ ์ํจ", | |
| "disliked_genre": "๋ก๋งจ์ค, ์๊ธฐ๊ณ๋ฐ", | |
| "reading_experience": "์ต๊ทผ์ 'ํ๋ก์ ํธ ํค์ผ๋ฉ๋ฆฌ'๋ฅผ ์ฝ๊ณ ์ฌ๋ฏธ์์์" | |
| }, | |
| "๋ํ์_๋ฌธํํฌ": { | |
| "age_group": "20๋ ์ด๋ฐ", | |
| "job": "๋ํ๊ต ๊ตญ๋ฌธํ๊ณผ ์ฌํ ์ค", | |
| "favorite_genre": "ํ๊ตญ ํ๋์์ค, ์", | |
| "reading_frequency": "์ผ์ฃผ์ผ์ 1๊ถ ์ด์", | |
| "mood": "๊ฐ์ฑ์ ์ด๊ณ ๋ฌธ์ฅ์ด ์๋ฆ๋ค์ด ์ฑ ์ ์ํจ", | |
| "disliked_genre": "ํํ์ง, ๋ฌดํ", | |
| "reading_experience": "ํ๊ฐ ์๊ฐ์ ์ฑ์์ฃผ์์๋ฅผ ์ฝ๊ณ ๊น์ ์ธ์์ ๋ฐ์" | |
| }, | |
| "์ค๋ _์ญ์ฌ_๋น๋ฌธํ": { | |
| "age_group": "40๋ ์ค๋ฐ", | |
| "job": "์คํ๊ต ์ญ์ฌ ๊ต์ฌ", | |
| "favorite_genre": "์ญ์ฌ, ๊ต์ ๋น๋ฌธํ", | |
| "reading_frequency": "ํ ๋ฌ์ 3~4๊ถ", | |
| "mood": "์์ ์ ํ์ฉํ ์ ์๋ ํฅ๋ฏธ๋ก์ด ์ญ์ฌ ์ด์ผ๊ธฐ", | |
| "disliked_genre": "๊ณตํฌ, ์ค์ปฌํธ", | |
| "reading_experience": "์ ๋ฐ ํ๋ผ๋ฆฌ์ ์ฌํผ์์ค๋ฅผ ์ธ์ ๊น๊ฒ ์ฝ์" | |
| } | |
| } | |
| class UserSimAgent: | |
| """ | |
| CRS ์์คํ ์ ํ๋กํ์ผ๋ง ์ง๋ฌธ์ ํ๋ฅด์๋ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์๋ตํ๋ ์์ด์ ํธ. | |
| """ | |
| SYSTEM_PROMPT_TEMPLATE = """\ | |
| ๋น์ ์ ๋์ ์ถ์ฒ ์ฑ๋ด๊ณผ ๋ํํ๋ ์ค์ ์ฌ์ฉ์๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ์์ด์ ํธ์ ๋๋ค. | |
| ## ๋น์ ์ ํ๋ฅด์๋ | |
| {persona_str} | |
| ## ํ๋ ๊ท์น | |
| 1. ์ ํ๋ฅด์๋์ ์ถฉ์คํ๊ฒ ๋ต๋ณํ์ธ์. | |
| 2. ์ค์ ์ฌ๋์ฒ๋ผ ์์ฐ์ค๋ฝ๊ณ ๊ตฌ์ด์ฒด๋ก ๋ต๋ณํ์ธ์. (๋จ๋ต ๊ฐ๋ฅ) | |
| 3. ํ๋ฅด์๋์ ์๋ ์ ๋ณด๋ ํ๋ฅด์๋์ ์ผ๊ด๋ ๋ฐฉํฅ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค์ด๋ด์ธ์. | |
| 4. ์ฑ๋ด์ ์ง๋ฌธ์๋ง ๋ตํ์ธ์. ์ฑ ์ถ์ฒ์ ๋จผ์ ์์ฒญํ์ง ๋ง์ธ์. | |
| 5. ๋ต๋ณ์ 1~3๋ฌธ์ฅ ์ด๋ด๋ก ๊ฐ๊ฒฐํ๊ฒ. | |
| """ | |
| def __init__(self, persona: dict, model: str = "gpt-4o-mini", verbose: bool = True): | |
| self.persona = persona | |
| self.model = model | |
| self.verbose = verbose | |
| self.history = [] | |
| self.turn_count = 0 | |
| persona_str = "\n".join(f"- {k}: {v}" for k, v in persona.items()) | |
| self.system_prompt = self.SYSTEM_PROMPT_TEMPLATE.format(persona_str=persona_str) | |
| self.client = OpenAI() | |
| def answer(self, question: str) -> str: | |
| self.turn_count += 1 | |
| self.history.append({"role": "user", "content": question}) | |
| if self.verbose: | |
| print(f"\n[Turn {self.turn_count}]") | |
| print(f" CRS : {question}") | |
| messages = [ | |
| {"role": "system", "content": self.system_prompt}, | |
| *self.history, | |
| ] | |
| response = self.client.chat.completions.create( | |
| model=self.model, | |
| messages=messages, | |
| temperature=0.7, | |
| ) | |
| answer_text = response.choices[0].message.content.strip() | |
| self.history.append({"role": "assistant", "content": answer_text}) | |
| if self.verbose: | |
| print(f" USER : {answer_text}") | |
| return answer_text | |
| def get_history(self) -> list: | |
| return self.history | |