1 LLM에 도구 바인딩 (Binding Tools)
- Binding: LLM이 외부 도구/기능을 호출할 수 있도록 연결하는 것
- LLM 모델이 도구(tool) 를 호출할 수 있으려면 chat 요청을 할 때 모델에 도구 스키마(tool schema) 를 전달해야 한다.
- Tool Binding = (LLM = 뇌 + Tools = 손/발) = “LLM의 손 많아지기” = 도구 쥐어주기
- 없을 때: 생각만 함 (추측)
- 있을 때: 생각하면서 실제 손과 발을 움직여 행동하게 된다. (검증)
- 하지만 “언제 손을 쓸지 판단”하는 뇌(LLM 내부 신뢰도 시스템)가 약하면, 손이 있어도 쓸 줄 모르게 된다.
- 용어
- Binding Tools = Function Calling = Tool Calling
LLM (Claude)
↓
Tool Binding Layer
↓
실제 Tools (Web Search, Code Execution, File Access 등)
- 도구 호출(tool calling) 기능을 지원하는 LangChain Chat Model 은
.bind_tools()메서드를 구현하여 - LangChain 도구 객체, Pydantic 클래스 또는 JSON 스키마 목록을 수신하고 공급자별 예상 형식으로 채팅 모델에 바인딩(binding) 한다.
- 바인딩된 Chat Model 의 후속 호출은 모델 API에 대한 모든 호출에 도구 스키마를 포함
- 참고) 모든 LLM 모델이 Tool Calling이 가능한 것은 아님.
- 하지만, 요즘 트렌드는 도구 사용이 대세이기 때문에 거의 모든 모델에 이 기능이 구현될 것.
- 만약 오류가 나면 아직 Tool Calling 기능이 LLM 모델에 구현이 안된 것.
2 LLM에 바인딩할 Tool 정의
실험을 위한 도구(tool) 를 정의한다. - get_word_length : 단어의 길이를 반환하는 함수 - add_function : 두 숫자를 더하는 함수 - naver_news_crawl : 네이버 뉴스 기사를 크롤링하여 본문 내용을 반환하는 함수
참고 - 도구를 정의할 때 @tool 데코레이터를 사용하여 도구를 정의 - docstring 은 가급적 영어로 작성하는 것을 권장
import re
import requests
from bs4 import BeautifulSoup
from langchain.agents import tool
# 도구를 정의합니다.
@tool
def get_word_length(word: str) -> int:
"""Returns the length of a word."""
return len(word)
@tool
def add_function(a: float, b: float) -> float:
"""Adds two numbers together."""
return a + b
# 오직 Naver 형식의 URL만 가능
@tool
def naver_news_crawl(news_url: str) -> str:
"""Crawls a 네이버 (naver.com) news article and returns the body content."""
# HTTP GET 요청 보내기
response = requests.get(news_url)
# 요청이 성공했는지 확인
if response.status_code == 200:
# BeautifulSoup을 사용하여 HTML 파싱
soup = BeautifulSoup(response.text, "html.parser")
# 원하는 정보 추출
title = soup.find("h2", id="title_area").get_text()
content = soup.find("div", id="contents").get_text()
cleaned_title = re.sub(r"\n{2,}", "\n", title)
cleaned_content = re.sub(r"\n{2,}", "\n", content)
else:
print(f"HTTP 요청 실패. 응답 코드: {response.status_code}")
return f"{cleaned_title}\n{cleaned_content}"
tools = [get_word_length, add_function, naver_news_crawl]3 bind_tools() 로 LLM 에 도구 바인딩
llm 모델에 bind_tools() 를 사용하여 도구를 바인딩한다.
from langchain_openai import ChatOpenAI
# 모델 생성
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# 도구 바인딩
llm_with_tools = llm.bind_tools(tools)- 실행결과를 확인한다.
- 결과는
tool_calls에 저장됨 - 따라서,
.tool_calls를 확인하여 도구 호출 결과를 확인 - 만약, LLM이 도구 활용 성능이 떨어진다고 생각되면 LLM 모델 (뇌)을 바꾸면 된다.
- 예, “gpt-4o-mini” > “gpt-4o-1”
참고 - name 은 도구의 이름을 의미 - args 는 도구에 전달되는 인자를 의미
# 실행 결과
#llm_with_tools.invoke("What is the length of the word 'teddynote'?") # 도구를 안쓴 것
llm_with_tools.invoke("What is the length of the word 'teddynote'?").tool_calls # 도구를 쓴 것[{'name': 'get_word_length', 'args': {'word': 'teddynote'}, 'id': 'call_ReeUlCuSd35Marox3yaxMgcH', 'type': 'tool_call'}]
llm_with_tools는 어떤 도구를 쓸 것인지 판단만 한 것 (판단 결과만 출력됨)- 다음으로는
llm_with_tools와JsonOutputToolsParser를 연결하여tool_calls를 parsing 하여 결과를 확인JsonOutputToolsParser:llm_with_tools의 도구 사용 판단 결과에 어떤 함수 즉, 어떤 도구에 어떤 argument를 넣어야하는지 parsing만 해줌
from langchain_core.output_parsers.openai_tools import JsonOutputToolsParser
# 도구 바인딩 + 도구 파서
chain = llm_with_tools | JsonOutputToolsParser(tools=tools)
# 실행 결과
tool_call_results = chain.invoke("What is the length of the word 'teddynote'?")print(tool_call_results, end="\n\n==========\n\n")
# 첫 번째 도구 호출 결과
single_result = tool_call_results[0]
# 도구 이름
print(single_result["type"])
# 도구 인자
print(single_result["args"])실행 결과는 다음과 같습니다.
[{'args': {'word': 'teddynote'}, 'type': 'get_word_length'}]
==========
get_word_length
{'word': 'teddynote'}
참고 - type: 도구의 이름 - args: 도구에 전달되는 인자
execute_tool_calls: 도구 이름과 일치하는 도구를 for loop을 돌면서 찾아 직접호출하여 실행
execute_tool_calls함수는 도구를 찾아 args 를 전달하여 도구를 실행- 즉,
type은 도구의 이름을 의미하고args는 도구에 전달되는 인자를 의미
def execute_tool_calls(tool_call_results):
"""
도구 호출 결과를 실행하는 함수
:param tool_call_results: 도구 호출 결과 리스트
:param tools: 사용 가능한 도구 리스트
"""
# 도구 호출 결과 리스트를 순회합니다.
for tool_call_result in tool_call_results:
# 도구의 이름과 인자를 추출합니다.
tool_name = tool_call_result["type"] # 도구의 이름(함수명)
tool_args = tool_call_result["args"] # 도구에 전달되는 인자
# 도구 이름과 일치하는 도구를 찾아 실행합니다.
# next() 함수를 사용하여 일치하는 첫 번째 도구를 찾습니다.
matching_tool = next((tool for tool in tools if tool.name == tool_name), None)
if matching_tool:
# 일치하는 도구를 찾았다면 해당 도구를 실행합니다.
result = matching_tool.invoke(tool_args)
# 실행 결과를 출력합니다.
print(f"[실행도구] {tool_name} [Argument] {tool_args}\n[실행결과] {result}")
else:
# 일치하는 도구를 찾지 못했다면 경고 메시지를 출력합니다.
print(f"경고: {tool_name}에 해당하는 도구를 찾을 수 없습니다.")
# 도구 호출 실행
# 이전에 얻은 tool_call_results를 인자로 전달하여 함수를 실행합니다.
execute_tool_calls(tool_call_results)[실행도구] get_word_length
[실행결과] 9
4 위의 일련의 과정을 한 번에 실행
- bind_tools + Parser + Execution
llm_with_tools: 도구를 바인딩한 모델JsonOutputToolsParser: 도구 호출 결과를 파싱하는 파서execute_tool_calls: 도구 호출 결과를 실행하는 함수
- 흐름 정리
- 모델에 도구를 바인딩
- 도구 호출 결과를 파싱
- 도구 호출 결과를 실행
from langchain_core.output_parsers.openai_tools import JsonOutputToolsParser
# bind_tools + Parser + Execution
chain = llm_with_tools | JsonOutputToolsParser(tools=tools) | execute_tool_calls[실행도구] add_function
[실행결과] 235.7
235.7
# 실행 결과
chain.invoke(
"뉴스 기사 내용을 크롤링해줘: https://n.news.naver.com/mnews/hotissue/article/092/0002347672?type=series&cid=2000065"
)[실행도구] naver_news_crawl
[실행결과] [미장브리핑] 9월 미국 CPI 주목…3분기 S&P500 실적 발표
▲10일(현지시간) 미국 9월 소비자물가지수(CPI) 발표 예정. 고용 지표가 양호하게 나온 가운데 물가 지표 주목. 9월 미국 비농업고용 25만4천명 증가해 시장 예상치 14만명 크게 상회. 이는 6개월 래 최대 규모로 지난 12개월 평균값 20만3천명 증가한 것보다도 높은 수치. 9월 실업률은 4.1%로 2개월 연속 하락했으며, 평균 시간당 임금은 전년 동월 대비 4% 증가해 5월 이후 최고 수준.▲시장에서 9월 헤드라인 CPI는 8월 전년 동월 대비 2.6% 로 5개월 연속 둔화하고 9월에는 2.3% 증가로 추가 하락 예상. 전월 대비도 8월 0.2% 둔화 예상. 근원 CPI는 지난 8월 3.2%와 비슷한 수준 관측.▲11일에는 미국 9월 제조업물가지수(PPI) 발표. 지난 6월 부터 8월까지 반등 추세 꺾여. 8월은 1.7% 증가.
(사진=이미지투데이)▲11월 미국 연방준비제도(연준) 공개시장위원회(FOMC) 에서 0.50%p 인하 기대가 크케 후퇴한 가운데, 9일에는 FOMC 의사록 공개. 지난 9월 회의에서 빅컷(0.50%p) 단행한 배경과 인플레이션 전망에 대한 논의를 알 수 있을 것으로 보여.▲미국 스탠다드앤푸어스(S&P) 500 기업의 3분기 실적 발표 시작. 평균 이익증가율 추정치는 전년 동기 대비 4.6%로 5개분기 연속 플러스이나 증가폭은 둔화 예상. 11일부터 JP모건체이스, 웰스파고 등 대형은행들의 실적 발표.▲FTSE 러셀은 8일 정례 시장분류 결과를 발표. 한국은 2022년 관찰대상국 지정 이후 금번 시장접근성 등급(L1) 상향으로 세계국채지수(WGBI) 에 편입될 지 관심. 주식의 경우 지난 2009년부터 선진국 지수에 편입돼 있는 한국 증시에 대해 공매도 제한 등을 이유로 관찰 대상국으로 지정할지 관심. 지정되더라도 검토 기간이 있어 즉각 제외되지는 않음.
손희연 기자(kunst@zdnet.co.kr)
기자 프로필
손희연 기자
구독
구독중
구독자 0
응원수
0
디지털이 접목되는 금융·식음료업계를 취재합니다
나도 모르게 대출 신청이?…"인뱅 통해 사전차단 가능"
우리은행 올해만 세 번째 금융사고…"허위서류로 55억 대출"
지디넷코리아의 구독 많은 기자를 구독해보세요!
닫기
Copyright ⓒ ZDNet Korea. All rights reserved. 무단 전재 및 재배포 금지.
이 기사는 언론사에서 IT 섹션으로 분류했습니다.
기사 섹션 분류 안내
기사의 섹션 정보는 해당 언론사의 분류를 따르고 있습니다. 언론사는 개별 기사를 2개 이상 섹션으로 중복 분류할 수 있습니다.
닫기
구독
메인에서 바로 보는 언론사 편집 뉴스 지금 바로 구독해보세요!
구독중
메인에서 바로 보는 언론사 편집 뉴스 지금 바로 확인해보세요!
지디넷코리아 '홈페이지'
QR 코드를 클릭하면 크게 볼 수 있어요.
QR을 촬영해보세요.
지디넷코리아 '홈페이지'
닫기
네이버 채널 구독하기
주요뉴스해당 언론사에서 선정하며 언론사 페이지(아웃링크)로 이동해 볼 수 있습니다.
KB금융, 광주 1인 여성 자영업자에 월 100만원 지원
아파트만? 이제 빌라 주담대도 갈아타자
카카오뱅크, 6일 새벽 금융거래 일시 중단
우리은행 올해만 세 번째 금융사고…"허위서류로 55억 대출"
이 기사를 추천합니다
기사 추천은 24시간 내 50회까지 참여할 수 있습니다.
닫기
쏠쏠정보
0
흥미진진
0
공감백배
0
분석탁월
0
후속강추
0
모두에게 보여주고 싶은 기사라면?beta
이 기사를 추천합니다 버튼을 눌러주세요. 집계 기간 동안 추천을 많이 받은 기사는 네이버 자동 기사배열 영역에 추천 요소로 활용됩니다.
레이어 닫기
연재
미장브리핑
구독 명
구독
구독중
구독해주셔서 감사합니다
구독한 연재는 설정 페이지에서확인할 수 있습니다
닫기
더보기
9월 미국 CPI 주목…3분기 S&P500 실적 발표
중동발 긴장 고조…한 때 원유값 급등
9월 고용지표 발표 주목…부통령 후보 토론회 개최
지디넷코리아 언론사홈 바로가기
기자 구독 후 기사보기
구독 없이 계속 보기
연재 구독 후 기사보기
구독 없이 계속 보기
5 bind_tools > Agent & AgentExecutor 로 대체
bind_tools()는 모델에 사용할 수 있는 스키마(도구)를 제공bind_tools()의 일련의 복잡한 과정을Agent & AgentExecutor로 대체bind_tools()은 같은 도구를 반복적으로 사용하기 힘듦, 하지만Agent Executer쉬움
AgentExecutor는 실제로 llm 호출, 올바른 도구로 라우팅, 실행, 모델 재호출 등을 위한 실행 루프를 생성
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
# Agent 프롬프트 생성
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"You are very powerful assistant, but don't know current events",
),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
# 모델 생성
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)from langchain.agents import create_tool_calling_agent
from langchain.agents import AgentExecutor
# 이전에 정의한 도구 사용
tools = [get_word_length, add_function, naver_news_crawl]
# Agent 생성
agent = create_tool_calling_agent(llm, tools, prompt)
# AgentExecutor 생성
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True,
)# Agent 실행
result = agent_executor.invoke({"input": "How many letters in the word `teddynote`?"})
# 결과 확인
print(result["output"])
Entering new AgentExecutor chain...
Invoking: `get_word_length` with `{'word': 'teddynote'}`
The word "teddynote" has 9 letters.
Finished chain.
The word "teddynote" has 9 letters.
# Agent 실행
result = agent_executor.invoke({"input": "114.5 + 121.2 의 계산 결과는?"})
# 결과 확인
print(result["output"])Entering new AgentExecutor chain...
Invoking: `add_function` with `{'a': 114.5, 'b': 121.2}`
235.7114.5 + 121.2의 계산 결과는 235.7입니다.
Finished chain.
114.5 + 121.2의 계산 결과는 235.7입니다.
한 번의 실행으로 끝나는 것이 아닌, 모델이 자신의 결과를 확인하고 다시 자신을 호출하는 과정을 거칩니다.
# Agent 실행
result = agent_executor.invoke(
{"input": "114.5 + 121.2 + 34.2 + 110.1 의 계산 결과는?"}
)
# 결과 확인
print(result["output"])
print("==========\n")
print(114.5 + 121.2 + 34.2 + 110.1)Entering new AgentExecutor chain...
Invoking: `add_function` with `{'a': 114.5, 'b': 121.2}`
235.7
Invoking: `add_function` with `{'a': 34.2, 'b': 110.1}`
144.3
Invoking: `add_function` with `{'a': 235.7, 'b': 144.3}`
380.0114.5 + 121.2 + 34.2 + 110.1의 계산 결과는 380.0입니다.
Finished chain.
114.5 + 121.2 + 34.2 + 110.1의 계산 결과는 380.0입니다.
==========
380.0
이번에는 뉴스 결과를 크롤링 해서 요약 해달라는 요청을 수행
result = agent_executor.invoke(
{
"input": "뉴스 기사를 요약해 줘: https://n.news.naver.com/mnews/hotissue/article/092/0002347672?type=series&cid=2000065"
}
)
print(result["output"])
Entering new AgentExecutor chain...
Invoking: `naver_news_crawl` with `{'news_url': 'https://n.news.naver.com/mnews/hotissue/article/092/0002347672?type=series&cid=2000065'}`
[미장브리핑] 9월 미국 CPI 주목…3분기 S&P500 실적 발표
▲10일(현지시간) 미국 9월 소비자물가지수(CPI) 발표 예정. 고용 지표가 양호하게 나온 가운데 물가 지표 주목. 9월 미국 비농업고용 25만4천명 증가해 시장 예상치 14만명 크게 상회. 이는 6개월 래 최대 규모로 지난 12개월 평균값 20만3천명 증가한 것보다도 높은 수치. 9월 실업률은 4.1%로 2개월 연속 하락했으며, 평균 시간당 임금은 전년 동월 대비 4% 증가해 5월 이후 최고 수준.▲시장에서 9월 헤드라인 CPI는 8월 전년 동월 대비 2.6% 로 5개월 연속 둔화하고 9월에는 2.3% 증가로 추가 하락 예상. 전월 대비도 8월 0.2% 둔화 예상. 근원 CPI는 지난 8월 3.2%와 비슷한 수준 관측.▲11일에는 미국 9월 제조업물가지수(PPI) 발표. 지난 6월 부터 8월까지 반등 추세 꺾여. 8월은 1.7% 증가.
(사진=이미지투데이)▲11월 미국 연방준비제도(연준) 공개시장위원회(FOMC) 에서 0.50%p 인하 기대가 크케 후퇴한 가운데, 9일에는 FOMC 의사록 공개. 지난 9월 회의에서 빅컷(0.50%p) 단행한 배경과 인플레이션 전망에 대한 논의를 알 수 있을 것으로 보여.▲미국 스탠다드앤푸어스(S&P) 500 기업의 3분기 실적 발표 시작. 평균 이익증가율 추정치는 전년 동기 대비 4.6%로 5개분기 연속 플러스이나 증가폭은 둔화 예상. 11일부터 JP모건체이스, 웰스파고 등 대형은행들의 실적 발표.▲FTSE 러셀은 8일 정례 시장분류 결과를 발표. 한국은 2022년 관찰대상국 지정 이후 금번 시장접근성 등급(L1) 상향으로 세계국채지수(WGBI) 에 편입될 지 관심. 주식의 경우 지난 2009년부터 선진국 지수에 편입돼 있는 한국 증시에 대해 공매도 제한 등을 이유로 관찰 대상국으로 지정할지 관심. 지정되더라도 검토 기간이 있어 즉각 제외되지는 않음.
손희연 기자(kunst@zdnet.co.kr)
기자 프로필
손희연 기자
구독
구독중
구독자 0
응원수
0
디지털이 접목되는 금융·식음료업계를 취재합니다
나도 모르게 대출 신청이?…"인뱅 통해 사전차단 가능"
우리은행 올해만 세 번째 금융사고…"허위서류로 55억 대출"
지디넷코리아의 구독 많은 기자를 구독해보세요!
닫기
Copyright ⓒ ZDNet Korea. All rights reserved. 무단 전재 및 재배포 금지.
이 기사는 언론사에서 IT 섹션으로 분류했습니다.
기사 섹션 분류 안내
기사의 섹션 정보는 해당 언론사의 분류를 따르고 있습니다. 언론사는 개별 기사를 2개 이상 섹션으로 중복 분류할 수 있습니다.
닫기
구독
메인에서 바로 보는 언론사 편집 뉴스 지금 바로 구독해보세요!
구독중
메인에서 바로 보는 언론사 편집 뉴스 지금 바로 확인해보세요!
지디넷코리아 '홈페이지'
QR 코드를 클릭하면 크게 볼 수 있어요.
QR을 촬영해보세요.
지디넷코리아 '홈페이지'
닫기
네이버 채널 구독하기
주요뉴스해당 언론사에서 선정하며 언론사 페이지(아웃링크)로 이동해 볼 수 있습니다.
KB금융, 광주 1인 여성 자영업자에 월 100만원 지원
아파트만? 이제 빌라 주담대도 갈아타자
카카오뱅크, 6일 새벽 금융거래 일시 중단
우리은행 올해만 세 번째 금융사고…"허위서류로 55억 대출"
이 기사를 추천합니다
기사 추천은 24시간 내 50회까지 참여할 수 있습니다.
닫기
쏠쏠정보
0
흥미진진
0
공감백배
0
분석탁월
0
후속강추
0
모두에게 보여주고 싶은 기사라면?beta
이 기사를 추천합니다 버튼을 눌러주세요. 집계 기간 동안 추천을 많이 받은 기사는 네이버 자동 기사배열 영역에 추천 요소로 활용됩니다.
레이어 닫기
연재
미장브리핑
구독 명
구독
구독중
구독해주셔서 감사합니다
구독한 연재는 설정 페이지에서확인할 수 있습니다
닫기
더보기
9월 미국 CPI 주목…3분기 S&P500 실적 발표
중동발 긴장 고조…한 때 원유값 급등
9월 고용지표 발표 주목…부통령 후보 토론회 개최
지디넷코리아 언론사홈 바로가기
기자 구독 후 기사보기
구독 없이 계속 보기
연재 구독 후 기사보기
구독 없이 계속 보기
기사 요약:
9월 10일(현지시간) 미국의 소비자물가지수(CPI) 발표가 예정되어 있으며, 고용 지표가 양호하게 나온 가운데 물가 지표에 대한 관심이 집중되고 있다. 9월 비농업 고용은 25만4천명 증가하여 시장 예상치를 크게 상회했으며, 실업률은 4.1%로 2개월 연속 하락했다. 평균 시간당 임금은 전년 대비 4% 증가했다.
9월 헤드라인 CPI는 8월 대비 2.6%로 5개월 연속 둔화되었고, 9월에는 2.3% 증가할 것으로 예상된다. 11일에는 제조업 물가지수(PPI) 발표도 예정되어 있다. 또한, 미국 S&P 500 기업의 3분기 실적 발표가 시작되며, 평균 이익 증가율은 전년 동기 대비 4.6%로 예상된다.
FTSE 러셀은 한국의 시장 접근성 등급을 상향 조정할 가능성에 대한 관심이 모아지고 있다.
Finished chain.
기사 요약:
9월 10일(현지시간) 미국의 소비자물가지수(CPI) 발표가 예정되어 있으며, 고용 지표가 양호하게 나온 가운데 물가 지표에 대한 관심이 집중되고 있다. 9월 비농업 고용은 25만4천명 증가하여 시장 예상치를 크게 상회했으며, 실업률은 4.1%로 2개월 연속 하락했다. 평균 시간당 임금은 전년 대비 4% 증가했다.
9월 헤드라인 CPI는 8월 대비 2.6%로 5개월 연속 둔화되었고, 9월에는 2.3% 증가할 것으로 예상된다. 11일에는 제조업 물가지수(PPI) 발표도 예정되어 있다. 또한, 미국 S&P 500 기업의 3분기 실적 발표가 시작되며, 평균 이익 증가율은 전년 동기 대비 4.6%로 예상된다.
FTSE 러셀은 한국의 시장 접근성 등급을 상향 조정할 가능성에 대한 관심이 모아지고 있다.