GN⁺: Show HN: Wordllama – LLM의 토큰 임베딩으로 할 수 있는 것들
(github.com/dleemiller)WordLlama
WordLlama는 빠르고 가벼운 NLP 도구로, 퍼지 중복 제거, 유사성 및 순위 매기기와 같은 작업을 최소한의 추론 시간 종속성으로 처리하며 CPU 하드웨어에 최적화되어 있음.
목차
- 빠른 시작
- 무엇인가?
- MTEB 결과
- 텍스트 임베딩
- 훈련 노트
- 로드맵
- 토큰 임베딩 추출
- 인용
- 라이선스
빠른 시작
-
설치:
pip install wordllama
-
256차원 모델 로드:
from wordllama import WordLlama wl = WordLlama.load()
-
두 문장 간 유사성 계산:
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop") print(similarity_score) # 출력: 0.06641249096796882
-
쿼리에 대한 문서 순위 매기기:
query = "i went to the car" candidates = ["i went to the park", "i went to the shop", "i went to the truck", "i went to the vehicle"] ranked_docs = wl.rank(query, candidates) print(ranked_docs) # 출력: # [ # ('i went to the vehicle', 0.7441646856486314), # ('i went to the truck', 0.2832691551894259), # ('i went to the shop', 0.19732814982305436), # ('i went to the park', 0.15101404519322253) # ]
-
추가 추론 방법:
wl.deduplicate(candidates, threshold=0.8) # 퍼지 중복 제거 wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4) # kmeans/kmeans++ 초기화 사용 라벨링 wl.filter(query, candidates, threshold=0.3) # 쿼리를 기반으로 후보 필터링 wl.topk(query, candidates, k=3) # 쿼리를 기반으로 상위 k 문자열 반환
무엇인가?
WordLlama는 대형 언어 모델(LLM)의 구성 요소를 재활용하여 효율적이고 컴팩트한 단어 표현을 생성하는 NLP 및 단어 임베딩 모델임. GloVe, Word2Vec, FastText와 같은 모델과 유사함.
- Matryoshka Representations: 필요에 따라 임베딩 차원 축소 가능
- 낮은 자원 요구 사항: 평균 풀링을 사용한 간단한 토큰 조회로 CPU에서 빠르게 작동 가능
- 이진화: 직통 추정기를 사용하여 훈련된 모델은 작은 정수 배열로 패킹 가능 (곧 제공 예정)
- Numpy 전용 추론: 가볍고 단순함
WordLlama는 다양한 NLP 작업에 적합하며, 빠르고 휴대 가능한 크기로 탐색 분석 및 유틸리티 애플리케이션에 유용함.
MTEB 결과
| Metric | WL64 | WL128 | WL256 (X) | WL512 | WL1024 | GloVe 300d | Komninos | all-MiniLM-L6-v2 | |--------|------|-------|-----------|-------|--------|------------|----------|------------------| | Clustering | 30.27 | 32.20 | 33.25 | 33.40 | 33.62 | 27.73 | 26.57 | 42.35 | | Reranking | 50.38 | 51.52 | 52.03 | 52.32 | 52.39 | 43.29 | 44.75 | 58.04 | | Classification | 53.14 | 56.25 | 58.21 | 59.13 | 59.50 | 57.29 | 57.65 | 63.05 | | Pair Classification | 75.80 | 77.59 | 78.22 | 78.50 | 78.60 | 70.92 | 72.94 | 82.37 | | STS | 66.24 | 67.53 | 67.91 | 68.22 | 68.27 | 61.85 | 62.46 | 78.90 | | CQA DupStack | 18.76 | 22.54 | 24.12 | 24.59 | 24.83 | 15.47 | 16.79 | 41.32 | | SummEval | 30.79 | 29.99 | 30.99 | 29.56 | 29.39 | 28.87 | 30.49 | 30.81 |
텍스트 임베딩
사전 훈련된 임베딩을 로드하고 텍스트를 임베딩하는 방법:
from wordllama import WordLlama
wl = WordLlama.load(trunc_dim=64)
embeddings = wl.embed(["the quick brown fox jumps over the lazy dog", "and all that jazz"])
print(embeddings.shape) # (2, 64)
이진 임베딩 모델 사용 예:
wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car") # 출력: array([[3029168427562626]], dtype=uint64)
wl = WordLlama.load(dim=1024, binary=True)
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
print(similarity_score) # 출력: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False # 해밍 유사성 대신 코사인 유사성 사용
wl = WordLlama.load(config="l3_supercat", dim=1024)
훈련 노트
이진 임베딩 모델은 높은 차원에서 더 뚜렷한 개선을 보였으며, 512 또는 1024 차원이 권장됨. L2 Supercat은 단일 A100에서 12시간 동안 배치 크기 512로 훈련됨.
로드맵
- 추론 기능 추가 작업 중:
- 의미적 텍스트 분할
- 예제 노트북 추가
- DSPy 평가자
- RAG 파이프라인
토큰 임베딩 추출
모델에서 토큰 임베딩을 추출하려면 사용자 동의서에 동의하고 Hugging Face CLI를 사용하여 로그인해야 함. 그런 다음 다음 스니펫을 사용할 수 있음:
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
인용
WordLlama를 연구나 프로젝트에 사용할 경우 다음과 같이 인용해 주시기 바람:
@software{miller2024wordllama,
author = {Miller, D. Lee},
title = {WordLlama: Recycled Token Embeddings from Large Language Models},
year = {2024},
url = {https://github.com/dleemiller/wordllama},
version = {0.2.6}
}
라이선스
이 프로젝트는 MIT 라이선스 하에 있음.
GN⁺의 정리
- WordLlama는 대형 언어 모델의 구성 요소를 재활용하여 효율적이고 컴팩트한 단어 표현을 생성하는 NLP 도구임.
- CPU에서 빠르게 작동하며, 다양한 NLP 작업에 적합한 "스위스 아미 나이프" 유틸리티로 활용 가능함.
- 이진 임베딩 모델은 높은 차원에서 더 뚜렷한 개선을 보이며, 512 또는 1024 차원이 권장됨.
- 빠르고 휴대 가능한 크기로 탐색 분석 및 유틸리티 애플리케이션에 유용함.
Hacker News 의견
-
작은 크기가 마음에 듦, SBERT의 가장 작은 모델보다 유리함
- 기술적으로 구식이지만 성능을 위한 타협임
- 다양한 유사성 유형(예: 의미론적, NLI, 명사-추상적)을 전환할 수 있는 방법 제공 요청
- 예를 들어, "Freezing"과 "Burning"을 신문 기사 분류에서는 유사하게, 화학 기사에서는 반대로 하고 싶음
- NLI 임베딩을 사용하여 인과 관계를 파악하고 싶음
- SBERT는 크기가 크고 여러 모델을 로드해야 하므로 자원 소모가 큼
-
임베딩은 많은 의미 정보를 캡처하며 독립적으로 유용한 작업에 사용 가능함
- CLIP 모델의 텍스트 인코더 임베딩을 사용하여 프롬프트를 보강함
- 예를 들어, "building"이라는 단어가 주어지면 임베딩 매트릭스에서 "concrete", "underground" 등을 찾아 대체하거나 추가함
- 제한된 실험에서 대부분의 쿼리에 대해 높은 리콜을 얻음
-
영어 외 다른 언어에 대한 계획이 있는지 질문
- 프랑스어에 완벽한 도구가 될 것임
-
토큰 자체에 많은 의미 내용이 포함되어 있음을 보여줌
-
임베딩을 사용하여 Little Alchemy를 해결하는 것에 대한 생각
-
게임 제작에 매우 유용함, 감사함
-
멋져 보임, mini-lm 모델의 장점에 대해 질문
- 대부분의 mteb 작업에서 더 나은 것 같지만 추론 등에서 더 나은지 궁금함
-
몇 년 전 비슷한 기능을 사용한 "언어 게임"을 작성함