CrewAI는 AI 에이전트를 만들 수 있는 프레임워크다. 생성한 각 에이전트는 고유한 전문 지식과 명령어를 가지고 있어서, CrewAI의 핵심은 전문화된 개별 AI 에이전트들이 각자의 역할을 수행하면서도, 서로 소통하고 협업하여 시너지를 발휘할 수 있게 하는 것, 에이전트들이 협력하여 하나의 큰 복잡한 문제를 해결할 수 있도록 쉽게 구조화할 수 있다.
한국에서는 아직 잘 알려지지 않은 프레임워크인 것 같다.
![]() | ![]() |
---|
아래는 CrewAI가 어떻게 쓰일 수 있는지 제시하는 실제 활용사례이다
첫번째는 Stock Analysis 주식 분석을 위해 CrewAI를 활용하는 사례이다. 이 분석에서 AI 에이전트는 특정 기업을 조사하고 해당 주식을 매수, 보유, 매도 중 어떤 것이 좋을지 간결한 보고서로 정리한다.
실제 CrewAI의 출력 결과를 보면, 먼저 AI 에이전트가 인터넷상의 다양한 보고서를 검색하여 수집한다. 이를 통해 내부 메모리 뱅크에 정보를 축적해 나간다. 이어서 분기 보고서 등을 추가로 분석하며 메모리 뱅크를 계속 확장한다.
마지막으로 CrewAI는 우리가 해야 할 행동을 정확히 알려주는 최종 보고서를 생성하게 된다. 영상의 예시에서 테슬라 주식의 경우 보유를 권장하면서 주식의 긍정적 지표, 우려 사항, 향후 전망에 영향을 줄 수 있는 예정된 이벤트 등을 제시한다. 이를 수행하는데 7분 30초 정도 소요되었다고 한다.
두번째는 TripPlanner 여행 계획 수립을 위해 CrewAI를 활용하는 사례이다. 이 기능에서는 사용자가 출발지, 목적지, 대략적인 여행 시기와 선호하는 활동을 입력하면 CrewAI가 세 개의 에이전트를 활용하여 여행 계획을 세운다.
첫 번째 에이전트는 방문할 도시를 선정하고, 두 번째 에이전트는 각 도시에서 즐길 만한 흥미로운 활동을 찾아낸다. 마지막으로 세 번째 에이전트가 핵심적인 역할을 하는데, 선정된 활동들을 연결하여 일정을 구성하고 항공권 등을 고려하여 예산까지 세워준다. 최종적으로 CrewAI는 일자별 세부 일정이 포함된 여행 계획 보고서를 생성하게 된다.
영상의 예시에서는 CrewAI가 11월 태국에서 열리는 축제를 자동으로 찾아내어 이를 중심으로 여행 일정을 최적화해주는 모습을 보여준다.
세번째는 Game Builder 게임 개발을 위해 CrewAI를 활용하는 사례이다. 이 기능에서 사용자는 만들고 싶은 게임의 기본 설명과 기대하는 게임 메커니즘을 입력하면, CrewAI의 세 에이전트가 협업하여 게임을 코딩하고 지속적으로 소스 코드를 검토 및 개선한다.
영상 예시에서는 퐁 게임을 만드는 과정을 보여주는데, 에이전트들이 반복적으로 코드를 정제해 나가는 모습을 확인할 수 있다. 약 4분 후 CrewAI는 완성된 Python 코드를 제공하며, 이를 실행하면 문제없이 작동하는 퐁 게임을 확인할 수 있다.
crewAI는 크게 Tools, Agent, Process, Task로 구성된다.
Agent는특정 업무를 수행하도록 설계된 직원과 같다. 작가, 연구원, 관리자와 같이 역할을 부여할 수 있다. 이들은 독립적으로 선택을 내릴 수 있으며, 정보를 공유하고 서로에게 작업을 할당하면서 협력한다. Agent에게는 역할, 목표, 배경 이야기, 도구 등의 속성을 부여할 수 있어 Agent의 행동 방식을 조정할 수 있다.
여행계획예시에서의 Agent는 아래와 같이 정의되었다.
도구는 에이전트가 특정 작업을 수행하는 데 사용할 수 있는 것이다. 실제 세계에서 건축업자가 망치로 못을 박는 것처럼, 에이전트는 도구를 사용하여 인터넷을 검색하거나 계산을 수행할 수 있다. 도구에는 Lang chain에 이미 내장된 built-in 도구와 사용자 지정 가능한 custom 도구, 두 가지 유형이 있다. Custom 도구의 예로는 계산기 도구, 검색 도구 등이 있다.
작업은 AI 에이전트가 완료해야 하는 직무 또는 할당된 일이다. 작업은 수행해야 할 내용을 정의하고, 어떤 에이전트가 작업을 수행해야 하는지, 어떤 도구를 사용해야 하는지 등의 추가 정보를 포함할 수 있다. 작업에는 설명, 담당 에이전트, 사용 도구 등의 핵심 속성을 정의할 수 있다.
위 Stock Analysis예시에서 정의되었던 TASK는 아래와 같다.
프로세스는 에이전트들이 어떻게 협업할 것인지, 작업이 에이전트에게 어떻게 할당될 것인지를 정의하는 가장 중요한 부분이다. 에이전트가 협업해야 할 때 프로세스가 모든 작업이 제대로 완료되도록 처리한다. 현재는 작업이 순차적으로 처리되도록 하는 방식을 지원하고 있으며, 추후 계층적 프로세스 등 더 많은 방식이 추가될 예정이다.
이 4가지 핵심 구성 요소가 결합되는 방식이 아래 주식 분석 crew 예제를 통해 나와있다. 먼저 에이전트를 정의하고, 수행할 작업을 결정한다. 그리고 각 에이전트와 작업을 구체적으로 추출하고, 에이전트에 필요한 도구를 연결한다.
마지막으로 모든 구성 요소를 연결하는 프로세스를 메인 crew 파일에 추가한다. 이렇게 에이전트, 작업, 도구, 프로세스를 모두 통합한 후 crew를 실행하면 에이전트들이 협업하여 복잡한 작업을 완료하게 된다.
https://github.com/joaomdmoura/crewAI-examples/
위 example에서 starter_template을 복사해이용하였다.
git clone https://github.com/joaomdmoura/crewAI-examples.git
main.py
import os
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI
from decouple import config
from textwrap import dedent
from agents import CustomAgents
from tasks import CustomTasks
# Install duckduckgo-search for this example:
# !pip install -U duckduckgo-search
from langchain.tools import DuckDuckGoSearchRun
search_tool = DuckDuckGoSearchRun()
os.environ["OPENAI_API_KEY"] = config("OPENAI_API_KEY")
os.environ["OPENAI_ORGANIZATION"] = config("OPENAI_ORGANIZATION_ID")
# This is the main class that you will use to define your custom crew.
# You can define as many agents and tasks as you want in agents.py and tasks.py
class CustomCrew:
def __init__(self, var1, var2):
self.var1 = var1
self.var2 = var2
def run(self):
# Define your custom agents and tasks in agents.py and tasks.py
agents = CustomAgents()
tasks = CustomTasks()
# Define your custom agents and tasks here
custom_agent_1 = agents.agent_1_name()
custom_agent_2 = agents.agent_2_name()
# Custom tasks include agent name and variables as input
custom_task_1 = tasks.task_1_name(
custom_agent_1,
self.var1,
self.var2,
)
custom_task_2 = tasks.task_2_name(
custom_agent_2,
)
# Define your custom crew here
crew = Crew(
agents=[custom_agent_1, custom_agent_2],
tasks=[custom_task_1, custom_task_2],
verbose=True,
)
result = crew.kickoff()
return result
# This is the main function that you will use to run your custom crew.
if __name__ == "__main__":
print("## Welcome to Crew AI Template")
print("-------------------------------")
var1 = input(dedent("""Enter variable 1: """))
var2 = input(dedent("""Enter variable 2: """))
custom_crew = CustomCrew(var1, var2)
result = custom_crew.run()
print("\n\n########################")
print("## Here is you custom crew run result:")
print("########################\n")
print(result)
pipx설치
pip (Package Installer for Python):
pipx (pip extension):
- pipx는 pip를 기반으로 하는 도구로, Python 애플리케이션을 독립적인 환경에 설치하고 실행하는 데 사용됩니다.
- 주로 독립적으로 실행 가능한 Python 애플리케이션(예: CLI 도구)을 설치하고 관리하는 데 사용됩니다.
- 각 애플리케이션을 격리된 가상 환경에 설치하여, 시스템 전역 Python 환경이나 다른 프로젝트에 영향을 주지 않도록 합니다.
- 설치된 애플리케이션은 시스템 PATH에 추가되어, 어디서나 쉽게 실행할 수 있습니다.
주요 차이점:
pip는 Python 프로젝트의 의존성 관리에 초점을 맞추고 있으며, 패키지를 Python 환경 내에 설치합니다.
pipx는 독립적으로 실행 가능한 Python 애플리케이션을 관리하는 데 초점을 맞추고 있으며, 각 애플리케이션을 격리된 가상 환경에 설치합니다.
사용 예시:
pip: 웹 프레임워크(Django, Flask), 데이터 분석 라이브러리(NumPy, Pandas) 등 프로젝트에 필요한 패키지를 설치할 때 사용합니다.
pipx: Black(코드 포매터), Flake8(린터), Poetry(프로젝트 관리 도구) 등 독립적으로 실행되는 Python 도구를 설치할 때 사용합니다.
pip는 Python 프로젝트 개발에 필수적인 도구인 반면, pipx는 Python 개발자들이 유용하게 사용할 수 있는 보조적인 도구라고 할 수 있습니다.
brew install pipx
pipx ensurepath
poetry설치
기능:
의존성 관리:
사용 방법:
프로젝트 관리:
- venv: 가상 환경 관리에 초점을 맞추고 있어, 프로젝트 관리 기능은 제한적입니다.
- Poetry: 프로젝트 구성, 의존성 관리, 패키지 빌드, 배포 등 프로젝트 관리에 필요한 다양한 기능을 제공합니다. 프로젝트 구조와 설정을 표준화하는 데 도움을 줍니다.
종합적으로, venv는 가상 환경 생성과 관리에 초점을 맞춘 간단한 도구인 반면, Poetry는 가상 환경 관리뿐만 아니라 프로젝트 의존성 관리, 빌드, 배포 등 Python 프로젝트 개발에 필요한 다양한 기능을 제공하는 종합적인 도구입니다. 프로젝트의 규모와 요구 사항에 따라 적절한 도구를 선택하는 것이 좋습니다.
pipx install poetry
poetry --version
pyproject.toml파일 생성
[tool.poetry]
# 프로젝트 정보 설정
name = "trip-planner-yt" # 프로젝트 이름
version = "0.1.0" # 프로젝트 버전
description = "Simple AI trip planner" # 프로젝트 설명
authors = ["Joao Moura", "Brandon Hancock"] # 프로젝트 저자
[tool.poetry.dependencies]
python = ">=3.10.0,<3.12" # Python 버전 요구 사항
crewai = "0.1.24" # CrewAI 라이브러리 버전 (자연어 처리)
unstructured = "==0.10.25" # Unstructured 라이브러리 버전 (비정형 데이터 처리)
pyowm = "3.3.0" # PyOWM 라이브러리 버전 (날씨 정보 처리)
python-dotenv = "1.0.0" # python-dotenv 라이브러리 버전 (환경 변수 관리)
langchain-openai = "^0.0.5" # Langchain-OpenAI 라이브러리 버전
[tool.pyright]
# Pyright 설정
useLibraryCodeForTypes = true # 타입 정보를 라이브러리 코드에서 가져올지 여부
exclude = [".cache"] # 분석에서 제외할 디렉토리
[tool.ruff]
# Ruff 설정
select = ['E', 'W', 'F', 'I', 'B', 'C4', 'ARG', 'SIM'] # 선택한 경고 유형
ignore = ['W291', 'W292', 'W293'] # 무시할 경고 유형
[build-system]
requires = ["poetry-core>=1.0.0"] # 필요한 빌드 시스템
build-backend = "poetry.core.masonry.api" # 빌드 백엔드
pyproject.toml가 있는 디렉토리에서 실행
poetry install --no-root
poetry env list
환경 실행
poetry shell
deactivate
아래는 agent를 생성할때 고려해야할 점이다.
"""
Creating Agents Cheat Sheet:
- Think like a boss. Work backwards from the goal and think which employee
you need to hire to get the job done.
- Define the Captain of the crew who orient the other agents towards the goal.
- Define which experts the captain needs to communicate with and delegate tasks to.
Build a top down structure of the crew.
Goal:
- Create a 7-day travel itinerary with detailed per-day plans,
including budget, packing suggestions, and safety tips.
Captain/Manager/Boss:
- Expert Travel Agent
Employees/Experts to hire:
- City Selection Expert
- Local Tour Guide
Notes:
- Agents should be results driven and have a clear goal in mind
- Role is their job title
- Goals should actionable
- Backstory should be their resume
"""
아래와 같이 세 개의 agent를 생성하였고
class CustomAgents:
def __init__(self):
self.OpenAIGPT35 = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7)
self.OpenAIGPT4 = ChatOpenAI(model_name="gpt-4", temperature=0.7)
self.Ollama = Ollama(model="openhermes")
def expert_travel_agent(self):
return Agent(
role="Expert Travel Agent",
backstory=dedent(
f"""Expert in travel planning and logistics.
I have decades of expereince making travel iteneraries."""),
goal=dedent(f"""
Create a 7-day travel itinerary with detailed per-day plans,
include budget, packing suggestions, and safety tips.
"""),
# tools=[tool_1, tool_2],
allow_delegation=False,
verbose=True,
llm=self.OpenAIGPT35,
)
def city_selection_expert(self):
return Agent(
role="City Selection Expert",
backstory=dedent(
f"""Expert at analyzing travel data to pick ideal destinations"""),
goal=dedent(
f"""Select the best cities based on weather, season, prices, and traveler interests"""),
# tools=[tool_1, tool_2],
allow_delegation=False,
verbose=True,
llm=self.OpenAIGPT35,
)
def local_tour_guide(self):
return Agent(
role="Local Tour Guide",
backstory=dedent(f"""Knowledgeable local guide with extensive information
about the city, it's attractions and customs"""),
goal=dedent(
f"""Provide the BEST insights about the selected city"""),
# tools=[tool_1, tool_2],
allow_delegation=False,
verbose=True,
llm=self.OpenAIGPT35,
)
Serper - The World's Fastest and Cheapest Google Search API
from langchain.tools import tool
class CalculatorTools():
@tool("Make a calculation")
def calculate(operation):
"""Useful to perform any mathematical calculations,
like sum, minus, multiplication, division, etc.
The input to this tool should be a mathematical
expression, a couple examples are `200*7` or `5000/2*10`
"""
try:
return eval(operation)
except SyntaxError:
return "Error: Invalid syntax in mathematical expression"
기본적으로는 위와 같이 만들 수 있지만 조금 더 roburst하게 작성하고 싶다면 Pydantic model을 활용하여 아래와 같이 작성도 가능하다.
from pydantic import BaseModel, Field
from langchain.tools import tool
# Define a Pydantic model for the tool's input parameters
class CalculationInput(BaseModel):
operation: str = Field(..., description="The mathematical operation to perform")
factor: float = Field(..., description="A factor by which to multiply the result of the operation")
# Use the tool decorator with the args_schema parameter pointing to the Pydantic model
@tool("perform_calculation", args_schema=CalculationInput, return_direct=True)
def perform_calculation(operation: str, factor: float) -> str:
"""
Performs a specified mathematical operation and multiplies the result by a given factor.
Parameters:
- operation (str): A string representing a mathematical operation (e.g., "10 + 5").
- factor (float): A factor by which to multiply the result of the operation.
Returns:
- A string representation of the calculation result.
"""
# Perform the calculation
result = eval(operation) * factor
# Return the result as a string
return f"The result of '{operation}' multiplied by {factor} is {result}."
Serper - The World's Fastest and Cheapest Google Search API
검색을 위해 위 api를 활용하였다.
import json
import os
import requests
from langchain.tools import tool
class SearchTools():
@tool("Search the internet")
def search_internet(query):
"""Useful to search the internet
about a a given topic and return relevant results"""
top_result_to_return = 4
url = "https://google.serper.dev/search"
payload = json.dumps({"q": query})
headers = {
'X-API-KEY': os.environ['openai_api_key'],
'content-type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
# check if there is an organic key
if 'organic' not in response.json():
return "Sorry, I couldn't find anything about that, there could be an error with you serper api key."
else:
results = response.json()['organic']
string = []
for result in results[:top_result_to_return]:
try:
string.append('\n'.join([
f"Title: {result['title']}", f"Link: {result['link']}",
f"Snippet: {result['snippet']}", "\n-----------------"
]))
except KeyError:
next
return '\n'.join(string)
task를 생성하는 tip은 아래와 같다.
"""
Creating Tasks Cheat Sheet:
- Begin with the end in mind. Identify the specific outcome your tasks are aiming to achieve.
- Break down the outcome into actionable tasks, assigning each task to the appropriate agent.
- Ensure tasks are descriptive, providing clear instructions and expected deliverables.
Goal:
- Develop a detailed itinerary, including city selection, attractions, and practical travel advice.
Key Steps for Task Creation:
1. Identify the Desired Outcome: Define what success looks like for your project.
- A detailed 7 day travel itenerary.
2. Task Breakdown: Divide the goal into smaller, manageable tasks that agents can execute.
- Itenerary Planning: develop a detailed plan for each day of the trip.
- City Selection: Analayze and pick the best cities to visit.
- Local Tour Guide: Find a local expert to provide insights and recommendations.
3. Assign Tasks to Agents: Match tasks with agents based on their roles and expertise.
4. Task Description Template:
- Use this template as a guide to define each task in your CrewAI application.
- This template helps ensure that each task is clearly defined, actionable, and aligned with the specific goals of your project.
Template:
---------
def [task_name](self, agent, [parameters]):
return Task(description=dedent(f'''
**Task**: [Provide a concise name or summary of the task.]
**Description**: [Detailed description of what the agent is expected to do, including actionable steps and expected outcomes. This should be clear and direct, outlining the specific actions required to complete the task.]
**Parameters**:
- [Parameter 1]: [Description]
- [Parameter 2]: [Description]
... [Add more parameters as needed.]
**Note**: [Optional section for incentives or encouragement for high-quality work. This can include tips, additional context, or motivations to encourage agents to deliver their best work.]
'''), agent=agent)
"""
from crewai import Task
from textwrap import dedent
# This is an example of how to define custom tasks.
# You can define as many tasks as you want.
# You can also define custom agents in agents.py
class TravelTasks:
def __tip_section(self):
return "If you do your BEST WORK, I'll give you a $10,000 commission!"
def plan_itinerary(self, agent, city, travel_dates, interests):
return Task(
description=dedent(
f"""
**Task**: Develop a 7-Day Travel Itinerary
**Description**: Expand the city guide into a full 7-day travel itinerary with detailed
per-day plans, including weather forecasts, places to eat, packing suggestions,
and a budget breakdown. You MUST suggest actual places to visit, actual hotels to stay,
and actual restaurants to go to. This itinerary should cover all aspects of the trip,
from arrival to departure, integrating the city guide information with practical travel logistics.
**Parameters**:
- City: {city}
- Trip Date: {travel_dates}
- Traveler Interests: {interests}
**Note**: {self.__tip_section()}
"""
),
agent=agent,
)
def identify_city(self, agent, origin, cities, interests, travel_dates):
return Task(
description=dedent(
f"""
**Task**: Identify the Best City for the Trip
**Description**: Analyze and select the best city for the trip based on specific
criteria such as weather patterns, seasonal events, and travel costs.
This task involves comparing multiple cities, considering factors like current weather
conditions, upcoming cultural or seasonal events, and overall travel expenses.
Your final answer must be a detailed report on the chosen city,
including actual flight costs, weather forecast, and attractions.
**Parameters**:
- Origin: {origin}
- Cities: {cities}
- Interests: {interests}
- Travel Date: {travel_dates}
**Note**: {self.__tip_section()}
"""
),
agent=agent,
)
def gather_city_info(self, agent, city, travel_dates, interests):
return Task(
description=dedent(
f"""
**Task**: Gather In-depth City Guide Information
**Description**: Compile an in-depth guide for the selected city, gathering information about
key attractions, local customs, special events, and daily activity recommendations.
This guide should provide a thorough overview of what the city has to offer, including
hidden gems, cultural hotspots, must-visit landmarks, weather forecasts, and high-level costs.
**Parameters**:
- Cities: {city}
- Interests: {interests}
- Travel Date: {travel_dates}
**Note**: {self.__tip_section()}
"""
),
agent=agent,
)
main.py
import os
from crewai import Crew
from textwrap import dedent
from agents import TravelAgents
from tasks import TravelTasks
from dotenv import load_dotenv
load_dotenv()
class TripCrew:
def __init__(self, origin, cities, date_range, interests):
self.origin = origin
self.cities = cities
self.date_range = date_range
self.interests = interests
def run(self):
# Define your custom agents and tasks in agents.py and tasks.py
agents = TravelAgents()
tasks = TravelTasks()
# Define your custom agents and tasks here
expert_travel_agent = agents.expert_travel_agent()
city_selection_expert = agents.city_selection_expert()
local_tour_guide = agents.local_tour_guide()
# Custom tasks include agent name and variables as input
plan_itinerary = tasks.plan_itinerary(
expert_travel_agent,
self.cities,
self.date_range,
self.interests
)
identify_city = tasks.identify_city(
city_selection_expert,
self.origin,
self.cities,
self.interests,
self.date_range
)
gather_city_info = tasks.gather_city_info(
local_tour_guide,
self.cities,
self.date_range,
self.interests
)
# Define your custom crew here
crew = Crew(
agents=[expert_travel_agent,
city_selection_expert,
local_tour_guide
],
tasks=[
plan_itinerary,
identify_city,
gather_city_info
],
verbose=True,
)
result = crew.kickoff()
return result
# This is the main function that you will use to run your custom crew.
if __name__ == "__main__":
print("## Welcome to Trip Planner Crew")
print('-------------------------------')
origin = input(
dedent("""
From where will you be traveling from?
"""))
cities = input(
dedent("""
What are the cities options you are interested in visiting?
"""))
date_range = input(
dedent("""
What is the date range you are interested in traveling?
"""))
interests = input(
dedent("""
What are some of your high level interests and hobbies?
"""))
trip_crew = TripCrew(origin, cities, date_range, interests)
result = trip_crew.run()
print("\n\n########################")
print("## Here is you Trip Plan")
print("########################\n")
print(result)
시작하기
poetry shell
나는 하단바가 원래 없어서 F1을 누르고 상태표시줄 설정을 다시 했다.
아래와 같이 정상적으로 실행되었다.
실행
python main.py
3분정도 잘 진행하다가 0.3달러나 사용하고 에러가 나버렸다!!!!;;;
아니 디버깅하려고 print문 넣고 실행했는데 또 정상적으로 실행되었다;;;
########################
## Here is you Trip Plan
########################
In Tokyo, April is a vibrant month full of special events. Of particular note are the cherry blossom festivals held in parks such as Ueno Park, Sumida Park, and Yoyogi Park. These parks become a tourist hotspot with food stalls, offering a fantastic opportunity for a restaurant tour. You could spend an entire day in these parks, enjoying the scenic beauty of cherry blossoms and partaking in delicious local cuisine.
The Tokyo Disney Resort and Tokyo DisneySea also typically hold special spring events during April, which can be an exciting day trip for those interested.
For daily activities, you can start your day by visiting key attractions like The Imperial Palace, The Tokyo Skytree, Shinjuku Gyoen National Garden, and The Meiji Shrine. Post sightseeing, you can have an exquisite dining experience at Sukiyabashi Jiro, Kanda, Ryugin, Tsuta, and Ukai-tei. Please remember to book in advance to secure your spot at these popular restaurants.
In terms of local customs, always remember to respect the local etiquette. For example, it's customary in Japan to bow when meeting someone new, and it's considered polite to say 'Itadakimasu' before eating a meal.
As for hidden gems, you can explore the alleys of Nonbei Yokocho in Shibuya, visit theme cafes like the Owl Cafe in Akihabara, or shop for unique souvenirs at Nakamise Shopping Street in Asakusa.
Overall, Tokyo offers a perfect blend of traditional and modern attractions, with culinary delights that are second to none. Enjoy your trip!
########################
########################
도쿄의 4월은 특별한 이벤트로 가득 차 활기가 넘치는 달입니다. 특히 우에노 공원, 스미다 공원, 요요기 공원 등에서 열리는 벚꽃 축제가 주목할 만합니다. 이 공원들은 푸드 스톨이 있어 레스토랑 투어를 하기에 환상적인 기회를 제공하는 관광 핫스팟이 됩니다. 하루 종일 이 공원에서 벚꽃의 아름다운 풍경을 즐기고 맛있는 현지 요리를 즐길 수 있습니다.
여 디즈니 리조트와 도쿄 디즈니 씨에서도 일반적으로 4월에 특별한 봄 이벤트를 개최합니다.
일상 활동으로는 황궁, 도쿄 스카이트리, 신주쿠 교엔 국립 정원, 메이지 신사 등 주요 명소를 방문하는 것으로 하루를 시작할 수 있습니다. 관광 후에는 스키야바시 지로, 칸다, 류긴, 츠타, 우카이테이에서 멋진 식사를 즐길 수 있습니다. 이 인기 있는 레스토랑에서 자리를 확보하려면 사전에 예약하는 것을 잊지 마세요.
현지 관습과 관련하여 항상 현지 예절을 존중하는 것을 기억하세요. 예를 들어 일본에서는 새로운 사람을 만날 때 인사하는 것이 관례이며, 식사 전에 '잇타다키마스'라고 말하는 것이 예의 바른 것으로 여겨집니다.
숨겨진 보석으로는 시부야의 논베이 요코초 골목을 탐험하거나, 아키하바라의 부엉이 카페와 같은 테마 카페를 방문하거나, 아사쿠사의 나카미세 쇼핑 거리에서 독특한 기념품을 쇼핑할 수 있습니다.
전반적으로 도쿄는 전통과 현대적인 명소가 완벽하게 어우러져 있으며, 그 어느 곳과도 견줄 수 없는 미식의 즐거움을 제공합니다. 여행을 즐기세요!