랭체인에서 tool/function calling을 활용한 output schema정의하기 - output parser미사용

 LangChain에서 tool/function calling을 사용하면, LLM이 아예 정의해둔 함수(또는 도구)를 직접 호출해서 자동으로 구조화된 JSON 객체 형태의 결과를 돌려주는 방식입니다.

아래는 툴 콜링을 활용해서 사용자의 질문에 대해 JSON 객체로 답변을 반환하는 매우 기본적인 예시입니다.

예시: LangChain tool/function calling으로 JSON 객체 받기

from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field

# 답변 스키마 정의 (Pydantic 사용)
class AnswerSchema(BaseModel):
    answer: str = Field(description="질문에 대한 정답")

# LLM(모델) 준비
model = ChatOpenAI()

# 사용할 툴(= 스키마) 등록
model_with_tools = model.bind_tools([AnswerSchema])

# 프롬프트(질문) 구성
prompt = PromptTemplate(
    template="다음 질문에 답하세요.\n{query}",
    input_variables=["query"]
)

# 체인 조립 (프롬프트 → LLM+툴)
chain = prompt | model_with_tools

# 실행 예시
result = chain.invoke({"query": "대한민국의 수도는 어디인가요?"})

print(result)  
# 출력 예시: {'answer': '서울'}

작동 원리 설명

  • AnswerSchema 클래스로 반환될 JSON 구조(키, 타입, 설명) 를 명확히 지정합니다.
  • bind_tools([AnswerSchema]) 로 모델에 해당 스키마(툴)를 직접 "바인딩"합니다.
  • 모델에 질문을 보내면, LLM이 내부적으로 이 스키마에 맞는 JSON 객체({'answer': '서울'})를 그대로 반환합니다.
    • 파싱 오류, 문자열 처리 등이 생기지 않고 안전하게 바로 structured 데이터로 받게 됩니다.

이 방식은 OpenAI, Anthropic, Google 같은 최신 LLM들이 공식 지원하고 있습니다. 코드 예시는 Python 기준이지만, 구조화된 결과(JSON 객체)를 안전하게 쓰고 싶을 때 가장 권장되는 방식입니다.

[펼치기]

댓글