OpenAI API와 Streamlit으로 삼국지 전문가 생성하기

심지혜·2024년 6월 26일
0

삼국지는 우리나라 고전 가운데서도 가장 유명하고 중요한 작품 중 하나입니다. 삼국시대의 역사와 인물, 사건 등을 다루고 있어 많은 사람들이 관심을 가지고 있죠. 하지만 방대한 분량 때문에 전문적인 지식 없이는 삼국지를 제대로 이해하기 어려울 수 있습니다.
이번 포스트에서는 OpenAI의 GPT-3 API와 Streamlit 라이브러리를 활용하여 '삼국지 전문가' AI 어시스턴트를 만들고, 이를 웹 애플리케이션으로 구현해봤습니다.

1. Assistant, Thread 작성

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)

2. 실행

# 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으로 변환해봅시다

3.Streamlit


똑똑한 친구가 잘 대답해 줍니다.
이를 실행시켜봅시다~

답변을 잘 해주네요~~
근데 좀 안이쁘죠? 스타일을 가미해봅시다.

예를 들어 "삼국시대 유명한 인물들은 누구인가요?"라고 질문하면, 어시스턴트는 제갈공명, 관우, 조조 등 유명 인물들에 대해 상세히 설명해줄 것입니다. 삼국지 관련한 것만 무엇이든 물어보세요.

0개의 댓글