LlamaIndex 응답 모드
LlamaIndex 응답 모드 (Response Modes)
쿼리 엔진이 검색된 여러 텍스트 조각을 어떻게 묶어서 답을 만들지는 **응답 모드(response mode)**가 정해요. LlamaIndex가 현재 지원하는 옵션은 이러해요.
refine: 검색된 각 텍스트 조각을 순차적으로 훑어가며 답을 "만들고 다듬는(create and refine)" 방식. 노드(검색된 조각)마다 LLM 호출이 한 번씩 발생해요.- 동작: 첫 번째 조각으로
text_qa_template프롬프트를 써서 질의해요. 그다음 그 답과 다음 조각(그리고 원래 질문)을refine_template프롬프트로 다시 질의해요. 이런 식으로 모든 조각이 처리될 때까지 반복해요. - 한 조각이 (프롬프트 크기를 고려했을 때) 창에 들어가기 너무 크면
TokenTextSplitter로 쪼개요(조각 간 텍스트 오버랩을 허용). 이렇게 생긴 추가 조각들도 원래 조각 묶음의 일부로 취급돼서 역시refine_template으로 질의돼요. - 더 상세한 답이 필요할 때 좋아요.
- 동작: 첫 번째 조각으로
compact(기본값):refine과 비슷하지만 조각들을 먼저 압축(연결)해서 LLM 호출 수를 줄여요.- 동작:
text_qa_template과refine_template중 최대 프롬프트 크기를 고려해, 컨텍스트 창에 들어갈 수 있는 만큼 텍스트를(검색된 조각에서 연결/압축해) 채워 넣어요. 너무 길어 한 프롬프트에 안 들어가면TokenTextSplitter로 필요한 만큼 여러 부분으로 쪼개요(텍스트 오버랩 허용). - 각 텍스트 부분이 하나의 "조각"으로 취급되어
refine신시사이저로 보내져요. - 요약하면
refine과 같지만 LLM 호출이 더 적어요.
- 동작:
tree_summarize:summary_template프롬프트로, 연결된 모든 조각이 질의될 때까지 LLM을 여러 번 호출해요. 이렇게 만들어진 여러 답이 다시 조각으로 취급되어 또다시tree_summarizeLLM 호출로 재귀적으로 처리되고, 마지막에 한 조각만 남아 최종 답이 하나가 될 때까지 반복돼요.- 동작:
summary_template프롬프트를 써서 컨텍스트 창에 들어갈 만큼 조각들을 최대한 연결하고, 필요하면 쪼개요(역시TokenTextSplitter와 오버랩 사용). 그다음 각 결과 조각/분할을summary_template으로 질의해서(refine 질의가 아니라!) 여러 답을 얻어요. - 답이 하나뿐이면(조각이 하나뿐이어서) 그게 최종 답이 돼요.
- 답이 여러 개면, 그 답들 자체가 조각으로 취급되어
tree_summarize과정에 재귀적으로 보내져요(연결/분할/질의 반복). - 요약(summarization) 목적에 좋아요.
- 동작:
simple_summarize: 모든 텍스트 조각을 잘라서 단일 LLM 프롬프트에 맞춰요. 빠른 요약에 좋지만, 잘려나가서 세부 내용이 사라질 수 있어요.no_text: LLM으로 보내졌을 조각들을 실제로 보내지 않고 리트리버만 실행해서 노드를 가져와요. 그다음response.source_nodes를 확인해 조사할 수 있어요.accumulate: 텍스트 조각 묶음과 쿼리가 주어졌을 때, 각 텍스트 조각에 쿼리를 적용하면서 응답을 배열에 쌓아요. 모든 응답을 연결한 문자열을 반환해요. 같은 쿼리를 각 텍스트 조각에 따로 실행해야 할 때 좋아요.compact_accumulate:accumulate와 같지만, 각 LLM 프롬프트를compact처럼 "압축"하고 각 텍스트 조각에 같은 쿼리를 실행해요.
출처: 공식문서
더 알아보기
- Response Synthesizer 문서에서 응답 합성의 구조를 더 자세히 배울 수 있어요.