LlamIndex (라마 인덱스)
https://docs.llamaindex.ai/en/stable/
LlamaIndex is a data framework for building context-augmented generative AI applications with LLMs including agents and workflows.
LLM 애플리케이션을 위한 데이터 프레임워크로, 몇 줄의 코드만으로 시작하여 몇 분 안에 RAG 시스템을 구축할 수 있습니다.
고급 사용자를 위해 LlamaIndex는 데이터 수집 및 색인화를 위한 풍부한 툴킷, 검색 및 재순위를 위한 모듈, 맞춤형 쿼리 엔진 구축을 위한 컴포저블 구성 요소를 제공합니다.
LlamaIndex는 RAG 스택 개발을 주도하고 있습니다.
- Indexing: 지식창고에서 데이터를 로드하고 색인화하는 방법
- Querying: 데이터를 표면화하여 모델 컨텍스트에 맞추는 방법
Indexing
모든 소스에서 RAG knowledge base로 데이터를 가져오려면 몇 가지 도구를 활용할 수 있습니다
- Documents/Nodes: 문서는 모든 데이터 소스(예: PDF, API 출력 또는 데이터베이스에서 검색된 데이터)를 둘러싼 일반적인 컨테이너입니다. 노드는 LlamaIndex에서 데이터의 원자 단위로, 소스 문서의 '청크'(즉, 하나의 문서에 많은 노드가 있음)와 다른 노드 객체와의 관계를 나타냅니다.
- Data Connectors: 데이터 커넥터는 다양한 소스에서 데이터를 수집하여 이를 문서 표현(텍스트 및 간단한 메타데이터)으로 변환합니다. 이러한 커넥터는 LlamaHub를 통해 제공되며, 현재 200개가 넘는 커넥터가 있습니다.
- Data Indexes: 데이터를 수집한 후에는 데이터를 검색하기 쉬운 형식으로 색인화할 수 있도록 LlamaIndex가 도와줍니다. 다양한 유형의 인덱스(요약, 트리, 벡터 등)가 있습니다. 내부적으로 LlamaIndex는 원시 문서를 중간 표현으로 파싱하고, 벡터 임베딩을 계산하고, 메타데이터를 유추합니다. 가장 일반적으로 사용되는 인덱스는 VectorStoreIndex이며, 이 인덱스는 시중의 모든 벡터 스토어와 쌍을 이룰 수 있습니다(예: Chroma)
Querying
쿼리 단계에서 RAG 파이프라인은 사용자의 프롬프트에서 가장 관련성이 높은 컨텍스트를 가져와 LLM에 전달합니다. 이를 통해 LLM은 기본 학습 데이터를 넘어선 최신/개인 지식을 갖추게 됩니다. LlamaIndex는 Q&A, 챗봇 또는 상담원 사용을 위한 RAG 경로를 구축하는 데 적합한 적응형 모듈을 제공하며, 각 경로마다 요구 사항이 다르기 때문입니다. 예를 들어 챗봇은 사용자가 후속 질문으로 개입해야 하는 반면, 상담원은 사용자의 개입 없이 스스로 전체 작업을 수행하려고 시도합니다.
Building Blocks
- Retrievers: 검색기는 쿼리가 주어졌을 때 지식창고(즉, 색인)에서 관련 컨텍스트를 효율적으로 검색하는 방법을 정의합니다. 벡터 인덱스가 가장 많이 사용되는 모드이지만 요약, 트리, 키워드 테이블, 지식 그래프 및 문서 요약과 같은 다른 옵션도 있습니다.
- Node Postprocessors: 리트리버가 노드 개체를 다시 가져오면 유사도가 낮은 개체를 버리는 등의 추가 작업을 수행해야 합니다. 여기에도 '유사도 포스트프로세서'(즉, 특정 유사도 점수 이하의 노드를 삭제하는 것)나 '롱컨텍스트 재정렬' 등 많은 옵션이 있으며, 이는 '중간에서 길을 잃은, U자형 기억 곡선' 논문에서 제기된 문제를 방지하는 데 도움이 됩니다.
- Reponse Synthesizers(응답 합성기): 사용자 쿼리와 검색된 청크, 프롬프트 및 LLM을 가져옵니다. 여기에는 철저함과 간결함의 균형을 맞추는 몇 가지 응답 모드가 있습니다.
Pipelines
- 쿼리 엔진: 쿼리 엔진은 데이터에 대해 질문할 수 있는 엔드투엔드 파이프라인입니다. 자연어 쿼리를 받아 검색된 참조 컨텍스트와 함께 응답을 반환하고 LLM에 전달합니다. 이를 통해 Panda 데이터 프레임을 데이터 소스로 활용하여 "팬더에게 질문하기"와 같은 작업을 수행할 수 있습니다.
- 채팅 엔진: 채팅 엔진은 데이터와 대화하기 위한 엔드투엔드 파이프라인입니다(단일 질문과 답변이 아닌 여러 번의 주고받기). 이는 기존의 OpenAI 스타일 채팅 인터페이스뿐만 아니라 ReAct. 에이전트와 같은 고급 채팅 인터페이스도 지원합니다
- 에이전트: 일련의 도구를 통해 세상과 상호작용하는 자동화된 의사 결정자(LLM에 의해 구동됨)입니다. 에이전트는 쿼리 엔진이나 채팅 엔진과 같은 방식으로 사용될 수 있지만, 데이터를 읽고 쓸 수 있는 기능이 있습니다. 추론에는 OpenAI 함수 또는 ReAct를 사용할 수 있습니다. 두 가지 모두 추가 분석을 위해 LlamaHub를 통해 제공되는 도구를 활용할 수 있습니다.
LlamaIndex 주요 기능
Agent
에이전트는 연구, 데이터 추출 등과 같은 작업을 수행하는 도구를 사용하는 LLM 기반의 지식 도우미입니다.
에이전트는 단순한 질문 답변부터 작업을 완료하기 위해 감지, 결정 및 조치를 취할 수 있는 기능까지 다양합니다.
LlamaIndex는 작업을 완료하기 위한 여러 도구 중 하나로 RAG 파이프라인을 사용하는 기능을 포함하여 에이전트를 구축하기 위한 프레임워크를 제공합니다.
Workflow
워크플로는 하나 이상의 에이전트, 데이터 커넥터 및 기타 도구를 결합하여 작업을 완료하는 다단계 프로세스입니다.
워크플로는 이벤트 기반 소프트웨어로, RAG 데이터 소스와 여러 에이전트를 결합하여 반사, 오류 수정 및 기타 고급 LLM 애플리케이션의 특징을 갖춘 다양한 작업을 수행할 수 있는 복잡한 애플리케이션을 만들 수 있습니다.
The Framework for Context-Augmented LLM Applications
LlamaIndex는 LLM 사용 방식에 제한을 두지 않습니다. 자동 완성, 챗봇, 에이전트 등으로 LLM을 사용할 수 있습니다. 단지 더 쉽게 사용할 수 있을 뿐입니다.
- 데이터 커넥터(Data connectors): 기본 소스 및 형식에서 기존 데이터를 수집합니다. 여기에는 API, PDF, SQL 등이 포함될 수 있습니다. 다양한 형식의 데이터 소스로부터 데이터를 쉽게 로드할 수 있습니다.
- 데이터 인덱스(Data Indexes): LLM이 사용하기 쉽고 성능이 뛰어난 중간 표현으로 데이터를 구조화합니다.
- 엔진(Engines): 데이터에 대한 자연어 액세스를 제공합니다.
- 쿼리 엔진은 질문 답변을 위한 강력한 인터페이스입니다(예: RAG 흐름).
- 채팅 엔진은 데이터와 '주고받는' 다중 메시지 상호작용을 위한 대화형 인터페이스입니다.
- 에이전트(Agents): 간단한 헬퍼 기능부터 API 통합 등에 이르기까지 도구로 보강된 LLM 기반 지식 근로자입니다.
- 관찰 가능성(Observability)/평가 통합(Evaluation)을 통해 선순환 구조로 앱을 엄격하게 실험, 평가 및 모니터링할 수 있습니다.
- 워크플로(Workflows)를 사용하면 위의 모든 것을 이벤트 중심 시스템으로 결합하여 다른 그래프 기반 접근 방식보다 유연하게 사용할 수 있습니다.
LlamaIndex Key Tools
1. Data Ingestion(데이터 수집)
LamaIndex는 다양한 외부 데이터 소스로부터 데이터를 가져옵니다. 이 소스에는 API, PDF 문서, SQL 데이터베이스 등이 포함될 수 있으며, 데이터는 구조화된 형태(예: 표), 비구조화된 형태(예: 텍스트 문서), 또는 프로그래밍을 통해 직접적으로 접근할 수 있는 형태일 수 있습니다.
2. Data Indexing(데이터 색인)
데이터가 수집되면, LamaIndex는 이 데이터를 정리하고 색인을 생성합니다. 이렇게 하면 데이터가 체계적으로 저장되고, 나중에 사용자가 데이터를 쉽게 찾을 수 있도록 합니다. 이 단계에서는 데이터를 다양한 사용 사례에 맞게 분류하고, 다운스트림 벡터 저장소 및 데이터베이스와 통합하여 데이터 검색이 보다 효율적으로 이루어질 수 있도록 기반을 마련합니다.
3. Query Interface(질의 인터페이스)
LamaIndex는 사용자가 데이터에 쿼리를 날릴 수 있는 인터페이스를 제공합니다. 사용자는 이 인터페이스를 통해 질문이나 명령을 입력하고, LamaIndex는 이전 단계에서 구축한 메타데이터와 색인을 활용하여 관련 정보를 빠르게 찾아 응답합니다. 이를 통해 사용자는 필요한 정보를 쉽고 빠르게 얻을 수 있습니다.
RAG 파이프라인의 주요 단계
- 로딩(Loading): 다양한 소스(텍스트 파일, PDF, 웹사이트, 데이터베이스, API 등)에서 데이터를 가져와 파이프라인에 입력합니다. LlamaHub에서 제공하는 다양한 커넥터를 활용할 수 있습니다.
- 인덱싱(Indexing): 데이터를 쿼리 가능한 구조로 변환합니다. 주로 벡터 임베딩을 생성하여 데이터의 의미를 수치화하고, 관련 메타데이터를 함께 저장합니다.
- 저장(Storing): 생성된 인덱스와 메타데이터를 저장하여 재사용할 수 있게 합니다.
- 쿼리(Querying): LLM과 LlamaIndex 데이터 구조를 활용하여 다양한 방식(서브쿼리, 다단계 쿼리, 하이브리드 전략 등)으로 데이터를 검색합니다.
- 평가(Evaluation): 파이프라인의 효과성을 객관적으로 측정합니다. 응답의 정확성, 충실도, 속도 등을 평가합니다.
LlamaIndex 사용하기
LlamaIndex 설치하기
pip install llama-index
데이터 로드 및 인덱스 생성
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 폴더에서 데이터 로드
documents = SimpleDirectoryReader("data").load_data()
# 문서에서 인덱스 생성
index = VectorStoreIndex.from_documents(documents)
# 인덱스에 문서 삽입
index.insert(document)
쿼리 실행
# 쿼리엔진 생성, 질의 응답
query_engine = index.as_query_engine()
response = query_engine.query("원하는 질문을 입력하세요")
print(response)
인덱스 커스터마이징
from llama_index.core import Settings
# LLM 커스터마이징
from llama_index.llms.openai import OpenAI
Settings.llm = OpenAI(model="gpt-4", temperature=0)
# LLM 입력 최대 토큰 수
Settings.context_window = 1024
임베딩 모델 커스터마이징
pip install llama-index-embeddings-langchain
pip install sentence-transformers # 허깅페이스 모델 사용 위함
from llama_index.embeddings.langchain import LangchainEmbedding
from langchain.embeddings import HuggingFaceEmbeddings
Settings.embed_model = LangchainEmbedding(
HuggingFaceEmbeddings(model_name = "<허깅페이스모델>")
)
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("<질문>")
References
'Generative AI > Language Model' 카테고리의 다른 글
Model Quantization (양자화) (0) | 2024.04.09 |
---|---|
[Metrics] ROUGE score, text 생성 타스크 평가 지표 (0) | 2023.08.07 |
[Large Language Model] Hallucination (환각) (0) | 2023.08.03 |
Risks of Large Language Models (대규모 언어 모델의 위험) (0) | 2023.08.03 |
[LLM] 업스테이지 모델, ‘허깅페이스 오픈 LLM 리더보드’서 세계 1위 (0) | 2023.08.02 |