# AI에 호기심 있는 앱 개발자를 위한 좋은 시작점, Embeddings

> Clean Markdown view of GeekNews topic #14380. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14380](https://news.hada.io/topic?id=14380)
- GeekNews Markdown: [https://news.hada.io/topic/14380.md](https://news.hada.io/topic/14380.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-04-18T10:03:20+09:00
- Updated: 2024-04-18T10:03:20+09:00
- Original source: [bawolf.substack.com](https://bawolf.substack.com/p/embeddings-are-a-good-starting-point)
- Points: 24
- Comments: 1

## Topic Body

### 앱 개발자를 위한 임베딩 사용 가이드   
  
* 벡터 임베딩은 다양한 입력에 대한 유사도 측정에 효과적이기 때문에 검색과 추천 기능에 적합함. 다른 언어인 프랑스어나 일본어에서도 잘 동작함.  
* Pgvector는 임베딩을 저장하고 쿼리할 수 있는 Postgres 확장으로, 새로운 서비스 추가 없이 SQL 로직과 임베딩 연산을 결합할 수 있어 강력함.   
* LLM과 달리, 임베딩 사용은 일반적인 결정론적 코드와 유사한 느낌을 줌.   
  
#### 아이콘 검색 및 추천 프로젝트 개발  
* Pgvector 셋업 후, 아이콘 데이터를 임베딩 벡터로 인코딩하는 전략을 만듦.   
* OpenAI의 text-embedding-3-small 모델 사용.  
* Cosine similarity로 검색어와 각 아이콘 임베딩 간 유사도 측정.  
* 임베딩 검색에 아이콘셋 필터링 등 비즈니스 로직을 결합.  
* 검색어에 대한 아이콘 클릭 데이터를 활용한 랭킹 알고리즘 예시 제시.  
* 선택된 아이콘과 유사한 아이콘 추천을 위해 임베딩 비교 활용.  
  
#### 구현 방안 요약  
* 벡터 DB로 pgvector/Postgres 선택. MongoDB 등 다른 선택지도 있음.  
* Typescript로 개발, drizzle-orm 사용. 다른 언어/프레임워크 라이브러리도 다양함.  
* 앱은 Neon에 호스팅. fly.io, Supabase 등의 관리형 DB 호스팅 서비스 활용 가능.   
* OpenAI의 text-embedding-3-small 임베딩 모델 사용. Huggingface 리더보드에서 다른 모델 선택 가능.  
* 아이콘 속성 중 검색 관련성 높은 것들을 key-value 쌍으로 임베딩.  
* Cosine similarity를 거리 함수로 사용. Pgvector는 l2 distance, inner product도 지원.  
* 검색 결과는 top 50개로 제한. 거리 범위 사용시 넓게 잡고 limit와 함께 사용 권장.  
  
### GN⁺의 의견  
* 대부분의 프로젝트에서 pgvector와 같이 기존 DB에 벡터 기능을 추가하는 방식으로 충분할 것 같음. 별도 벡터 DB 도입은 대규모 서비스에서나 필요해보임.  
* 임베딩 검색에 비즈니스 로직을 자연스럽게 결합할 수 있다는 점이 큰 장점. SQL의 강력함을 그대로 활용할 수 있음.  
* 랭킹 알고리즘에 사용자 피드백 데이터를 반영하는 아이디어가 좋음. 검색의 정확도를 지속적으로 개선시킬 수 있을 것 같음.  
* LLM에 비해 임베딩 기반 서비스는 동작이 명확하고 디버깅도 용이해 실제 서비스에 적용하기 훨씬 수월할 것 같음.   
* 다양한 오픈소스 임베딩 모델이 공개되어 있어, 자체 모델 개발이 어려운 경우에도 고품질 임베딩을 손쉽게 활용 가능함.

## Comments



### Comment 24510

- Author: neo
- Created: 2024-04-18T10:03:20+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40067486) 
### 해커뉴스 댓글 요약

#### RAG 모델을 활용한 문서 임베딩 및 유사도 검색의 편의성
- `sentence-transformers`와 `faiss` 라이브러리를 사용하면 쉽게 문서 임베딩과 유사도 검색을 구현할 수 있음
- 뉴욕 타임즈의 추천 시스템보다 나은 성능을 보여주는 것이 재미있는 프로젝트가 될 수 있음
- James Briggs의 유튜브 채널에 관련 내용이 잘 설명되어 있음

#### 임베딩의 기본 개념 이해
- AI/딥러닝 없이도 단어에 고유 인덱스를 부여하고, 빈도수에 따라 값을 누적하는 방식으로 임베딩을 만들 수 있음
- 코사인 유사도 등을 활용해 유사도 검색도 가능함
- 딥러닝 기반 임베딩은 이러한 기본 개념 위에 단어/토큰 필터링, 동의어 처리 등의 기능이 추가된 것임

#### 임베딩 생성 과정에 대한 상세 설명 부족
- 글에서는 임베딩 생성 과정에 대해 `They're a bit of a black box`라고만 언급하고 자세히 설명하지 않음
- 직접 단어 벡터를 만들어보고, Word2Vec 등의 방법론을 이해하는 것이 도움될 수 있음
  - [Earthly 블로그 포스트](https://earthly.dev/blog/cosine_similarity_text_embeddings/)
  - [Jay Alammar의 Word2Vec 설명 글](https://jalammar.github.io/illustrated-word2vec/)

#### 동음이의어 처리의 어려움
- 동음이의어로 인해 검색 결과가 의도치 않게 나오는 경우가 있음 (예: "king"으로 검색 시 ruler(자) 아이콘이 나오는 등)
- 관련 아이콘을 찾을 수 있다는 장점과 함께 재미있는 도전 과제가 될 수 있음

#### 벡터 저장소 없이도 임베딩 활용 가능
- 대용량 데이터의 프로덕션 환경에서는 지연 시간 등의 이유로 벡터 저장소가 중요하지만, 토이 프로젝트 수준에서는 Numpy 등으로 간단히 구현 가능
- Numpy의 `@` 연산자를 활용해 정규화된 쿼리 벡터와 레코드 행렬 간 내적을 구하는 방식으로 유사도 계산 가능

#### 로컬 환경에서 임베딩 로직 실행 방법
- OpenAI API에 의존하지 않고 로컬 환경이나 데이터베이스에서 직접 임베딩을 생성할 수 있는 방법에 대한 궁금증 제기

#### 기술 문서 작성 시 임베딩 활용 가능성
- 챗GPT 등장 이후 기술 문서 작성자들 사이에서 시맨틱 검색 도구로서의 활용 가능성에 대한 논의 활발
- 문서 작성에 필요한 리서치 단계에서 효율성 향상에 도움될 수 있음

#### 임베딩 저장 및 활용 방법
- 임베딩을 생성하고 저장한 뒤, 필요할 때마다 불러와서 사용하는 것이 일반적임
- 간단한 경우에는 임베딩을 바로 배열 등으로 전달해 사용할 수도 있음
- 임베딩 저장이 어려운 부분인데, 특수한 데이터베이스가 필요한 건 아니고 SQLite의 BLOB 등으로도 가능함
- 임베딩이 '만료'되는 경우는 없음

#### AI 입문 개발자를 위한 배경 지식 설명 부족
- 글에서 임베딩이나 벡터 데이터베이스 등의 개념을 설명 없이 바로 사용법으로 넘어가고 있음
- AI에 관심 있는 앱 개발자의 좋은 시작점을 찾는 사람들에게는 관련 개념에 대한 소개가 필요했을 것으로 보임
