5P by GN⁺ | ★ favorite | 댓글 1개
  • 임베딩은 텍스트·이미지·코드 같은 콘텐츠를 고정 길이의 부동소수점 배열로 바꿔, 의미적으로 가까운 항목을 거리 계산으로 찾게 해줌
  • 같은 모델이 만든 벡터 공간에서는 개별 숫자의 뜻을 몰라도 코사인 유사도로 관련 문서, 유사 이미지, 코드 조각을 비교할 수 있음
  • OpenAI text-embedding-ada-002로 472개 TIL 글을 1,536차원 벡터로 저장한 사례에서는 관련 글 검색 쿼리가 약 400ms 걸렸고, 402,500토큰 전체 임베딩 비용은 약 $0.04였음
  • 로컬 모델과 작은 도구 조합만으로도 README 검색, 코드 검색, 이미지 검색, 클러스터링, RAG를 구현할 수 있으며 LLM, llm-sentence-transformers, Symbex, CLIP, E5-large-v2가 예시로 쓰임
  • 임베딩 기반 의미 검색은 정확한 단어 일치에 의존하지 않아, 사내 문서 질의응답 같은 RAG에서 관련 발췌문을 LLM 프롬프트에 넣는 핵심 수단이 됨

임베딩의 기본 개념

  • 임베딩은 콘텐츠 한 조각을 부동소수점 숫자 배열로 변환하는 방식임
    • 콘텐츠 길이와 관계없이 배열 길이는 항상 같음
    • 배열 길이는 사용하는 임베딩 모델이 정하며, 예시로 300개, 1,000개, 1,536개 숫자가 나옴
  • 이 배열은 다차원 공간의 좌표처럼 볼 수 있음
    • 공간 안의 위치는 임베딩 모델이 이해한 콘텐츠의 의미를 나타냄
    • 색상, 형태, 개념 같은 콘텐츠 특성이 반영될 수 있음
  • 개별 숫자의 의미를 완전히 이해하지 못해도, 위치 관계를 이용하면 가까운 항목을 찾는 등 유용한 작업이 가능함

관련 콘텐츠 추천: TIL 블로그 사례

  • 472개 글이 있는 TIL 사이트에서 OpenAI text-embedding-ada-002 모델로 각 글의 1,536차원 임베딩 벡터를 계산함
    • 벡터는 사이트의 SQLite 데이터베이스에 저장됨
    • 관련 글은 대상 글 벡터와 다른 모든 글 벡터의 코사인 유사도를 계산해 가까운 10개를 반환하는 방식으로 찾음
  • 예시 글 “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg”의 관련 글 상위 결과는 SQLite, SpatiaLite, GDAL, 공간 SQL 질의 관련 글로 구성됨
    • 자기 자신과의 유사도는 1.0
    • sqlite_geopoly.md는 0.8817322855676049
    • spatialite_viewing-geopackage-data-with-spatialite-and-datasette.md는 0.8813094978399854
  • 관련 글 계산 쿼리는 약 400ms가 걸려, 모든 글에 대해 상위 10개 유사도를 미리 계산한 뒤 similarities 테이블에 저장함
  • OpenAI 임베딩 API 비용은 TIL 사이트 기준 약 402,500토큰에 $0.0001/1,000토큰 요율로 $0.04였음
  • 독점 모델은 운영상 주의가 필요함
    • OpenAI는 과거 일부 오래된 임베딩 모델을 종료함
    • 기존 모델로 저장한 임베딩이 많으면, 새 콘텐츠를 임베딩하기 위해 지원 모델 기준으로 다시 계산해야 할 수 있음
    • OpenAI는 새 모델로 재임베딩하는 비용을 부담하겠다고 약속했지만, 독점 모델 의존 위험은 남아 있음
  • 공개 라이선스 모델은 자체 하드웨어에서 실행할 수 있어 모델 종료 위험을 피할 수 있음

Word2Vec으로 보는 벡터 공간

  • Google Research의 Efficient Estimation of Word Representations in Vector Space는 2013년 1월 16일 공개된 Word2Vec 논문임
  • Word2Vec은 단어 하나를 300개 숫자 배열로 바꾸는 초기 임베딩 모델임
  • turbomaze.github.io/word2vecjson은 10,000개 단어와 각 단어의 300개 숫자 배열을 탐색할 수 있는 데모임
    • “france”와 가까운 단어로 french, belgium, paris, germany, italy, spain이 나옴
  • 벡터 연산으로도 관계가 드러남
    • “germany” 벡터에 “paris”를 더하고 “france”를 빼면 결과 벡터가 “berlin”에 가장 가까움
    • 모델이 국적과 지리 관계를 벡터 공간 안에 포착했음을 보여줌
  • Word2Vec은 16억 단어 콘텐츠로 학습됐고, 현재 임베딩 모델은 훨씬 큰 데이터셋으로 학습되어 더 풍부한 관계를 포착함

LLM 도구로 임베딩 계산하기

  • LLM은 대규모 언어 모델을 다루기 위한 명령줄 도구이자 Python 라이브러리임
    • pip install llm 또는 brew install llm으로 설치할 수 있음
    • 기본적으로 OpenAI API와 함께 사용할 수 있음
  • 플러그인을 설치하면 새 언어 모델이나 임베딩 모델을 추가할 수 있음
  • llm-sentence-transformers 플러그인은 SentenceTransformers 라이브러리를 감싼 플러그인임
    • all-MiniLM-L6-v2 모델을 Hugging Face에서 내려받아 로컬에서 사용할 수 있음
    • llm embed 명령은 문장 하나를 JSON 숫자 배열로 출력함
  • 임베딩은 단독 숫자 배열로는 큰 의미가 없고, 저장한 뒤 비교해야 유용함
  • llm embed-multi는 여러 콘텐츠를 한 번에 임베딩해 컬렉션이라는 SQLite 테이블에 저장할 수 있음
    • 예시 명령은 홈 디렉터리 아래 모든 README.md 파일을 찾아 readmes 컬렉션에 저장함
    • --store 옵션은 원문 텍스트도 SQLite 테이블에 함께 저장함
    • 실행 결과 16,796개의 README.md 파일이 저장됐고, 로컬 컴퓨터에서 약 30분 걸림

의미 검색과 “vibes-based search”

  • llm similar 명령은 저장된 임베딩 컬렉션에서 입력 문장과 유사한 항목을 찾음
  • sqlite backup tools라는 문장으로 readmes 컬렉션을 검색하면 sqlite-diffable, sqlite-dump, sqlite-generate, sqlite-history, sqlite-utils 등 SQLite 백업이나 관련 프로젝트 README가 상위에 나옴
  • 결과 문서에 “backups”라는 단어가 직접 포함된다는 보장은 없음
    • 콘텐츠가 검색어와 의미적으로 유사하면 결과로 나올 수 있음
  • 이런 방식은 의미 검색이며, 원문에서는 이를 vibes-based search라고 부름
  • 정확한 텍스트 일치만으로는 사용자가 찾는 것을 항상 찾기 어려워, 다양한 콘텐츠 검색 엔진에 유용함

코드 임베딩: Symbex와 Datasette

  • Symbex는 Python 코드베이스의 심볼을 탐색하는 도구임
    • Python 함수와 클래스를 빠르게 찾아 LLM에 전달하기 위해 만들어짐
    • 이후 코드베이스의 모든 함수 임베딩을 계산해 코드 검색 엔진을 만들 수 있게 됨
  • Symbex는 찾은 심볼을 JSON 또는 CSV로 출력할 수 있고, 그 형식은 llm embed-multi 입력으로 사용할 수 있음
  • Datasette 프로젝트의 모든 함수와 클래스 메서드를 임베딩하는 예시는 gte-tiny 모델을 사용함
    • gte-tiny는 60MB 파일임
    • symbex '*' '*:*' --nl은 현재 디렉터리의 함수와 클래스 메서드를 newline-delimited JSON으로 출력함
    • llm embed-multi ... --format nl은 그 출력을 바로 입력으로 받아 임베딩함
  • 이후 Datasette와 datasette-llm-embed 플러그인을 사용해 SQL로 코드 의미 검색을 실행할 수 있음
  • SQLite는 여러 도구를 함께 묶는 통합 지점으로 쓰임
    • 코드에서 함수를 추출함
    • 임베딩 모델에 통과시킴
    • 결과를 SQLite에 기록함
    • SQL로 검색함

CLIP으로 텍스트와 이미지를 같은 공간에 임베딩하기

  • CLIP은 OpenAI가 2021년 1월 공개한 모델로, 텍스트와 이미지를 모두 임베딩할 수 있음
  • 핵심은 텍스트와 이미지를 같은 벡터 공간에 넣는다는 점임
    • “dog” 문자열의 임베딩 위치와 개 사진의 임베딩 위치가 같은 공간에서 가까워짐
    • 텍스트로 관련 이미지를 찾거나, 이미지로 관련 텍스트를 찾을 수 있음
  • 브라우저에서 실행되는 CLIP 데모는 Observable notebook으로 만들어졌고, CLIP 모델을 브라우저 안에서 실행함
    • 페이지는 158MB 리소스를 로드함
    • CLIP 텍스트 모델은 64.6MB, 이미지 모델은 87.6MB임
  • 해변 사진에 대해 텍스트별 유사도 점수를 계산한 예시가 있음
    • beach: 26.946%
    • city: 19.839%
    • sunshine: 24.146%
    • california beach: 27.427%
  • 임의의 사진과 단어 하나의 유사도를 묻는 것 자체보다, 그 위에 검색 인터페이스를 만드는 것이 핵심임

Faucet Finder: CLIP 기반 이미지 검색

  • Faucet Finder는 욕실 수전 사진을 찾기 위한 맞춤 검색 도구임
  • Drew Breunig은 수전 공급사에서 20,000장의 수전 사진을 수집하고 CLIP 임베딩을 계산함
    • 구현에는 LLM과 llm-clip 플러그인이 사용됨
    • Datasette로 배포됨
  • 이 도구는 특정 수전과 시각적으로 비슷한 다른 수전을 찾을 수 있게 함
    • 비싼 수전이 마음에 들면, 시각적으로 유사한 더 저렴한 선택지를 찾을 수 있음
  • Drew의 데모는 미리 계산된 임베딩을 사용해 서버에서 CLIP 모델을 실행하지 않고도 유사 결과를 표시함
  • 이후 서버 측 CLIP 모델을 Fly.io에 배포하고, 텍스트 문자열 임베딩 API와 수전 임베딩 테이블 API를 조합한 Observable notebook 데모가 만들어짐
    • “gold purple” 같은 검색어로 수전 이미지를 의미 기반으로 검색할 수 있음

클러스터링과 2D 시각화

  • 임베딩은 관련 콘텐츠 추천과 의미 검색 외에도 클러스터링에 사용할 수 있음
  • llm-cluster는 scikit-learn의 sklearn.cluster을 사용해 클러스터링을 구현한 플러그인임
  • GitHub issues API와 paginate-json을 사용해 simonw/llm 저장소의 이슈 제목을 llm-issues 컬렉션으로 만들고, 10개 클러스터를 생성할 수 있음
  • llm cluster llm-issues 10 --summary 옵션은 클러스터 텍스트를 LLM에 전달해 설명적인 이름을 생성함
    • 예시 이름으로 “Log Management and Interactive Prompt Tracking”, “Continuing Conversation Mechanism and Management”가 나옴
  • 고차원 공간은 시각화하기 어려워 주성분 분석(PCA) 으로 차원을 줄일 수 있음
    • Matt Webb은 BBC In Our Time 팟캐스트 에피소드 설명을 OpenAI 임베딩으로 만들고, PCA로 2D 시각화를 생성함
    • 1,536차원을 2차원으로 줄여도 역사 전쟁 관련 에피소드나 현대 과학 발견 관련 에피소드가 서로 가까이 나타남

평균 위치로 문장 분류하기

  • 임베딩은 분류에도 사용할 수 있음
    • 특정 방식으로 분류된 임베딩 그룹의 평균 위치를 먼저 계산함
    • 새 콘텐츠 임베딩이 그 위치들 중 어디에 가까운지 비교해 카테고리를 배정함
  • Amelia Wattenberger의 Getting creative with embeddings는 문장이 구체적인지 추상적인지 점수화하는 사례임
  • 구체적 문장과 추상적 문장 샘플을 만들고, 각 그룹의 평균 위치를 계산함
  • 새 문장은 두 평균 위치 사이에서 어디에 가까운지에 따라 점수를 받음
  • 이 점수는 문장이 얼마나 추상적이거나 구체적인지 느슨하게 나타내는 색상으로도 바꿀 수 있음

RAG: 개인 문서와 사내 문서 질의응답

  • ChatGPT를 써본 사람들은 개인 노트나 회사 내부 문서를 기반으로 질문에 답하게 하는 방법을 궁금해함
  • 답은 비싼 커스텀 모델 학습이 아니라, 기성 LLM과 검색 증강 생성(RAG) 조합일 수 있음
  • RAG의 기본 절차는 단순함
    • 사용자가 질문함
    • 개인 문서에서 질문과 관련 있어 보이는 콘텐츠를 검색함
    • LLM의 크기 제한을 지키며 관련 발췌문과 원래 질문을 프롬프트에 넣음
    • LLM이 제공된 추가 콘텐츠를 바탕으로 답함
  • 일반적인 크기 제한은 3,000~6,000단어 수준임
  • RAG에서 어려운 부분은 프롬프트에 넣을 가장 좋은 발췌문을 찾는 것임
    • 임베딩 기반 의미 검색은 관련 가능성이 높은 콘텐츠를 모으는 데 적합함

E5-large-v2로 블로그 기반 오프라인 Q&A 구현

  • 블로그 콘텐츠 기반 RAG 예시는 E5-large-v2를 사용함
  • 질문과 답변 문장은 문법이 달라, 질문이 답을 포함한 문서와 항상 의미적으로 가깝게 잡히지는 않음
  • E5-large-v2는 두 종류의 콘텐츠를 지원함
    • factual sentence는 phrase로 임베딩함
    • question은 query로 임베딩함
    • 이는 CLIP이 이미지와 텍스트를 같은 공간에 넣는 방식과 비슷함
  • 블로그의 19,000개 문단을 phrase로 임베딩하고, 질문을 query로 임베딩해 답에 가까운 문단을 찾음
  • 예시는 Bash 한 줄 스크립트로 RAG를 구현함
    • llm similar로 관련 문단을 찾음
    • jq로 콘텐츠를 추출함
    • 로컬 노트북에서 실행되는 Llama 2 Chat 7B 모델에 질문과 문단을 전달함
  • What is shot-scraper? 질문에 대해 shot-scraper가 Playwright를 감싸는 Python 유틸리티이며, 명령줄 인터페이스와 YAML 기반 설정 흐름으로 웹페이지 스크린샷과 JavaScript 기반 스크래핑을 자동화한다는 답을 생성함
  • 생성된 답은 기존 블로그 콘텐츠의 정확한 문장 일치가 아니었음

실무에서 조정할 수 있는 선택지

  • LangChain은 LLM 위 기능 구현을 위한 프레임워크이며, RAG는 LangChain의 핵심 기능 중 하나임
    • 같은 기능을 LangChain 위에 만들 수 있지만, LangChain을 이해하는 데 상당한 투자가 필요함
    • 여기서는 모든 것을 해결하는 단일 프레임워크보다 함께 조합되는 작은 도구 모음을 선호함
  • 거리 함수는 코사인 유사도가 기본으로 사용됨
    • 다른 거리 함수는 아직 시도하지 않았음
    • RAG는 거리 함수, 임베딩 모델, 프롬프트 전략, LLM 등 조정 가능한 요소가 많음
  • 예시들은 최대 약 20,000개 임베딩 규모였고, 이 정도는 전체에 대해 brute force 코사인 유사도 계산을 실행해도 합리적인 시간에 결과를 받을 수 있음
  • 10억 개 객체처럼 더 큰 데이터에서는 벡터 데이터베이스나 기존 데이터베이스 확장이 선택지가 됨
  • 앞으로 기대되는 흐름은 멀티모달 모델과 더 작은 모델임
    • Facebook ImageBind는 이미지, 텍스트, 오디오, 깊이, 열, IMU 데이터 6개 모달리티의 공동 임베딩을 학습함
    • 60MB인 gte-tiny처럼 작아지는 모델은 제한된 기기나 브라우저 실행 가능성을 높임

더 읽을거리

댓글과 토론

Hacker News 의견들
  • 이 글을 올린 뒤 임베딩을 더 낮은 수준에서 이해하는 데 유용한 자료를 몇 개 더 찾았음
    내 글은 일부러 아주 높은 수준에서, 주로 응용에 초점을 맞췄음
    Cohere의 Text Embeddings Visually Explained: https://txt.cohere.com/text-embeddings/
    Tensorflow Embedding Projector 도구: https://projector.tensorflow.org/
    Vicki Boykis의 What are embeddings?도 볼 만함: https://vickiboykis.com/what_are_embeddings/
    페이지 하단의 “further reading”에 추가할 예정임

    • 예전에 거의 같은 아이디어를 시도했음: https://blog.scottlogic.com/2022/02/23/word-embedding-recomm...
      임베딩을 써서 관련 글의 참여도를 높였고, 개인적으로 임베딩은 과소평가된 강력한 도구라고 봄
      문서나 발췌문 사이를 유사도로 탐색하거나, 반대로 독특한 콘텐츠를 찾는 데 쓸 수 있으며 환각을 걱정하지 않아도 되어 꽤 “안전”함
    • AI, 머신러닝, LLM 경험이 적은 사람도 접근하기 쉽게 쓰는 방식이 좋음
      임베딩이 어떻게 만들어지는지도 흥미로울 수 있음. 예를 들면 학습 뒤 분류 계층을 잘라내는 방식이나 EfficientNet 같은 접근이 있음
    • 임베딩의 역사와 컴퓨터 과학·LLM에서의 사용을 다룬 자료가 있는지 궁금함
      머신러닝의 핵심 기반이 되어가는 중임
  • 컴퓨터 비전과 시각 SLAM 알고리즘에서는 임베딩이 장소 인식의 사실상 표준 방법이 되었고, 이 글의 내용과 매우 비슷함
    “bag-of-word place recognition”이라고 부르며, 요즘 거의 모든 오픈소스 라이브러리에서 쓰임
    핵심은 각 이미지를 특징 추출·기술자 파이프라인에 통과시켜 상위 N개 특징을 담은 벡터로 “임베딩”하는 것임
    카메라가 움직이는 동안 keyframe이라는 이미지 데이터베이스를 만들고, 이미지는 훨씬 낮은 차원의 벡터로 저장됨
    이후 모든 이미지로 데이터베이스를 질의하고 코사인 유사도 같은 방식으로 벡터 데이터베이스에서 최적 매칭을 찾음
    매칭이 있으면 질의 이미지와 매칭 이미지 사이의 스테레오 제약을 계산해 지도를 갱신할 수 있음
    원 논문은 [1]이고 가장 유명한 구현은 https://github.com/dorian3d/DBoW2
    [1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...

  • 훌륭한 입문용 참고자료
    예전에 직접 iOS 메모 앱을 만들었는데, 기존 전체 텍스트 검색에 임베딩을 추가하는 일이 1) 놀랄 만큼 쉬웠고 2) 처음 예상보다 훨씬 강력했음
    “dog”를 검색하면 “canine”이 들어간 메모도 나올 거라는 건 알았지만, “내가 좋아할 만한 반려동물” 같은 검색으로 긍정적인 감정이 담긴 여러 동물 관련 메모가 잡히는 걸 직접 해보고서야 깨달음
    그게 첫 큰 “아하” 순간이었음
    당시 Supabase의 DocsGPT PR이 예제 코드로 유용했음: https://github.com/supabase/supabase/pull/12056

    • “기존 전체 텍스트 검색에 추가”했다는 표현이 은근히 중요함. 임베딩은 전통적인 검색 알고리즘을 보완하는 의미 검색을 제공함
      많은 애플리케이션은 이름이나 고유명사에 크게 의존하고, 맥락이 부족한 경우도 많음
      반려견을 설명 없이 이름으로만 부르면 특정 임베딩 모델은 이를 잡지 못할 수 있음
      사람, 장소, 거리명 같은 고유명사는 개인화·도메인 특화 검색을 고정하는 데 매우 중요할 수 있지만, 범용 언어 모델은 이를 모름
      이 문제를 다루는 구체적인 방법이 있는지 궁금함
    • Logseq 메모에도 비슷한 걸 작업 중임
      지금 가장 큰 질문은 얼마나 많은 텍스트를 하나의 임베딩으로 만들지임
      문장마다 할지, 아니면 메모 앱의 한 페이지에 속한 문장 블록 전체를 하나로 할지 고민됨
    • 임베딩 생성에 기기 밖 API를 쓰는지, 검색은 기기 안에서 하는지 궁금함
  • 단어 임베딩의 대표 예시는 유명한 King - Man + Woman = Queen
    벡터 공간에서는 잘 동작하지만 2차원으로 투영하면 시각적으로는 잘 와닿지 않음
    내 경험으로는 PCA, MDS, t-SNE 모두 마찬가지였음: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
    브라우저에서 단어 임베딩을 수행하는 JupyterLite Notebook이며, 스마트폰에서는 실행하지 않는 게 좋음
    단어 임베딩의 대표 예시를 보기 좋게 시각화하는 방법을 아는지 궁금함

    • 제대로 이해했다면 2차원 공간에서 “king”을 원점에 두고, X축을 “king”-“man”, Y축을 “king”-“woman”으로 잡아 시각화할 수 있음
      정말 직교성을 원하면 Gram-Schmidt를 쓰면 됨
      3차원에서는 Z축을 “king”-“queen”으로 한 축 더 둘 수 있고, 직교화 버전은 모델이 보는 거리 개념에 더 가까움
      2차원에서는 “king”-“man”+“woman”을 계산했을 때 “queen”에서 얼마나 벗어났는지는 보여주지 못하지만 나머지 거리는 정확하게 얻을 수 있음
      3차원에서는 정확한 거리를 줄 수 있을 것임
      “queen”은 보통 X="king"-"man"+"woman"에 가장 가까운 임베딩을 가진 단어라 선택됨
      2차원 차트에 다음으로 가까운 단어 몇 개도 표시하고, 각 단어에 2차원 평면으로부터의 직교 거리를 붙일 수 있음
      그러면 “queen”이 X로부터의 제곱거리와 평면으로부터의 제곱 직교거리 합이 가장 작은 단어여야 하므로 눈으로도 어느 정도 확인 가능함
    • UMAP을 시도해보면 좋겠음
    • 고차원을 시각화하는 수학자 농담을 찾다가 ChatGPT에 물었는데, Google에서는 찾을 수 없는 Richard Feynman식 농담을 만들어냈음
      “4차원은 시각화할 수 없다… 적어도 나는 못 한다. brane이 세 개뿐이라서”라는 식이었고, branes와 brains를 이용한 말장난이었음
      나중에 ChatGPT가 지어낸 것이라고 인정하고 사과했음
      이어 John von Neumann, H. G. Wells, Ian Stewart의 인용도 내놨고, 마지막에는 “4차원을 시각화하려면 3차원을 시각화한 다음 ‘n+1’이라고 말하면 된다”는 식의 답을 냈는데 기억 속 농담과 가장 비슷했지만 덜 웃겼음
      그래서 Deepak Chopra 스타일로 고차원 공간을 시각화하는 환각 인용을 만들어보라고 했더니, septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle, Shannon entropy 같은 표현을 섞은 그럴듯한 가짜 인용들을 쏟아냈음
  • 실용 삼각법에서 흔한 실수는 필요 없는 제곱근 계산을 하는 것임
    예시 코드의 magnitude_a = sum(x * x for x in a) * 0.5magnitude_b = sum(x * x for x in b) * 0.5에는 *0.5가 필요 없음
    코사인을 비교할 거라면 제곱값을 비교해도 되므로 비용 큰 루트 계산을 피할 수 있음
    비슷하게 타원곡선 암호에서도 역원 계산 같은 비싼 연산은 가능한 한 뒤로 미루거나, 두 점을 비교하기만 할 때는 표준값 계산 자체를 피하기도 함

    • 이 코드는 이해하기 쉽게 쓰인 것임
      그렇지 않았다면 저수준 SIMD 코드로 대체했을 것임
  • dot_product = sum(x * y for x, y in zip(a, b))라니, 왜 이렇게 하고 벡터화된 numpy 연산을 쓰지 않는지 의아함
    “여러 버전의 코사인 유사도 코드를 ChatGPT에게 작성하게 했다”는 대목을 보고 납득함

    • 이유는 두 가지임
      첫째, 사람들에게 설명할 때는 numpy 문법이 오히려 방해된다고 느낌
      둘째, numpy는 가장 가벼운 의존성이 아님
      성능이 필요할 때는 쓰지만 기본 선택지로 삼고 싶지는 않음
  • Show HN 글, ProductHunt 스타트업, YC 회사, Github 저장소 중 LLM 임베딩과 관련된 것을 보고 싶다면 방금 출시한 LLM-Embeddings-Based Search Engine MVP에서 빠르게 찾을 수 있음
    https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...

    • 괜찮음
      여러 필터 버튼을 누르면 검색 결과가 바로 갱신될 거라고 예상했고, 검색을 다시 해야 할 줄은 몰랐음
      왜 그렇게 했는지는 이해됨
    • 내 Show HN 글은 여기 있음: https://news.ycombinator.com/item?id=38011802
  • 최근 몇 달 동안 “AI” 관련해서 읽은 것 중 가장 흥미로움
    목록에서 임베딩 모델을 볼 때마다 뭔지 궁금했고, 왜 모두가 벡터 DB를 말하는지도 궁금했음
    오래 진행 중인 사이드 프로젝트에 바로 적용할 방법이 떠오름
    모든 문서에 임베딩이 있다면 사용자 데이터의 유용한 군집화가 현실적으로 가능해질지도 모름

  • 실제로 임베딩을 근사 최근접 이웃과 군집화 말고 다른 데 써본 사람이 있는지 궁금함
    떠오르는 가능성으로는 임의 축에 대한 투영·색인·정렬이 있음. 예를 들면 “뜨거움-차가움”, “행복-슬픔”, “SF-현실주의”, “문학성-상업성” 같은 축임
    임베딩 공간에서 SVM식 분류를 하거나, word2vec식 추론인 woman-man+king=queen을 하거나, LLM의 한 계층을 떼어오는 것 말고 임베딩을 직접 학습시키는 방법도 있을 것임
    대조 학습은 쓰이는 걸 알지만, 함수 신경망과 함께 임베딩을 학습하고 함수 방정식을 생성해 평균제곱오차 손실을 계산하는 등 다른 방법도 탐구할 만해 보임
    의미 검색에 너무 집중되어 있는 것처럼 보여 놀랍고, 분명 다른 흥미로운 응용이 있을 것 같음

    • 예로 든 것들이 모두 비교적 흔한 작업처럼 보여서 조금 혼란스러움
      첫 번째와 세 번째는 사실상 동일함
      컴퓨터 비전에서는 사진에 안경을 추가하는 식으로 의미적으로 이미지를 바꾸고 싶을 수 있고, Google 광고에서 보는 작업들이 그런 예임
      이런 작업은 잠재 공간에서 이루어짐
      정규화 흐름에서는 공간을 가우시안으로 바꾸기 때문에 특히 명확함
      확산 모델도 근사 방법으로 비슷한 일을 하지만 가역적이지는 않고, 되돌릴 수는 있음
      조작하고 싶은 이미지·문장·데이터를 투영하고, 가우시안 공간에서 조작한 다음 대상 공간으로 되돌림
      다만 임베딩이라는 단어가 너무 많은 뜻을 가진 과적재된 용어라 서로 헷갈리는 것일 수도 있음
      이산 정수 토큰을 연속 부동소수점으로 바꾸는 첫 블록만 생각하는 것일 수도 있음
      하지만 그 임베딩도 학습되므로 조회 테이블처럼 되더라도 여전히 신경망 과정임
      이 공간에서 SVM을 쓰는 일도 있음
      잠재 공간과 비슷하지만 조금 더 추상적이라고 봄
      적어도 임베딩은 단사여야 함. 수학적으로는 그렇지만…
    • 임베딩 공간에서 SVM식 분류는 산업계 자연어 처리와 머신러닝에서 아주 기본적인 기법임
      임베딩을 직접 학습시키는 건 말 그대로 원래의 임베딩 모델인 Word2Vec임
    • PubMed 초록을 기반으로 word2vec 임베딩 공간을 만든 적도 있음
      화학·생화학 이름의 하이픈 표기, 비하이픈 표기, 띄어쓰기 표기 같은 변형과 약어를 많이 찾았음
      아마 기술 용어 사전을 만들 수도 있었을 것임
      정의까지 얼마나 갈 수 있었을지는 모르겠지만, 벡터만으로는 한계가 있어도 출발점은 됨
      다른 사람들도 이런 방식으로 사전 구축을 했을 가능성이 큼
    • 두 언어 각각에 임베딩 공간을 만들고 시드 사전으로 공간을 정렬하는 교차 언어 임베딩은 다국어 검색과 기계번역에 실제 또는 잠재적 응용이 있음
    • 데이터 중복 제거에도 쓸 수 있음
  • 임베딩을 만져보고 몇 가지 프로덕션 사용 사례도 만들어봤는데, 멋진 응용을 많이 가능하게 해주는 훌륭한 도구임
    하지만 특정 도메인에서 만들다 보면 기성 임베딩 모델의 한계에 부딪힘
    기성 모델은 차원이 많지만 그중 어떤 차원은 내 애플리케이션의 분류, 콘텐츠 유사도, 군집화 등에 중요하고 어떤 차원은 중요하지 않을 수 있음
    다시 말해 관심 없는 차원에서 가까워서 두 벡터가 가깝게 보일 수 있음
    임베딩 모델 미세조정을 위한 더 나은 도구와 문헌이 나오길 기대함

    • 이 문제를 풀려고 전체 언어 모델을 미세조정하는 건 못에 큰 망치를 쓰는 것과 같음
      이런 도구는 오래전부터 있었고, 예를 들어 데이터를 조금 라벨링한 뒤 임베딩 공간 위에서 분류용 SVM을 학습시키면 됨
    • sentence-transformers에는 이와 관련한 도구가 꽤 잘 갖춰져 있음