AI

[15분 완성] AI 챗봇 만들기(Streamlit + OpenAI API) - 4) 챗봇 완성!!

생각파워 2024. 8. 26. 06:09

2024.08.24 - [AI] - AI 챗봇 만들기(Streamlit + OpenAI API) - 1) 환경설정

2024.08.25 - [AI] - AI 챗봇 만들기(Streamlit + OpenAI API) - 2) 챗봇 만들기

2024.08.26 - [AI] - AI 챗봇 만들기(Streamlit + OpenAI API) - 3) API 키 생성

 

 

1. AI와 질의 응답 테스트

이제 마지막으로 AI와 질의응답을 해보도록 하겠습니다.

질문을 AI에게 던지려면 어떻게 해야 할까요?

OpenAI API 사이트에 들어가보면 예제가 만들어져 있습니다.

 

상단을 보면 curl, node.js, python에 대하여 각각 예제가 만들어져 있습니다.

복사해서 사용하도록 하겠습니다.

기존 코드에 복붙을 하면 에러가 발생합니다. openai라는 패키지 설치가 안됐기 때문입니다.

파이썬에서 패키지 설치는 어떻게 관리했었죠? pip을 이용해서 설치하면 됩니다.

 

설치가 완료되었습니다.

예제의 내용으로 테스트를 먼저해보겠습니다.

client = OpenAI()
completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "chatGPT에 대해 알려주세요."}
    ]
)

 

저렇게 질문을 던지면 답변이 올텐데, API 키는 어떻게 전달해야 할까요?

OpenAI() 객체를 생성할때 넣어주면 됩니다.

client = OpenAI(api_key="sk-proj-l4goTUMr2_TUqsqKyQMmpFLJo55WWHwCZfkxuT3BlbkFJghzLhffwQXOo4eFLiQpXIkc29e8dR0umc-ROpHwujxssrgh0oV1-kameIA")
completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "chatGPT에 대해 알려주세요."}
    ]
)

st.write(completion)

 

일단 화면 구성은 신경쓰지 않고,

st.write를 이용해출력해보겠습니다. 

 

위와 같이 출력이 됩니다. 

읽고 쓰기 편하게 to_dict 함수를 이용해 딕셔너리 형태로 변환해 보겠습니다.

st.write(completion.to_dict())

 

어떻게 구분해야할지 조금 보이는 것 같습니다.

우리는 답변 추출이 중요하니까 "message"안에 있는 "content"를 가져와보겠습니다.

천천히 순서대로 접근해 보겠습니다.

 

1. "message"가 들어있는 "choices"로 접근

st.write(response["choices"])


2. "choices"는 배열이므로 제일 첫번째 요소인 0번째 요소로 접근

st.write(response["choices"]["0"])

0번째 요소만 가져왔습니다. 

3. "content"요소를 가지고 있는 "message"에 접근

딕셔너리니까 ["message"]로 찾아가면 됩니다.

st.write(response["choices"][0]["message"])

 

4. "content"에 접근. "assistant" 답변으로 넣어주면 완성됩니다.

with st.chat_message("assistant"):
    st.write(response["choices"][0]["message"]["content"])

 

 

2. AI 응답으로 화면 구성하기

이제 AI 질의 응답부분을 이전에 화면 구성한 부분에 넣어주기만 하면 됩니다.

import streamlit as st
from openai import OpenAI

if "messages" not in st.session_state:
    st.session_state.messages = [{"role":"assistant","content":"무엇을 알려드릴까요?"}]

for m in st.session_state.messages:
    with st.chat_message(m["role"]):
        st.write(m["content"])

if prompt := st.chat_input("질문을 입력하세요"):
    st.session_state.messages.append({"role":"user","content":prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    client = OpenAI(api_key="sk-proj--H4OHhQEJau67FtrhJuHSjWw1NfHBZpzT3BlbkFJqUX42XkLWGZLVtsDaab3m7Z7dNvLe032zzkEE0D6z3mWJW7eYBdLUGDh0A")
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": prompt}
        ]
    )

    response = completion.to_dict()["choices"][0]["message"]["content"]
    st.session_state.messages.append({"role":"assistant","content":response})
    with st.chat_message("assistant"):
        st.markdown(response)

전체 소스입니다.

크게 달라진 점은 없습니다. 

 

1. 사용자 질문 저장 및 출력

if prompt := st.chat_input("질문을 입력하세요"):
    st.session_state.messages.append({"role":"user","content":prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

사용자 질문을 prompt로 받아서 st.session_state.messages에 저장하고,

st.chat_message를 "user"로 설정해서 st.markdown으로 질문을 출력해줍니다.

st.write를 사용해도 됩니다.

 

2. 사용자 질문 AI에게 전송 후 답변 받기

    client = OpenAI(api_key="sk-proj--H4OHhQEJau67FtrhX1D8saa82yMlFSnJuHSjWw1NfHBZpzT3BlbkFJqUX42XkLWGZLVtsDaab3m7Z7LUGDh0A")
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": prompt}
        ]
    )

API 키를 이용해서 API를 열고, 어떤 모델에 질문을 할것인지 설정하고 "user" 메시지가 담긴 "prompt"를 전송합니다.

답변은 completion으로 받습니다.

 

3. AI 답변 저장 및 출력

response = completion.to_dict()["choices"][0]["message"]["content"]
    st.session_state.messages.append({"role":"assistant","content":response})
    with st.chat_message("assistant"):
        st.markdown(response)

AI 응답을 to_dict함수를 이용해서 딕셔너리로 변환 후 답변인 "content"를 찾아서 response에 넣습니다.

response를 "assistant"로 st.session_state.messages에 저장한 후 화면에 출력합니다.

 

AI 챗봇이 완성되었습니다.

반응형