1. 인트로 및 세션 개요
- 진행자 소개
"안녕하세요 여러분, 저는 Nico이고 Vercel에서 AI SDK를 개발하고 있습니다." - 세션 목표
"오늘 이 세션에서는 AI SDK로 에이전트를 만드는 방법을 살펴볼 거예요." - 구성
- 기초 파트: AI SDK의 핵심 빌딩 블록 소개
- 실전 파트: Node.js로 딥 리서치(Deep Research) 클론 만들기
2. 프로젝트 준비 및 실행 방법
- 레포지토리 클론, 의존성 설치, 환경 변수 복사
"먼저 레포지토리를 클론하고, 의존성을 설치한 뒤, 환경 변수를 복사해 주세요." - 실행 방법
index.ts파일 하나로 구성pnpm rundev로 실행 (별칭pd사용)
3. 기초 빌딩 블록: 텍스트 생성 함수
3.1 generateText 함수
-
기본 사용법
- 비동기 함수
main에서generateText호출 - 모델: OpenAI의 GPT-4.0 mini
- 프롬프트: "hello world"
- 결과 출력
"Hello, how can I assist you today?"
- 비동기 함수
-
메시지 배열 지원
- 프롬프트 대신 메시지 배열도 입력 가능
- 메시지는
role과content로 구성
-
통합 인터페이스의 장점
- "AI SDK의 핵심 기능 중 하나는 통합 인터페이스입니다. 한 줄만 바꿔서 다양한 모델을 쓸 수 있어요!"
3.2 모델 전환의 유연성
-
웹 검색이 필요한 경우
- GPT-4.0 mini는 2024년까지만 학습, 2025년 정보는 모름
"죄송하지만 2025년에 예정된 AI 엔지니어 서밋에 대한 정보는 없습니다."
- Perplexity 모델로 전환
- "모델만 바꿔주면 됩니다."
- Perplexity Sonar Pro 사용
"AI 엔지니어 서밋 2025는 2월 19일부터 22일까지 뉴욕에서 열렸습니다."
- sources 속성으로 출처 확인 가능
- GPT-4.0 mini는 2024년까지만 학습, 2025년 정보는 모름
-
다양한 프로바이더 지원
- "SDK 문서에서 다양한 프로바이더를 확인할 수 있습니다."
- 예: Google Gemini Flash 1.5 + 검색 그라운딩
4. 도구(툴) 및 함수 호출: 외부 세계와 상호작용
4.1 툴의 개념
-
"툴은 언뜻 복잡해 보이지만, 본질은 간단합니다."
-
툴 제공 방식
- 모델에 프롬프트와 함께 사용 가능한 툴 목록 전달
- 각 툴: 이름, 설명, 필요 데이터 포함
-
툴 호출 흐름
- 모델이 툴이 필요하다고 판단하면 툴 콜(tool call) 생성
- 개발자가 해당 툴 콜을 파싱, 실행, 결과를 처리
4.2 간단한 예시: 두 수 더하기
-
코드 구조
generateText에tools객체 전달- 툴 이름:
addNumbers - 설명, 파라미터, 실행 함수 포함
- 타입 세이프티를 위한
tool유틸리티 사용
-
실행 결과
"툴 결과: addNumbers, 인자: 10, 5, 결과: 15"
-
툴 콜만 생성, 텍스트는 없음
- "이제 모델은 텍스트가 아니라 툴 콜만 생성합니다."
4.3 툴 결과를 텍스트로 합성하기
- maxSteps 옵션
- "maxSteps는 모델이 툴 콜을 생성하면, 그 결과를 다시 대화 컨텍스트에 넣고, 다음 스텝을 반복합니다."
- "텍스트가 생성될 때까지, 또는 최대 스텝에 도달할 때까지 반복합니다."
- 멀티스텝 에이전트 구현 가능
4.4 복수 툴로 에이전트 행동 시연
-
날씨 정보 툴 추가
getWeather툴: 위도, 경도, 도시명 필요- "도시명만 프롬프트에 있으면, 모델이 나머지 파라미터를 추론할 수 있습니다."
-
복합 프롬프트 예시
"샌프란시스코와 뉴욕의 날씨를 가져오고, 두 값을 더해줘."
-
실행 결과
"샌프란시스코의 현재 온도는 12.3°C, 뉴욕은 15.2°C입니다. 두 온도를 더하면 27.5°C입니다."
-
스텝 구조
- 1단계: 두 도시의 날씨 툴 콜
- 2단계: 두 값을 더하는 툴 콜
- 3단계: 최종 텍스트 생성
5. 구조화된 데이터 생성 (Structured Output)
5.1 generateText의 experimental output 옵션
- Zod로 스키마 정의
- "Zod는 타입스크립트 검증 라이브러리로, AI SDK와 찰떡궁합입니다."
- 예:
output: object({ sum: z.number(), });
- 실행 결과
"experimental output: sum = 27.5"
5.2 generateObject 함수
-
정의
- "generateObject는 구조화된 출력에 특화된 함수로, 제가 가장 좋아하는 함수입니다."
-
예시
- 프롬프트: "AI 에이전트의 정의 10개를 만들어줘."
- 스키마:
definitions: string[] - 결과:
"AI 에이전트는 인공지능 기술을 활용해 자율적 또는 반자율적으로 작업을 수행하는 소프트웨어 엔티티입니다." (외 9개)
-
Zod의 describe 기능
- 각 정의에 "가능한 한 많은 전문 용어를 사용하고, 완전히 이해할 수 없게 작성하라" 등 세부 지시 가능
- 결과:
"자율적 엔티티가 알고리즘적 휴리스틱을 활용해 동적 환경에서 의사결정 프로세스를 최적화한다." (등등)
6. 실전: Deep Research 클론 만들기
6.1 Deep Research란?
-
"Deep Research는 주제를 입력하면, 웹을 탐색하고, 자료를 모으고, 생각의 가지를 따라가며, 최종적으로 리포트를 만들어주는 서비스입니다."
-
핵심 워크플로우
- 입력 쿼리
- 서브 쿼리 생성
- 각 쿼리로 웹 검색
- 검색 결과 분석 및 추가 질문 생성
- 필요시 재귀적으로 반복
- 최종적으로 모든 정보를 종합해 리포트 생성
-
깊이(depth)와 너비(breadth) 개념
- "깊이: 몇 단계까지 파고들지, 너비: 각 단계에서 몇 개의 쿼리를 생성할지"
6.2 구현 단계별 상세 설명
1) 서브 쿼리 생성 함수
- generateSearchQueries
- 입력: 쿼리, 생성할 쿼리 개수
- 출력: 검색에 적합한 쿼리 배열
- 예시:
"D1 샷풋 선수가 되려면 필요한 것은?"
- "D1 샷풋 선수 자격 요건"
- "D1 샷풋 선수 훈련 방법"
- "NCAA 디비전 1 샷풋 자격"
2) 웹 검색 함수
- Exa API 사용
- "Exa는 빠르고 저렴한 웹 검색 API입니다."
- 결과에서 불필요한 정보(파비콘 등)는 제거
- "토큰 수를 줄이면 비용도 줄고, 모델의 효율도 올라갑니다."
3) 검색 결과 평가 및 에이전트 루프
- searchAndProcess 함수
- 두 개의 툴 사용:
- 웹 검색 툴
- 검색 결과 평가 툴 (relevant/irrelevant)
- maxSteps로 반복
- "평가 결과가 irrelevant면, '더 구체적인 쿼리로 다시 검색해 주세요'라는 피드백을 남깁니다."
- "이렇게 하면, 모델이 계속해서 더 나은 결과를 찾으려고 시도합니다."
- 두 개의 툴 사용:
4) 학습 내용 및 추가 질문 생성
- generateLearnings 함수
- 입력: 쿼리, 검색 결과
- 출력:
- learning(인사이트)
- followUpQuestions(추가 질문 배열)
- 예시:
"D1 샷풋 선수가 되려면, 고등학교 4년간의 선수 경험, 주/전국 대회 입상, 60피트 이상의 기록이 필요합니다."
"추가 질문: 샷풋 선수의 훈련법은? D1과 D2, D3의 차이는?"
5) 재귀적 딥 리서치 함수
-
deepResearch 함수
- 재귀적으로 followUpQuestions를 새로운 쿼리로 삼아 반복
- 누적 연구 상태(accumulated research)를 전역에서 관리
- depth, breadth로 반복 제한
-
중복 소스 방지
- "이미 사용한 소스는 irrelevant로 처리해 중복을 막습니다."
6) 최종 리포트 생성
-
generateReport 함수
- 누적된 연구 데이터를 기반으로 리포트 생성
- "03 mini" 모델 사용
- 결과를 마크다운 파일로 저장
-
시스템 프롬프트 추가
- "당신은 전문 연구원입니다. 오늘 날짜는 XX입니다. 마크다운 포맷을 사용하세요. 추측이나 예측은 명확히 표시하세요."
- "모델이 추론에 의존하지 않도록, 원하는 구조와 포맷을 명확히 지시하세요."
-
실행 결과
"아래는 D1 샷풋 선수가 되기 위한 요건, 기술, 훈련, 초보자 실수 등에 대한 통합 리포트입니다."
- "최상위 수준의 경쟁력, 4년간의 선수 경험, 55피트 이상의 기록, 남녀별 차이 등..."
7. 마무리 및 안내
- "이렇게 단 218줄의 코드로 딥 리서치 에이전트를 만들 수 있습니다!"
- "질문이 있으면 X(트위터) @nikoalbanese10으로 DM 주세요."
- "SDK.purcell.ai에서 문서와 쿡북 가이드도 확인해 보세요."
- "Swix에게 이 세션을 제안해줘서 감사하고, 다음에 또 만나요!"
핵심 키워드 요약
- AI SDK
- generateText / generateObject
- 툴(도구) / 함수 호출
- 멀티스텝 에이전트
- 구조화된 출력 (Structured Output)
- Zod 스키마
- Deep Research 워크플로우
- 재귀적 에이전트
- 웹 검색 API (Exa)
- 마크다운 리포트 생성
- 시스템 프롬프트 설계
"이 세션을 통해 여러분이 AI SDK로 멋진 에이전트와 리서치 시스템을 직접 만들어볼 수 있길 바랍니다!" 😊