AI 공부

4. Tool calling 및 멀티모달(음성, 이미지) 적용_Gradio 항공예약 챗봇

kdb1248 2026. 2. 1. 17:48

목차

1. Day 8 - 지시기반 프롬프트 테스트_고객 CS 챗봇 

2. Day 9 - Tool Calling 적용_항공예약 챗봇

3. Day 10 - 멀티모달(이미지, 음성) 적용_항공예약 챗봇

 


1. Day 8 -지시기반 프롬프트 테스트_고객 CS 챗봇 

Gradio 챗봇을 만들면서 시스템 프롬프트에 여러 지시기반 프롬프트를 넣어 잘 작동하는지를 테스트해보는 시간이었다.

 

1) Gradio 세팅

- Gradio 챗봇에서 1) 시스템 프롬프트 2) 과거 대화 맥락 (history) 3) 유저 프롬프트 를 모두 활용하기 위한 초기 세팅

 

2) Gradio의 "messages" 이용해서 OpenAI 규격으로 유저의 채팅 메시지 넘기기 

- 유저로 부터 메시지가 들어왔을 때 해당 메시지들을 OpenAI에서 요구하는 규격 {'role': ~~ , 'content': ~~} 형식으로 바꿔서 전달

gr.ChatInterface(fn=chat, type="messages").launch()

 

3) 지시기반 프롬프트 테스트_고객 CS 챗봇 

- 시스템 프롬프트 반영하여 1) 열정적인 응대 2) 모자가 60% 세일한다는 것 강조해서 답변하는 걸 볼 수 있음

system_message = "You are a helpful assistant in a clothes store. You should try to gently encourage \
the customer to try items that are on sale. Hats are 60% off, and most other items are 50% off. \
For example, if the customer says 'I'm looking to buy a hat', \
you could reply something like, 'Wonderful - we have lots of hats - including several that are part of our sales event.'\
Encourage the customer to buy hats if they are unsure what to get."

열정적 응대 + 모자 60% 세일 강조

 

2. Day 9 - Tool Calling 적용_항공예약 챗봇

단순히 모델의 응답만 받는게 아니라, 상황에 따라서 모델이 적절한 Tool을 Call 해서 사용할 수 있도록 하는 법을 배웠던 시간.

 

최근 들어서 에이전트가 대두되면서 단순한 모델 성능보다도 

1) 이 모델 얼마나 Tool Calling 잘하냐?

2) 실제 에이전트 구축 시 적절히 Tool call해가면서 돌아가도록 시스템 구축할 수 있냐 

가 많이 중요해지고 있음.

 

실제 일하면서 말로는 쉽게 Tool calling, Tool calling 했지만 이게 진짜로 코드단에서 어떻게 돌아가나를 알진 못했었는데

이를 직접 구현해보고 배워볼 수 있는 기회여서 의미가 있었다. 

 

아래는 항공 예약 챗봇에 [티켓 가격을 조회하는 Tool]을 붙여본 예시이다. 


 

1) 티켓 가격 조회 함수 정의 

- 특정 도시명을 입력하면 해당 도시의 티켓 가격을 조회하는 함수를 정의 

 

2) 모델이 함수를 활용할 수 있도록 Tool 화 

- LLM이 외부 함수를 호출하려면 "이 함수가 무엇을 하는지, 어떤 인자를 받느지" 정확히 설명하는 구조 필요 

- price_function 은 “티켓 가격을 가져오는 함수(get_ticket_price)”를 모델에게 알려주는 함수 정의서 (Function Schema)

# There's a particular dictionary structure that's required to describe our function:

price_function = {
    "name": "get_ticket_price",
    "description": "Get the price of a return ticket to the destination city. Call this whenever you need to know the ticket price, for example when a customer asks 'How much is a ticket to this city'",
    "parameters": {
        "type": "object",
        "properties": {
            "destination_city": {
                "type": "string",
                "description": "The city that the customer wants to travel to",
            },
        },
        "required": ["destination_city"],
        "additionalProperties": False
    }
}

a. 코드 설명 

- name: 실제 툴(또는 함수)의 이름  (LLM이 "이름으로" 함수를 호출할 수 있게 함)

- description: 이 함수가 어떤 역할을 하는지 자연어로 설명. LLM이 언제, 왜 이 함수를 써야 하는지 “이해”할 수 있게 함
(즉, 모델이 “티켓 가격 알려줘”라는 요청을 받으면 이 함수를 써야겠다고 판단)

- parameters: 함수의 입력값(파라미터) 구조를 JSON Schema 형태로 명시

  . required 반드시 입력해야 하는 필드

  . additionalProperties 정의된 것 외의 값은 거부

 

- 이 schema를 LLM에 등록하면, 사용자가 “서울 왕복 티켓 얼마에요?”라고 묻는 순간 모델은 이렇게 판단

{
  "function_call": {
    "name": "get_ticket_price",
    "arguments": {
      "destination_city": "Seoul"
    }
  }
}

 

3) tools 리스트로 사용할 함수(도구)를 등록 

- LLM 이 아래 정리한 tool list에서 적절한 tool을 불러 쓸 수 있음 (지금은 "price function" 1개만)

# And this is included in a list of tools:

tools = [{"type": "function", "function": price_function}]

 

4) OpenAI LLM이 정의한 Tool 을 쓸 수 있게 하기

4)-1 Chat 함수 

chat 함수 (tool 도 파라미터로 전달)

 

a. 코드 설명 

response = openai.chat.completions.create(model=MODEL, messages=messages, tools=tools)

- LLM 에게  “대화 내역 + 사용할 수 있는 tool 목록” 전달. tools 파라미터 덕분에 LLM이 “이럴 땐 tool(함수) 써야겠다” 고 판단 

 

✅ 도구 호출 감지
    if response.choices[0].finish_reason=="tool_calls":

- finish_reason == "tool_calls"인 경우, 모델이 “함수 호출을 원한다”고 신호를 보낸 것임

즉, "How much is a ticket to Seoul?" 같은 질문을 받으면 모델이 "get_ticket_price" 호출 요청을 반환함

 

-finish_reason?:  AI가 이번 대답을 어떤 이유로 멈췄는가”를 알려주는 표시

예를 들면 아래와 같음.

. "stop" AI가 자기 말이 끝났다고 판단 (보통 자연스러운 끝)
. "length" 토큰 제한 때문에 멈춤
. "content_filter" 안전 필터에 걸림
. "tool_calls"  AI가 도구를 써야 한다고 판단함

 

3️⃣ 실제 함수 호출 처리
        message = response.choices[0].message
        response, city = handle_tool_call(message)

- 모델이 반환한 메시지를 handle_tool_call() 로 전달
- handle_tool_call() 함수가 실제 함수를 실행하고, 그 결과를 LLM에게 전달할 메시지를 만들어 반환

 

 messages.append(message)
 messages.append(response)
 response = openai.chat.completions.create(model=MODEL, messages=messages)

- 모델의 “함수 호출 요청 메시지” + “실행 결과 메시지”를 함께 다시 전달

- 이렇게 하면 LLM은 실행된 결과(예: "Seoul 티켓 가격은 ₩120,000입니다")를 자연스러운 문장으로 완성함

 

4)-2 handle_tool_call 함수 

tool call 구체적 어떻게 돌아가는지 확인 가능

 

a. 코드 설명 

handle_tool_call() 함수 상세

def handle_tool_call(message):
    tool_call = message.tool_calls[0]
    arguments = json.loads(tool_call.function.arguments)
    city = arguments.get('destination_city')

 

-모델이 요청한 함수 호출 정보를 가져옴
1)어떤 함수(tool_call.function.name), 2) 어떤 인자(arguments) 인지 가져오고
-> 그 인자를 활용해 destination_city 값을 꺼냄

price = get_ticket_price(city)

해당 city 값 활용해서 실제 Python에서 정의된 함수 실행
→ 예: get_ticket_price("Seoul")
→ 결과: 120000 같은 숫자 반환

response = {
        "role": "tool",
        "content": json.dumps({"destination_city": city,"price": price}),
        "tool_call_id": tool_call.id
    }

- 이건 “함수 실행 결과를 LLM에게 전달할 메시지”
- role 은 "tool" — 즉, “이건 툴 실행 결과야”라고 알려주는 역할
- content 는 함수의 결과를 JSON으로 담음
- tool_call_id 로 어떤 호출의 응답인지 연결

return response, city

- 완성된 응답 메시지(response)와 도시명(city)을 반환

 

4)-3 전체 흐름 시각화/실행 예시 

실제 티켓 가격 등록되어있는 베를린의 경우 tool call해서 정확한 가격 가져오는 걸 볼 수 있다

 

 

3. Day 10 - 멀티모달(이미지, 음성) 적용_항공예약 챗봇

Day 10은 Day 9에서 tool call로 만든 항공 예약 챗봇에 멀티모달 기능 (이미지 생성, 음성 답변) 등을 추가해 고도화해보는 시간이었다.

 

1) 이미지 생성 적용 

DALL-E 3 이용해 Seoul의 이미지를 생성한 것

- OpenAI의 DALL-E 3 모델을 이용해, 입력하는 도시의 이미지를 여행 스팟 포함한 팝아트 스타일로 만드는 함수를 정의 

 

2) 음성 적용 

TTS 모델 활용해 음성 생성

- OpenAI TTS 모델 활용해서 입력받은 문자열을 음성으로 생성해주는 함수 

 

3) 항공예약 챗봇에 멀티모달(이미지, 음성) 적용 

- 텍스트 챗 + (선택적 이미지 생성) + 음성(TTS)로 응답하는 챗봇 구축

- Tool 호출이 될 때만, 호출에 쓰인 city 를 이용해서 이미지 생성까지 해준다. (음성 TTS는 항상)

- 즉, 

1) 일반 대화 -> 텍스트 챗 + 음성(TTS)로 대답

2) Tool 호출 필요한 상황(티켓 가격 물어보는 경우) -> 텍스트 챗 + 음성(TTS) + 해당 도시 이미지 생성까지 해준다. 

관련 코드

 

실제 챗봇이 각 시나리오 (일반대화, tool 호출 필요상황) 에서 어떻게 구현됐는지를 아래 영상을 통해 볼 수 있다. 

 

1) 일반 대화 -> 텍스트 챗 + 음성(TTS)로 대답

https://youtu.be/TtrNnii2YHs

챗봇 테스트(음성만)

 

2) Tool 호출 필요한 상황(티켓 가격 물어보는 경우) -> 텍스트 챗 + 음성(TTS) + 해당 도시 이미지 생성까지 해준다. 

https://youtube.com/shorts/r5y_qZSxYYM?feature=share

챗봇 테스트(음성 + 이미지)_llm 답변 딜레이가 있어 영상 조금 넘기기 필요

이번 글에선 일하며 여기저기서 듣기만 많이 했던 Tool calling을 직접 코드단에서 구현해 보는 경험, 

그리고 챗봇 구축에 있어 단순 텍스트 챗봇을 넘어 멀티모달 기능(음성, 이미지) 등을 붙여보는 경험을 해볼 수 있었다. 

 

실제 기능들이 코드단에서 어떻게 구현되는 가를 보고, 직접 해보는 것 자체가 큰 의미가 있던 시간이었다. 

다음 글은 허깅페이스에 있는 여러 오픈 소스 모델들을 활용해 보는 시간들이었던 3주 차의 공부내용들에 대해 적어보려 한다. 

 

Profile:

Linkedin