목차
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."

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 함수

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 함수

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 전체 흐름 시각화/실행 예시


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


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

- OpenAI TTS 모델 활용해서 입력받은 문자열을 음성으로 생성해주는 함수
3) 항공예약 챗봇에 멀티모달(이미지, 음성) 적용
- 텍스트 챗 + (선택적 이미지 생성) + 음성(TTS)로 응답하는 챗봇 구축
- Tool 호출이 될 때만, 호출에 쓰인 city 를 이용해서 이미지 생성까지 해준다. (음성 TTS는 항상)
- 즉,
1) 일반 대화 -> 텍스트 챗 + 음성(TTS)로 대답
2) Tool 호출 필요한 상황(티켓 가격 물어보는 경우) -> 텍스트 챗 + 음성(TTS) + 해당 도시 이미지 생성까지 해준다.


실제 챗봇이 각 시나리오 (일반대화, tool 호출 필요상황) 에서 어떻게 구현됐는지를 아래 영상을 통해 볼 수 있다.
1) 일반 대화 -> 텍스트 챗 + 음성(TTS)로 대답
2) Tool 호출 필요한 상황(티켓 가격 물어보는 경우) -> 텍스트 챗 + 음성(TTS) + 해당 도시 이미지 생성까지 해준다.
https://youtube.com/shorts/r5y_qZSxYYM?feature=share
이번 글에선 일하며 여기저기서 듣기만 많이 했던 Tool calling을 직접 코드단에서 구현해 보는 경험,
그리고 챗봇 구축에 있어 단순 텍스트 챗봇을 넘어 멀티모달 기능(음성, 이미지) 등을 붙여보는 경험을 해볼 수 있었다.
실제 기능들이 코드단에서 어떻게 구현되는 가를 보고, 직접 해보는 것 자체가 큰 의미가 있던 시간이었다.
다음 글은 허깅페이스에 있는 여러 오픈 소스 모델들을 활용해 보는 시간들이었던 3주 차의 공부내용들에 대해 적어보려 한다.
Profile:
'AI 공부' 카테고리의 다른 글
| 6. 모델별 Tokenizer, special token, chat_template 작동방식 비교 (feat. Llama, Deepseek, Phi, Qwen-Coder) (0) | 2026.03.15 |
|---|---|
| 5. Hugging Face 오픈소스 모델 다운 및 이용 (feat. Stable Diffusion, Speech T5) (1) | 2026.02.08 |
| 3. Gradio 활용해보기_회사 소개 브로셔 제작 챗봇 (0) | 2026.01.25 |
| 2. Parameter, Token, Tokenizer, Context Window, Transformer (1) | 2025.08.31 |
| 1. GPT API, Ollama 활용 Local LLM 으로 웹사이트 요약 구현 (6) | 2025.08.17 |