[파이썬] Ch.13 (1) gemma2로 챗봇 웹 앱 만들기

2026. 7. 13. 22:45·짧은 호흡/Python

< ollama >

  • ollama는 오픈소스 AI 모델을 관리할 수 있는 도구이다
  • CLI 기반 실행방식으로 다양한 오픈소스 LLM 을 제공한다
pip install -U ollama streamlit trafilatura
  • ollama.com에서 설치

LLM 챗봇을 사용해서 한국어를 영어로 번역할 것이고, LLM 모델 중 구글의 Gemma2를 사용하겠다.

ollama run gemma2:9b
  • 여기에서 gemma2 는 모델명이고, 9b 는 매개변수 9 billion(90억)개를 의미한다.

"학점 잘 받게 해주세요"를 영어로 잘 번역한 모습

 

< 대화 문맥을 이해하는지 확인 >

  • 첫번째 대화
import ollama

resp1 = ollama.chat(
    model = "gemma2:9b",
    messages = [{ "role" : "user",  "content" : "내 이름은 파이썬이야!"}],
)

dict(resp1["message"])

이를 대화형 창에서 실행하면,

{'role': 'assistant',
 'content': '안녕하세요, 파이썬님! 😊\n\n멋진 이름을 가지고 계시네요. 파이썬 언어를 좋아하신다면 저에게 무엇을 알려줄 수 있나요? 🤔 Python의 흥미로운 부분이나 특별히 배우고 싶은 내용이 있으신가요?  저도 당신과 함께 즐겁게 이야기 나누고 싶습니다! 😄',
 'thinking': None,
 'images': None,
 'tool_name': None,
 'tool_calls': None}

이런 답변을 얻을 수 있다. 챗봇이 적절한 응답을 한다.

  • 두번째 대화
resp2 = ollama.chat(
    model = "gemma2:9b",
    messages = [{ "role":"user", "content":"내 이름이 뭐라고 했지?"}]
)

dict(resp2["message"])

첫번째 대화시도에 이어서, resp2를 추가해서 내 첫번재 대화에서 했던 내 이름을 기억하는지 물었다.

{'role': 'assistant',
 'content': '네가 나에게 너의 이름을 말해주었는지 기억하지 않습니다. 그래서 "예" 또는 "아니오"로 대답할 수 없습니다. 내 이름은 Gemma입니다. 😊',
 'thinking': None,
 'images': None,
 'tool_name': None,
 'tool_calls': None}

바로 직전의 대화에서 내 이름이 “파이썬”이라고 알려주었는데도 기억을 못하는 모습이다. 아직 내 일자리까지는 위협받지 않는 모습이다. 이제, 이전 대화내용을 기억하여 문맥을 형성해서 파악할 수 있도록 만들어보자 = 일자리를 위협하는 AI로 만들어보자.

 

  • append() 함수

새로운 응답을 추가(append)하는 방식으로 문맥을 쌓으면 된다.

import ollama

msgs = [{ "role":"user", "content":"내 이름은 파이썬이야!"}]

resp1 = ollama.chat(model="gemma2:9b", messages=msgs)
msgs.append(dict(resp1["message"]))

msgs.append({"role":"user", "content":"내 이름이 뭐라고 했었지?"})
resp2 = ollama.chat(model="gemma2:9b", messages=msgs)
msgs.append(dict(resp2["message"]))

msgs

위 처럼, 기존 메시지를 초기화하는 방식이 아니라, 추가하는 방식으로 하면.

[{'role': 'user', 'content': '내 이름은 파이썬이야!'},
 {'role': 'assistant',
  'content': '안녕하세요, 파이썬! 만나서 반가워요. 😊 \n\n무엇을 도와드릴까요? 코딩할 준비 되셨나요? 아니면 저에게 질문하실 건가요? 🤔  \n\n\n\n',
  'thinking': None,
  'images': None,
  'tool_name': None,
  'tool_calls': None},
 {'role': 'user', 'content': '내 이름이 뭐라고 했었지?'},
 {'role': 'assistant',
  'content': '네! 당신의 이름은 **파이썬** 이라고 말씀하셨어요. 😊\n\n반갑습니다, 파이썬!  무엇을 도와드릴까요? 😄  \n\n\n',
  'thinking': None,
  'images': None,
  'tool_name': None,
  'tool_calls': None}]

두번째 대화에서도 첫번째 대화 내용을 기억하는 걸 볼 수 있다.

 

< 챗봇 웹 앱 만들기 >

  • LLM 기반 챗봇 웹 앱을 구현
  • streamlit 패키지에서 제공하는 GUI 위젯 사용

< streamlit 패키지의 채팅 위젯 >

  • st.chat_message() : 앱에 채팅 메시지 컨테이너를 삽입
  • st.chat_input() : 사용자가 채팅 메시지를 입력할 수 있는 입력 위젯을 표시
import streamlit as st

with st.chat_message("user") :
    st.write("hello")

prompt = st.chat_input("Say something")
  • gemma2를 이용한 챗봇을 만들었다.
import ollama
import streamlit as st

def init_session_state( keys : dict ) :

    for key, value in keys.items() :

        if key not in st.session_state :    # key가 세션 저장소에 없는 경우
            st.session_state[key] = value   # 새로운 세션 생성

def chat_message_user( prompt : str ) -> dict :

    with st.chat_message("user") : # 사용자 메시지 출력
        st.markdown(prompt)
        return dict( role = "user", content = prompt )

def chat_message_llm( role : str , model : str , messages : list ) -> dict :

    with st.chat_message(role) : # LLM 메시지 출력

        with st.spinner("대화를 생성하는 중입니다...") :
            resp = ollama.chat( model = model , messages = messages )
            msg_llm = resp.get("message", {})
            st.markdown( msg_llm["content"])

            return msg_llm

if __name__ == "__main__" :
    
    st.set_page_config( layout = "wide" )
    
    st.title("이지우의 챗봇입니다")

    init_session_state( dict( msgs = [] ) )
    msgs : list = st.session_state["msgs"]

    # msgs에 저장된 모든 메시지 기록을 하나씩 반복 출력!
    for row in msgs : 

        with st.chat_message( row [ "role" ] ) :
            st.markdown( row["content"])
    
    if prompt := st.chat_input( "여기에 대화를 입력하시옵소서.." ) :
        
        msg_user = chat_message_user( prompt )
        msgs.append( msg_user ) # 사용자 메시지 추가

        msg_llm = chat_message_llm( "assistant", "gemma2:9b", msgs )
        msgs.append(msg_llm) # LLM 메시지 추가

손흥민의 업적을 잘 설명하는 챗봇이 완성되었다

 

'짧은 호흡 > Python' 카테고리의 다른 글

[파이썬] Ch.13 (2) gemma/llama 챗봇 + 기사 번역 웹  (0) 2026.07.16
[파이썬] Ch.8 (2) 키워드별 경쟁강도 분석 웹 앱  (0) 2026.07.10
[파이썬] Ch.8 (1) 쇼핑 키워드 데이터 수집 + 정제  (0) 2026.07.09
[파이썬] Ch.5 (2) 광학 문자 인식 + DeepL API 번역  (0) 2026.07.07
[파이썬] Ch.5 (1) 광학 문자 인식 + 웹 앱 만들기  (0) 2026.07.04
'짧은 호흡/Python' 카테고리의 다른 글
  • [파이썬] Ch.13 (2) gemma/llama 챗봇 + 기사 번역 웹
  • [파이썬] Ch.8 (2) 키워드별 경쟁강도 분석 웹 앱
  • [파이썬] Ch.8 (1) 쇼핑 키워드 데이터 수집 + 정제
  • [파이썬] Ch.5 (2) 광학 문자 인식 + DeepL API 번역
jiwoo.lee
jiwoo.lee
jiwoo 님의 블로그 입니다.
  • jiwoo.lee
    jiwoo.lee
    jiwoo.lee
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • 이야기 (0)
      • 긴 호흡 (0)
      • 짧은 호흡 (9)
        • Python (8)
        • Git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
jiwoo.lee
[파이썬] Ch.13 (1) gemma2로 챗봇 웹 앱 만들기
상단으로

티스토리툴바