gemini api로 챗봇 만들기
정말 오랜만에 티스토리를 작성한다. 마지막 게시물이 2월달이었으니까 .... ^^;;;
그 사이 연구실도 들어가고 계절학기도 하고 해커톤도 나갔다. 그렇기 때문에 이제부터라도 꾸준히 써보려고 맘 먹었다. 👩🏻💻
오늘은 해커톤에서 실제로 사용했던 gemini api를 사용해서 웹사이트에 챗봇을 넣는 방식을 설명해보려고 한다.
Google AI Studio에서 API 키 가져오기 버튼을 눌러주면 된다.
여기서 프로젝트 선택을 해주는데 무료로 하려면 Generative Language Client 를 선택해주면 된다.
이렇게 API KEY 생성이 완료된 모습을 확인할 수 있다. 근데 이렇게 생성한 API KEY는 보안 문제로 외부에 유출되면 안되는 문제가 있기에 적절한 방법으로 숨겨줘야한다. 예전에 해커톤 나갔을 때도 어떤 팀에서 API KEY를 깃허브에 커밋해서 유출되는 일이 있었다.
난 그것도 모르고 커밋했다가 깃허브에서 메일이 왔었다 ㅎㄷㄷ 그럴땐 기존의 API KEY를 삭제하고 새롭게 발급받으면 된다.
이제는 생성한 API KEY를 숨기는 방법에 대해 작성해보겠다.
나는 처음엔 apikey.txt 파일에 API KEY를 넣고 .gitignore 파일에 해당 파일을 넣어서 커밋되지 않도록 했는데 배포할 때 사용한 컴퓨터 SSH에서는 "파일 올리기"라는 편한 기능을 모르고(ㅠㅠㅠ) 계속 삽질을 했었다...
그래서 환경변수로 설정해 컴퓨터에 저장시키는 방법을 사용했다.
echo "export API_KEY='발급받은 API KEY'" >> ~/.zshrc
source ~/.zshrc
사용자가 사용하는 쉘(Shell)이 zsh일 경우
echo "export MAP_API_KEY='발급받은 API KEY'" >> ~/.bashrc
source ~/.bashrc
사용자가 사용하는 쉘(Shell)이 bash일 경우
이렇게 위의 명령어를 터미널에 치면 환경변수로 변수명은 API KEY로 설정된 api key가 등록된다.
잘 등록됐는지 확인하는 명령어는 아래와 같다.
import os
api_key = os.getenv('API_KEY')
print(api_key) # 콘솔에 API 키 출력하여 확인
코드에서 직접 print하는 방법도 있고,
echo $API_KEY
이렇게 리눅스 echo 명령어로 변수명에 담긴 데이터를 직접 확인하는 방법도 있다.
파란색으로 가린 부분은 등록한 api key이다. 잘 나오는걸 확인할 수 있다.
from fastapi import FastAPI, Request, HTTPException, APIRouter, Depends, Request, Cookie
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
import logging
from fastapi.encoders import jsonable_encoder
import google.generativeai as genai
import os
//데이터베이스 부분 Import
from sqlalchemy.orm import Session
from sqlalchemy import select
from database.db_setup import get_db
from api.models import Pet, UserPet, User
from config import templates, session_data
from typing import Optional
class Message(BaseModel):
message: str
safety_settings = [
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
]
router = APIRouter()
api_key = os.getenv('API_KEY') //api key 불러옴
genai.configure(api_key=api_key)
model = genai.GenerativeModel(
'gemini-1.5-flash', safety_settings=safety_settings) //gemini model 등록
chat = None //초기 chat 초기화
chat = model.start_chat(history=[{
"role": "user", //역할 설정
"parts": [{"text": "Can you ask me one routine question after another, such as how was your day? And don't use English."}]
//모델에게 초기 설정(예: 넌 정서적인 상담을 해주는 상담가 역할이야. 오늘 하루는 어땠는지와 같은 일상을 물어봐줘.")
}])
templates = Jinja2Templates(directory="templates")
@router.get("/chat", response_class=HTMLResponse)
async def get_pets(request: Request, session_id: Optional[str] = Cookie(None), db: Session = Depends(get_db)):
print("Received session_id:", session_id)
print("Session data:", session_data)
# 쿠키에서 세션 ID를 가져오고, 세션 데이터가 유효한지 확인
if session_id is None or session_id not in session_data:
raise HTTPException(status_code=401, detail="Invalid session")
# 세션 데이터에서 사용자 정보 가져오기
user_info = session_data[session_id]
main_pet = user_info['main_pet_id']
user_id = user_info.get('id');
print("user_id : "+user_id)
# 데이터베이스에서 main_pet과 일치하는 pet 행 가져오기
pet = db.execute(select(Pet).where(Pet.pet_id == main_pet)).scalar_one_or_none()
if pet is None:
raise HTTPException(status_code=404, detail="Pet not found")
pet_name = pet.name
# 템플릿 렌더링
return templates.TemplateResponse("chat.html", {"request": request, "pet_name": pet_name})
@router.post("/api/chat")
async def api_chat(message: Message):
if chat is None:
raise HTTPException(
status_code=500, detail="Chat session not initialized")
response = chat.send_message(message.message)
response_content = response.text if hasattr(
response, 'text') else str(response)
return JSONResponse(content={"response": response_content})
데이터베이스 연결하는 코드도 같이 작성되어 있는데 실질적으로 gemini model을 불러오는 코드는 몇 줄 되지 않는다.
그런데 계속 애 먹었던 오류들이 몇 가지 있는데
AttributeError: module 'google.generativeai' has no attribute 'GenerativeModel’
계속 이런 오류가 떠서 uvicorn 로컬에서 열어도 모델이 불러와지지 않았다.
구글링을 해보니 pip install google-generativeai 명령어를 치라 해서 쳐보니 이미 설치되어있다고 떴다.(개환멸)
근데 해당 라이브러리를 사용하려면 파이썬 버전이 3.9이상이어야 되는데 내 로컬 가상환경에서는 파이썬이 3.8로 고정되어 있었다.
일부러 처음부터 가상환경 만들 때 3.10.14로 설치했던건데 ㅠ ㅠ
pyenv install 3.10.14
pyenv global 3.10.14 //전역 파이썬 버전으로 설정
이렇게 파이썬 3.10.14를 전역 파이썬 버전으로 설정시킨 뒤 uvicorn main:app --reload 명령어를 치니 모델이 잘 작동했다 쩝;;
python —version 명령어로 꼭 !!!!!! 버전 확인하면서 작업하자!!!!!!!!
이렇게 내 로컬에서 잘 작동하는걸 확인하고 챗봇은 마무리가 되나 .. 싶었는데??
GCP에서 빌린 컴퓨터에서 가상환경 설정하고 파이썬 버전도 잘 설치하고 환경변수 등록까지 다 했는데
raise ValueError("API key is not available in the environment variables.")
ValueError: API key is not available in the environment variables.
서버에서 계속 이런 에러 메세지가 떴다. API KEY 등록도 다 했고 불러와지는 것까지 다 확인했는데 대체 왜!!!!!!!!!!!!!!!!라고 고민하고 있는데 동아리 오빠가 도와줘서 해결 됐다. 난 코드에 문제가 있다고 생각해서 완전 심각,됐는데 ... 웬열;;
sudo -E python -m uvicorn main:app --reload --host=0.0.0.0 --port=80
서버구동하는 명령어에서 -E 만 붙이면 되는 문제였다 ㅎㄷㄷ
오빠 추측으로는 E가 environment인데 sudo 권한으로 실행하니까 컴퓨터에 저장한 환경변수가 무시되는 것 같다고 ... 그래서 저렇게 -E 를 붙여줘서 해결이 됐다. (놀랍게도 이거 해결한다구 밤샜음) 럭키비키~ 이렇게 한 번 쎄게 고생했으니 절대 안 까먹을거같당 ><
이렇게 잘 나오는 모습을 확인할 수 있다. 원래는 모델 첫 답변이 "무엇을 도와드릴까요?"였는데 이게 너무너무 맘에 안 듦 + 우리 서비스와는 맞지 않는 것 같아서 초기 설정을 따로 줬다. 사진은 없는데 이모티콘도 야무지게 써가면서 잘 대화하는 모습을 확인했다.
또 시간이 지나도 예전 대화 내용을 기억하는 것에 놀랐다(ㅎㄷㄷ) gemini 모델 ,, 꽤나 강할지두.
연구실에서는 llama2, 3 모델로 주어진 파일들에 대해서만 답변하는 챗봇을 만든 적이 있었는데 그래서 이번에도 llama를 써보려다가
연구실 서버가 아닌 내 맥북에서 돌릴 수 없는 코드들이였어서(따흐흡) 급하게 gemini 모델로 바꿨었다.
근데 웹사이트에 넣을 용도로 쓸거면 gemini가 훨씬 좋은듯 !! 굉장히 가볍다는 장점이 있다. 👍
gemini-1.5-flash 난 이 버전의 모델을 사용했는데 pro 버전도 있었다. 근데 둘 다 사용해보니 flash가 좀 더 빠르고 가벼워서 flash로 사용했다.
챗봇 많이 막막했는데 이렇게 성공시켜서 너무 뿌듯했다. 하핫 😙😙😙
chrome 확장 프로그램으로 음성을 텍스트로 변환시키는 기능도 구현했는데 그건 다음 글로 작성해보도록 하겠다.