삼국지는 우리나라 고전 가운데서도 가장 유명하고 중요한 작품 중 하나입니다. 삼국시대의 역사와 인물, 사건 등을 다루고 있어 많은 사람들이 관심을 가지고 있죠. 하지만 방대한 분량 때문에 전문적인 지식 없이는 삼국지를 제대로 이해하기 어려울 수 있습니다.
이번 포스트에서는 OpenAI의 GPT-3 API와 Streamlit 라이브러리를 활용하여 '삼국지 전문가' AI 어시스턴트를 만들고, 이를 웹 애플리케이션으로 구현해봤습니다.
import openai
from dotenv import load_dotenv
import time
import logging
from datetime import datetime
import requests
from bs4 import BeautifulSoup
load_dotenv()
client = openai.OpenAI()
model = "gpt-3.5-turbo-16k"
url = "https://namu.wiki/w/삼국지"
response = requests.get(url)
html_content = response.content
# Step 2: Parse the HTML content and extract the relevant information
soup = BeautifulSoup(html_content, 'html.parser')
page_content = soup.get_text()
instructions = f"""
너는 삼국지 전문가이다.
누군가 삼국지 관련 질문을 하면
간단하고 명확하게 대답해주되,
삼국지의 역사와 인물, 사건 등에 대해 상세히 설명해줘.
{page_content}
"""
# Create assistant
three_kingdoms_expert = client.beta.assistants.create(
name="삼국지 전문가",
instructions=instructions,
model=model
)
print(three_kingdoms_expert.id)
# Create a thread and send a message
thread = client.beta.threads.create(
messages=[
{
"role": "user",
"content": "삼국지 시대 유명한 인물들은 누구인가요?"
}
]
)
print(thread.id)
# Send a follow-up message
message = "삼국지 시대에서 유명한 인물이 누구야?"
message = client.beta.threads.messages.create(
thread_id=thread_id,
role="user",
content=message
)
run = client.beta.threads.runs.create(
assistant_id=personal_trainer_assis_id,
thread_id=thread_id,
instructions="사용자를 주공이라고 불러줘."
)
def wait_for_run_completion(client, thread_id, run_id, sleep_interval=5):
"""
Waits for a run to complete and prints the elapsed time.
:param client: The OpenAI client object.
:param thread_id: The ID of the thread.
:param run_id: The ID of the run.
:param sleep_interval: Time in seconds to wait between checks.
"""
while True:
try:
run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run_id)
if run.completed_at:
elapsed_time = run.completed_at - run.created_at
formatted_elapsed_time = time.strftime(
"%H:%M:%S", time.gmtime(elapsed_time)
)
print(f"Run completed in {formatted_elapsed_time}")
logging.info(f"Run completed in {formatted_elapsed_time}")
# Get messages here once Run is completed!
messages = client.beta.threads.messages.list(thread_id=thread_id)
last_message = messages.data[0]
response = last_message.content[0].text.value
print(f"Assistant Response: {response}")
break
except Exception as e:
logging.error(f"An error occurred while retrieving the run: {e}")
break
logging.info("Waiting for run to complete...")
time.sleep(sleep_interval)
# === Run ===
wait_for_run_completion(client=client, thread_id=thread_id, run_id=run.id)
# ==== Steps --- Logs ==
run_steps = client.beta.threads.runs.steps.list(thread_id=thread_id, run_id=run.id)
print(f"Steps---> {run_steps.data[0]}")
잘 나오죠?
이제 이 코드를 Streamlit으로 변환해봅시다
똑똑한 친구가 잘 대답해 줍니다.
이를 실행시켜봅시다~
답변을 잘 해주네요~~
근데 좀 안이쁘죠? 스타일을 가미해봅시다.
예를 들어 "삼국시대 유명한 인물들은 누구인가요?"라고 질문하면, 어시스턴트는 제갈공명, 관우, 조조 등 유명 인물들에 대해 상세히 설명해줄 것입니다. 삼국지 관련한 것만 무엇이든 물어보세요.