Files
sam-kd/ai_sam/dev.md

351 lines
10 KiB
Markdown
Raw Normal View History

# Sam AI 개발 문서
## 프로젝트 개요
Sam AI는 Google Gemini Live API를 활용한 실시간 음성 AI 어시스턴트입니다. React (CDN)와 PHP를 사용하여 구현되었으며, 사용자의 음성 명령으로 대시보드 네비게이션과 파일 검색 기능을 제공합니다.
## 기술 스택
- **Frontend**: React 18 (CDN), Tailwind CSS (CDN), Babel (브라우저 변환)
- **Backend**: PHP 7.3+
- **AI SDK**: Google GenAI SDK (`@google/genai@^1.31.0`)
- **API**: Gemini Live API (`gemini-2.5-flash-native-audio-preview-09-2025`)
- **오디오**: Web Audio API, ScriptProcessorNode
## 설치 과정
### 1. 파일 구조
```
ai_sam/
├── index.php # 메인 애플리케이션 파일
├── api/
│ └── get_api_key.php # API 키 조회 엔드포인트
├── API_KEY_GUIDE.md # API 키 발급 가이드
└── dev.md # 개발 문서 (본 파일)
```
### 2. API 키 설정
#### 필요한 API 키
**Gemini Live API**를 사용하기 위해서는 **Google AI Studio**에서 발급받은 **Gemini API 키**가 필요합니다.
⚠️ **중요**:
- Vertex AI API 키가 아닙니다
- 서비스 계정 OAuth 토큰이 아닙니다
- Google AI Studio의 일반 Gemini API 키입니다
#### API 키 발급 방법
**방법 1: Google AI Studio (권장)**
1. https://makersuite.google.com/app/apikey 접속
2. Google 계정으로 로그인 (Codebridge-Chatbot 프로젝트 계정)
3. "Create API Key" 버튼 클릭
4. 프로젝트 선택: **Codebridge-Chatbot**
5. 생성된 API 키 복사
**방법 2: Google Cloud Console**
1. https://console.cloud.google.com/ 접속
2. 프로젝트 선택: **Codebridge-Chatbot**
3. "API 및 서비스" > "라이브러리"
4. "Generative Language API" 검색 후 "사용 설정"
5. "API 및 서비스" > "자격 증명"
6. "자격 증명 만들기" > "API 키"
7. 생성된 API 키 복사
#### API 키 저장
생성된 API 키를 `apikey/gemini_api_key.txt` 파일에 저장합니다.
```
# 파일 위치: apikey/gemini_api_key.txt
# 파일 내용: API 키만 저장 (설명 텍스트 제외)
AIzaSyAbCdEfGhIjKlMnOpQrStUvWxYz1234567
```
#### 프로젝트 확인
`ai_sam/api/get_api_key.php`는 Codebridge-Chatbot 프로젝트의 서비스 계정(`apikey/google_service_account.json`)을 확인하여 프로젝트 일치 여부를 검증합니다.
```php
// 프로젝트 ID 확인
if ($serviceAccount['project_id'] !== 'codebridge-chatbot') {
// 오류 반환
}
```
### 3. 의존성
모든 의존성은 CDN을 통해 로드됩니다:
- **React & ReactDOM**: `https://unpkg.com/react@18/umd/react.development.js`
- **Babel**: `https://unpkg.com/@babel/standalone/babel.min.js`
- **Tailwind CSS**: `https://cdn.tailwindcss.com`
- **Google GenAI SDK**: `https://aistudiocdn.com/@google/genai@^1.31.0` (ES Module)
### 4. 서버 요구사항
- PHP 7.3 이상
- `openssl` 확장 (서비스 계정 인증용, 선택사항)
- HTTPS 또는 localhost (마이크 접근 권한 필요)
## 개발 과정에서 발생한 이슈 및 해결
### 이슈 1: WebSocket이 즉시 종료되는 문제
**증상**: "Call Sam" 버튼을 클릭하면 연결이 시작되자마자 즉시 종료됨
**원인 분석**:
- WebSocket 연결 상태 추적 부족
- 세션 객체 관리 미흡
- 오디오 스트림 정리 로직 부재
**해결 방법**:
1. **연결 상태 추적 추가**
```javascript
this.isConnected = false;
this.session = null;
```
2. **안전한 데이터 전송**
```javascript
if (this.session && this.isConnected) {
try {
this.session.sendRealtimeInput({ media: pcmBlob });
} catch (sendError) {
// WebSocket이 닫힌 경우 처리
}
}
```
3. **리소스 정리 개선**
- `cleanup()` 메서드 추가
- 미디어 스트림 트랙 중지
- ScriptProcessor 연결 해제
- AudioContext 종료
- 세션 종료
### 이슈 2: 디버그 로깅 시스템 구축
**목적**: 연결 과정의 각 단계를 추적하여 문제점 파악
**구현 내용**:
1. **LiveManager 클래스에 디버그 로깅 추가**
```javascript
this.debugLog = [];
this.log = (msg, data = null) => {
const timestamp = new Date().toISOString();
const logEntry = { timestamp, msg, data };
this.debugLog.push(logEntry);
console.log(`[Sam AI Debug ${timestamp}]`, msg, data || '');
};
```
2. **주요 디버그 포인트**
- API 키 확인
- Google GenAI SDK 로드 상태
- AudioContext 생성
- WebSocket 연결 (시도, 성공, 실패, 종료)
- 미디어 스트림 (마이크 접근 권한)
- 세션 관리
3. **콘솔 출력**
- 연결 성공/실패/종료 시 전체 디버그 로그 출력
- 각 단계별 상세 정보 표시
### 이슈 3: API 키 종류 혼동
**문제**: Vertex AI API 키와 Gemini API 키의 차이점 불명확
**해결**:
- Google AI Studio에서 발급받은 일반 Gemini API 키 사용
- `API_KEY_GUIDE.md` 문서 작성
- `get_api_key.php`에서 프로젝트 검증 로직 추가
### 이슈 4: ScriptProcessorNode Deprecation 경고
**경고**: `ScriptProcessorNode`는 deprecated되었으며 `AudioWorkletNode` 사용 권장
**현재 상태**:
- 기능은 정상 동작
- 향후 `AudioWorkletNode`로 마이그레이션 필요
**참고**: https://bit.ly/audio-worklet
## 주요 컴포넌트
### LiveManager 클래스
Gemini Live API와의 연결을 관리하는 핵심 클래스입니다.
**주요 메서드**:
- `initAI()`: Google GenAI SDK 초기화
- `connect()`: WebSocket 연결 시작
- `handleOpen()`: 연결 성공 시 미디어 스트림 시작
- `handleMessage()`: 서버 메시지 처리 (오디오, 도구 호출)
- `cleanup()`: 리소스 정리
- `disconnect()`: 연결 종료
**상태 관리**:
- `isConnected`: 연결 상태 플래그
- `session`: WebSocket 세션 객체
- `inputAudioContext`: 입력 오디오 컨텍스트 (16kHz)
- `outputAudioContext`: 출력 오디오 컨텍스트 (24kHz)
- `mediaStream`: 마이크 스트림
- `scriptProcessor`: 오디오 처리 노드
### App 컴포넌트
메인 React 컴포넌트로 UI와 상태를 관리합니다.
**주요 기능**:
- 메뉴 네비게이션
- 파일 검색
- Sam AI 연결 관리
- 오디오 시각화
### 도구 (Tools)
AI가 사용할 수 있는 기능들:
1. **navigateToPage**: 대시보드 메뉴 네비게이션
2. **searchDocuments**: 파일 검색
## 사용 방법
### 1. 기본 사용
1. 브라우저에서 `ai_sam/index.php` 접속
2. "Call Sam" 버튼 클릭
3. 마이크 접근 권한 허용
4. 음성으로 명령 (예: "Settings 화면으로 이동해줘")
### 2. 디버그 모드
1. 브라우저 개발자 도구 열기 (F12)
2. Console 탭 선택
3. "Call Sam" 버튼 클릭
4. 콘솔에 출력되는 디버그 로그 확인
### 3. 예시 명령어
- "Show me the finance dashboard"
- "Find the Q3 report from October"
- "Settings 화면으로 이동해줘"
- "Find the financial report"
## 파일 구조 상세
### index.php
메인 애플리케이션 파일로 다음을 포함합니다:
- HTML 구조
- React 컴포넌트 (Sidebar, FileList, Visualizer, App)
- LiveManager 클래스
- 오디오 유틸리티 함수
- 상수 정의 (MOCK_FILES, MOCK_MENU, SYSTEM_INSTRUCTION)
### api/get_api_key.php
API 키를 안전하게 조회하는 PHP 엔드포인트:
- 서비스 계정 프로젝트 검증
- API 키 파일 읽기
- 플레이스홀더 텍스트 필터링
- JSON 응답 반환
## 보안 고려사항
1. **API 키 보호**
- API 키는 서버 측에서만 관리
- 클라이언트에 직접 노출되지 않음
- `get_api_key.php`를 통해서만 전달
2. **프로젝트 검증**
- Codebridge-Chatbot 프로젝트만 허용
- 서비스 계정 정보로 검증
3. **HTTPS 권장**
- 마이크 접근 권한은 HTTPS 또는 localhost에서만 가능
- 프로덕션 환경에서는 반드시 HTTPS 사용
## 성능 최적화
1. **오디오 처리**
- ScriptProcessorNode 사용 (향후 AudioWorkletNode로 마이그레이션 예정)
- 16kHz 샘플레이트로 입력 최적화
- 24kHz 샘플레이트로 출력 최적화
2. **리소스 관리**
- 연결 종료 시 모든 리소스 정리
- 메모리 누수 방지
3. **에러 처리**
- 모든 비동기 작업에 try-catch 적용
- 사용자 친화적 에러 메시지
## 향후 개선 사항
1. **AudioWorkletNode 마이그레이션**
- ScriptProcessorNode 대신 AudioWorkletNode 사용
- 더 나은 성능과 안정성
2. **에러 복구 메커니즘**
- 자동 재연결 기능
- 네트워크 오류 처리 개선
3. **사용자 경험 개선**
- 연결 상태 시각적 표시 개선
- 오디오 레벨 표시 개선
- 더 많은 도구 추가
## 참고 자료
- [Google AI Studio](https://makersuite.google.com/)
- [Google Cloud Console](https://console.cloud.google.com/)
- [Gemini API 문서](https://ai.google.dev/docs)
- [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)
- [AudioWorklet](https://developer.mozilla.org/en-US/docs/Web/API/AudioWorklet)
## 변경 이력
### 2025-01-XX (초기 개발)
- Sam AI 기본 구조 구현
- React (CDN) 기반 UI 구성
- Gemini Live API 통합
- 실시간 음성 대화 기능 구현
- 도구 시스템 (navigateToPage, searchDocuments) 구현
- 디버그 로깅 시스템 구축
- WebSocket 연결 안정화
- API 키 관리 시스템 구축
- Codebridge-Chatbot 프로젝트 연동
## 문제 해결 체크리스트
연결이 안 될 때 확인 사항:
- [ ] API 키가 올바르게 설정되었는가? (`apikey/gemini_api_key.txt`)
- [ ] API 키 형식이 올바른가? (약 39자, `AIzaSy`로 시작)
- [ ] Google Cloud Console에서 "Generative Language API"가 활성화되었는가?
- [ ] Codebridge-Chatbot 프로젝트에서 API 키가 생성되었는가?
- [ ] 브라우저 콘솔에 에러 메시지가 있는가?
- [ ] 마이크 접근 권한이 허용되었는가?
- [ ] HTTPS 또는 localhost에서 실행 중인가?
- [ ] Google GenAI SDK가 정상적으로 로드되었는가?
## 개발자 노트
- 모든 디버그 로그는 브라우저 콘솔에서 확인 가능
- 연결 과정의 각 단계는 타임스탬프와 함께 로깅됨
- 에러 발생 시 전체 디버그 로그가 자동으로 출력됨
- API 키는 절대 클라이언트 코드에 하드코딩하지 않음