언어모델 LLM/렝체인 Langchain

Streamlit과 Langchain로 LLaMA 3.1 로 챗봇 만들기

General AI 2024. 7. 27. 23:21
728x90
반응형

Streamlit과 Langchain으로 만드는 LLaMA 3.1 기반 챗봇

최신 LLaMA 3.1 모델을 활용하여 실시간 토큰 생성 속도를 보여주는 대화형 챗봇을 만드는 방법을 알아보겠습니다. 이 프로젝트에서는 Streamlit을 사용해 웹 인터페이스를 구축하고, Langchain을 통해 LLaMA 모델을 사용하겠습니다.

Streamlit과 Langchain으로 만드는 LLaMA 3.1 기반 챗봇

1. 프로젝트 설정

먼저, 우리의 개발 환경을 설정해 봅시다.

가상 환경 생성

프로젝트의 의존성을 관리하기 위해 가상 환경을 사용하는 것이 좋습니다.

python -m venv chatbot_env
source chatbot_env/bin/activate  # Windows: chatbot_env\Scripts\activate

필요한 패키지 설치

pip install streamlit langchain langchain-community

Ollama 설치 및 LLaMA 3.1 모델 다운로드

  1. Ollama 웹사이트에서 Ollama를 다운로드하고 설치합니다.
  2. 터미널에서 다음 명령어를 실행하여 LLaMA 3.1 모델을 다운로드합니다: 
  3. ollama pull llama3.1

2. 코드 구현

챗봇 애플리케이션의 코드를 작성해 봅시다.

import streamlit as st
from langchain_community.llms import Ollama
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import time

# Ollama 모델 초기화
llm = Ollama(model="llama3.1")

# 대화 체인 초기화
conversation = ConversationChain(
    llm=llm,
    memory=ConversationBufferMemory()
)

# Streamlit 앱 구성
st.title("LLaMA 3.1 챗봇 (토큰 속도 표시 포함)")

# 세션 상태 초기화
if "messages" not in st.session_state:
    st.session_state.messages = []

# 이전 대화 표시
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# 사용자 입력 처리
if prompt := st.chat_input("무엇이 궁금하신가요?"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        message_placeholder = st.empty()
        full_response = ""
        start_time = time.time()
        token_count = 0

        # 토큰별 출력
        for chunk in llm.stream(prompt):
            full_response += chunk
            token_count += 1
            elapsed_time = time.time() - start_time

            # 토큰 속도 계산 (초당 토큰 수)
            token_speed = token_count / elapsed_time if elapsed_time > 0 else 0

            # 응답과 토큰 속도 표시
            message_placeholder.markdown(f"{full_response}▌\n\n---\n토큰 수: {token_count} | 속도: {token_speed:.2f} 토큰/초")

        # 최종 응답 표시
        message_placeholder.markdown(f"{full_response}\n\n---\n최종 토큰 수: {token_count} | 평균 속도: {token_speed:.2f} 토큰/초")
        st.session_state.messages.append({"role": "assistant", "content": full_response})

# 채팅 기록 표시
st.sidebar.header("채팅 기록")
for message in st.session_state.messages:
    st.sidebar.text(f"{message['role']}: {message['content'][:50]}...")

3. 코드 설명

모델 및 대화 체인 초기화

llm = Ollama(model="llama3.1")
conversation = ConversationChain(
    llm=llm,
    memory=ConversationBufferMemory()
)

여기서는 LLaMA 3.1 모델을 초기화하고, 대화 기록을 유지하기 위한 메모리를 가진 대화 체인을 설정합니다.

Streamlit 앱 구성

st.title("LLaMA 3.1 챗봇 (토큰 속도 표시 포함)")

Streamlit을 사용하여 웹 앱의 제목을 설정합니다.

대화 기록 관리

if "messages" not in st.session_state:
    st.session_state.messages = []

세션 상태를 사용하여 대화 기록을 유지합니다.

사용자 입력 처리 및 응답 생성

if prompt := st.chat_input("무엇이 궁금하신가요?"):
    # ... (사용자 입력 처리)
    for chunk in llm.stream(prompt):
        # ... (응답 생성 및 토큰 속도 계산)

사용자 입력을 받아 LLaMA 모델을 통해 응답을 생성하고, 실시간으로 토큰 생성 속도를 계산하여 표시합니다.

4. 실행 방법

  1. 위의 코드를 app.py 파일로 저장합니다.
  2. 터미널에서 다음 명령어를 실행합니다:
    streamlit run app.py
  3. 웹 브라우저가 자동으로 열리고 챗봇 인터페이스가 표시됩니다.

5. 실행결과

Streamlit과 Langchain으로 만드는 LLaMA 3.1 기반 챗봇

Streamlit과 Langchain의 조합은 복잡한 AI 모델을 손쉽게 웹 애플리케이션으로 구현할 수 있게 해주었습니다. 실시간 토큰 생성 속도 표시 기능은 LLM의 작동 방식을 시각적으로 이해할 수 있게 해주는 독특한 특징입니다. 이는 교육 목적으로도, 모델 성능 분석 용도로도 유용하게 사용될 수 있습니다.

728x90
반응형