< 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 |