쿼리 변환

쿼리 변환 (Query Transformations)

쿼리를 다른 쿼리로 변환해 검색 결과를 개선하는 기법들을 배워요. HyDE와 다단계 쿼리 분해처럼 쿼리 변환 모듈을 활용하는 방법을 알아봅시다.

출처: 문서

본문

LlamaIndex는 인덱스 구조 위에서 쿼리 변환을 수행할 수 있게 해줍니다. 쿼리 변환은 쿼리를 다른 쿼리로 변환하는 모듈입니다. 인덱스에 대해 쿼리가 실행되기 전에 변환이 한 번 실행되는 **단일 단계(single-step)**일 수 있습니다.

다음과 같은 **다단계(multi-step)**일 수도 있습니다.

  1. 쿼리가 변환되고 인덱스에 대해 실행됩니다.
  2. 응답이 검색됩니다.
  3. 후속 쿼리가 순차적으로 변환/실행됩니다.

아래에서 몇 가지 쿼리 변환을 더 자세히 다룹니다.

사용 사례

쿼리 변환에는 여러 사용 사례가 있습니다.

  • 초기 쿼리를 임베딩하기 더 쉬운 형태로 변환 (예: HyDE)
  • 초기 쿼리를 데이터에서 더 쉽게 답할 수 있는 하위 질문으로 변환 (단일 단계 쿼리 분해)
  • 초기 쿼리를 각각 쉽게 답할 수 있는 여러 하위 질문으로 분해 (다단계 쿼리 분해)

HyDE (Hypothetical Document Embeddings)

HyDE는 자연어 쿼리가 주어지면 먼저 가상의 문서/답변을 생성하는 기법입니다. 그런 다음 원시 쿼리 대신 이 가상 문서를 임베딩 조회에 사용합니다.

HyDE를 사용하는 예제 코드 스니펫은 아래와 같습니다.

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.indices.query.query_transform.base import (
    HyDEQueryTransform,
)
from llama_index.core.query_engine import TransformQueryEngine


# load documents, build index
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex(documents)


# run query with HyDE query transform
query_str = "what did paul graham do after going to RISD"
hyde = HyDEQueryTransform(include_original=True)
query_engine = index.as_query_engine()
query_engine = TransformQueryEngine(query_engine, query_transform=hyde)
response = query_engine.query(query_str)
print(response)

전체 안내는 예제 노트북을 확인하세요.

다단계 쿼리 변환

다단계 쿼리 변환은 기존 단일 단계 쿼리 변환 접근법 위에 일반화한 것입니다.

초기의 복잡한 쿼리가 주어지면 쿼리가 변환되어 인덱스에 대해 실행됩니다. 쿼리에서 응답이 검색됩니다. 응답(그리고 이전 응답들)과 쿼리가 주어지면 인덱스에 대한 후속 질문도 할 수 있습니다. 이 기법은 쿼리가 모든 질문을 충족할 때까지 단일 지식 소스에 대해 쿼리를 실행할 수 있게 해줍니다.

예시 그림은 아래와 같습니다.

대응하는 예제 코드 스니펫입니다.

from llama_index.core.indices.query.query_transform.base import (
    StepDecomposeQueryTransform,
)


# gpt-4
step_decompose_transform = StepDecomposeQueryTransform(llm, verbose=True)


query_engine = index.as_query_engine()
query_engine = MultiStepQueryEngine(
    query_engine, query_transform=step_decompose_transform
)


response = query_engine.query(
    "Who was in the first batch of the accelerator program the author started?",
)
print(str(response))

전체 안내는 예제 노트북을 확인하세요.

더 알아보기 (Learn more)