| # OpenAI API 교체 가이드 | |
| ## 🎯 교체 가능한 위치 | |
| --- | |
| ## 📍 수정 필요한 위치 | |
| ### 1. Import 부분 (라인 5) | |
| ```python | |
| # 현재 | |
| from openai import OpenAI | |
| # 교체 시 | |
| from anthropic import Anthropic # 예: Claude | |
| from google.generativeai import ... # 예: Gemini | |
| from ... import ... # 다른 API | |
| ``` | |
| --- | |
| ### 2. 클라이언트 초기화 (라인 1267) | |
| ```python | |
| # 현재 | |
| client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| MODEL = os.getenv("OPENAI_MODEL", "gpt-4o-mini") | |
| # 예시 1: Claude로 교체 | |
| client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) | |
| MODEL = os.getenv("ANTHROPIC_MODEL", "claude-3-haiku-20240307") | |
| # 예시 2: Gemini로 교체 | |
| import google.generativeai as genai | |
| genai.configure(api_key=os.getenv("GEMINI_API_KEY")) | |
| MODEL = os.getenv("GEMINI_MODEL", "gemini-pro") | |
| # 예시 3: Ollama (로컬)로 교체 | |
| client = OpenAI( | |
| api_key="ollama", # 사용 안 함 | |
| base_url="http://localhost:11434/v1" | |
| ) | |
| MODEL = os.getenv("OLLAMA_MODEL", "llama2") | |
| ``` | |
| --- | |
| ### 3. API 호출 부분 (3곳) | |
| #### 위치 A: detect_echo_ai (라인 1565) | |
| ```python | |
| # 현재 | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": system_prompt}, | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| max_tokens=200, | |
| temperature=0.3 | |
| ) | |
| # Claude로 교체 시 | |
| response = client.messages.create( | |
| model=MODEL, | |
| max_tokens=200, | |
| system=system_prompt, | |
| messages=[ | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| temperature=0.3 | |
| ) | |
| content = response.content[0].text # 응답 파싱도 변경 | |
| ``` | |
| #### 위치 B: shape_echolalia (라인 1669) | |
| ```python | |
| # 현재 | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": prompt}, | |
| {"role": "user", "content": user_input} | |
| ], | |
| max_tokens=200, | |
| temperature=0.7 | |
| ) | |
| # Claude로 교체 시 | |
| response = client.messages.create( | |
| model=MODEL, | |
| max_tokens=200, | |
| system=prompt, | |
| messages=[ | |
| {"role": "user", "content": user_input} | |
| ], | |
| temperature=0.7 | |
| ) | |
| content = response.content[0].text | |
| ``` | |
| #### 위치 C: generate_context_analysis (라인 2276) | |
| ```python | |
| # 현재 | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": system_prompt}, | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| max_tokens=300, | |
| temperature=0.3 | |
| ) | |
| # Claude로 교체 시 | |
| response = client.messages.create( | |
| model=MODEL, | |
| max_tokens=300, | |
| system=system_prompt, | |
| messages=[ | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| temperature=0.3 | |
| ) | |
| content = response.content[0].text | |
| ``` | |
| --- | |
| ## 🔧 대체 API별 가이드 | |
| ### 옵션 1: Anthropic Claude | |
| #### 변경사항 | |
| ```python | |
| # 1. Import | |
| from anthropic import Anthropic | |
| # 2. 클라이언트 | |
| client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) | |
| MODEL = "claude-3-haiku-20240307" | |
| # 3. API 호출 | |
| response = client.messages.create( | |
| model=MODEL, | |
| max_tokens=200, | |
| system=system_prompt, # system 파라미터로 전달 | |
| messages=[ | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| temperature=0.3 | |
| ) | |
| content = response.content[0].text # 응답 파싱 변경 | |
| ``` | |
| **환경변수**: | |
| ```bash | |
| ANTHROPIC_API_KEY=your_key_here | |
| ANTHROPIC_MODEL=claude-3-haiku-20240307 | |
| ``` | |
| --- | |
| ### 옵션 2: Google Gemini | |
| #### 변경사항 | |
| ```python | |
| # 1. Import | |
| import google.generativeai as genai | |
| # 2. 클라이언트 | |
| genai.configure(api_key=os.getenv("GEMINI_API_KEY")) | |
| MODEL = genai.GenerativeModel("gemini-pro") | |
| # 3. API 호출 | |
| prompt = f"{system_prompt}\n\n{user_prompt}" | |
| response = MODEL.generate_content( | |
| prompt, | |
| generation_config={ | |
| "max_output_tokens": 200, | |
| "temperature": 0.3 | |
| } | |
| ) | |
| content = response.text | |
| ``` | |
| **환경변수**: | |
| ```bash | |
| GEMINI_API_KEY=your_key_here | |
| GEMINI_MODEL=gemini-pro | |
| ``` | |
| --- | |
| ### 옵션 3: Ollama (로컬) | |
| #### 변경사항 | |
| ```python | |
| # 1. Import (OpenAI 호환 방식 유지) | |
| from openai import OpenAI | |
| # 2. 클라이언트 | |
| client = OpenAI( | |
| api_key="ollama", | |
| base_url="http://localhost:11434/v1" | |
| ) | |
| MODEL = "llama2" | |
| # 3. API 호출 (기존 코드 그대로) | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": system_prompt}, | |
| {"role": "user", "content": user_prompt} | |
| ], | |
| max_tokens=200, | |
| temperature=0.3 | |
| ) | |
| ``` | |
| **설치**: | |
| ```bash | |
| curl -fsSL https://ollama.com/install.sh | sh | |
| ollama pull llama2 | |
| ``` | |
| **환경변수**: | |
| ```bash | |
| OLLAMA_MODEL=llama2 | |
| ``` | |
| --- | |
| ### 옵션 4: OpenAI 호환 API | |
| #### 변경사항 | |
| ```python | |
| # 1. Import | |
| from openai import OpenAI | |
| # 2. 클라이언트 (base_url만 변경) | |
| client = OpenAI( | |
| api_key=os.getenv("OPENAI_API_KEY"), | |
| base_url="https://api.example.com/v1" # 호환 API URL | |
| ) | |
| MODEL = os.getenv("OPENAI_MODEL", "custom-model") | |
| # 3. API 호출 (기존 코드 그대로) | |
| response = client.chat.completions.create(...) | |
| ``` | |
| **예시 서비스**: | |
| - Together AI | |
| - Groq | |
| - Replicate | |
| - MindsDB | |
| --- | |
| ## 📋 체크리스트 | |
| ### 필수 변경사항 | |
| - [ ] Import 문 | |
| - [ ] 클라이언트 초기화 | |
| - [ ] API 호출 파라미터 | |
| - [ ] 응답 파싱 로직 | |
| ### 선택 변경사항 | |
| - [ ] 환경변수 이름 | |
| - [ ] 프롬프트 포맷 | |
| - [ ] 에러 처리 | |
| - [ ] 토큰 추정 로직 | |
| --- | |
| ## 🔄 단계별 교체 가이드 | |
| ### Step 1: 백업 | |
| ```bash | |
| cp gradio_app.py gradio_app.py.backup | |
| ``` | |
| ### Step 2: Import 수정 | |
| ```python | |
| # 라인 5 | |
| from openai import OpenAI | |
| ↓ | |
| from anthropic import Anthropic # 예시 | |
| ``` | |
| ### Step 3: 클라이언트 수정 | |
| ```python | |
| # 라인 1267-1268 | |
| client = OpenAI(...) | |
| MODEL = ... | |
| ↓ | |
| client = Anthropic(...) | |
| MODEL = ... | |
| ``` | |
| ### Step 4: API 호출 수정 | |
| ```python | |
| # 3곳 수정 | |
| response = client.chat.completions.create(...) | |
| ↓ | |
| response = client.messages.create(...) | |
| ``` | |
| ### Step 5: 응답 파싱 수정 | |
| ```python | |
| # 각 호출 후 | |
| content = response.choices[0].message.content | |
| ↓ | |
| content = response.content[0].text # Claude 예시 | |
| ``` | |
| ### Step 6: 테스트 | |
| ```bash | |
| python gradio_app.py | |
| ``` | |
| --- | |
| ## ⚠️ 주의사항 | |
| ### 1. 응답 포맷 차이 | |
| ``` | |
| OpenAI: response.choices[0].message.content | |
| Claude: response.content[0].text | |
| Gemini: response.text | |
| Ollama: response.choices[0].message.content (호환) | |
| ``` | |
| ### 2. System Prompt 처리 | |
| ``` | |
| OpenAI: messages에 system 포함 | |
| Claude: system 파라미터로 분리 | |
| Gemini: system + user 합쳐서 prompt | |
| Ollama: messages에 system 포함 (호환) | |
| ``` | |
| ### 3. 파라미터 차이 | |
| ``` | |
| max_tokens vs max_output_tokens | |
| temperature: 대부분 동일 | |
| ``` | |
| --- | |
| ## 🎯 추천 교체 순서 | |
| ### 1순위: Ollama (로컬) | |
| ``` | |
| 장점: | |
| - OpenAI 호환 API | |
| - 코드 변경 최소화 | |
| - 비용 무료 | |
| - 프라이버시 | |
| 단점: | |
| - 로컬 리소스 필요 | |
| - 성능 제한적 | |
| ``` | |
| ### 2순위: OpenAI 호환 서비스 | |
| ``` | |
| 장점: | |
| - 코드 변경 최소화 | |
| - 더 낮은 비용 가능 | |
| - 빠른 반응 | |
| 예시: | |
| - Groq (매우 빠름) | |
| - Together AI (저렴) | |
| ``` | |
| ### 3순위: Claude | |
| ``` | |
| 장점: | |
| - 성능 우수 | |
| - 긴 컨텍스트 | |
| 단점: | |
| - 코드 변경 필요 | |
| - 비용 비슷 | |
| ``` | |
| --- | |
| ## 📊 API 비교표 | |
| | API | 코드 변경 | 비용 | 속도 | 성능 | | |
| |-----|----------|------|------|------| | |
| | **OpenAI** | - | $$$ | 중간 | ⭐⭐⭐⭐⭐ | | |
| | **Claude** | 중간 | $$$ | 빠름 | ⭐⭐⭐⭐⭐ | | |
| | **Gemini** | 많음 | $$ | 빠름 | ⭐⭐⭐⭐ | | |
| | **Ollama** | 최소 | 무료 | 느림 | ⭐⭐⭐ | | |
| | **Groq** | 최소 | $ | 매우 빠름 | ⭐⭐⭐⭐ | | |
| --- | |
| ## ✅ 테스트 방법 | |
| ### 1. 단위 테스트 | |
| ```python | |
| # detect_echo_ai 테스트 | |
| result = detect_echo_ai("아이스크림", "", "식사") | |
| print(result) | |
| # shape_echolalia 테스트 | |
| result = shape_echolalia("아이스크림", "L1", "식사") | |
| print(result) | |
| ``` | |
| ### 2. 통합 테스트 | |
| ```bash | |
| # 앱 실행 | |
| python gradio_app.py | |
| # UI에서 직접 테스트 | |
| # - 텍스트 입력 | |
| # - 분석 버튼 클릭 | |
| # - 결과 확인 | |
| ``` | |
| --- | |
| ## 📄 파일 변경 목록 | |
| ``` | |
| gradio_app.py 수정: | |
| - 라인 5: Import | |
| - 라인 1267-1268: 클라이언트 초기화 | |
| - 라인 1565-1573: detect_echo_ai 호출 | |
| - 라인 1669-1677: shape_echolalia 호출 | |
| - 라인 2276-2284: generate_context_analysis 호출 | |
| - 각 응답 파싱 부분 | |
| 환경변수 (.env): | |
| - OPENAI_API_KEY → 새 API 키 | |
| - OPENAI_MODEL → 새 모델 이름 | |
| ``` | |
| --- | |
| *API 교체 가이드 완료* | |