부동산 업계는 지능형 로봇과 AI 시스템이 수작업을 완전히 대체하며 중대한 변화를 겪고 있습니다. 부동산 기업들은 종종 이질적인 데이터셋, 노동 집약적 분석, 그리고 확장성에 대한 막대한 제약과 마주합니다. 하지만 추론하고 적응하며 완전한 부동산 서비스를 자율적으로 제공할 수 있는 시스템이 존재한다면 어떨까요?
이 가이드에서 배우게 될 내용:
- 웹 스크래핑 인프라와 통합된 현대적 AI 에이전트 프레임워크가 이러한 문제를 어떻게 해결하는지.
- CrewAI와 Bright Data의 MCP 서버를 활용해 현대적 부동산 에이전트를 구축하는 방법.
시작해 보겠습니다!
CrewAI란 무엇인가요?
CrewAI는 협업형 AI 에이전트를 오케스트레이션하기 위한 오픈소스 프레임워크입니다. CrewAI를 사용하면 에이전트가 수행할 수 있는 작업, 목표, 허용된 도구를 명시적으로 지정할 수 있습니다. 이를 통해 에이전트를 팀 또는 크루로 그룹화하여 부동산 분야에서 복잡한 다단계 워크플로우를 실행할 수 있습니다.
CrewAI는 다음과 같은 핵심 구성 요소로 이루어져 있습니다:
- 에이전트(Agent). 정의된 역할, 특정 목표, 선택적 배경 스토리를 가진 LLM 기반 작업자입니다. 부동산 도메인 컨텍스트가 모델에 적용됩니다.
- 작업(Task). 단일 에이전트를 위한 명확히 정의된 출력을 가진, 경계가 잘 정해진 작업으로, 품질 관리 기준으로 활용됩니다.
- 도구(Tool). 에이전트가 호출할 수 있는 사설 함수로, 부동산 데이터 조회나 시장 분석과 같은 도메인 특화 기능 또는 Bright Data의 MCP 엔드포인트를 활용한 스크래핑까지 수행합니다.
- 크루(Crew). 부동산 목표는 협업하는 에이전트 집합을 포함하며, 각 에이전트는 해당 업무를 수행합니다.
- 프로세스. 순차적, 병렬적 또는 계층적 방식으로 수행될 수 있는 실행 계획은 작업의 순서, 할당, 위임 및 반복을 관리합니다.
이는 부동산 팀을 반영한 것으로, 자산 연구원은 데이터 추출을, 시장 분석가는 인사이트를, 고객 관리자는 커뮤니케이션을, 리스팅 전문가는 마케팅을 담당합니다.
CrawAI가 Bright Data와 같은 도구와 어떻게 통합되는지 자세히 알아보려면 이 가이드를 확인하세요.
MCP란 무엇입니까?
MCP는 AI 에이전트가 단일 구조화된 인터페이스를 통해 외부 도구 및 데이터 소스를 호출할 수 있게 하는 개방형 JSON-RPC 2.0 표준입니다. 부동산 데이터용 범용 커넥터라고 생각하시면 됩니다.
Bright Data의 MCP 서버는 에이전트를 Bright Data의 스크래핑 스택에 직접 연결하여 이 표준을 구현함으로써, 기존 방식보다 훨씬 간편한 부동산 데이터 추출을 가능하게 합니다:
- 봇 차단 우회. 요청은 Web Unlocker와 195개국에 걸쳐 1억 5천만 개 이상의 회전하는 주거용 IP 풀을 통해 전달됩니다.
- 동적 사이트 지원. 전용 스크래핑 브라우저가 자바스크립트를 렌더링하여 에이전트가 완전히 로드된 부동산 목록을 확인합니다.
- 구조화된 결과. 다수의 도구가 깔끔한 JSON을 반환하여 맞춤형 파서 개발이 불필요합니다.
서버는 일반 URL 가져오기부터 부동산 전용 스크레이퍼까지 50개 이상의 사전 제작 도구를 제공하므로, CrewAI 에이전트가 단일 호출로 부동산 세부 정보, 시장 데이터 또는 매물 정보를 검색할 수 있습니다.
구축 중인 솔루션: 부동산 에이전트
Zillow 페이지에서 부동산 정보를 조사하여 구조화된 JSON 출력으로 세부 정보를 반환하는 CrewAI 부동산 에이전트를 구축할 예정입니다.
링크와 코드의 일부를 변경하면 다른 부동산에도 사용할 수 있습니다.
필수 준비 사항:
코드를 시작하기 전에 다음 설정이 완료되었는지 확인하세요:
- Python 3.11 – 안정성을 위해 권장됩니다.
- Node.js + npm – Bright Data Web MCP 서버 실행에 필요함; 공식 사이트에서 다운로드하세요.
- Python 가상 환경 – 종속성을 분리하여 관리합니다.
venv문서를 참조하세요. - Bright Data 계정 – 가입 후 API 토큰 생성 (무료 체험 크레딧 제공).
- Nebius API 키 – Nebius AI Studio에서 키 생성( + Get API Key 클릭). 무료로 사용 가능하며 결제 프로필이 필요하지 않습니다.
1단계. 환경 설정:
터미널에서 다음 명령어를 실행하여 프로젝트 환경을 설정하고 종속성을 설치하세요:
mkdir real-estate-ai-system && cd real-estate-ai-system
python -m venv venv
# macOS/Linux: source venv/bin/activate
# Windows: venv\Scripts\activate
pip install "crewai-tools[mcp]" crewai mcp python-dotenv pandas
real_estate_agents.py라는 새 파일을 생성하고 다음 임포트를 추가하세요:
from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
from crewai.llm import LLM
import os
import json
import pandas as pd
from datetime import datetime
from dotenv import load_dotenv
load_dotenv()
2단계. Brightdata MCP 서버 구성
프로젝트 루트에 자격 증명을 포함한 .env 파일을 생성하세요:
BRIGHT_DATA_API_TOKEN="your_api_token_here"
WEB_UNLOCKER_ZONE="your_web_unlocker_zone"
BROWSER_ZONE="your_browser_zone"
NEBIUS_API_KEY="your_nebius_api_key"
필요한 항목:
- API 토큰: Bright Data 대시보드에서 새 API 토큰 생성
- 웹 언락커 영역: 부동산 사이트용 새 웹 언락커 영역 생성
- 브라우저 API 영역: 자바스크립트 중심 부동산 사이트용 새 브라우저 API 영역 생성
- Nebius API 키: 필수 조건에서 이미 생성됨
real_estate_agents.py 파일에 다음 구성을 추가하세요:
llm = LLM(
model="nebius/Qwen/Qwen3-30B-A3B",
api_key=os.getenv("NEBIUS_API_KEY"))
server_params = StdioServerParameters(
command="npx",
args=["@brightdata/mcp"],
env={
"API_TOKEN": os.getenv("BRIGHT_DATA_API_TOKEN"),
"WEB_UNLOCKER_ZONE": os.getenv("WEB_UNLOCKER_ZONE"),
"BROWSER_ZONE": os.getenv("BROWSER_ZONE"),
},
)
이 명령어는 *npx @brightdata/mcp*를 하위 프로세스로 실행하여 부동산 데이터 추출을 위한 MCP 표준을 통해 50개 이상의 도구를 노출합니다.
3단계. 에이전트 및 작업 정의
여기서 에이전트의 역할과 수행해야 할 구체적인 작업을 정의합니다. CrewAI 구현 시 작업 설계에 우선순위를 두고 약 80%의 노력을 할애하며, 에이전트 정의에는 20%만 할당하세요. real_estate_agents.py 파일을 업데이트하여 에이전트 및 작업 정의를 추가합니다:
def build_scraper_agent(mcp_tools):
return Agent(
role="시니어 부동산 데이터 추출 담당자",
goal=(
"snake_case 형식의 키를 가진 JSON 객체를 반환: 주소, 가격, "
"침실 수, 욕실 수, 평수, 대지 면적, 건축 연도, 부동산 유형, "
"listing_agent, days_on_market, mls_number, description, image_urls, "
"and neighborhood for the target property listing page. Ensure strict schema validation."
),
backstory=(
"Zillow, Realtor.com, Redfin에서 부동산 정보를 추출한 다년간의 경험을 가진 베테랑 부동산 데이터 엔지니어. Bright Data MCP, 프록시 로테이션, CAPTCHA 회피, 부동산 데이터에 대한 엄격한 JSON 스키마 검증에 능숙합니다."
),
tools=mcp_tools,
llm=llm,
max_iter=3,
verbose=True,
)
def build_scraping_task(agent):
return Task(
description=(
"<https://www.zillow.com/homedetails/123-Main-St-City-State-12345/123456_zpid/>에서 부동산 데이터를 추출하여 구조화된 JSON으로 반환합니다."
),
expected_output="""{
"address": "123 Main Street, City, State 12345",
"price": "$450,000",
"bedrooms": 3,
"bathrooms": 2,
"square_feet": 1850,
"lot_size": "0.25 acres",
"year_built": 1995,
"property_type": "단독 주택",
"listing_agent": "존 도, ABC 리얼티",
"days_on_market": 45,
"mls_number": "MLS123456",
"description": "리모델링된 주방이 있는 아름다운 주택...",
"image_urls": ["<https://example.com/image1.jpg>", "<https://example.com/image2.jpg>"],
"neighborhood": "다운타운 역사 지구"
}""",
agent=agent,
)
각 매개변수의 역할은 다음과 같습니다:
- role – 짧은 직무 제목, CrewAI는 @role 매개변수를 모든 시스템 프롬프트에 삽입합니다.
- goal – 핵심 목표; CrewAI는 각 반복 단계 후 이를 비교하여 중단 여부를 결정합니다.
- backstory – 에이전트의 어조를 안내하고 환각 현상을 줄이는 데 도움이 되는 도메인 지식.
- tools – BaseTool 객체 목록을 주입합니다(예: MCP search_engine, scrape_as_markdown).
- llm – 각 ‘생각 → 계획 → 실행 → 답변’ 루틴에 사용될 모델 정의.
- max_iter – 에이전트가 수행할 수 있는 내부 루프 횟수의 하드 캡 – v0.30 이상 버전에서 기본값은 20입니다.
- verbose – 모든 프롬프트, 모든 생각, 모든 도구 호출을 stdout으로 스트리밍합니다(디버깅용).
- description – 매 턴마다 행동 지향적 지침이 주입됩니다.
- expected_output – 유효한 답변에 대한 공식 계약(엄격한 JSON, 쉼표 없음).
- agent – 이 작업을 특정 Agent 인스턴스에 바인딩하여 Crew.kickoff()를 호출합니다.
4단계. 크루 조립 및 실행
이 부분은 에이전트와 태스크를 크루로 조립하고 워크플로를 실행합니다. real_estate_agents.py 파일에 크루 조립 및 실행 스크립트를 추가하세요:
def scrape_property_data():
"""스크래핑 크루를 조립하고 실행합니다."""
with MCPServerAdapter(server_params) as mcp_tools:
scraper_agent = build_scraper_agent(mcp_tools)
scraping_task = build_scraping_task(scraper_agent)
crew = Crew(
agents=[scraper_agent],
tasks=[scraping_task],
process=Process.sequential,
verbose=True
)
return crew.kickoff()
if __name__ == "__main__":
try:
result = scrape_property_data()
print("\n[SUCCESS] 스크래핑 완료!")
print("추출된 부동산 데이터:")
print(result)
except Exception as e:
print(f"\n[ERROR] 스크래핑 실패: {str(e)}")
5단계. 스크레이퍼 실행
터미널에서 스크립트를 실행하려면 다음 명령어를 실행하세요:
python real_estate_agents.py
각 에이전트가 작업을 계획하고 실행하는 과정을 콘솔에서 확인할 수 있습니다.

최종 출력은 깔끔한 JSON 객체입니다:
{
"address": "123 Main Street, City, State 12345",
"price": "$450,000",
"bedrooms": 3,
"bathrooms": 2,
"square_feet": 1850,
"lot_size": "0.25 acres",
"year_built": 1995,
"property_type": "Single Family Home",
"listing_agent": "존 도, ABC 리얼티",
"days_on_market": 45,
"mls_number": "MLS123456",
"description": "리모델링된 주방이 있는 아름다운 주택...",
"image_urls": ["<https://example.com/image1.jpg>", "<https://example.com/image2.jpg>"],
"neighborhood": "다운타운 역사 지구"
}
고급 구현 패턴
기본 예제는 핵심 개념을 보여주지만, 실제 적용에는 더 많은 고려가 필요합니다:
시장 분석 및 리드 생성
시장 인텔리전스를 구축하려면 트렌드를 분석하고 기회를 식별하며 유망한 리드를 생성할 수 있는 에이전트가 필요합니다. 이러한 에이전트들은 협력하여 포괄적인 시장 통찰력을 제공하고 잠재 고객을 식별합니다.
다음 시장 분석 에이전트를 real_estate_agents.py 파일에 추가하세요:
def build_market_analysis_agent(mcp_tools):
return Agent(
role="부동산 시장 분석가",
goal=(
"시장 동향, 가격 변동, 투자 기회를 분석합니다. "
"포괄적인 시장 데이터와 비교 대상 부동산 분석을 바탕으로 "
"구매자, 판매자, 투자자에게 실행 가능한 인사이트를 제공합니다."
),
backstory=(
"부동산 경제학, 자산 평가, 투자 분석 분야의 전문성을 갖춘 시니어 시장 분석가. 통계 분석 및 머신러닝 기법을 활용하여 시장 동향, 가격 이상 현상, 투자 기회 식별에 특화되어 있습니다."
),
tools=mcp_tools,
llm=llm,
max_iter=4,
verbose=True,
)
def build_lead_generation_agent(mcp_tools):
return Agent(
role="부동산 리드 생성 전문가",
goal=(
"시장 활동, 부동산 검색 및 행동 패턴을 기반으로 잠재적 매수자 및 매도자를 식별합니다. 연락처 정보와 참여 전략을 포함한 적격 리드를 생성합니다."
"부동산 검색 및 행동 패턴을 기반으로 잠재적 구매자와 판매자를 식별합니다. 연락처 정보와 참여 전략을 포함한 적격 리드를 생성합니다."
),
backstory=(
"부동산 마케팅, 고객 행동 분석 및 디지털 잠재 고객 발굴에 대한 깊은 지식을 갖춘 리드 생성 전문가입니다. 부동산 전문가 대상 고가치 잠재고객 발굴 및 맞춤형 접근 캠페인 개발 경험 보유."
),
tools=mcp_tools,
llm=llm,
max_iter=3,
verbose=True,
)
def analyze_market_and_generate_leads(area_zip_code, price_range):
"""특정 지역에 대한 시장 분석 수행 및 리드 생성."""
with MCPServerAdapter(server_params) as mcp_tools:
market_analyst = build_market_analysis_agent(mcp_tools)
lead_generator = build_lead_generation_agent(mcp_tools)
market_task = Task(
description=(
f"ZIP 코드 {area_zip_code} 내 부동산 시장 분석. "
f"가격 범위 {price_range} 내에서. 최근 거래 내역, "
"현재 매물, 가격 추세 및 시장 상황을 조사합니다. "
"기회를 식별하고 투자 권장 사항을 제공합니다."
),
expected_output="""{
"market_overview": {
"avg_price": "$000,000",
"중간가격": "$000,000",
"가격추세": "상승/하락/안정",
"평균매물기간": 00,
"재고수준": "높음/중간/낮음"
},
"최근_매매": [],
"활성_매물": 000,
"평방피트당_가격_추세": "$000",
"투자_기회": [],
"시장_전망": "시장_예측",
"추천사항": []
}""",
agent=market_analyst,
)
lead_task = Task(
description=(
f"{area_zip_code} 지역에 대한 유망한 리드를 생성하세요. "
"매물로 등록될 가능성이 높은 부동산을 보유한 잠재적 판매자, "
"해당 지역에서 적극적으로 물건을 찾고 있는 구매자, 그리고 투자 기회를 찾는 투자자를 식별하십시오. "
"연락 전략과 시기 권장 사항을 포함하십시오."
),
expected_output="""{
"potential_sellers": [],
"active_buyers": [],
"investor_prospects": [],
"lead_scoring": {
"high_priority": [],
"medium_priority": [],
"low_priority": []
},
"contact_strategies": [],
"follow_up_timeline": []
}""",
agent=lead_generator,
)
crew = Crew(
agents=[market_analyst, lead_generator],
tasks=[market_task, lead_task],
process=Process.sequential,
verbose=True
)
return crew.kickoff()
고객 상호작용 및 커뮤니케이션
효과적인 고객 관리는 부동산 프로세스 전반에 걸쳐 커뮤니케이션을 처리하고, 약속을 예약하며, 관계를 유지할 수 있는 전문 에이전트가 필요합니다. 이러한 에이전트는 일관되고 전문적인 고객 서비스를 보장합니다.
real_estate_agents.py 파일에 다음 고객 관리 에이전트를 추가하세요:
def build_client_communication_agent(mcp_tools):
return Agent(
role="부동산 고객 관계 관리자",
goal=(
"구매/판매 과정 전반에 걸쳐 고객 커뮤니케이션 관리, 약속 일정 조정, 후속 조치 발송 및 고객 관계 유지. "
"고객 문의에 대한 맞춤형 서비스 및 신속한 응답 제공."
),
backstory=(
"부동산 고객 서비스, 약속 일정 관리, 관계 관리 분야의 전문성을 갖춘 경험 많은 고객 관계 전문가입니다. "
"고객 요구 사항 이해, 기대치 관리, 추천 및 재구매를 위한 장기적 관계 유지에 능숙합니다."
),
tools=mcp_tools,
llm=llm,
max_iter=3,
verbose=True,
)
def build_appointment_scheduler_agent(mcp_tools):
return Agent(
role="부동산 예약 조정 담당자",
goal=(
"부동산 견학 일정, 고객 미팅, 후속 약속을 조정합니다. "
"구매자, 판매자, 중개인 간 조정을 통해 일정 최적화와 "
"견학 효율 극대화를 실현합니다."
),
backstory=(
"부동산 업무 흐름, 고객 선호도, 일정 최적화에 대한 깊은 이해를 가진 전문 예약 조정자. "
"복잡한 일정 관리 및 다중 이해관계자 조정에 능숙합니다."
),
tools=mcp_tools,
llm=llm,
max_iter=2,
verbose=True,
)
def handle_client_communication(client_inquiry, client_profile):
"""고객 문의를 처리하고 커뮤니케이션을 관리합니다."""
with MCPServerAdapter(server_params) as mcp_tools:
communication_agent = build_client_communication_agent(mcp_tools)
scheduler_agent = build_appointment_scheduler_agent(mcp_tools)
커뮤니케이션_태스크 = Task(
설명=(
f"고객 문의 처리: '{client_inquiry}' (프로필: {client_profile}). 맞춤형 응답 제공, "
"특정 요구사항 해결, 다음 단계 권장."
),
expected_output="""{
"response_message": "personalized_client_response",
"client_needs_assessment": {
"budget_range": "$000,000 - $000,000",
"선호 지역": [],
"부동산 요구사항": [],
"일정": "시간대"
},
"추천 부동산": [],
"다음 단계": [],
"후속 일정": "시기 권장사항"
}""",
agent=communication_agent,
)
scheduling_task = Task(
description=(
"고객 커뮤니케이션을 바탕으로 적절한 후속 약속,
"부동산 견학 또는 상담 미팅을 예약합니다. 고객 편의성과
"에이전트 효율성을 고려하여 일정을 최적화합니다."
),
expected_output="""{
"scheduled_appointments": [],
"property_viewing_schedule": [],
"follow_up_reminders": [],
"calendar_integration": "scheduling_details"
}""",
agent=scheduler_agent,
)
crew = Crew(
agents=[communication_agent, scheduler_agent],
tasks=[communication_task, scheduling_task],
process=Process.sequential,
verbose=True
)
return crew.kickoff()
부동산 리스팅 및 마케팅 자동화
마케팅 자동화에는 매력적인 리스팅을 생성하고, 검색 엔진 최적화를 수행하며, 여러 플랫폼에 배포할 수 있는 전문 에이전트가 필요합니다.
real_estate_agents.py 파일에 이 마케팅 에이전트를 추가하세요:
def build_listing_manager_agent(mcp_tools):
return Agent(
role="부동산 리스팅 마케팅 매니저",
goal=(
"매력적인 부동산 리스팅을 생성하고, 검색 엔진 최적화를 수행하며, "
"여러 플랫폼에 배포합니다. 마케팅 자료를 생성하고 "
"리스팅 성과를 추적하여 노출과 문의를 극대화합니다."
),
backstory=(
"부동산 마케팅, SEO 최적화, 다중 플랫폼 리스팅 관리에 전문성을 가진 디지털 마케팅 전문가입니다. MLS, Zillow, Realtor.com, 소셜 미디어를 아우르는 마케팅 캠페인 관리와 높은 전환율을 유도하는 부동산 설명 작성 경험이 있습니다."
),
tools=mcp_tools,
llm=llm,
max_iter=4,
verbose=True,
)
검색 및 발견 기능
지능형 부동산 검색 및 추천 시스템은 고객이 자신의 특정 요구사항과 선호도에 정확히 부합하는 부동산을 찾을 수 있도록 지원합니다. 이러한 에이전트는 맞춤형 부동산 발견 및 추천 서비스를 제공합니다.
real_estate_agents.py 파일에 다음 검색 및 발견 에이전트를 추가하세요:
def build_search_agent(mcp_tools):
return Agent(
role="지능형 부동산 검색 전문가",
goal=(
"지능형 부동산 검색 및 추천 서비스를 제공합니다. "
"고객 선호도를 이해하고, 여러 데이터베이스를 검색하며, "
"상세한 분석과 함께 맞춤형 부동산 추천을 제공합니다."
),
backstory=(
"부동산 데이터베이스, 부동산 매칭 알고리즘, 고객 선호도 분석에 대한 깊은 이해를 가진 검색 기술 전문가입니다. "
"최적의 부동산 발견을 위한 고급 검색 기술과 맞춤형 추천 시스템에 특화되어 있습니다."
),
tools=mcp_tools,
llm=llm,
max_iter=4,
verbose=True,
)
def build_recommendation_agent(mcp_tools):
return Agent(
role="부동산 추천 엔진",
goal=(
"고객 행동, 선호도 및 시장 데이터를 분석하여 맞춤형 부동산 추천을 생성합니다. 고객 피드백으로부터 학습하고 추천 정확도를 지속적으로 개선합니다."
),
backstory=(
"추천 시스템, 행동 분석 및 부동산 예측 모델링 분야의 전문성을 갖춘 머신러닝 전문가입니다. 사용자 상호작용과 시장 동향으로부터 학습하는 맞춤형 추천 엔진 개발 경험이 있습니다."
),
tools=mcp_tools,
llm=llm,
max_iter=4,
verbose=True,
)
"행동 분석, 예측 모델링 분야의 전문성을 갖춘 머신 러닝 전문가입니다. "
"사용자 상호작용과 시장 동향으로부터 학습하는 맞춤형 추천 엔진 개발 경험이 있습니다."
),
tools=mcp_tools,
llm=llm,
max_iter=3,
verbose=True,
)
def intelligent_property_search(search_criteria, client_preferences):
"""개인화된 추천을 통한 지능형 부동산 검색 수행."""
with MCPServerAdapter(server_params) as mcp_tools:
search_agent = build_search_agent(mcp_tools)
추천 에이전트 = 추천_에이전트(mcp_tools)
검색_태스크 = 태스크(
설명=(
f"검색 기준: {search_criteria}에 부합하는 부동산을 검색합니다. "
f"고객 선호도: {client_preferences}. 여러 플랫폼과 데이터베이스에 걸쳐 고급 검색 "
"기법을 사용합니다. 고객 선호도와 시장 상황에 따라 결과를 우선순위화합니다."
),
expected_output="""{
"search_results": [],
"total_matches": 0,
"search_filters_applied": [],
"alternative_suggestions": [],
"market_insights": {
"avg_price_in_area": "$000,000",
"market_trends": "trend_analysis",
"inventory_levels": "availability_status"
}
}""",
agent=search_agent,
)
recommendation_task = Task(
description=(
"검색 결과와 고객 선호도를 분석하여 "
"맞춤형 추천을 생성합니다. 관련성 순으로 부동산 순위 지정, "
"숨겨진 보석 같은 매물 발굴, 고객 요구를 충족할 수 있는 "
"대안 옵션 제안."
),
expected_output="""{
"top_recommendations": [],
"personalization_score": "0-100",
"추천_이유": [],
"대안_옵션": [],
"학습_인사이트": {
"선호도_패턴": [],
"행동_분석": "고객_행동_요약"
}
}""",
agent=추천 에이전트,
)
크루 = 크루(
에이전트=[검색 에이전트, 추천 에이전트],
작업=[검색 작업, 추천 작업],
프로세스=프로세스.순차적,
상세 출력=True
)
크루.시작()을 반환합니다
배포 및 프로덕션 설정
마지막으로, 모든 전문 에이전트를 조정하는 포괄적인 오케스트레이션 시스템을 생성해 보겠습니다. 이 주요 시스템 클래스는 모든 부동산 운영의 중심 허브 역할을 할 것입니다.
real_estate_agents.py 파일에 이 메인 시스템 오케스트레이션을 추가하세요:
class RealEstateAgentSystem:
def full_property_analysis(self, property_url, client_profile=None):
with MCPServerAdapter(server_params) as mcp_tools:
research_agent = build_property_research_agent(mcp_tools)
market_analyst = build_market_analysis_agent(mcp_tools)
listing_manager = build_listing_manager_agent(mcp_tools)
research_task = build_property_research_task(research_agent, property_url)
market_task = Task(
description="조사된 부동산의 시장 상황 분석",
expected_output="동향 및 권장사항이 포함된 시장 분석",
agent=market_analyst,
)
marketing_task = Task(
description="부동산 및 시장 분석을 기반으로 마케팅 전략 수립",
expected_output="완성된 마케팅 캠페인 계획",
agent=listing_manager,
)
crew = Crew(
agents=[research_agent, market_analyst, listing_manager],
tasks=[research_task, market_task, marketing_task],
process=Process.sequential,
verbose=True
)
return crew.kickoff()
def client_service_workflow(self, client_inquiry, client_profile):
communication_result = handle_client_communication(client_inquiry, client_profile)
if "search" in client_inquiry.lower():
search_criteria = self.extract_search_criteria(client_inquiry)
search_result = intelligent_property_search(search_criteria, client_profile)
return {
"communication": communication_result,
"search_results": search_result
}
return communication_result
def extract_search_criteria(self, inquiry):
criteria = {
"price_range": "extracted_from_inquiry",
"location": "extracted_from_inquiry",
"property_type": "extracted_from_inquiry",
"bedrooms": "extracted_from_inquiry",
"bathrooms": "extracted_from_inquiry"
}
return criteria
def main():
system = RealEstateAgentSystem()
property_url = "<https://www.zillow.com/homedetails/661-Cranbrook-Rd-London-ON-N6K-1W8/2071250954_zpid/>"
try:
print("=== 포괄적 부동산 분석 시작 ===")
analysis_result = system.full_property_analysis(property_url)
print("\n=== 분석 완료 ===")
print("추출된 부동산 데이터:")
print(json.dumps(analysis_result, indent=2) if isinstance(analysis_result, dict) else str(analysis_result))
client_inquiry = "I'm looking for a 3-bedroom house under $500,000 in downtown area"
client_profile = {
"name": "John Smith",
"budget": "$450,000",
"preferred_locations": ["downtown", "midtown"],
"timeline": "3 months"
}
print("\n=== 고객 문의 처리 중 ===")
service_result = system.client_service_workflow(client_inquiry, client_profile)
print("\n=== 클라이언트 서비스 완료 ===")
print("클라이언트 서비스 결과:")
print(json.dumps(service_result, indent=2) if isinstance(service_result, dict) else str(service_result))
print("\n=== 시장 분석 및 리드 생성 중 ===")
market_leads = analyze_market_and_generate_leads("90210", "$500,000-$1,000,000")
print("\n=== 시장 분석 완료 ===")
print("시장 분석 및 리드:")
print(json.dumps(market_leads, indent=2) if isinstance(market_leads, dict) else str(market_leads))
except Exception as e:
print(f"\n[ERROR] 시스템 실행 실패: {str(e)}")
if __name__ == "__main__":
main()
비용 최적화
Bright Data의 MCP는 사용량 기반이므로 추가 요청마다 요금이 부과됩니다. 비용을 관리하는 데 도움이 되는 몇 가지 팁은 다음과 같습니다:
- 전체 리스팅 사이트나 데이터셋을 크롤링하지 말고 필요한 속성 필드만 요청하세요.
- CrewAI의 도구 수준 캐시를 활성화하여 부동산 데이터가 변경되지 않았을 때 호출을 건너뛰어 시간과 크레딧을 모두 절약하세요.
- 기본적으로 Web Unlocker 영역을 사용하고, 복잡한 부동산 사이트에서 JavaScript 렌더링이 필수적인 경우에만 Browser API 영역으로 전환하세요.
- 모든 에이전트에게 합리적인 최대 반복 횟수 제한을 부여하여 문제 있는 리스팅에서 무한 루프에 빠지지 않도록 하세요.
이러한 관행을 따르면 CrewAI 에이전트는 비용 효율적이고 안정적으로 유지되어 실제 부동산 작업 부하에 대비할 수 있습니다.
결론
이 튜토리얼을 통해 Bright Data의 MCP 서버를 사용하여 CrawAI 부동산 에이전트를 구축하는 방법을 배웠습니다.
우리는 이러한 기술이 무엇이며 어떻게 사용되는지 이해하는 것으로 시작했습니다. 그런 다음 부동산 에이전트를 구축하기 위해 더 나아가 Bright Data의 MCP 서버 설정, LLM 구성, 에이전트 생성, 작업 정의 및 작업 크루 조립을 진행했습니다.
이러한 에이전트는 다른 부동산 대상에 쉽게 적용할 수 있습니다. 예를 들어 Zillow 대신 Realtor. com에서 스크래핑하려면 에이전트의 역할, 목표, 배경 이야기와 함께 작업 설명 및 출력 예상값을 조정하기만 하면 됩니다.