본문 바로가기

코딩 공부

streamlit 활용하여 LLM 챗봇 기본 틀 만들기

아나콘다 설치 후 VScode의 커맨드 팔레트로 python interpreter로 가상환경 설정

 

터미널에서 모듈 설치

// streamlit 패키지 설치
pip install streamlit

// llama-index 패키지 설치
pip install streamlit llama-index

// llama-index-ollama 패키지 설치
pip install llama-index-llms-ollama

 

 

import streamlit as st
from llama_index.core.llms import ChatMessage
import logging
import time
from llama_index.llms.ollama import Ollama
logging.basicConfig(level=logging.INFO)
if 'messages' not in st.session_state:
        st.session_state.messages = []
def stream_chat(model, messages):
      try:
            llm = Ollama(model=model, request_timeout=120.0)
            resp = llm.stream_chat(messages)
            response = ""
            response_placeholder = st.empty()
            for r in resp:
                  response += r.delta
                  response_placeholder.write(response)
            logging.info(f"Model: {model}, Messages: {messages}, Response: {response}")
            return response
      except Exception as e:
            logging.error(f"스트리밍 에러 발생: {str(e)}")
            raise e
def main():
      st.title("LLM 모델과 채팅하기")
      logging.info("앱 시작")
      model = st.sidebar.selectbox("모델을 선택해주세요", ["llama3.2", "llama3", "llava", "gemma2"])
      logging.info(f"선택한 모델: {model}")
      if prompt := st.chat_input("질문해주세요"):
            st.session_state.messages.append({"role": "user", "content": prompt})
            logging.info(f"유저 인풋: {prompt}")
            for message in st.session_state.messages:
                  with st.chat_message(message["role"]):
                        st.write(message["content"])
            if st.session_state.messages[-1]["role"] != "assistant":
                  with st.chat_message("assistant"):
                    start_time = time.time()
                    logging.info("응답 생성중")
            with st.spinner("응답 생성하는 중.."):
                try:
                      messages = [ChatMessage(role=msg["role"], content=msg["content"]) for msg in st.session_state.messages]
                      response_message = stream_chat(model, messages)
                      duration = time.time() - start_time
                      respone_message_with_duration = f"{response_message}\n\nDuration: {duration:.2f} seconds"
                      st.session_state.messages.append({"role": "assistant", "content": respone_message_with_duration})
                      st.write(f"Duration: {duration:.2f} 초")               
                
                except Exception as e:
                      st.session_state.messasges.append({"role": "assistant", "content": str(e)})
                      logging.error(f"에러 발생: {str(e)}")
if __name__ == "__main__":
    main()

 

// 앱 실행하기
streamlit run app.py

 

앱을 실행한 모습

더보기

requirements.txt: json파일과 같은 기능
LM studio: 오프라인에서도 llama 구동 가능
파일명에 있는 QN: N비트로 양자화 한 파일이라는 뜻