browser-use는 LLM(대형 언어 모델)이 웹 브라우저를 자율적으로 조작할 수 있게 해주는 AI 에이전트 프레임워크입니다. OpenAI, Claude, Gemini, Ollama 등 거의 모든 LLM을 지원하며, Playwright 기반으로 실제 Chromium을 CDP(Chrome DevTools Protocol)로 제어합니다. 2.4k 이상의 프로젝트가 이 라이브러리에 의존하고 있을 만큼 사실상 표준 브라우저 에이전트 프레임워크로 자리잡았습니다.
지금까지 AI는 "말로만" 도움을 줬습니다. "이 사이트에서 가격 비교해줘"라고 하면 방법을 설명해줄 뿐, 직접 하지는 못했죠. browser-use는 AI에게 실제로 브라우저를 제어하는 손을 줍니다.
핵심은 DOM을 AI가 읽을 수 있는 텍스트(접근성 트리)로 변환하는 직렬화 파이프라인입니다. 브라우저 화면을 스크린샷으로 찍고, 어떤 버튼·링크가 있는지 시맨틱하게 전달하여 LLM이 "다음에 무엇을 클릭할지" 결정합니다.
2025~2026년은 AI 에이전트가 실제 작업을 수행하는 시대가 열린 해입니다. ⭐ 95,984로 오픈소스 브라우저 자동화 도구 중 가장 많은 스타를 보유하며, 멀티 LLM 지원, 루프 감지, 폴백 LLM 등 프로덕션 레벨 기능을 갖추고 있습니다.
전통적인 브라우저 자동화는 개발자가 모든 클릭·입력을 코드로 미리 짜야 합니다. 사이트 구조가 바뀌면 스크립트가 깨지고, 자연어 지시로 새 태스크를 시키는 것은 불가능합니다.
"구글에서 오늘 날씨 검색하고 기온 알려줘"라고 문장 하나만 주면 됩니다. AI가 DOM을 읽고, 어디를 클릭할지 판단하고, 루프에 빠지면 스스로 다른 전략을 시도합니다. 사이트 구조 변경도 AI가 적응합니다.
| 비교 항목 | browser-use | Selenium/Puppeteer | Playwright 직접 | AgentQL |
|---|---|---|---|---|
| LLM 통합 | 네이티브 멀티 LLM | 수동 구현 필요 | 수동 구현 필요 | 제한적 |
| 자연어 태스크 | 텍스트로 지시 | 코드 필수 | 코드 필수 | 부분 지원 |
| DOM 시맨틱 분석 | 접근성 트리 통합 | 없음 | 없음 | 제한적 |
| 루프 감지 | 내장 | 없음 | 없음 | 없음 |
| 폴백 LLM | 자동 전환 | N/A | N/A | 없음 |
| 비전 모드 | 스크린샷 기반 | 없음 | 없음 | 없음 |
| GitHub 스타 | ⭐ 95,984 | 오래된 생태계 | Microsoft 공식 | 비교 불가 |
| 카테고리 | 기술 | 역할 |
|---|---|---|
| 언어 | Python 3.11+ | 코어 런타임 (98.4%) |
| 브라우저 엔진 | Chromium (CDP) | Chrome DevTools Protocol 직접 제어 |
| 브라우저 자동화 | Playwright | 브라우저 프로세스 관리 |
| HTTP 클라이언트 | aiohttp / httpx / requests | 비동기·동기 HTTP 통신 |
| 데이터 검증 | Pydantic | 설정·액션 모델·출력 스키마 검증 |
| 비동기 | asyncio (네이티브) | 전체 에이전트 루프 비동기 실행 |
| 문서 파싱 | pypdf / python-docx | PDF·DOCX 콘텐츠 추출 |
| 프로바이더 | SDK | 대표 모델 |
|---|---|---|
| OpenAI | openai 2.16.0 | GPT-4o, GPT-4 |
| Anthropic | anthropic 0.76.0 | Claude Sonnet, Opus |
| google-genai 1.65.0 | Gemini Pro, Flash | |
| Groq | groq 1.0.0 | 초고속 추론 |
| Ollama | ollama 0.6.1 | Llama, Mistral (로컬) |
| ChatBrowserUse | 자체 API | 브라우저 태스크 최적화 모델 |
| 기술 | 역할 |
|---|---|
| Docker | Python 3.12-slim 기반, 비루트 사용자 browseruse(UID 911) |
| uv | 빠른 Python 패키지 관리자 (pip 대체) |
| Hatchling | 빌드 시스템 (pyproject.toml 기반) |
| Ruff | 린팅 + 포매팅 통합 |
| Pyright | 정적 타입 체크 |
| pytest | 테스트 프레임워크 (asyncio 지원) |
| Textual | 터미널 TUI (선택) |
매 스텝마다 다음 4단계를 순차 실행합니다. Observe → Think → Act → Reflect의 ReAct 패턴을 브라우저에 특화시킨 구현입니다.
@self.registry.action(description='검색 엔진에서 쿼리를 검색합니다')
async def search(query: str, engine: str = 'duckduckgo') -> ActionResult:
await self.page.goto(f"https://duckduckgo.com/?q={query}")
return ActionResult(extracted_content="검색 완료")
새 브라우저 액션 추가가 데코레이터 하나로 가능합니다. LLM이 JSON 형태로 액션을 출력하면 레지스트리가 해당 함수를 찾아 실행합니다.
# 브라우저 이벤트 종류 (events.py)
NavigateToUrlEvent # URL 이동
TabCreatedEvent # 새 탭 생성
TabClosedEvent # 탭 닫힘
AgentFocusChangedEvent # 에이전트 포커스 변경
BrowserStartEvent # 브라우저 시작
BrowserStopEvent # 브라우저 종료
Watchdog 핸들러들이 비동기적으로 이벤트를 처리하므로, 브라우저 조작·스크린샷·다운로드 추적이 메인 실행 경로를 블로킹하지 않습니다.
CDP는 Chrome 브라우저를 WebSocket으로 직접 제어하는 저수준 프로토콜입니다. Target.createTarget, Page.printToPDF, Runtime.evaluate 등 브라우저의 거의 모든 기능을 프로그래밍으로 다룰 수 있습니다. browser-use는 Playwright를 프로세스 관리에만 쓰고 핵심 제어는 CDP로 직접 합니다.
CDP DOM 스냅샷과 접근성(AX) 트리를 병합하여 LLM이 이해할 수 있는 형태로 변환하는 정교한 파이프라인을 배울 수 있습니다. 가시성 계산, iframe 재귀 탐색, 페인트 오더 필터링까지 실무에서 쓰이는 기법들이 포함되어 있습니다.
ReAct(Reasoning + Acting) 패턴의 실제 구현을 볼 수 있습니다. 4단계 스텝 파이프라인, 루프 감지와 넛지 주입, 메시지 압축으로 토큰 예산 관리하는 기법이 모두 소스에 담겨 있습니다.
EventBus 패턴으로 비동기 이벤트를 발행·구독하고, Watchdog 패턴으로 브라우저 상태를 비블로킹으로 감시합니다. asyncio와 결합한 현대적인 Python 동시성 패턴의 모범 사례입니다.
Chromium을 포함하는 Docker 이미지의 멀티 스테이지 빌드, 비루트 사용자(UID 911) 실행, 멀티 아키텍처(amd64/arm64) 빌드를 배울 수 있습니다.
| 항목 | 최소 | 권장 |
|---|---|---|
| Python | 3.11+ | 3.12+ |
| OS | Linux / macOS / Windows | Linux (Docker 배포 시) |
| RAM | 2GB+ (Chromium 실행) | 4GB+ (복수 탭) |
| 디스크 | 500MB+ (Chromium + 의존성) | 1GB+ |
| CPU | 2코어+ | 4코어+ |
| GPU | 불필요 | 불필요 (LLM은 API 호출) |
| 네트워크 | LLM API 호출용 인터넷 | 안정적 인터넷 |
# Docker 실행 예시
# 노출 포트: 9242, 9222
# 볼륨: /data
# 비루트 사용자: browseruse (UID 911)
docker run -e OPENAI_API_KEY=sk-xxx browser-use/browser-use
OPENAI_API_KEY — OpenAI GPT-4o 등ANTHROPIC_API_KEY — Claude Sonnet/OpusGOOGLE_API_KEY — GeminiBROWSER_USE_API_KEY — ChatBrowserUse 자체 모델browser-use를 설치하고 날씨 검색 에이전트를 실행해봅니다.
from browser_use import Agent, BrowserSession
from langchain_openai import ChatOpenAI # pip install langchain-openai 별도 필요 (examples extra)
agent = Agent(
task="구글에서 '서울 오늘 날씨'를 검색하고 기온을 알려줘",
llm=ChatOpenAI(model="gpt-4o"),
browser_session=BrowserSession()
)
result = await agent.run()
목표: 기본 설치 → 에이전트 실행 → 결과 확인
데코레이터 패턴으로 커스텀 액션을 등록하고 에이전트가 활용하게 합니다.
from browser_use import Agent, Controller
controller = Controller()
@controller.action(description='현재 시간을 반환합니다')
async def get_current_time() -> str:
from datetime import datetime
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
agent = Agent(
task="현재 시간을 확인하고 캘린더 이벤트를 만들어줘",
llm=...,
controller=controller
)
목표: 레지스트리 패턴 이해, 커스텀 도구 등록
3개 뉴스 사이트에서 동시에 AI 관련 헤드라인을 수집하여 비교 보고서를 작성하는 에이전트를 구축합니다.
학습 포인트: 탭 관리, extract 액션, write_file 액션 활용
Primary LLM을 의도적으로 실패하게 만들고(잘못된 API 키), Fallback LLM이 자동으로 작업을 이어받는 것을 확인합니다.
agent = Agent(
task="...",
llm=ChatOpenAI(model="gpt-4o", api_key="INVALID"),
fallback_llm=ChatOpenAI(model="gpt-4o-mini"), # 올바른 키
)
학습 포인트: 폴백 메커니즘 동작 원리, 에러 코드별 처리 로직
browser-use CLI로 로그인 → 데이터 수집 → PDF 저장까지의 워크플로우를 자동화합니다.
browser-use open "https://example.com/login"
browser-use type "user@example.com" # 포커스된 요소에 타이핑
browser-use click 3 # 요소 인덱스로 클릭 (state 명령으로 인덱스 확인)
browser-use screenshot dashboard.png
학습 포인트: CLI 도구 활용, 세션 지속성, 브라우저 프로필 관리
| 주차 | 주제 | 핵심 학습 내용 |
|---|---|---|
| 1주차 | 기초 다지기 | CDP 공식 문서 읽기 / Playwright Python 기본 / asyncio 코루틴·태스크 |
| 2주차 | browser-use 코어 파악 | 설치 및 기본 예제 / agent/service.py의 run()→step() 흐름 추적 |
| 3주차 | LLM 에이전트 패턴 | ReAct 논문 읽기 / Function Calling vs Tool Use 비교 / 토큰 최적화 전략 |
| 4주차 | 프로덕션 배포 | Chromium 포함 Docker 이미지 최적화 / 에러 핸들링·재연결 로직 / 텔레메트리 |
| 5주차 | 확장 및 커스텀 | 커스텀 액션 개발 / MCP 통합 / Skills 시스템 |
| 6주차 | 고급 주제 | 멀티 에이전트 오케스트레이션 / WebArena·Mind2Web 벤치마크 평가 |
| 키워드 | 설명 |
|---|---|
| CDP | Chrome DevTools Protocol. WebSocket으로 Chrome을 제어하는 프로토콜. 탭 관리·DOM 조작·스크린샷·네트워크 감시 등 가능 |
| Playwright | Microsoft의 브라우저 자동화 라이브러리. browser-use에서 프로세스 관리에만 부분 사용 |
| DOM 직렬화 | 브라우저 DOM 트리를 LLM이 이해할 수 있는 텍스트 형태로 변환하는 과정 |
| 접근성 트리 | 웹 페이지의 시맨틱 구조. 버튼·링크 등의 역할(role)과 이름(name)을 포함. 스크린 리더용이지만 AI도 활용 |
| Action Registry | 브라우저 액션을 데코레이터로 등록하고 이름으로 디스패치하는 패턴 |
| 루프 감지 | 에이전트가 같은 동작을 반복할 때 탈출 전략을 제안하는 메커니즘 |
| 폴백 LLM | 주 LLM 실패 시 자동으로 대체 모델로 전환하는 전략 |
| EventBus | 이벤트 발행/구독 패턴의 중앙 허브. 브라우저 이벤트를 비동기 전파 |
| Watchdog | 특정 조건을 지속 감시하고 이벤트를 발행하는 감시자 패턴 |
| 메시지 압축 | LLM 컨텍스트 윈도우 한계 내에서 대화 기록을 압축하는 기법 |
| 넛지(Nudge) | 에이전트가 정체·루프에 빠졌을 때 LLM에 주입하는 힌트 메시지 |
| ReAct | Reasoning + Acting. 관찰→추론→행동 반복 루프의 LLM 에이전트 패턴 |
| Pydantic | Python 데이터 검증 라이브러리. 액션 모델·설정·출력 스키마에 사용 |
| MCP | Model Context Protocol. LLM과 외부 도구를 연결하는 표준 프로토콜. browser-use는 MCP 서버로도 동작 가능 |
| KV Cache | LLM 추론 시 이전 토큰의 Key/Value를 캐싱하여 반복 계산을 피하는 기법 |
| Stealth Browser | 봇 감지를 우회하기 위해 브라우저 핑거프린트를 조작한 브라우저 인스턴스 |
| uv | Rust로 작성된 초고속 Python 패키지 관리자. pip/poetry 대체 |