본문 바로가기
Tech Insights

랭체인(Langchain), Streamlit을 활용해서 웹 기반 챗봇 만들기

by Kudos IT Daily 2023. 10. 19.
반응형

랭체인(Langchain), Streamlit을 활용해서 웹 기반 챗봇 만들기

목차

  • Streamlit 간단 예제
  • 랭체인, Streamlit을 활용한 웹 애플리케이션 만들기
  • 마치며

 

안녕하세요. 오늘도 랭체인과 관련한 내용을 소개드리려 찾아왔습니다. 지난 랭체인 관련 포스팅에서 랭체인과 랭체인을 구성하는 주요 모듈에 대해 소개드리고, 간단한 예제를 통해 랭체인의 모듈이 어떻게 동작하는지 확인했습니다. 관련 포스팅을 참고하고자 할 경우, 다음의 LangChain - 초보자를 위한 완벽 가이드를 확인해 주시기 바랍니다.

 

오늘 포스팅에서 다룰 내용은 랭체인에서 기본적으로 제공하는 기능 외에 외부 패키지를 활용해서 랭체인의 기능을 보다 확장하는 법에 대한 내용입니다. 앞으로 여러 인공지능 모델을 적용해 보고, 외부 라이브러리, 패키지 등을 활용해 보면서 랭체인을 조금 더 심도 있게 다룰 예정입니다. 앞으로 랭체인과 관련한 포스팅에 많은 관심 부탁드립니다. 오늘은 Streamlit 패키지를 활용해서 LLM 웹 애플리케이션을 쉽게 구현하는 방법에 대해 소개하도록 하겠습니다.

 

기존에 웹 개발에 익숙하지 않은 사용자들은 여러 웹 개발 관련 생태계에 대한 이해가 부족할 수 있습니다. 대표적인 웹 개발 분야인 프론트엔드(Frontend)나 백엔드(Backend), 개발 언어인 Java, Node.js, Python이나 React, Vue.js 프레임워크 등 여러 용어를 접하게 되면 덜컥 겁부터 나게 될 것입니다. 그만큼 전통적인 웹 개발 분야는 여러 선수 지식과 스택을 요구하기 때문에 학습 곡선(Learning curve)이 가파르고 초보자들이 접근하기 쉽지 않습니다.

 

Streamlit은 앞서 말한 웹 개발의 고통(?)을 조금이나마 덜어줄 수 있습니다. 특히, 간단하게 웹을 구현하고 싶은 머신러닝, 데이터 사이언스 전문가들에게 상당히 반가운 패키지입니다. 대표적인 이유로 파이썬을 사용해서 구현하고, Pandas, Numpy, Matplotlib과 같은 라이브러리와 바로 통합이 가능합니다. 또한, 버튼, 슬라이더, 텍스트 입력과 같은 여러 위젯을 바로 구현할 수 있어 원하는 웹 애플리케이션을 쉽게 프로토타이핑 할 수 있습니다. 간단한 예제를 통해서 Streamlit의 일부 기능을 사용해 보도록 하겠습니다.

 

Streamlit 간단 예제

Streamlit을 사용하기 위해서 파이썬 환경에서 Streamlit 패키지를 설치해야 합니다. 아래의 명령어를 통해 Streamlit 패키지를 설치해 보도록 하겠습니다.

 

pip install streamlit

 

Streamlit 설치가 완료되면 "Hello Streamlit"을 실행해 볼까요? 첫째로, 아래와 같이 Streamlit 라이브러리를 불러옵니다. 

라이브러리를 불러온 후, 타이틀을 설정하는 함수 title()을 호출하여 "Hello Streamlit"을 수행해 보겠습니다. 아래의 streamlit run을 통해 streamlit을 동작하면 아래의 스크린샷과 유사한 결과를 확인하실 수 있습니다. 

 

import streamlit as st

st.title("Hello Streamlit!")

# streamlit run app_name.py

 

Hello Streamlit

 

이처럼 간단한 함수 호출을 통해 웹에서 동작하는 애플리케이션을 만들 수 있습니다. Streamlit은 웹을 디자인하거나 사용자 인터페이스를 구현할 수 있는 다양한 함수를 제공합니다. 제공되는 함수를 사용하면 웹 개발 선수 지식 없이 간단하게 웹을 구현할 수 있습니다. 뿐만 아니라, 구성한 파이썬 파일을 Github 저장소에 저장하여 웹 애플리케이션을 Streamlit 서버를 통해 배포할 수도 있습니다. Streamlit을 활용한 배포 관련 내용은 추후 포스팅에서 소개해드릴 수 있도록 하겠습니다.

 

정말 간단한 Hello Streamlit 예제를 살펴봤으니, Streamlit과 랭체인을 활용해서 LLM 웹 애플리케이션을 구성해 볼까요?

 

랭체인, Streamlit을 활용한 웹 애플리케이션 만들기

오늘 랭체인과 Streamlit을 활용해서 만들어 볼 애플리케이션은 웹 URL을 입력받고 쿼리를 전달받아 응답하는 챗봇입니다. 오늘 사용할 언어 모델은 OpenAI의 언어 모델이기 때문에 API 키가 준비되어야 합니다.

 

첫째로, 오늘 예제에 활용할 라이브러리들을 호출합니다. 랭체인의 chat_models, embeddings, document_loaders, text_splitter, vectorstores, chains 라이브러리를 사용했습니다. 추가로, 제 Chromadb를 사용하는 과정에서 built-in sqlite3 버전이 맞지 않아 커스텀으로 아래와 같이 pip-installed 패키지를 사용했습니다.

import streamlit as st
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')

 

그다음, Streamlit을 활용해서 사용자로부터 필요한 정보를 입력받을 것입니다. 입력받을 정보는 OpenAI의 API 키, 활용하고자 하는 URL 주소, 쿼리 명령 그리고 전송 버튼입니다. 전달받을 사용자의 입력은 텍스트, 버튼 입력입니다. 텍스트와 버튼 클릭을 입력받을 때, 아래의 Streamlit 라이브러리 함수를 사용합니다.

 

st.title("Streamlit Chatbot")

api_key = st.text_input("Enter your OpenAI API key")
url = st.text_input("Input URL to chat with")
query = st.text_input("Input your query")
button = st.button("Submit")

 

오늘 구현할 기능은 버튼을 클릭했을 때 동작하도록 설계할 예정입니다. 따라서, 조건문을 활용해서 버튼이 입력됐을 때, 동작하도록 할 것입니다. 조건문 내부에는 아래의 기능들이 구현되어 있습니다. 금일 포스팅 내용 한계 상, 상세 내용은 따로 주제를 구성하여 설명드릴 수 있도록 하겠습니다.

 

  • 입력받은 API 키를 활용한 모델 및 임베딩 생성
  • 웹 URL 정보를 통한 데이터 로드
  • 로드된 데이터를 쪼개는 작업
  • 벡터 데이터 베이스, 검색기 생성
  • 체인을 활용한 통합
  • 쿼리를 전달한 후, 응답 확인

 

if button:
  llm = ChatOpenAI(openai_api_key= api_key)
  embeddings = OpenAIEmbeddings(openai_api_key= api_key)

  # Load data from URL
  loader = WebBaseLoader(url)
  data = loader.load()
  
  # Text Spliter
  text_splitter = CharacterTextSplitter(separator="\n",
                                        chunk_size=1000,
                                        chunk_overlap=200)
  docs = text_splitter.split_documents(data)
  
  # Create vector database
  vector_database = Chroma.from_documents(documents=docs,
                                          embedding=embeddings)
  
  # Create a retriever from Chroma database
  retriever = vector_database.as_retriever(search_kwargs={"k":3})
  
  # Chain
  qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
  result = qa(query)
  st.write(result)

 

위의 코드를 구현한 후, 실행한 모습은 아래와 같습니다. 아래에 OpenAI API 키를 입력하고, Elon Musk의 위키피디아 페이지를 URL로 전달한 후, 요약을 요청해 보도록 하겠습니다.

 

Submit 버튼을 클릭한 후, 응답을 얻을 때까지 기다립니다. 응답 결과, 아래와 같은 최종 결과를 얻을 수 있었습니다. 많은 양의 코드를 작성하지 않고도 웹 기반 챗봇을 구현해 볼 수 있었습니다.

 

 

마치며

오늘은 지난 랭체인 소개글에 이어 Streamlit을 활용한 웹 기반 LLM 애플리케이션을 만들어보는 내용을 다뤄봤습니다. 저희가 개발하다 보면 완벽한 애플리케이션은 아니더라도 빠르게 프로토타이핑이 필요한 시점이 많습니다. 그런 상황에서 웹이나 앱 개발에 능숙하지 않은 분들은 프로토타이핑을 하는 데 있어서도 시간이 꽤나 소요될 것입니다. Streamlit은 그런 상황에서 빠르게 웹을 구현하고 테스트해 볼 수 있는 좋은 환경인 것 같습니다. 이번 내용에 이어서 다음 랭체인 포스팅에서 좋은 내용으로 찾아뵐 수 있도록 하겠습니다. 오늘 못다 한 얘기도 빠른 시일 내에 전달드릴 수 있도록 하겠습니다. 감사합니다.

반응형