문서에 대화형 챗봇을 위한 Langchain과 LlamaIndex를 사용하여 RAG 기술을 구현합니다.
RAG는 프롬프트 엔지니어링 기술은 아니지만 벡터 임베딩을 사용하고 이를 LLM에 컨텍스트로 전달하여 사용 사례별 데이터/컨텍스트로 프롬프트를 향상시키는 데 사용됩니다.
RAG 구현은 지속적으로 발전해 왔으며 LLM에서 사용자 정의 데이터 소스를 사용하기 위한 새롭고 가장 선호되는 프레임워크인 LlamaIndex 에 대해 이야기하여 사용자 정의 데이터를 쿼리하는 것이 좋을 것이라고 생각했습니다 .
LlamaIndex는 사용자 지정 콘텐츠/데이터를 수집하고 해당 콘텐츠를 쿼리할 수 있는 프레임워크입니다. 이는 LLM이 반드시 사용 사례별 콘텐츠/데이터/문서로 교육/세분화될 필요가 없는 대부분의 기업 사용 사례에서 매우 강력한 요구 사항입니다.
예를 들어, 저는 생산 사건/티켓/이벤트 중에 적용하는 사용자 정의 문서(예: SOP(표준 운영 절차)와 같은 표준 운영 절차)가 있는 다양한 고객과 협력합니다. 이러한 경우 테라바이트 단위의 Word를 매우 쉽게 수집할 수 있습니다. 문서 및 PDF 문서를 사용하여 엔지니어가 문서를 쿼리하는 데 사용할 수 있는 봇을 보유하고 LLM 에이전트를 사용하여 이를 자동화하여 ChatOps I의 일부로 사건 및 컨텍스트를 기반으로 적절한 콘텐츠를 검색할 수 있습니다. 곧 앱/플랫폼 개발/운영에서 LLM을 사용하는 방법에 대해 설명하는 몇 개의 블로그를 작성할 예정입니다.
LlamaIndex는 고급 RAG 애플리케이션을 생성하기 위한 라이브러리를 제공하는 프레임워크입니다 .
다음 그림은 LlamaIndex 작동 방식에 대한 높은 수준의 접근 방식을 보여줍니다.
이 다이어그램을 더 잘 이해해 봅시다.
LlamaIndex를 사용하여 문서를 쿼리하는 Q&A 챗봇을 구현해 보겠습니다.
저는 일반적으로 각 프로젝트마다 별도의 가상 환경을 생성하여 애플리케이션을 실행하고 버전 충돌을 방지하기 위한 올바른 구성과 환경이 있는지 확인합니다.
python3 -m venv ./llamaindex-venv #setup a environment
source ./llamaindex-venv/bin/activate #activate the environment
pip install -r requirements.txt #install all the required python libraries
다음은 이 애플리케이션을 구현하는 데 사용할 모든 라이브러리가 포함된 요구사항.txt를 보여줍니다.
python-dotenv
openai
llama-index
pypdf
streamlit
nltk
모든 문서를 넣을 수 있는 폴더를 만들어야 합니다. 나는 “ document”에 전화하고 있습니다. 폴더를 생성할 수 있지만 폴더/경로의 이름이 무엇인지 확인하고 이에 따라 코드를 업데이트하십시오.
파일을 폴더에 복사합니다(사용하려는 PDF 파일을 복사할 수 있지만 이 예에서는 Cannon 사용자 매뉴얼 사이트에서 다운로드한 Cannon EOS-R 매뉴얼을 사용하고 있습니다).
다음 코드에서는 필요한 모든 라이브러리를 가져옵니다.
다음 코드를 살펴보겠습니다.
15행 : 내 OpenAI 키 값이 포함된 OPENAI_API_KEY 환경 변수가 있는 .env 파일을 로드합니다.
16행 : VectorDB를 저장할 폴더의 위치를 설정합니다. 이 경우 로컬 디스크에 저장되는 간단한 벡터db를 구현합니다. 보다 확장 가능한 솔루션은 PineCone 등과 같은 SaaS 솔루션을 사용하는 것입니다.
17행 : 수집할 모든 문서를 저장할 "./documents" 문서의 위치를 설정합니다.
18-30행 : 벡터 저장소를 초기화하고 있습니다. 문서를 이미 인덱스에 수집한 경우에는 인덱싱 및 저장을 수행할 필요가 없습니다. initialize()메소드는 인덱스가 이미 존재하는지 확인한 다음 기존 데이터베이스에서 로드하고, 그렇지 않으면 새 데이터베이스와 인덱스를 생성합니다.
Index : LlamaIndex의 주요 기능 중 하나는 수집된 콘텐츠를 인덱스로 구성하는 방식입니다. 이러한 인덱스를 사용하여 쿼리에 응답합니다. 수집된 콘텐츠는 여러 개의 청크로 나누어지며, 이를 노드 라고도 합니다 . 이러한 노드는 목록, 트리, 키워드 및 벡터로 색인화됩니다. 노드(청크)의 모든 콘텐츠는 벡터 임베딩으로 저장됩니다. 추론 중에 모든 LLM에는 토큰 제한이 있으므로 청킹은 매우 중요합니다. 이를 방지하기 위해 LlaamaIndex는 이러한 다양한 청크를 특정 순서로 사용하여 LLM을 쿼리하고 응답을 구체화합니다. 하나의 추론 요청으로 모든 문서 콘텐츠를 전달하는 것은 사실상 불가능하기 때문입니다.
이 방법을 사용하면 다음 파일이 생성됩니다.
34-56행 : 채팅 종류의 인터페이스를 갖춘 간소화된 애플리케이션을 만들고 있습니다. 메시지를 st.session_state( 36, 43행 ) 에 저장하고 이는 기본 창에 채팅( 45-46행 ) 으로 인쇄됩니다 . st.chat_input()( Line 42–44 ) 에 제공된 프롬프트를 캡처 하고 Line 40 에서 만든 chat_engine()( Line 52 )를 호출합니다 . LlamaIndex는 생성된 인덱스로 채팅 엔진을 생성할 수 있는 편리한 기능을 제공합니다. 이는 RAG 수행의 모든 복잡성을 처리하고 응답을 얻기 위해 적절한 LLM을 호출합니다.
이는 간소화된 애플리케이션이므로 다음 명령을 사용하여 실행해야 합니다.
스트림라이트 실행 qa_chat.py
그러면 채팅 애플리케이션이 포함된 브라우저가 시작됩니다. 다음 스크린샷은 출력을 보여줍니다.
콘솔에서는 상위 2개 옵션에 대한 예측과 유사성 점수를 볼 수 있습니다. 이는 pprint_response(response, show_source=True)(라인 54) 에 의해 콘솔에 인쇄됩니다 .
자, 보시다시피 LlamaIndex를 사용하여 복잡한 RAG 패턴을 구현하는 것은 매우 쉽습니다.
2024 Mac Book 앱! NeoVim & Ollama & ... (0) | 2024.05.03 |
---|---|
BigQuery DataFrames를 통해 Gemini로 텍스트 데이터를 보강하는 방법 (0) | 2024.04.29 |
Wagtail 사용법 (1) | 2024.04.21 |
Konfig 소개: 스타트업 및 기업을 위해 사전 구성된 GitLab 및 Google Cloud (0) | 2024.04.19 |
GCP에서 Serverless 구성하기(API Gateway + Cloud Run) (0) | 2024.04.19 |
댓글 영역