Router
- 쿼리가 주어졌을 때 어떤 쿼리 엔진을 사용할지 선택
- e.g. 요약 쿼리 엔진과 질의응답 쿼리 엔진이 있을 때, 무엇을 선택할지 결정
Index
- 데이터를 기반으로 한 일종의 메타데이터
- 인덱스 별로 다른 retrieval 양상을 보임
- Vector Index는 사용자 쿼리와의 임베딩 유사성을 기반으로 retrieve
- Summary Index는 사용자의 쿼리와 상관 없이 인덱스에 있는 모든 노드를 retrieve
from llama_index.core import SummaryIndex, VectorStoreIndex
summary_index = SummaryIndex(nodes)
vector_index = VectorStoreIndex(nodes)
Query Engine
- 인덱스에 저장된 데이터에 대한 쿼리 인터페이스
summary_query_engine = summary_index.as_query_engine(
response_mode="tree_summarize",
use_async=True,
)
vector_query_engine = vector_index.as_query_engine()
- 쿼리 엔진에 메타데이터를 추가한 도구
- 도구가 대답할 수 있는 질문의 종류에 대한 설명이 메타데이터에 포함
from llama_index.core.tools import QueryEngineTool
summary_tool = QueryEngineTool.from_defaults(
query_engine=summary_query_engine,
description=(
"Useful for summarization questions related to MetaGPT"
),
)
vector_tool = QueryEngineTool.from_defaults(
query_engine=vector_query_engine,
description=(
"Useful for retrieving specific context from the MetaGPT paper."
),
)
Selector
- LlamaIndex는 라우터를 만들 수 있는 여러 개의 Selector 제공
- LLM selector
- 언어모델에 텍스트 프롬프트를 사용해 JSON 형식으로 파싱을 진행
- 상응하는 인덱스가 쿼리되도록 함
- Pydantic selector
- Fucntion Calling API (e.g. OpenAI에서 제공)을 활용해 pydantic selection 객체를 생성
from llama_index.core.query_engine.router_query_engine import RouterQueryEngine
from llama_index.core.selectors import LLMSingleSelector
query_engine = RouterQueryEngine(
selector=LLMSingleSelector.from_defaults(),
query_engine_tools=[
summary_tool,
vector_tool,
],
verbose=True
)
response = query_engine.query("What is the summary of the document?")