LangChain 구조화 출력

LangChain 구조화 출력 (Structured Output)

LLM은 자유롭게 텍스트를 생성하지만, 애플리케이션에서는 종종 정해진 포맷의 응답이 필요해요. 예를 들어 함수 인자로 쓸 JSON이나, 데이터베이스 스키마에 맞는 레코드 같은 것들이요. LangChain의 구조화 출력(structured output)은 모델의 응답을 정의된 스키마에 강제해서, 검증된 데이터를 안정적으로 받을 수 있게 해줘요.

구조화 출력은 에이전트의 response_format= 파라미터로 지정할 수 있어요. Pydantic 모델이나 JSON 스키마를 넘기면, 모델이 그 규격을 지키는 응답을 만들어요.

출처: LangChain Structured Output 공식 문서

Pydantic 모델로 구조화 출력 만들기

create_agentresponse_format=으로 Pydantic 모델을 넘기면, 에이전트가 그 스키마에 맞는 응답을 반환해요.

from pydantic import BaseModel
from langchain.agents import create_agent

class Answer(BaseModel):
    summary: str
    confidence: float

agent = create_agent(
    model="openai:gpt-5.5",
    tools=tools,
    response_format=Answer,
)

result = agent.invoke({"messages": [{"role": "user", "content": "Summarize AI trends"}]})
result["structured_response"]  # Answer(summary=..., confidence=...)

호출 결과의 structured_response 키에 검증된 Pydantic 객체가 들어와요. 이렇게 하면 자유 텍스트를 파싱하면서 생기는 오류를 줄일 수 있어요.

JSON 스키마 방식

Pydantic 대신 JSON 스키마를 넘길 수도 있어요. 모델 응답이 해당 JSON 스키마를 만족하도록 강제할 때 유용해요.

{
  "type": "object",
  "properties": {
    "summary": {"type": "string"},
    "confidence": {"type": "number"}
  },
  "required": ["summary", "confidence"]
}

구조화 출력이 유용한 상황

  • API 응답: 클라이언트가 파싱하기 쉬운 고정 포맷
  • 함수/도구 인자: 도구 호출 시 모델이 정확한 스키마의 인자를 넘기도록 보장
  • 데이터 추출: 문서에서 특정 필드를 일관된 구조로 추출
  • 데이터베이스 연동: 스키마에 맞는 레코드를 그대로 저장

구조화 출력과 도구 호출

구조화 출력은 도구 호출과도 자연스럽게 얽혀요. 모델이 도구를 호출할 때도 인자를 정의된 스키마에 맞춰야 하므로, 에이전트가 여러 도구를 번갈아 쓰면서도 각 호출의 인자가 정확히 검증되도록 해줘요.

더 알아보기