이 블로그 게시물에서는 다음 내용을 확인하실 수 있습니다:
- Cartesia가 무엇이며, AI 음성 에이전트 개발에 어떤 기능을 제공하는지.
- 음성 에이전트(다른 모든 에이전트와 마찬가지로)가 효과적이고 진정으로 신뢰할 수 있으려면 왜 웹에 접근해야 하는지.
- Bright Data 통합을 통해 Cartesia AI 음성 에이전트가 웹에서 정보를 검색하고 추출할 수 있도록 하는 방법.
자, 시작해 봅시다!
Cartesia란 무엇인가요?
Cartesia는 실시간 AI 음성 에이전트를 구축하기 위한 개발자 중심 플랫폼입니다. 이 플랫폼은 저지연 음성 모델과 완벽한 에이전트 개발 스택을 결합하여, 아이디어에서 실제 운영 가능한 음성 에이전트까지 완성하는 데 필요한 모든 것을 제공합니다.
이 플랫폼은 빠른 반복 작업을 위해 설계되어, 개발자가 최소한의 마찰로 대화형 에이전트의 프로토타입을 제작, 배포 및 개선할 수 있도록 지원합니다. 단일 통합 생태계 내에서 음성, 추론, 배포 및 테스트를 처리합니다.
Cartesia의 음성 스택은 두 가지 핵심 자체 개발 모델을 기반으로 합니다:
- Sonic: 초저지연과 표현력 높은 출력을 위해 최적화된 스트리밍 텍스트-투-스피치(TTS) 모델입니다. 40개 이상의 언어로 웃음, 감정 표현을 전달하며 자연스럽고 인간과 유사한 음성을 구현합니다.
- Ink: 실제 대화 환경을 위해 설계된 빠르고 정확한 음성-텍스트 변환(STT) 모델로, 소음, 억양, 말더듬 등을 처리하면서도 거의 실시간에 가까운 전사 속도를 유지합니다.
에이전트 구축을 위해 Cartesia는 내장형 웹 에이전트 빌더와 오픈소스 SDK인 Line을 모두 제공합니다. Cartesia SDK는 템플릿, 도구 통합, 다중 에이전트 오케스트레이션 등을 지원합니다. 이를 통해 지능적이고 생산 환경에 적합한 음성 에이전트를 제작하는 데 필요한 모든 것을 갖추게 됩니다.
음성 에이전트에 웹 액세스가 필요한 이유
Cartesia는 LiteLLM을 통해 100개 이상의 대규모 언어 모델(LLM)을 지원하는, AI 음성 에이전트 구축을 위한 기능이 풍부한 솔루션임에 틀림없습니다. 그러나 이처럼 폭넓은 선택지가 있음에도 불구하고, 모든 LLM은 지식 데이터가 특정 시점에 고정되어 있다는 동일한 본질적인 한계를 공유합니다. 이로 인해 에이전트가 실제 환경의 최신 작업을 처리해야 할 때, 구식 응답, 허위 정보 제공, 또는 정보 공백이 발생할 수 있습니다.
게다가 LLM은 기본적으로 웹에 접속하거나 외부 시스템과 상호작용할 수 없습니다. 그 결과, 표준 에이전트 워크플로는 모델의 한계로 인해 제약을 받게 됩니다. 이를 극복하기 위해서는 맞춤형 도구를 통한 외부 서비스와의 통합이 필수적입니다.
바로 여기서 Bright Data가 해결책이 됩니다. Cartesia를 Bright Data에 연결하면 에이전트가 어떤 웹사이트에서든 실시간 정보, 검색 결과 및 구조화된 데이터에 접근할 수 있습니다.
Bright Data의 엔터프라이즈급 인프라는 195개국에 걸쳐 4억 개 이상의 IP를 보유한 세계 최대 규모의 프록시 네트워크 중 하나를 갖추고 있어, 실시간 웹 콘텐츠에 안전하고 안정적이며 확장 가능한 접근을 가능하게 합니다.
Cartesia 음성 에이전트에 적용할 수 있는 주요 Bright Data 제품은 다음과 같습니다:
- SERP API: Google, Bing 등에서 검색 엔진 결과를 수집하여 정보에 기반한 응답을 지원합니다.
- Web Unlocker API: CAPTCHA 및 봇 방지 기능을 우회하여 모든 사이트의 콘텐츠를 원시 HTML 또는 마크다운 형식으로 액세스합니다.
- Web Scraper API: Amazon, LinkedIn, Instagram과 같은 플랫폼에서 구조화된 데이터를 추출합니다.
- Crawl API: 전체 웹사이트를 구조화된 데이터 세트로 변환하여 후속 AI 워크플로우에 활용합니다.
Bright Data를 통해 Cartesia 에이전트는 더 이상 사전 학습된 지식에만 국한되지 않습니다. 에이전트는 실시간의 신뢰할 수 있는 웹 데이터를 탐색, 검색 및 추론할 수 있습니다. 이를 통해 더 정확하고, 맥락을 이해하며, 실행 가능한 응답을 제공할 수 있습니다.
Bright Data의 웹 데이터 검색 기능을 활용한 Cartesia AI 음성 에이전트 구축 방법
이 단계별 가이드에서는 Cartesia를 사용하여 AI 음성 에이전트를 구축하는 방법을 배웁니다. 이 에이전트는 Bright Data를 활용한 웹 검색 및 웹 스크래핑 기능으로 강화될 것입니다.
특히, 이 AI 음성 에이전트는 주어진 주제에 대해 청취할 수 있는 짧은 뉴스 형식의 리포트를 생성하는 시뮬레이션을 수행합니다. 또한 에이전트와 채팅을 통해 후속 질문을 하고 주제를 더 깊이 탐구할 수도 있습니다.
참고: 이는 AI 음성 에이전트의 구현 사례 중 하나일 뿐입니다. Bright Data의 통합 기능은 그 외에도 다양한 사용 사례를 지원합니다.
구체적으로, Bright Data의 AI 지원 제품 중 두 가지를 통합하게 됩니다:
- 에이전트가 어떤 URL에서든 데이터를 추출할 수 있도록 하는 Web Unlocker API.
- 에이전트가 웹 검색을 수행할 수 있도록 지원하는 SERP API.
이 두 도구를 결합하면 AI 에이전트가 ‘검색 및 추출’ 패턴을 적용할 수 있게 됩니다. 이는 데이터 그라운딩과 웹 탐색에 이상적입니다.
에이전트를 구축할 때 더 정교한 프로그래밍 제어를 위해 Line(즉, Cartesia SDK)을 활용할 것입니다. 에이전트 빌더는 프로토타이핑에는 훌륭하지만 기능이 다소 제한적이기 때문입니다.
아래 지침을 따르세요!
필수 사항
이 튜토리얼을 따라 하려면 다음 사항이 준비되어 있는지 확인하세요.
- 유닉스 기반 운영 체제(Linux, macOS 또는 Windows의 WSL).
- 로컬에 Python 3.9 이상이 설치되어 있어야 합니다.
- 로컬에
uv가설치되어 있어야 합니다. - Cartesia에서 지원하는 LLM 제공업체 중 하나의 API 키(여기서는 Gemini API 키를 사용합니다).
- Web Unlocker API 및 SERP API가 설정된 Bright Data 계정과 API 키.
- API 키가 구성된 Cartesia 계정.
Bright Data 및 Cartesia 계정 설정에 대해서는 아직 걱정하지 마세요. 전용 하위 장에서 단계별로 안내해 드릴 것입니다.
1단계: Cartesia 프로젝트 초기화
uv를 사용하여 프로젝트용 폴더를 생성하는 것으로 시작합니다(이는 Cartesia 퀵스타트 가이드에서 권장하는 방법입니다):
uv init cartesia-bright-data-voice-agent
프로젝트 폴더로 이동합니다:
cd cartesia-bright-data-voice-agent
다음과 같은 폴더 구조가 표시되어야 합니다:
cartesia-bright-data-voice-agent/
├── .git/
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml
이것이 uv init 명령어의 결과입니다.
main.py 파일에 주목하세요. 이곳에 Cartesia 로직을 추가하여 Bright Data를 활용해 웹 데이터 검색 및 검색 기능이 확장된 AI 음성 에이전트를 설계하게 됩니다.
다음으로 다음 명령어를 사용하여 프로젝트 종속성을 설치하세요:
uv add cartesia-line requests
필요한 두 가지 라이브러리는 다음과 같습니다:
cartesia-line: 지능적이고 지연 시간이 짧은 음성 에이전트를 구축하기 위한 Cartesia Line SDK입니다.requests: 널리 사용되는 Python HTTP 클라이언트로, 사용자 정의 Cartesia 도구에서 Bright Data의 API를 호출하는 데 사용됩니다.
이 라이브러리들은 uv에 의해 .venv 가상 환경에 자동으로 설치됩니다. 이제 선호하는 Python IDE에서 프로젝트를 직접 열 수 있습니다.
잘하셨습니다! 빈 Cartesia 프로젝트가 준비되었습니다.
2단계: Cartesia CLI 시작하기
로컬에서 Cartesia 에이전트를 테스트하려면 Cartesia CLI를 설치하고 로그인해야 합니다. 인증을 위해서는 Cartesia API 키가 필요하므로, 먼저 이를 준비해 봅시다!
아직 계정이 없다면 새로운 Cartesia 계정을 생성하세요. 이미 계정이 있다면 로그인하세요. 로그인하면 대시보드로 이동합니다:
이제 “API Keys” 페이지로 이동하여 “New” 버튼을 클릭하세요:
API 키에 이름을 지정하고(예: “Bright Data 기반 음성 에이전트”), “생성”을 클릭하면 모달 창에 API 키가 표시됩니다.
API 토큰을 복사하여 안전하게 보관해 두세요. 곧 필요하게 될 것입니다.
Unix 기반 터미널에서 다음 명령어를 사용하여 Cartesia CLI를 설치하십시오:
curl -fsSL https://cartesia.sh | sh
설치가 완료되면 셸을 재시작하여 어디서나 cartesia 명령어를 사용할 수 있도록 하세요.
CLI에서 인증하려면 다음 명령을 실행하세요:
cartesia auth login
Cartesia API 키를 입력하라는 메시지가 표시됩니다. 키를 붙여넣고 Enter 키를 누르세요. 성공하면 다음과 같은 메시지가 표시됩니다:
참고: 이 예시에서 “Writech”는 Cartesia 조직의 이름입니다. 사용자의 경우, 해당 조직에 맞춰진 메시지가 표시됩니다.
완벽합니다! 이제 초기 필수 설정을 완료하기 위해 Bright Data 계정을 설정할 차례입니다.
3단계: Bright Data 계정 설정
Cartesia에서 SERP API와 Web Unlocker를 연결하려면 먼저 SERP API 영역과 Web Unlocker API 영역이 모두 설정된 Bright Data 계정과 API 키가 필요합니다.
Bright Data 계정이 없다면 새 계정을 생성하세요. 이미 계정이 있다면 로그인하세요. 제어판으로 이동하여 “Proxies & Scraping” 페이지로 이동한 후 “My Zones” 테이블을 확인하세요:
표에 Web Unlocker API 영역(예: web_unlocker)과 SERP API 영역(예: serp_api)이 이미 나열되어 있다면 준비가 완료된 것입니다. 이 두 영역은 사용자 지정 도구를 통해 Web Unlocker 및 SERP API 서비스를 호출하는 데 사용됩니다.
두 존 중 하나라도 누락된 경우, 해당 존을 생성하십시오. “Unblocker API” 및 “SERP API” 카드로 스크롤한 후 “존 생성”을 클릭하십시오. 마법사의 안내에 따라 두 존을 모두 추가하십시오:
자세한 안내는 다음 문서 페이지를 참조하세요:
다음 단계에서 필요하므로 두 영역에 지정한 이름을 기억해 두세요. 마지막으로 Bright Data API 키를 생성하고 안전하게 보관하세요.
훌륭합니다! 이제 Bright Data를 Cartesia에 통합할 준비가 되었습니다.
4단계: 환경 변수 읽기 구성
이 AI 음성 에이전트 워크플로는 LLM 제공업체(이 경우 Gemini)와 Bright Data(API 키 + 존 이름)라는 몇 가지 비밀 정보에 의존합니다. 이러한 비밀 정보를 코드에 하드코딩하는 것은 보안 위험이 있으므로 환경 변수에 저장하는 것이 좋습니다.
Cartesia CLI는 백그라운드에서 python-dotenv를 사용하여 .env 파일을 자동으로 읽어오므로, 모든 시크릿을 해당 파일에 저장할 수 있습니다. 먼저 프로젝트 디렉터리에 .env 파일을 추가하세요:
cartesia-bright-data-voice-agent/
├── .git/
├── .env # <-----------
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml
그런 다음, 비밀 정보를 입력하세요:
GEMINI_API_KEY="<YOUR_GEMINI_API_KEY>"
BRIGHT_DATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>"
BRIGHT_DATA_WEB_UNLOCKER_ZONE="<YOUR_BRIGHT_DATA_WEB_UNLOCKER_ZONE>" # 예: "web_unlocker"
BRIGHT_DATA_SERP_API_ZONE="<YOUR_BRIGHT_DATA_SERP_API_ZONE>" # 예: "serp_api"
모든 자리 표시자를 실제 값으로 대체하십시오. 이러한 모든 비밀값이 설정되지 않으면 워크플로가 시작되지 않도록 하려면 main.py에 다음 로직을 추가하십시오:
import os
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
if not GEMINI_API_KEY:
raise EnvironmentError("환경 변수 누락: GEMINI_API_KEY")
BRIGHT_DATA_API_KEY = os.getenv("BRIGHT_DATA_API_KEY")
if not BRIGHT_DATA_API_KEY:
raise EnvironmentError("환경 변수 누락: BRIGHT_DATA_API_KEY")
BRIGHT_DATA_SERP_API_ZONE = os.getenv("BRIGHT_DATA_SERP_API_ZONE")
if not BRIGHT_DATA_SERP_API_ZONE:
raise EnvironmentError("환경 변수 BRIGHT_DATA_SERP_API_ZONE이(가) 없습니다")
BRIGHT_DATA_WEB_UNLOCKER_ZONE = os.getenv("BRIGHT_DATA_WEB_UNLOCKER_ZONE")
if not BRIGHT_DATA_WEB_UNLOCKER_ZONE:
raise EnvironmentError("환경 변수 누락: BRIGHT_DATA_WEB_UNLOCKER_ZONE")
.env 파일을 사용할 필요는 없다는 점을 유의하십시오. 터미널에서 직접 다음과 같이 환경 변수를 설정할 수도 있습니다:
export GEMINI_API_KEY="<YOUR_GEMINI_API_KEY>" BRIGHT_DATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>" BRIGHT_DATA_WEB_UNLOCKER_ZONE="<YOUR_BRIGHT_DATA_WEB_UNLOCKER_ZONE>" BRIGHT_DATA_SERP_API_ZONE="<YOUR_BRIGHT_DATA_SERP_API_ZONE>"
훌륭합니다! 환경 변수가 안전하게 설정되었습니다. 다음 단계: 웹 스크래핑 및 검색을 위한 Bright Data 도구 구현입니다.
5단계: 웹 스크래핑을 위한 Web Unlocker 도구 정의
기본적으로 Cartesia AI 음성 에이전트는 외부 웹에 액세스할 수 없습니다. 이를 활성화하려면 에이전트가 호출할 수 있는 사용자 지정 도구를 제공해야 합니다. 여기서는 웹 스크래핑을 위해 Bright Data의 Web Unlocker API에 연결하는 도구를 정의할 것입니다.
Cartesia에서 도구는 사용 가능한 도구 데코레이터 중 하나로 주석이 달린 함수에 불과합니다. 다음은 Web Unlocker API에 연결하는 Cartesia 웹 스크래핑 도구를 구축하는 방법입니다:
@loopback_tool
def bright_data_web_unlocker(
ctx,
page_url: Annotated[str, "스크래핑할 페이지의 URL"]
) -> str:
"""
Bright Data Web Unlocker API를 사용하여 웹 페이지 콘텐츠를 가져옵니다.
"""
url = "https://api.brightdata.com/request"
data = {
"zone": BRIGHT_DATA_WEB_UNLOCKER_ZONE,
"url": page_url,
"format": "raw",
"data_format": "markdown"
}
headers = {
"Authorization": f"Bearer {BRIGHT_DATA_API_KEY}",
"Content-Type": "application/json"
}
# Bright Data Web Unlocker API에 요청 전송
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
return response.text
Cartesia SDK는 함수의 docstring을 도구 설명으로 사용하고, 매개변수에 대한 타입 주석을 활용합니다. 또한 모든 도구의 첫 번째 매개변수는 도구 컨텍스트를 나타내는 ctx여야 합니다. 이를 통해 대화 상태에 접근할 수 있으며, 향후 호환성을 보장합니다.
bright_data_web_unlocker() 함수는 Requests HTTP 클라이언트를 사용하여 Bright Data Web Unlocker API 영역에 POST 요청을 보냅니다. 이 함수는 page_url 인자로 지정된 웹 페이지의 마크다운 버전을 반환합니다. 사용 가능한 매개변수 및 옵션에 대한 자세한 내용은 Bright Data 문서를 참조하십시오.
data_format 인수가 "markdown"으로 설정되어 있다는 점에 유의하십시오. 이를 통해“Scrape as Markdown”기능을 활성화하여,LLM 입력에 이상적인 AI 최적화 Markdown 형식으로 스크랩된 콘텐츠를 얻을 수 있습니다. format 인수는 "raw" 로 설정되어 있어, API가 스크랩된 Markdown 콘텐츠를 JSON으로 감싸지 않고 원본 그대로 반환합니다.
훌륭합니다! 이제 Cartesia AI 애플리케이션에 Bright Data를 사용하여 어떤 웹사이트든 성공적으로 웹 스크래핑할 수 있는 도구가 포함되었습니다.
6단계: 웹 검색용 SERP API 도구 정의
마찬가지로, SERP API를 호출하는 사용자 정의 함수 도구를 정의합니다:
@loopback_tool
def bright_data_serp_api(
ctx,
query: Annotated[str, "Google 검색 쿼리"]
) -> str:
"""
Bright Data의 SERP API를 사용하여 특정 용어에 대한 웹 검색을 수행합니다.
"""
url = "https://api.brightdata.com/request"
data = {
"zone": BRIGHT_DATA_SERP_API_ZONE,
"url": f"https://www.google.com/search?q={urllib.parse.quote_plus(query)}&brd_json=1",
"format": "raw"
}
headers = {
"Authorization": f"Bearer {BRIGHT_DATA_API_KEY}",
"Content-Type": "application/json"
}
# Bright Data SERP API에 요청을 보냅니다
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
return response.text
이 함수는 SERP API 영역에 POST 요청을 보냅니다. Google에 쿼리를 전송하고 Bright Data를 통해 파싱된 검색 결과를 가져옵니다. 자세한 내용은 Bright Data SERP API 문서를 참조하세요.
좋습니다! 이제 Cartesia 애플리케이션에 필요한 Bright Data 기반 도구가 포함되었습니다.
7단계: Cartesia 음성 에이전트 정의
이 단계까지 진행하면 Cartesia 에이전트를 정의하는 데 필요한 모든 구성 요소를 갖추게 됩니다. 권장되는 방법은 LiteLLM을 통해 100개 이상의 LLM 제공업체를 지원하는 내장 LlmAgent 클래스를 사용하는 것입니다.
음성 에이전트를 정의하려면 클래스에 다음을 제공하십시오:
- LLM 모델 및 API 키.
- 에이전트가 사용할 수 있는 도구.
- 에이전트가 수행해야 할 작업을 설명하는 시스템 프롬프트.
- 초기 메시지.
모든 요소를 통합하는 방법은 다음과 같습니다:
from line.llm_agent import LlmAgent, LlmConfig, end_call
from line.voice_agent_app import VoiceAgentApp
async def get_agent(env, call_request):
# AI 음성 에이전트 정의
SYSTEM_PROMPT = """
당신은 웹을 검색하여 최신 정보를 찾아낼 수 있는 유용한 비서입니다.
명확하고 뉴스 스타일의 유익한 어조로 답변해 주세요.
"""
return LlmAgent(
model="gemini/gemini-3-flash-preview",
api_key=GEMINI_API_KEY,
tools=[
end_call,
bright_data_web_unlocker,
bright_data_serp_api
],
config=LlmConfig(
system_prompt=SYSTEM_PROMPT,
introduction="안녕하세요! 오늘 무엇을 도와드릴까요?",
),
)
주의할 점 몇 가지:
tools배열에는 앞서 정의한 두 가지 Bright Data 사용자 정의 도구(bright_data_web_unlocker및bright_data_serp_api)가 포함되어 있습니다.- 에이전트가 대화를 원활하게 종료할 수 있도록 내장된
end_call도구가 필요합니다. - 구성된 LLM 모델은 Gemini 3 Flash이지만, 다른 Gemini 모델도 사용할 수 있습니다.
마지막으로, VoiceAgentApp 클래스에 에이전트를 등록하고 실행합니다:
app = VoiceAgentApp(get_agent=get_agent)
if __name__ == "__main__":
app.run()
임무 완료! 뉴스 스타일의 응답을 제공하는 AI 음성 에이전트를 구축했습니다. 이 에이전트는 더 정확하고 최신 정보를 제공하기 위해 웹에서 실시간 정보를 검색하고 가져올 수 있습니다.
8단계: 최종 코드
이제 main.py 파일에는 다음과 같은 내용이 포함되어야 합니다:
# uv add cartesia-line requests
import os
from line.llm_agent import loopback_tool
from typing import Annotated
import requests
import urllib
from line.llm_agent import LlmAgent, LlmConfig, end_call
from line.voice_agent_app import VoiceAgentApp
# 환경 변수에서 필요한 비밀 키 읽기
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
if not GEMINI_API_KEY:
raise EnvironmentError("환경 변수 누락: GEMINI_API_KEY")
BRIGHT_DATA_API_KEY = os.getenv("BRIGHT_DATA_API_KEY")
if not BRIGHT_DATA_API_KEY:
raise EnvironmentError("환경 변수 누락: BRIGHT_DATA_API_KEY")
BRIGHT_DATA_SERP_API_ZONE = os.getenv("BRIGHT_DATA_SERP_API_ZONE")
if not BRIGHT_DATA_SERP_API_ZONE:
raise EnvironmentError("환경 변수 BRIGHT_DATA_SERP_API_ZONE이(가) 없습니다")
BRIGHT_DATA_WEB_UNLOCKER_ZONE = os.getenv("BRIGHT_DATA_WEB_UNLOCKER_ZONE")
if not BRIGHT_DATA_WEB_UNLOCKER_ZONE:
raise EnvironmentError("환경 변수 누락: BRIGHT_DATA_WEB_UNLOCKER_ZONE")
@loopback_tool
def bright_data_web_unlocker(
ctx,
page_url: Annotated[str, "스크래핑할 페이지의 URL"]
) -> str:
"""
Bright Data Web Unlocker API를 사용하여 웹 페이지 콘텐츠를 가져옵니다.
"""
url = "https://api.brightdata.com/request"
data = {
"zone": BRIGHT_DATA_WEB_UNLOCKER_ZONE,
"url": page_url,
"format": "raw",
"data_format": "markdown"
}
headers = {
"Authorization": f"Bearer {BRIGHT_DATA_API_KEY}",
"Content-Type": "application/json"
}
# Bright Data Web Unlocker API에 요청 전송
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
return response.text
@loopback_tool
def bright_data_serp_api(
ctx,
query: Annotated[str, "Google 검색 쿼리"]
) -> str:
"""
Bright Data의 SERP API를 사용하여 웹에서 특정 용어를 검색합니다.
"""
url = "https://api.brightdata.com/request"
data = {
"zone": BRIGHT_DATA_SERP_API_ZONE,
"url": f"https://www.google.com/search?q={urllib.parse.quote_plus(query)}&brd_json=1",
"format": "raw"
}
headers = {
"Authorization": f"Bearer {BRIGHT_DATA_API_KEY}",
"Content-Type": "application/json"
}
# Bright Data SERP API에 요청 전송
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
return response.text
async def get_agent(env, call_request):
# AI 음성 에이전트 정의
SYSTEM_PROMPT = """
당신은 웹을 검색하여 최신 정보를 찾아낼 수 있는 유용한 비서입니다.
명확하고 뉴스 스타일의 유익한 어조로 답변해 주세요.
"""
return LlmAgent(
model="gemini/gemini-2.5-flash",
api_key=GEMINI_API_KEY,
tools=[
end_call,
bright_data_web_unlocker,
bright_data_serp_api
],
config=LlmConfig(
system_prompt=SYSTEM_PROMPT,
introduction="안녕하세요! 오늘 무엇을 도와드릴까요?",
),
)
app = VoiceAgentApp(get_agent=get_agent)
if __name__ == "__main__":
app.run()
멋지네요! 약 100줄의 파이썬 코드로 웹 데이터 검색 기능을 갖춘 강력한 음성 AI 에이전트를 구축하셨습니다.
9단계: 음성 에이전트 테스트
필요한 모든 환경 변수가 정의되어 있는지 확인하세요( .env 파일이나 export 명령어를 통해). 그런 다음 다음 명령어로 에이전트를 실행하세요:
PORT=8000 uv run python main.py
이렇게 하면 로그에 표시된 대로 http://localhost:8000에서 Cartesia 앱이 로컬로 시작됩니다:
별도의 터미널에서 다음 명령을 실행하여 에이전트와 대화해 보세요:
cartesia chat 8000
Cartesia 채팅 환경이 터미널에서 바로 실행됩니다:
이 설정을 통해 음성 대신 채팅을 통해 대화를 시뮬레이션할 수 있어 테스트가 훨씬 간편해집니다.
다음과 같은 프롬프트를 시도해 보세요:
웹에서 "미국 인플레이션 뉴스" 쿼리를 검색하고, 뉴스 허브 페이지가 아닌 기사 3~5개를 선택하여 내용을 추출한 후, 해당 정보를 활용해 주요 내용을 요약하고 출처를 인용한 약 3분 분량의 팟캐스트를 제작해 주세요.
다음은 예상되는 결과입니다:
에이전트가 먼저 “US inflation news”라는 쿼리로 bright_data_serp_api 도구를 호출하는 것을 확인하세요 . 다른 터미널에서는 Bright Data SERP API가 반환한 JSON 결과 로그를 볼 수 있습니다 . 에이전트는 해당 결과 중에서 관련성 높은 기사 URL 3개를 선택합니다:
다음으로, bright_data_web_unlocker 도구를 사용하여 각 페이지를 크롤링하고 출처를 명시한 요약문을 생성합니다:
응답의 어조가 앞서 정의한 시스템 프롬프트와 일치하며, 마치 기자가 쓴 것처럼 자연스럽게 표현된 점을 확인해 보세요.
자, 이제 완성되었습니다! 웹에서 정보를 능동적으로 검색하고 가져와, 상황에 더 잘 맞고 정확한 응답을 제공하는 음성 에이전트를 성공적으로 구축했습니다. Bright Data의 검색 및 스크래핑 도구를 통합하지 않았다면 불가능했을 것입니다.
다음 단계
이제 작동하는 AI 음성 에이전트가 완성되었으니, 다음 단계는 이를 Cartesia에 배포하고 휴대폰에서 호출해 보는 것입니다. 필요에 따라 에이전트를 더욱 세밀하게 조정하고 맞춤 설정하려면 문서를 참고하세요.
마지막으로, 이 튜토리얼에서 보여드린 것처럼 다른 API 기반 Bright Data 제품들을 통합할 수 있다는 점을 기억해 주세요. 이를 통해 에이전트의 기능을 확장할 수 있습니다.
Cartesia는 LiveKit(AI 음성 에이전트 구축을 위한 또 다른 기술)을 비롯한 다양한 통합 기능을 지원한다는 점을 기억해 주세요. 자세한 내용은 Bright Data와 LiveKit을 통합하는 방법을 참조하세요.
결론
이 블로그 게시물을 통해 Cartesia가 무엇이며, AI 음성 에이전트 개발에 어떤 이점을 제공하는지 알아보았습니다. 또한 Cartesia의 한계와 Bright Data 통합을 통해 이러한 한계를 해결하는 방법도 확인했습니다.
음성 에이전트에 두 가지 전문 도구를 추가함으로써, 웹 검색 및 웹 페이지 데이터 추출 기능을 부여했습니다. 이는 Bright Data의 SERP API와 Web Unlocker API로 구동되는 맞춤형 도구와 에이전트를 연결함으로써 가능해졌습니다.
실시간 웹 피드 액세스나 웹 상호작용 자동화 등 기능을 더욱 확장하려면, Cartesia 음성 에이전트를 Bright Data의 AI 전용 서비스 전체 제품군과 통합해 보세요.
지금 바로 Bright Data 계정을 무료로 생성하고, 에이전트에 AI 지원 웹 데이터 솔루션을 통합해 보세요!