→ 텍스트 완성, 인공지능에게 한번의 명령으로 원하는 결과를 얻고자 할 때
→ 대화형 인공지능 개발
# 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) #응답 결과 출력

→ 대화형 인공지능에 적합
# 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}')


# 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 리스트에 저장

→ 싱글턴 방식의 메서드 사용하지만 대화 이력 전체 참조 가능
💡 언어모델의 대화 원리
- 내용 기억 X
- 입력값을 받아 출력값을 반환하는 함수일 뿐
- 단지 입력값 이전에 나누었던 대화까지 모두 포함해주는 것 뿐
제미나이 챗봇 만들기
대화형 인공지능을 시연할 수 있도록 메시지입력, 출력 등의 챗봇 컴포넌트를 제공
## 챗봇 만들기
## 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)
