# Show HN: Wordllama – LLM의 토큰 임베딩으로 할 수 있는 것들

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16785](https://news.hada.io/topic?id=16785)
- GeekNews Markdown: [https://news.hada.io/topic/16785.md](https://news.hada.io/topic/16785.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-16T09:44:46+09:00
- Updated: 2024-09-16T09:44:46+09:00
- Original source: [github.com/dleemiller](https://github.com/dleemiller/WordLlama)
- Points: 1
- Comments: 1

## Topic Body

### WordLlama

**WordLlama**는 빠르고 가벼운 NLP 도구로, 퍼지 중복 제거, 유사성 및 순위 매기기와 같은 작업을 최소한의 추론 시간 종속성으로 처리하며 CPU 하드웨어에 최적화되어 있음.

#### 목차
- 빠른 시작
- 무엇인가?
- MTEB 결과
- 텍스트 임베딩
- 훈련 노트
- 로드맵
- 토큰 임베딩 추출
- 인용
- 라이선스

#### 빠른 시작

- 설치:
  ```bash
  pip install wordllama
  ```

- 256차원 모델 로드:
  ```python
  from wordllama import WordLlama
  wl = WordLlama.load()
  ```

- 두 문장 간 유사성 계산:
  ```python
  similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
  print(similarity_score)  # 출력: 0.06641249096796882
  ```

- 쿼리에 대한 문서 순위 매기기:
  ```python
  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)
  # ]
  ```

- 추가 추론 방법:
  ```python
  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 |

#### 텍스트 임베딩

사전 훈련된 임베딩을 로드하고 텍스트를 임베딩하는 방법:

```python
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)
```

이진 임베딩 모델 사용 예:

```python
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를 사용하여 로그인해야 함. 그런 다음 다음 스니펫을 사용할 수 있음:

```python
from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")
```

#### 인용

WordLlama를 연구나 프로젝트에 사용할 경우 다음과 같이 인용해 주시기 바람:

```plaintext
@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 차원이 권장됨.
- 빠르고 휴대 가능한 크기로 탐색 분석 및 유틸리티 애플리케이션에 유용함.

## Comments



### Comment 28938

- Author: neo
- Created: 2024-09-16T09:44:46+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41544969) 
- 작은 크기가 마음에 듦, SBERT의 가장 작은 모델보다 유리함
  - 기술적으로 구식이지만 성능을 위한 타협임
  - 다양한 유사성 유형(예: 의미론적, NLI, 명사-추상적)을 전환할 수 있는 방법 제공 요청
  - 예를 들어, "Freezing"과 "Burning"을 신문 기사 분류에서는 유사하게, 화학 기사에서는 반대로 하고 싶음
  - NLI 임베딩을 사용하여 인과 관계를 파악하고 싶음
  - SBERT는 크기가 크고 여러 모델을 로드해야 하므로 자원 소모가 큼

- 임베딩은 많은 의미 정보를 캡처하며 독립적으로 유용한 작업에 사용 가능함
  - CLIP 모델의 텍스트 인코더 임베딩을 사용하여 프롬프트를 보강함
  - 예를 들어, "building"이라는 단어가 주어지면 임베딩 매트릭스에서 "concrete", "underground" 등을 찾아 대체하거나 추가함
  - 제한된 실험에서 대부분의 쿼리에 대해 높은 리콜을 얻음

- 영어 외 다른 언어에 대한 계획이 있는지 질문
  - 프랑스어에 완벽한 도구가 될 것임

- 토큰 자체에 많은 의미 내용이 포함되어 있음을 보여줌

- 임베딩을 사용하여 Little Alchemy를 해결하는 것에 대한 생각

- 게임 제작에 매우 유용함, 감사함

- 멋져 보임, mini-lm 모델의 장점에 대해 질문
  - 대부분의 mteb 작업에서 더 나은 것 같지만 추론 등에서 더 나은지 궁금함

- 몇 년 전 비슷한 기능을 사용한 "언어 게임"을 작성함
  - [Language-games](https://github.com/Hellisotherpeople/Language-games)
