Search

[LLM 프로젝트] - 7편. AI 에이전트의 예시 [개인 맞춤형 여행 계획 에이전트]

[LLM 프로젝트] - 10편. Claude 데스크톱에 MCP 연동하기
[LLM 프로젝트] - 10편. Claude 데스크톱에 MCP 연동하기
지난 글에서는 AI 에이전트(Agent)의 개념과 이를 구성하는 주요 요소들에 대해 자세히 살펴보았습니다. AI 에이전트는 단순히 질문에 답변하는 역할을 넘어서, 스스로 사용자의 목표를 이해하고, 이를 달성하기 위한 계획을 세우고 도구를 선택하여 실행하며, 피드백을 통해 개선해나가는 자율적인 시스템입니다.
이번 글에서는 AI 에이전트의 개념을 좀 더 쉽게 이해할 수 있도록 [개인 맞춤형 여행 계획 에이전트]라는 구체적인 컨셉을 바탕으로, 실제 에이전트를 어떻게 구축할 수 있는지 단계별로 알아보겠습니다. 이를 통해 AI 에이전트의 실제 구축 과정을 더욱 명확히 이해하고, 에이전트가 실제 서비스에서 어떻게 활용될 수 있는지 살펴보겠습니다.

1. [개인 맞춤형 여행 계획 에이전트]

[개인 맞춤형 여행 계획 에이전트]는 사용자가 원하는 여행 목적지, 일정, 선호하는 여행 스타일 등의 다양한 조건을 이해하고, 이에 맞춰 최적의 여행 일정을 자동으로 설계·제안하는 AI 시스템입니다. 사용자는 에이전트에게 일반적인 질문이나 요구사항(“4박 5일로 오사카에 가는데, 맛집과 온천 위주로 여행하고 싶어”)을 던지기만 하면, 에이전트가 다양한 외부 API데이터를 활용하여 개인화된 결과를 제공합니다.
이 에이전트는 다음과 같은 목표를 갖고 있습니다:
사용자의 여행 선호도를 정확히 파악하고 맞춤형 여행 일정 설계
최신 항공편 및 숙소 정보를 실시간 조회하여 최적의 일정을 제공
관광지 정보, 맛집 추천, 온천 방문 등 세부적인 현지 정보 제공
이를 단순히 “오사카 맛집 좀 알려줘” 식의 질문에만 답하는 것이 아니라, 온전히 사용자의 여행을 대신 설계해줄 수 있다는 점이 핵심입니다.

2. 개인 맞춤형 여행 계획 에이전트의 구축 과정

이제 이 여행 계획 에이전트를 어떻게 단계별로 구축할 수 있는지 살펴보겠습니다. 각 단계는 논리적으로 연결되어 있으며, 이 과정을 통해 에이전트가 사람처럼 생각하고 행동하는 시뮬레이션을 할 수 있습니다.

(1) 목표 정의하기 (Goal Definition)

가장 먼저 해야 할 일은 에이전트가 해결해야 하는 최종 목표를 명확하게 설정하는 것입니다.
목표 예시: “사용자가 특정 여행 목적지와 일정, 선호도를 알려주면 이에 맞춰 최적의 여행 일정을 자동으로 설계하고, 사용자에게 제안한다.”
예시 사용자 요청:
“다음 달 오사카로 4박 5일 여행을 가려고 하는데, 맛집과 온천 위주로 추천해줘.”
에이전트는 이 한 문장 속에 담긴 목적지, 일정(4박 5일), 날짜(다음 달), 여행 스타일(맛집, 온천) 등의 정보를 구조적으로 파악하고, 최종적으로 ‘사용자가 원하는 여행 일정을 제안’하는 데 집중해야 합니다.
중요 포인트:
여행 목표 정의가 불명확하면 에이전트의 실행 결과도 부정확해집니다.
가능한 한 세분화된 목표(맛집, 온천, 액티비티, 쇼핑 등)를 반영할 수 있어야 합니다.

(2) 사용자 입력 인지 (Perception)

다음 단계는 사용자 입력을 분석하고, 사용자의 **의도(intent)**와 세부 요구사항을 정형화된 형태로 추출하는 과정입니다. GPT API를 활용하여 자연어JSON 형태로 변환하는 예시가 대표적입니다.
import openai openai.api_key = 'YOUR_API_KEY' def parse_user_request(user_request): system_prompt = """ 너는 여행 계획을 수립하는 AI야. 사용자의 여행 요청을 JSON 형태로 분석해줘. { "destination": "여행 목적지", "duration": "여행 기간", "preferences": ["여행 선호도"], "date": "여행 일정" } """ response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_request}, ] ) return response.choices[0].message.content user_request = "다음 달 오사카로 4박 5일 여행을 가려고 하는데, 맛집과 온천 위주로 추천해줘." parsed_request = parse_user_request(user_request) print(parsed_request)
Python
복사
GPT가 제공하는 예상 결과:
{ "destination": "오사카", "duration": "4박 5일", "preferences": ["맛집", "온천"], "date": "다음 달" }
JSON
복사
이처럼 자연어로 된 사용자 요청을 구조화된 데이터로 바꿔주면, 이후 단계에서 계획을 세울 때 매우 유용해집니다.
실제 구현 레벨에서는 아래와 같은 중요 포인트를 고려해서 프롬프트를 설계하고, 함수를 만들어야합니다.
중요 포인트:
여행지는 도시명(“오사카”)인지, 국가명(“일본”)인지 분리
일정을 구체적인 날짜(“YYYY-MM-DD”)로 파악할 필요가 있음 (추가적인 파싱 작업)
선호도(“맛집”, “온천”)가 복수개일 수 있으므로 리스트 형태로 관리

(3) 작업 계획(Planning) 수립

이제 추출된 정보를 가지고, 에이전트가 무슨 일을 해야 할지 ‘계획’을 세우는 단계입니다.
def generate_travel_plan(parsed_request): system_prompt = """ 너는 여행 계획을 수립하는 AI 에이전트야. 여행 목적지, 일정, 선호도를 기반으로 여행 준비를 위해 수행해야 할 작업을 구체적으로 나열해줘. """ user_content = f""" 여행 정보: {parsed_request} """ response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_content}, ] ) return response.choices[0].message.content travel_plan = generate_travel_plan(parsed_request) print(travel_plan)
Python
복사
GPT 예상 결과:
1. 여행 날짜 확정 및 항공편 조회 2. 숙소 검색 (온천 시설 우선) 3. 맛집 리스트 생성 (현지 인기 맛집 위주) 4. 온천 관광지 선정 및 관광 일정 구성 5. 최종 여행 일정 사용자에게 제안
Plain Text
복사

(4) 도구 활용과 실행 (Tool Use & Execution)

에이전트가 필요한 정보를 외부에서 실제로 조회하기 위해 GPT의 함수 호출(Function Calling) 기능을 이용합니다. 실제 내부에서 각 함수별로 외부에서 정보를 가져올 수 있게 함수는 구현되어 있어야 합니다.

함수 정의 예시:

functions = [ { "name": "get_flights", "description": "항공편 정보 조회", "parameters": { "type": "object", "properties": { "destination": {"type": "string"}, "date": {"type": "string"}, "duration": {"type": "integer"} }, "required": ["destination", "date", "duration"] } }, { "name": "get_hotels", "description": "숙소 정보 조회", "parameters": { "type": "object", "properties": { "city": {"type": "string"}, "feature": {"type": "string"} }, "required": ["city", "feature"] } } ]
Python
복사

GPT API 호출 (함수 호출 예시):

response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "사용자 요청을 처리하기 위해 필요한 외부 함수를 호출해줘."}, {"role": "user", "content": user_request}, ], functions=functions, function_call="auto", ) function_call = response.choices[0].message.get("function_call") print(function_call)
Python
복사
GPT 예상 결과 (함수 호출 예시):
{ "name": "get_hotels", "arguments": { "city": "오사카", "feature": "온천" } }
JSON
복사
에이전트는 이러한 함수를 직접 실행하여 실제 호텔 데이터를 가져온 후, 결과를 다시 GPT에게 전달하여 최종 여행 일정을 만들게 됩니다.
중요 포인트:
함수 시그니처(파라미터 타입, 명칭 등)를 GPT가 인식할 수 있어야 합니다.
실제 API를 연동할 때는 에러 처리, 실패 시 재시도(retry), 결과 없는 경우 대안 제시 등을 고려해야 합니다.

(5) 최종 여행 일정 제공 (Final Answer)

모든 필요한 정보를 얻었다면, 에이전트는 이를 종합해 사용자가 이해하기 쉬운 형태로 답변해야 합니다. 이때도 GPT를 활용하면, 다양한 문체언어, 형식으로 응답을 생성할 수 있습니다.
def generate_final_response(travel_info): system_prompt = "여행 정보를 기반으로 자연스러운 여행 일정을 작성해줘." response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"{travel_info}"}, ] ) return response.choices[0].message.content final_plan = { "항공편": "2024-06-10 오전 9시 인천 → 오사카", "숙소": "호텔 ABC (온천 시설 포함)", "맛집": ["라멘 XYZ", "스시집 DEF"], "온천": ["스미노에 온천", "아리마 온천"] } final_response = generate_final_response(final_plan) print(final_response)
Python
복사
GPT 최종 사용자 제공 예시:
다음 달 오사카 여행 일정입니다. [항공편] - 출발: 2024-06-10 오전 9시 인천 → 오사카 [숙소] - 호텔 ABC (온천 시설 포함, 중심부 위치) [맛집 추천] - 라멘 XYZ, 스시집 DEF [온천 추천] - 1일차: 스미노에 온천 - 3일차: 아리마 온천 투어 즐거운 여행 되세요!
Plain Text
복사
단순한 응답을 기준으로 작성하였으나, 아래 중요 포인트를 고려하여 구체적으로 구현할 수 있습니다.
중요 포인트:
텍스트 형식뿐 아니라, HTML, PDF, 심지어 챗봇 UI에 맞는 포맷 등 다양한 형태로 응답을 제공할 수 있습니다.
사용자 피드백(“이 숙소 말고 다른 숙소 없어요?”)을 반영해 일정 수정이 바로 가능하도록 설계할 수도 있습니다.

(6) 최종 정리

여기까지 정리해보면, “사용자가 여행 계획을 문의한다” → “에이전트가 분석해 필요한 작업을 쪼갠다” → “실제 데이터(항공권, 숙소, 맛집 등)를 가져온다” → “최종 결과를 종합하여 사용자에게 전달한다”의 과정을 거치게 됩니다. 이때 AI 에이전트는 단순히 하나의 질문-답변 패턴을 넘어, 다양한 계획도구 사용 단계를 수행함으로써 고도화된 서비스를 제공하게 됩니다.

마무리

이번 글에서는 개인 맞춤형 여행 계획 에이전트를 예시로 들어, AI 에이전트를 실제 서비스 수준으로 구축하는 과정을 살펴보았습니다. 이러한 단계를 통해, AI 에이전트가 자율적인 의사결정을 할 수 있는 구조를 마련하게 됩니다. 다음 글에서는 요즘 AI 에이전트 분야에서 뜨거운 화두로 떠오른 모델(LLM)과 시스템 간의 맥락(Context)을 관리하는 새로운 방식인 MCP(Model Context Protocol)에 대해 다뤄볼 예정입니다.