반응형
결론
- Pydantic 활용 Class생성
- LLM 모델에 bind_tools()
Pydantic 모델 -> Structured Output Tool로 자동 변환해서 바인딩한다.
-> 내가 원하는 양식(형식, 구조)으로 LLM의 답변을 강제하고 싶은 경우!
Pydantic 모델을 Class로 만들어 bind_tools()에 넣으면 됨!
#Structured output을 만들어줌
class PromptInstructions(BaseModel):
"""Instructions on how to prompt the LLM"""
objective: str
variables: List[str]
constraints: List[str]
requirements: List[str]
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)
llm_with_tool = llm.bind_tools([PromptInstructions])
Pydantic의 BaseModel을 상속한 Class를 툴로 바인딩하는 경우
- LLM이 해당 모델 구조에 맞춘 JSON 출력을 생성하도록 강제하기 위한 도구
- 즉, 도구 호출 형식으로 Strict JSON Schema 출력을 받아내기 위한 약속
- LLM이 PromptInstructions라는 함수를 호출해 결과를 반환하는 것 처럼 행동한다.
📌 bind_tools가 하는 일 (내부 동작)
1. Pydantic모델을 읽고
2. 그 모델의 Schema를 기반으로
3. "type": "function" 형식의 도구 정의를 생성함
4. LLM에게 이 형식을 사용해 도구 호출 형태로 응답할 수 있다 라고 알려줌
즉, LLM이 출력할 수 있는 새로운 Strict JSON형식 함수를 제공하는 셈
ex) 예시
get_message_info로 messages에 PromptInstructions을 모두 제공했다.
llm에 PromptInstructions를 tool로 등록해뒀으므로 invoke하면 리턴 값으로 관련된 tool 사용 정보를 받게 된다.
def get_message_info(messages):
# AI가 초기 목적을 까먹으면 안되기 때문에, 매번 template을 다시 넣어줘야함.
return [SystemMessage(content=template)] + messages
llm_with_tool.invoke(get_message_info([
"""1. **프롬프트의 목표**: 블로그 글 작성 가이드 (일상 관련 포스팅)
2. **프롬프트 템플릿에 전달될 변수**: 주제 (일상 관련)
3. **출력에서 하지 말아야 할 제약 조건**: 없음
4. **출력에서 반드시 지켜야 할 요구 사항**: 글의 길이는 500~1000자 내외, 친근한 형식"""
]))
리턴된 tool_calls
tool_calls=[
{'name': 'PromptInstructions', 'args': {'objective': '블로그 글 작성 가이드 (일상 관련 포스팅)', 'variables': ['주제 (일상 관련)'
], 'constraints': [], 'requirements': ['글의 길이는 500~1000자 내외', '친근한 형식'
]
}, 'id': 'call_5VedjU3H6R5SOzpBb4KECzwT', 'type': 'tool_call'
}
]반응형
'Agent' 카테고리의 다른 글
| LLM의 도구 호출이 정확히 뭐하는 걸까? (0) | 2025.11.30 |
|---|
댓글