구조화 출력 만들기
구조화 출력 만들기 (Structured Outputs)
LLM이 구조화된 출력을 만들어내는 능력은 출력 값을 안정적으로 파싱해야 하는 다운스트림 애플리케이션에 중요해요. LLM은 본질적으로 텍스트를 내놓지만, 우리가 원하는 건 때로는 깔끔한 JSON, 때로는 형식에 맞는 SQL이죠. LlamaIndex도 내부적으로 구조화 출력에 의존하고 있어요.
출처: 공식문서
개념
LlamaIndex가 구조화 출력에 의존하는 대표적인 두 가지 방식이 있어요.
- 문서 검색: LlamaIndex의 많은 데이터 구조가 특정 스키마의 LLM 호출에 의존해요. 예를 들어 트리 인덱스는 LLM 호출이 "ANSWER: (숫자)" 형식일 것을 기대해요.
- 응답 합성: 사용자가 최종 응답에 어느 정도의 구조(JSON 출력, 형식에 맞는 SQL 쿼리 등)가 포함되길 기대할 수 있어요.
LlamaIndex는 LLM이 구조화된 형식으로 출력하게 하는 다양한 모듈을 제공해요. 기본적으로 구조화 출력은 LLM 클래스 안에 내장되어 있고, 더 낮은 수준의 모듈도 제공돼요.
- Pydantic 프로그램: 입력 프롬프트를 Pydantic 객체로 표현된 구조화 출력에 매핑하는 범용 모듈. 함수 호출(function calling) API나 텍스트 완성 API + 출력 파서를 사용할 수 있고, 쿼리 엔진과도 통합 가능해요.
- 사전 정의된 Pydantic 프로그램: 입력을 특정 출력 타입(예: 데이터프레임)에 매핑하는 미리 정의된 Pydantic 프로그램.
- 출력 파서: LLM 텍스트 완성 엔드포인트 전후에 동작하는 모듈. 함수 호출 엔드포인트에서는 사용하지 않아요 (이미 구조화 출력을 기본 제공하므로).
구조화 출력 함수의 해부 (Anatomy)
LLM 기반 구조화 출력 함수를 구성하는 파이프라인은 일반 LLM 텍스트 완성 API를 쓰는지, LLM 함수 호출 API를 쓰는지에 따라 달라져요.
일반 완성 API에서는 입력과 출력이 텍스트 프롬프트로 처리돼요. 출력 파서는 LLM 호출 전후로 개입해 구조화 출력을 보장하는 역할을 해요 — 호출 전에는 형식 지시를 프롬프트에 추가하고, 호출 후에는 출력을 지정된 지시대로 파싱해요.
함수 호출 API에서는 출력이 본질적으로 구조화된 형식이고, 입력이 원하는 객체의 시그니처를 받을 수 있어요. 구조화 출력은 올바른 객체 형식(예: Pydantic)으로 캐스팅만 하면 되죠.