[Aws cloud school 21일]Gemini API를 이용해 챗봇 만들기

miniPig·2024년 6월 12일

AWS cloud school

목록 보기
6/31

구글 제미나이 API 기본 사용법 3가지

  • 싱글턴으로 메시지 주고받기 : 한 번의 질의/응답으로 완결

→ 텍스트 완성, 인공지능에게 한번의 명령으로 원하는 결과를 얻고자 할 때

  • 멀티턴으로 메시지 주고받기 1 : 사용자와 인공지능이 여러 차례 메시지 주고 받기

→ 대화형 인공지능 개발

  • 멀티턴으로 메시지 주고받기 2

⏩ 싱글턴으로 메시지 주고받기

# single_turn.py
# 싱글턴으로 메시지 주고받기

# Google Generative AI를 사용하여 인공지능에 대해 한 문장으로 설명하는 텍스트를 생성하는 스크립트
import google.generativeai as genai
import os
my_api_key = "사용자의 API 키 값"
genai.configure(api_key=my_api_key)    #google.generativeai 패키지의 configure함수를 통해 api_key 세팅
#model = genai.GenerativeModel('gemini-pro')
model = genai.GenerativeModel('gemini-1.5-flash-latest') # 다른 예제도 flash 모델 적용 예정
# 모델 이름인 gemini-1.5-flash-latest라는 문자열을 인자값으로 넣어서 객체 생성
response = model.generate_content("인공지능에 대해 한 문장으로 설명하세요.")
# 모델의 generate_content 메서드를 통해 문자열로 메시지를 보내고 응답받기

print(response.text)   #응답 결과 출력

⏩ 멀티턴으로 메시지 주고받기 1

→ 대화형 인공지능에 적합

# multi_turn1.py
# 멀티턴으로 메시지 주고받기
# 위와 차이점 : model 의 start_chat 메서드를 호출해서 ChatSession 객체를 받아오고 이것을 통해 메시지를 전달하는 부분
import google.generativeai as genai 

my_api_key = "사용자의 API 키 값"   #키를 넣어줘야 동작함!
genai.configure(api_key=my_api_key)

model = genai.GenerativeModel('gemini-pro')    #pro모델 사용
chat_session = model.start_chat(history=[]) #ChatSession 객체 반환
#리스트 history : 대화 이력이 쌓이는 공간!!!!!
#가장 큰 차이점 : model의 start_chat 메서드를 호출해서 ChatSession을 받아오고 저장
user_queries = ["인공지능에 대해 한 문장으로 짧게 설명하세요.", "의식이 있는지 한 문장으로 답하세요."]
for user_query in user_queries:
    print(f'[사용자]: {user_query}')   
    response = chat_session.send_message(user_query)
    print(f'[모델]: {response.text}')

⏩ 멀티턴으로 메시지 주고받기 2

# multi_turn2.py
import google.generativeai as genai

my_api_key = "사용자의 API 키 값"   #키를 넣어줘야 동작함!
genai.configure(api_key=my_api_key)

model = genai.GenerativeModel('gemini-pro')
user_queries = [{'role':'user', 'parts': ["인공지능에 대해 한 문장으로 짧게 설명하세요."]},
                {'role':'user', 'parts': ["의식이 있는지 한 문장으로 답하세요."]}
            ]
history = []
for user_query in user_queries:  #user_query에 있는 반복문을 돌려주는데,
    history.append(user_query)   #질문을 history 리스트에 저장
    print(f'[사용자]: {user_query["parts"][0]}')   #첫번째 질문을 화면에 출력해주고
    response = model.generate_content(history)     #첫번째 질문에 대한 답을 history를 기반해서 가져옴
    print(f'[모델]: {response.text}')   #첫번째 질문에 대한 답을 보여줌
    history.append(response.candidates[0].content)    #해답을 history 리스트에 저장

  • 싱글턴 방식의 메서드인 model.generate_content를 사용하지만 대화 이력은 사용자 프로그램에서 직접 관리
  • 대화 이력을 model.generate_content를 호출할 때마다 인자값으로 전달

→ 싱글턴 방식의 메서드 사용하지만 대화 이력 전체 참조 가능

💡 언어모델의 대화 원리

  • 내용 기억 X
  • 입력값을 받아 출력값을 반환하는 함수일 뿐
  • 단지 입력값 이전에 나누었던 대화까지 모두 포함해주는 것 뿐

제미나이 챗봇 만들기

스트림릿이란?

대화형 인공지능을 시연할 수 있도록 메시지입력, 출력 등의 챗봇 컴포넌트를 제공

⏩ streamlit run이 잘 동작하는지 확인하기

## 챗봇 만들기
## streamlit run이 잘 동작하는지 확인하기
import streamlit as st    #터미널에 streamlit run 파일명

text = "마지막 레이어의 로짓값을 가정"
st.header(text, divider='rainbow')
st.subheader(text)
st.title(text)
st.write(text)
st.write("# Bar Chart")
vocab_logits = {"나는": 0.01,"내일": 0.03,"오늘": 0.25,"어제": 0.3,
                "산에": 0.4,"학교에": 0.5,"집에": 0.65,
                "오른다": 1.2,"간다": 1.05,"왔다": 0.95}
st.bar_chart(vocab_logits)
st.caption(text)

💡 VSC의 다른 창에 저장된 다른 파일이 떠 있으면 같이 실행 됨!! (주의)

⏩ 에코 챗봇 - 대화 이력 전체 매번 출력

## 대화 이력을 매번 화면에 출력하기
import streamlit as st
st.title("echo-bot")

# 만약 history가 세션에 없다면 초기화시켜라!
if "chat_history" not in st.session_state:
    st.session_state.chat_history = []

# 사용자의 인터랙션이 있을 때마다 for-loop 구문을 통해 메시지 전체가 화면에 출력
for content in st.session_state.chat_history:
    with st.chat_message(content["role"]):
        st.markdown(content['message'])    

if prompt := st.chat_input("메시지를 입력하세요."):   #user 부분
    with st.chat_message("user"):   
        st.markdown(prompt)
        st.session_state.chat_history.append({"role": "user", "message": prompt})

    with st.chat_message("ai"):            #제미나이가 대답해주는 것들
        response = f'{prompt}... {prompt}... {prompt}...'
        st.markdown(response)
        st.session_state.chat_history.append({"role": "ai", "message": response})

⏩ 제미나이 챗봇 완성하기

## st_chatbot.py
import google.generativeai as genai 
import streamlit as st

## 키 입력해주기
my_api_key = "사용자의 API 키 값"
genai.configure(api_key=my_api_key)  

##제목을 위에 적어주기
st.title("Gemini-Bot")     

## ????
@st.cache_resource
def load_model():
    model = genai.GenerativeModel('gemini-pro')
    print("model loaded...")
    return model

model = load_model()

if "chat_session" not in st.session_state:    
    st.session_state["chat_session"] = model.start_chat(history=[]) 

for content in st.session_state.chat_session.history:
    with st.chat_message("ai" if content.role == "model" else "user"):
        st.markdown(content.parts[0].text)

if prompt := st.chat_input("메시지를 입력하세요."):  # 입력 메시지 컨테이너
    with st.chat_message("user"):
        st.markdown(prompt)
    with st.chat_message("ai"):
        response = st.session_state.chat_session.send_message(prompt)        
        st.markdown(response.text)

0개의 댓글