Guidance
Guidance
Guidance는 Microsoft가 개발한 LLM 제어용 가이던스 언어예요. 생성·프롬프팅·논리 제어를 하나의 연속 흐름으로 엮어 구조화된 출력을 안정적으로 만드는 방법을 알아봅시다.
출처: 문서
본문
Guidance는 Microsoft가 개발한 대형 언어 모델 제어를 위한 가이던스 언어입니다.
Guidance 프로그램을 사용하면 생성(generation), 프롬프팅, 논리적 제어를 언어 모델이 실제로 텍스트를 처리하는 방식과 일치하는 단일 연속 흐름으로 엮을 수 있습니다.
구조화된 출력 (Structured Output)
Guidance의 특히 흥미로운 측면은 구조화된 객체(특정 스키마를 따르는 JSON, 또는 pydantic 객체)를 출력할 수 있다는 점입니다. 원하는 출력 구조를 LLM에게 "제안"만 하는 대신, Guidance는 실제로 LLM 출력이 원하는 스키마를 따르도록 "강제"할 수 있습니다. 이를 통해 LLM이 구문이 아닌 내용에 집중할 수 있고, 출력 파싱 문제가 발생할 가능성을 완전히 없앨 수 있습니다.
이 기능은 파라미터 수가 적고 충분한 소스 코드 데이터로 학습되지 않아 잘 구성된 계층형 구조 출력을 안정적으로 만들기 어려운 약한 LLM에서 특히 강력합니다.
pydantic 객체를 생성하는 guidance 프로그램 만들기
LlamaIndex에서는 구조화된 출력(더 구체적으로는 pydantic 객체)을 아주 쉽게 생성할 수 있도록 guidance와의 초기 통합을 제공합니다.
예를 들어 다음 스키마로 노래 앨범을 생성한다고 해 봅시다.
class Song(BaseModel):
title: str
length_seconds: int
class Album(BaseModel):
name: str
artist: str
songs: List[Song]
GuidancePydanticProgram을 만들고 원하는 pydantic 클래스 Album을 지정하고 적절한 프롬프트 템플릿을 제공하기만 하면 됩니다.
참고: guidance는 handlebars 스타일 템플릿을 사용하는데, 변수 치환에는 이중 중괄호, 리터럴 중괄호에는 단일 중괄호를 사용합니다. 이는 Python format string 규칙과 반대입니다.
from llama_index.core.prompts.guidance_utils import convert_to_handlebars를 사용하면 Python format string 스타일 템플릿을 guidance handlebars 스타일 템플릿으로 변환할 수 있습니다.
program = GuidancePydanticProgram(
output_cls=Album,
prompt_template_str="Generate an example album, with an artist and a list of songs. Using the movie {{movie_name}} as inspiration",
guidance_llm=OpenAI("text-davinci-003"),
verbose=True,
)
이제 추가 사용자 입력을 넣어 프로그램을 실행할 수 있습니다. 여기서는 으스스한 느낌으로 '샤이닝(The Shining)'에서 영감을 받은 앨범을 만들어 보겠습니다.
output = program(movie_name="The Shining")
pydantic 객체를 얻었습니다.
Album(
name="The Shining",
artist="Jack Torrance",
songs=[
Song(title="All Work and No Play", length_seconds=180),
Song(title="The Overlook Hotel", length_seconds=240),
Song(title="The Shining", length_seconds=210),
],
)
자세한 내용은 이 노트북으로 실습해 보세요.
guidance로 sub-question 쿼리 엔진의 견고성 높이기
LlamaIndex는 다양한 사용 사례를 다루기 위한 고급 쿼리 엔진 툴킷을 제공합니다. 그중 몇 가지는 중간 단계에서 구조화된 출력에 의존합니다. guidance를 사용하면 중간 응답이 기대하는 구조를 갖도록(구조화된 객체로 올바르게 파싱되도록) 보장해 이러한 쿼리 엔진의 견고성을 높일 수 있습니다.
예를 들어 SubQuestionQueryEngine에 끼워 넣어 기본 설정보다 더 견고하게 만들 수 있는 GuidanceQuestionGenerator를 구현해 보겠습니다.
from llama_index.question_gen.guidance import GuidanceQuestionGenerator
from guidance.llms import OpenAI as GuidanceOpenAI
# define guidance based question generator
question_gen = GuidanceQuestionGenerator.from_defaults(
guidance_llm=GuidanceOpenAI("text-davinci-003"), verbose=False
)
# define query engine tools
query_engine_tools = ...
# construct sub-question query engine
s_engine = SubQuestionQueryEngine.from_defaults(
question_gen=question_gen, # use guidance based question_gen defined above
query_engine_tools=query_engine_tools,
)
자세한 내용은 이 노트북을 참고하세요.