Skip to content

Commit 26ad70d

Browse files
authored
[25.05.18 / TASK-193] Feature - module for velog api & llm (v0.6 배치) (#28)
* feature: velog 를 독립성 높게 분리, 모듈화 * feature: HttpSession 프로토콜 업데이트 * modify: 프로토콜 활용 세션 실제 메소드 호출시 mypy 이슈 해결 * feature: 라이브러리 추가 * feature: llm module 추가 * feature: llm module 추가 v2 * feature: llm module 추가 v4 * feature: temp 파일, 임시 트랜드 분석 처리 파일 * hotfix: 제 토큰 노출 ㅋㅋㅋ 하 어짜피 만료될꺼 그냥 커밋 롤백 안하고 상남자식 푸시 * refactor: 모듈들 코멘트 리펙토링, 싱글톤 & 레이지 이니셜라이징 강화 * refactor: 마지막 런타임 레벨에서 타입 강화 * refactor: client 와 service 분리, 파사드 와 레이지 싱클톤 패턴으로 취합 * refactor: clinet 의 service 를 다루는 방법 리펙토링
1 parent 26ba6de commit 26ad70d

File tree

19 files changed

+1997
-2
lines changed

19 files changed

+1997
-2
lines changed

.env.sample

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,7 @@ POSTGRES_PORT=5432
2727
# Sentry info
2828
SENTRY_DSN=https://sentry.io/project # https://<key>@sentry.io/<project>
2929
SENTRY_ENVIRONMENT=local # develop
30-
SENTRY_TRACES_SAMPLE_RATE=0.2
30+
SENTRY_TRACES_SAMPLE_RATE=0.2
31+
32+
# LLM
33+
OPENAI_API_KEY=sk-proj-...

.github/workflows/test-ci.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ jobs:
7070
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env
7171
echo "SENTRY_ENVIRONMENT=gitaction" >> .env
7272
echo "SENTRY_TRACES_SAMPLE_RATE=0.2" >> .env
73+
echo "OPENAI_API_KEY= sk-proj" >> .env
7374
echo "AES_KEY_0=${{ secrets.AES_KEY_0 }}" >> .env
7475
echo "AES_KEY_1=${{ secrets.AES_KEY_1 }}" >> .env
7576
echo "AES_KEY_2=${{ secrets.AES_KEY_2 }}" >> .env

modules/llm/__init__.py

Whitespace-only changes.

modules/llm/base_client.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
from abc import ABC, abstractmethod
2+
from typing import Any, Generic, TypeVar
3+
4+
# 클라이언트 타입을 위한 제네릭 타입 변수
5+
T = TypeVar("T")
6+
7+
8+
class LLMClient(ABC, Generic[T]):
9+
"""
10+
모든 LLM 클라이언트를 위한 추상 기본 클래스로 Lazy Initialization 패턴을 따릅니다.
11+
모든 LLM 서비스 구현을 위한 템플릿을 제공합니다.
12+
"""
13+
14+
@classmethod
15+
@abstractmethod
16+
def get_client(cls, api_key: str) -> "LLMClient[T]":
17+
"""
18+
LLM 클라이언트를 가져오거나 초기화합니다.
19+
20+
Args:
21+
api_key: API 키 (필수)
22+
23+
Returns:
24+
초기화된 클라이언트 인스턴스
25+
26+
Raises:
27+
AuthenticationError: API 키가 유효하지 않은 경우
28+
ConnectionError: 서비스 연결에 실패한 경우
29+
"""
30+
pass
31+
32+
@classmethod
33+
@abstractmethod
34+
def _initialize_client(cls, api_key: str) -> T:
35+
"""
36+
특정 LLM 클라이언트를 초기화하는 추상 메서드.
37+
각 구체적인 하위 클래스에서 구현되어야 합니다.
38+
39+
Args:
40+
api_key: API 키 (필수)
41+
42+
Returns:
43+
초기화된 클라이언트 인스턴스
44+
45+
Raises:
46+
AuthenticationError: API 키가 유효하지 않은 경우
47+
ConnectionError: 서비스 연결에 실패한 경우
48+
"""
49+
pass
50+
51+
@abstractmethod
52+
def generate_text(
53+
self,
54+
prompt: str,
55+
system_prompt: str = "",
56+
model: str = "",
57+
**kwargs: Any,
58+
) -> str:
59+
"""
60+
LLM을 사용하여 텍스트를 생성합니다.
61+
62+
Args:
63+
prompt: 텍스트 생성을 위한 입력 프롬프트
64+
system_prompt: 시스템 프롬프트 (선택적)
65+
model: 사용할 모델 (선택적)
66+
**kwargs: LLM에 특화된 추가 인자
67+
68+
Returns:
69+
LLM에서 생성된 텍스트
70+
71+
Raises:
72+
ClientNotInitializedError: 클라이언트가 초기화되지 않은 경우
73+
ValueError: 잘못된 입력 값
74+
ConnectionError: API 연결 실패
75+
GenerationError: 생성 과정에서 오류 발생
76+
"""
77+
pass
78+
79+
@abstractmethod
80+
def generate_embedding(
81+
self,
82+
text: str | list[str],
83+
model: str = "",
84+
) -> list[float] | list[list[float]]:
85+
"""
86+
LLM을 사용하여 텍스트 임베딩을 생성합니다.
87+
88+
Args:
89+
text: 임베딩을 생성할 텍스트 또는 텍스트 목록
90+
model: 사용할 임베딩 모델 (선택적)
91+
92+
Returns:
93+
벡터 임베딩 리스트(단일 텍스트 입력의 경우) 또는 벡터 임베딩 리스트의 리스트(다중 텍스트 입력의 경우)
94+
95+
Raises:
96+
ClientNotInitializedError: 클라이언트가 초기화되지 않은 경우
97+
ValueError: 잘못된 입력 값
98+
ConnectionError: API 연결 실패
99+
GenerationError: 생성 과정에서 오류 발생
100+
"""
101+
pass
102+
103+
@classmethod
104+
@abstractmethod
105+
def reset_client(cls) -> None:
106+
"""
107+
클라이언트 인스턴스를 재설정합니다(테스트나 설정 변경 시 사용하기 위함)
108+
"""
109+
pass

modules/llm/exceptions.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class LLMError(Exception):
2+
"""LLM 서비스 관련 기본 예외 클래스"""
3+
4+
pass
5+
6+
7+
class AuthenticationError(LLMError):
8+
"""API 키 인증 실패 시 발생하는 예외"""
9+
10+
pass
11+
12+
13+
class ConnectionError(LLMError):
14+
"""LLM 서비스 연결 실패 시 발생하는 예외"""
15+
16+
pass
17+
18+
19+
class GenerationError(LLMError):
20+
"""텍스트 또는 임베딩 생성 중 발생하는 예외"""
21+
22+
pass
23+
24+
25+
class ClientNotInitializedError(LLMError):
26+
"""클라이언트가 초기화되지 않았을 때 발생하는 예외"""
27+
28+
pass

modules/llm/openai/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)