Leave-behind 기업용 사이드킥
요약
이 글은 기업 환경에서 활용할 수 있는 다중 테넌트 사이드킥 챗봇 애플리케이션을 소개합니다. 이 앱은 Astra DB Vector Store와 Foundational LLM의 상호작용에 중점을 두며, RAGStack과 LangChain을 사용하여 강력한 검색 증강 생성(RAG) 기능을 구현했습니다.
핵심 포인트
- Astra DB Vector Store를 활용하여 기업 데이터를 컨텍스트로 사용합니다.
- LangChain 및 Streamlit으로 구축되어 재사용성과 구성 가능성이 높습니다.
- 다양한 RAG 전략(Basic, MMR, Fusion)과 메모리 관리가 가능합니다.
- 멀티테넌시와 현지화 기능을 지원하는 엔터프라이즈급 솔루션입니다.
Leave-behind 기업용 사이드킥
이 기업용 사이드킥은 엔터프라이즈나 잠재 고객과 공유할 수 있도록 다중 테넌트(multi-tenant), 재사용 가능하며 구성 가능한 샘플 애플리케이션으로 특별히 구축되었습니다. 이 앱은 Astra DB Vector Store와 기반 대규모 언어 모델(Foundational Large Language Model) 간의 상호 작용에 중점을 둡니다. 왜냐하면 귀하의 데이터만이 지속 가능한 경쟁 우위(Sustainable Competitive Advantage)를 제공하기 때문입니다.

아키텍처
- 🤩 프로덕션 환경 사용을 위해 DataStax RAGStack을 활용하여 다음 구성 요소를 이용합니다:
- 🚀 검색 증강 생성(Retrieval Augmented Generation)을 가능하게 하는 의미적 유사성 검색(Semantic Similarity search)을 위한 Astra DB Vector Store
- 🧠 무엇이 말해지고 생성되었는지 추적하기 위한 Astra DB를 통한 단기 메모리(Short Term Memory)
- 🦜🔗 OpenAI와 Astra DB 연결을 위한 LangChain
- 👑 웹 애플리케이션을 쉽게 생성할 수 있는 프레임워크로 Streamlit을 사용합니다.
기능성
- 이 챗봇은 새로운 콘텐츠를 업로드하고, 벡터화(Vectorized)하여 Astra DB Vector Database에 저장할 수 있게 하여 컨텍스트로 사용할 수 있도록 합니다.
- PDF 및 텍스트 파일을 통해
- URL을 통해 웹 페이지를 자동으로 스크래핑하여
- 사이드킥은 사진을 관련 프롬프트로 변환합니다.
- Astra DB Vector Store에서 질의(queries), 프롬프트, 컨텍스트 추적을 위해 Langsmith와 통합됩니다.
- 데이터 없이는 AI가 없다는 점에 따라, 이 챗봇은 다음과 같은 옵션을 통해 Astra DB Vector Store를 OpenAI Chat Model과 통합하는 데 중점을 두고 있습니다:
- 채팅 메모리 활성화/비활성화 (Enable/Disable Chat Memory)
- 채팅 메모리의 Top-K 설정
- 특정 시점에 채팅 메모리 삭제
- 벡터 스토어 활성화/비활성화 (Enable/Disable the Vector Store)
- 벡터 스토어의 Top-K 설정
- 다음 옵션 중 RAG 전략 선택:
- 기본 검색(Basic Retrieval)
- 최대 주변 관련성(Maximal Marginal Relevance)
- 융합(Fusion)
- 다음 프롬프트 중 선택:
- 간결한 결과(Short results)
- 확장된 결과(Extended results)
- 사용자 정의 프롬프트 사용(Use a Custom Prompt)
- 화면에 출력을 스트리밍하여 최종 답변을 기다릴 필요가 없도록 StreamingCallbackHandler를 사용합니다.
멀티테넌시 및 커스터마이징
특히 멀티테넌시와 구성 가능성을 위해 이 앱은 다음 기능을 제공합니다:
/customizations/localization.csv파일을 통한 설정 가능한 현지화(localization) 기능으로, 기본 언어는 us_US와 nl_NL입니다./customizations/rails.csv를 통한 안내형 온-레일스 경험(guided experience on-rails)- 특정 조직을 위한
/customizations/welcome의 사용자 정의 환영 페이지(welcome page) - 특정 조직을 위한
/customizations/logo의 사용자 정의 로고
1️⃣ 준비 사항
이 챗봇은 Github 계정에 접근할 수 있다고 가정합니다.
그리고 다음을 위해 무료로 가입해야 합니다:
- DataStax Astra DB (Github 계정을 통해 가입할 수 있습니다)
- OpenAI 계정 (Github 계정을 통해 가입할 수 있습니다)
- 멋진 앱을 배포하기 위한 Streamlit (Github 계정을 통해 가입할 수 있습니다)
아래 단계를 따라 Astra DB API Endpoint, Astra DB ApplicationToken 및 OpenAI API Key가 필요할 때 제공하세요.
반드시 벡터 기능이 활성화된(vector-enabled) Astra 데이터베이스를 갖추어야 합니다 (여기 astra.datastax.com에서 무료로 받으세요).
- Database details 아래 오른쪽 창에서 찾을 수 있는 API Endpoint를 제공하라는 요청을 받을 것입니다.
- Database details 아래 오른쪽 창에서 생성할 수 있는 데이터베이스용 Application Token을 갖추도록 하세요.
- API 키 페이지로 이동하여 새 Secret Key를 생성하고, 선택적으로 키에 이름을 지정할 수 있습니다.
- 특히 GPT4 모델을 사용하려면 신용카드 정보를 제공하고 계정에 일정 금액을 충전해야 할 수도 있습니다.
여기에 설명된 단계를 따르세요.
Python 의존성 설치
다음 명령어를 사용하여 Python 의존성을 설치하세요:
pip3 install -r requirements.txt
비밀 설정(Secrets) 구성
그런 다음 /.streamlit/secrets.toml 파일에서 OpenAI, AstraDB, 그리고 선택적으로 LangSmith 비밀을 업데이트하세요. secrets.toml.example에 예시가 제공되어 있습니다.
2️⃣ 맞춤 설정 (Customizations)
이제 사용자의 특정 상황이나 고객에 맞춰 앱을 커스터마이징할 차례입니다.
단계 1
/.streamlit/secrets.toml 파일의 [passwords] 섹션에 새로운 사용자 이름과 비밀번호를 추가하여 자격 증명(credentials)을 정의합니다. 다음 규칙을 사용하세요:
[passwords]
the_username_for_the_user = "the password for the user"
단계 2
/.streamlit/secrets.toml 파일의 [languages] 섹션에 현지화 코드(localization code)를 추가하여 앱의 UI 언어를 정의합니다. 다음 규칙을 사용하세요:
[languages]
the_username_for_the_user = "the language definition"
현재는 en_US, nl_NL, ro_RO가 지원됩니다. 하지만 /customizations/localization.csv에 추가 언어를 쉽게 추가할 수 있습니다.
단계 3
/customizations/welcome에 맞춤 환영 페이지(welcome page)를 생성합니다. 여기서의 규칙은 <username>.md라는 마크다운 파일을 만드는 것입니다. 이상적으로는 6단계에서 미리 로드된 파일 목록을 나열하는 것이 좋습니다.
맞춤 환영 페이지가 제공되지 않는 경우, 앱은 default.md를 사용합니다.
단계 4
/customizations/logo에 맞춤 로고(logo)를 생성합니다. 여기서의 규칙은 <username>.svg 또는 <username>.png라는 이미지 파일을 만드는 것입니다.
맞춤 로고가 제공되지 않는 경우, 앱은 default.svg를 사용합니다.
단계 5
rails.csv에 샘플 프롬프트(sample prompts)를 제공하여 가이드 경험(guided experience)을 만듭니다. 여기서의 규칙은 1단계에서 정의한 <username>을 사용하여 경험을 정의하는 것입니다. 다음 규칙을 사용하세요:
username,key,value
the_username_for_the_user,1,"Question prompt number 1"
the_username_for_the_user,2,"Question prompt number 2"
...
단계 6
로드된 모든 컨텍스트(context)를 삭제할 수 있는 옵션을 앱에서 활성화하거나 비활성화합니다. 다음 규칙을 사용하세요:
[delete_option]
the_username_for_the_user = "True"
위의 설정이 제공되지 않는 경우, 앱은 콘텐츠와 해당 벡터 임베딩(vector embeddings) 삭제 기능을 기본적으로 비활성화합니다.
단계 7
/customizations/prompt에 기본 프롬프트(default prompt)를 정의하는 옵션이 있습니다.
여기서의 관례는 <username>.txt라는 텍스트 파일을 생성하는 것입니다.
프롬프트가 제공되지 않는 경우, 앱은 default.txt를 사용하며 'Short results' 프롬프트를 기본값으로 사용하게 됩니다.
사용자에게 사용자 지정 프롬프트를 제공하는 경우, 앱은 시작 시 이를 기본값으로 사용합니다.
8단계
앱을 시작하고 관련 PDF 및 텍스트 파일을 미리 로드하여 다음 단계의 질문/프롬프트에 사용할 수 있는 콘텐츠를 확보합니다. 이 모든 데이터는 <username>으로 정의된 Astra DB 내 사용자별 컬렉션에 로드됩니다.
3️⃣ 사용 시작하기
다음과 같이 앱을 실행할 준비가 되었습니다:
streamlit run streamlit_app.py
미리 로드된 콘텐츠 외에도, 사용자는 프롬프트의 컨텍스트로 사용될 추가 콘텐츠를 추가할 수 있습니다.
4️⃣ 이 멋진 것을 Streamlit cloud에 배포해 봅시다!
이 단계에서는 여러분의 멋진 앱을 인터넷에 배포하여 모두가 여러분의 멋진 작업을 즐기고 놀라워할 수 있도록 할 것입니다!
Streamlit 계정 설정하기
아직 하지 않았다면, Streamlit에서 계정을 설정해 주세요. 이미 계정이 있는 경우 다음 단계로 건너뛰고 앱을 배포하세요.
- Streamlit.io로 이동하여
Sign up을 클릭합니다. 그런 다음Continue with Github를 선택합니다:

- GitHub 자격 증명을 사용하여 로그인합니다:

- 이제 Streamlit에 권한을 부여합니다:

- 그리고 계정을 설정합니다:

앱 배포하기
메인 화면에서 로그인하면 New app을 클릭합니다.
- 첫 번째 배포인 경우, 추가 권한을 제공합니다:

- 이제 애플리케이션 설정을 정의합니다. 본인의 저장소(repository) 이름을 사용하고, 메인 파일 경로가
streamlit_app.py인지 확인합니다. 앱이 배포될 멋진 App URL을 선택하세요:

- Advanced를 클릭하고
Python 3.11을 선택한 다음,secrets.toml의 내용을 복사하여 붙여넣거나 처음으로 여기에 정의합니다 (1단계 참조).
Deploy를 클릭합니다! 잠시 기다리면 여러분의 앱이 온라인 상태가 되어 모두가 사용할 수 있습니다!
⛔️ 경고
이 앱은 공개적이며 OpenAI 계정을 사용하므로 비용이 발생할 수 있다는 점을 유의하십시오. 메인 화면에서 설정(Settings)->공유(Sharing)를 클릭하여 접근이 허용되는 이메일 주소를 정의함으로써 이를 보호하는 것이 좋습니다. 이를 활성화하려면 Google 계정을 연결해야 합니다.
Python 환경 설정
위 내용을 모두 로컬에서 실행하고 싶다면, *가상 환경(Virtual Environment)*을 생성하는 것이 유용합니다. 아래 명령어를 사용하여 설정할 수 있습니다:
python3 -m venv myenv
그런 다음 다음과 같이 활성화합니다:
# Linux/Mac의 경우:
source myenv/bin/activate
...
이제 패키지 설치를 시작할 수 있습니다:
pip3 install -r requirements.txt
설치된 패키지가 무엇인지 확인하려면 다음 명령어를 사용합니다:
pip3 freeze
원한다면 이를 requirements.txt에 저장할 수도 있습니다:
pip3 freeze > requirements.txt
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기