Simplifying Structs, Methods and Interfaces in Golang

  • Go 는 다른 OOP 언어와 달리 상속이 없는 대신 합성(composition)과 인터페이스 임베딩(interface embedding) 을 사용한다.
  • 구조체(struct)는 데이터 타입의 합성체인 동시에, 모델링 또는 구조화된 경량 컨테이너 역할을 하여 애플리케이션의 데이터 구조를 정의한다.
  • 메서드(method)는 특정 타입과 연관된 함수로, 구조체의 행동을 정의해야 할 때 사용된다. (그래서 리시버가 붙어 구조체의 행동을 정의하는 듯)
  • 인터페이스는 어떠한 타입(구조체)가 수행해야 할 메서드의 시그니처를 정의한다. 다른 OOP 언어와 달리 Go 의 인터페이스는 암시적이므로 구조체가 명시적으로 특정 인터페이스를 구현한다고 선언하지 않아도 된다. 그럼 어떻게 구조체는 특정 인터페이스를 구현하느냐? 그저 인터페이스에 정의된 모든 메서드를 구현하기만 하면 자동으로 해당 인터페이스를 충족하는걸로 간주된다.

연간 LLM 호출 비용 25% 절감, 인턴이 도전한 시맨틱 캐싱 도입 기록

  • 벡터 DB 란 문장을 벡터 값(숫자 배열)으로 변환해서 저장하는 DB. 사용자가 안녕하세요 키워드 입력 시 해당 문장을 벡터 값으로 변환하여 기존에 저장돼 있던 벡터들과 유사도를 계산한다. 유사도의 임계값(threshold)에 충족되면 미리 준비된 응답을 반환하는 형태.
  • chromem-go 라는 임베디드 벡터 DB 를 사용하여 네트워크 지연이나 추가 인프라 비용을 절감함. (인메모리 DB 를 사용한 격)
  • 벡터 DB 에 미리 문장 세트를 준비하기 위해 DBSCAN 이란 밀도 기반의 알고리즘 채택 -> 비슷한 문장들이 많이 모여있으면 하나의 그룹으로 묶고, 혼자 떨어져 있는 이상한 문장은 노이즈로 분류. 미리 수집한 문장을 유사한 그룹으로 분류하여 캐싱

Scaling recommendations service at OLX

  • pydantic 이 항상 최선의 선택이 아니다. request 뿐 아니라 request output, object creation 에도 pydantic 이 적용돼 다중 검증으로 인한 런타임 오버헤드가 커짐. OLX 개발팀은 pydantic 을 request 에만 적용하고 나머지는 dataclasses 의 slots 옵션을 사용하도록 전환. slots=True 는 __dict__ 제거로 메모리 효율성이 향상된다. 일반적인 클래스는 객체에 __dict__ 포인터를 활용하여 값을 참조하지만 slots=True 옵션을 사용하면 __dict__ 포인터를 제거하고 객체에 직접 값을 저장한다. __dict__ 가 사라져 메모리 효율성 뿐만 아니라 접근 속도도 개선됨.