LlamaCloudIndex + LlamaCloudRetriever

LlamaCloudIndex + LlamaCloudRetriever

관리형 파싱·수집·검색 서비스를 LlamaIndex 프레임워크 안에서 쓰고 싶다면, **LlamaCloudIndex**와 **LlamaCloudRetriever**가 그 다리가 돼요. LlamaCloud는 프로덕션급 컨텍스트 증강을 LLM·RAG 애플리케이션에 가져다주기 위해 설계된 차세대 관리형 파싱·수집·검색 서비스예요.

출처: 공식문서

현재 LlamaCloud가 지원하는 것:

  • 관리형 수집 API — 파싱과 문서 관리를 처리
  • 관리형 검색 API — RAG 시스템에 최적의 검색 구성

접근

관리형 수집·검색 API의 비공개 베타를 제한된 엔터프라이즈 파트너에게 열어두고 있어요. 데이터 파이프라인을 중앙화하고 실제 RAG 유스케이스에 더 시간을 쓰고 싶다면 문의하세요. LlamaCloud 접근 권한이 있으면 LlamaCloud에 로그인해 API 키를 받을 수 있어요.

설치

최신 LlamaIndex 버전을 설치해요.

pip uninstall llama-index  # run this if upgrading from v0.9.x or older
pip install -U llama-index --upgrade --no-cache-dir --force-reinstall

llama-cloud-services 패키지는 위 설치에 포함되지만, 직접 설치할 수도 있어요.

pip install -U llama-cloud-services

사용법

LlamaCloud에 인덱스를 만드는 코드예요.

import os

os.environ[
    "LLAMA_CLOUD_API_KEY"
] = "llx-..."  # can provide API-key in env or in the constructor later on

from llama_index.core import SimpleDirectoryReader
from llama_cloud_services import LlamaCloudIndex

# create a new index
index = LlamaCloudIndex.from_documents(
    documents,
    "my_first_index",
    project_name="default",
    api_key="llx-...",
    verbose=True,
)

# connect to an existing index
index = LlamaCloudIndex("my_first_index", project_name="default")

관리형 검색용 리트리버도 구성할 수 있어요.

# from the existing index
index.as_retriever()

# from scratch
from llama_cloud_services import LlamaCloudRetriever

retriever = LlamaCloudRetriever("my_first_index", project_name="default")

관리형 인덱스의 다른 지름길도 쓸 수 있어요.

query_engine = index.as_query_engine(llm=llm)

chat_engine = index.as_chat_engine(llm=llm)

리트리버 설정

리트리버 설정/kwargs 전체 목록이에요.

  • dense_similarity_top_k: Optional[int] — 0보다 크면 dense 검색으로 k개 노드를 검색
  • sparse_similarity_top_k: Optional[int] — 0보다 크면 sparse 검색으로 k개 노드를 검색
  • enable_reranking: Optional[bool] — 리랭킹 활성화 여부. 속도를 일부 희생하고 정확도를 얻음
  • rerank_top_n: Optional[int] — 리랭킹 후 반환할 노드 수
  • alpha: Optional[float] — dense와 sparse 검색 사이 가중치. 1 = 완전 dense, 0 = 완전 sparse

복합 검색 (Composite Retrieval)

여러 인덱스가 다양한 데이터를 수집하고 있으면, 모든 인덱스에 걸쳐 질의하는 애플리케이션을 만들고 싶을 거예요. 이때 **LlamaCloudCompositeRetriever**를 써요.

import os
from llama_cloud import CompositeRetrievalMode, RetrieverPipeline
from llama_cloud_services import (
    LlamaCloudIndex,
    LlamaCloudCompositeRetriever,
)

llama_cloud_api_key = os.environ["LLAMA_CLOUD_API_KEY"]
project_name = "Essays"

# Setup your indices
pg_documents = SimpleDirectoryReader("./examples/data/paul_graham").load_data()
pg_index = LlamaCloudIndex.from_documents(
    documents=pg_documents,
    name="PG Index",
    project_name=project_name,
    api_key=llama_cloud_api_key,
)

sama_documents = SimpleDirectoryReader(
    "./examples/data/sam_altman"
).load_data()
sama_index = LlamaCloudIndex.from_documents(
    documents=sama_documents,
    name="Sam Index",
    project_name=project_name,
    api_key=llama_cloud_api_key,
)

retriever = LlamaCloudCompositeRetriever(
    name="Essays Retriever",
    project_name=project_name,
    api_key=llama_cloud_api_key,
    # If a Retriever named "Essays Retriever" doesn't already exist, one will be created
    create_if_not_exists=True,
    # CompositeRetrievalMode.FULL will query each index individually and globally rerank results at the end
    mode=CompositeRetrievalMode.FULL,
    rerank_top_n=5,
)

# Add the above indices to the composite retriever
# Carefully craft the description as this is used internally to route a query to an attached sub-index when CompositeRetrievalMode.ROUTING is used
retriever.add_index(pg_index, description="A collection of Paul Graham essays")
retriever.add_index(
    sama_index, description="A collection of Sam Altman essays"
)

# Start retrieving context for your queries
# async .aretrieve() is also available
nodes = retriever.retrieve("What does YC do?")

복합 검색 관련 파라미터

  • mode: Optional[CompositeRetrievalMode]CompositeRetrievalMode.FULL 또는 CompositeRetrievalMode.ROUTING
    • full: 모든 첨부 하위 인덱스를 질의하고, 이 하위 인덱스들에서 받은 모든 노드에 걸쳐 리랭킹을 실행
    • routing: 에이전트가 주어진 쿼리에 가장 관련 있는 하위 인덱스(제공한 하위 인덱스 name·description 기반)를 판단해, 관련 있다고 여겨지는 인덱스만 질의. 선택된 인덱스의 노드만 리랭킹 후 반환
  • rerank_top_n: Optional[int] — 모든 인덱스에서 검색된 노드에 걸쳐 리랭킹 후 반환할 노드 수

더 알아보기