victor은(는) 무엇을 하나요?

벡터가 침대에 있습니다. 화살표에는 VECTOR라고 적혀 있습니다. 그것이 로고이자 농담입니다. 작업은 농담이 아닙니다.
Victor는 임베더 스킬입니다. 문자열을 점으로 간주하고 이웃을 측정합니다. 또한 벡터 없이 동일한 문자열을 보아 기하학과 겹침을 구별할 수 있습니다. 포니테일(Ponytail): 하나의 공간, 하나의 모델, 코사인, 추가 저장소 없음. 네크비어드(Neckbeard): 숫자는 이해가 아닙니다. 숫자는 동시 발생을 훈련받은 방향입니다. 있는 그대로의 세상입니다.
세상을 있는 그대로 보십시오
임베딩은 float의 목록입니다. 구에서 가깝다는 것은 그 모델에서 유사하다는 뜻이지, 진실, 동의어, 동의를 의미하지 않습니다. 혼합된 모델은 혼합된 세계입니다. 혼합된 차원은 충돌입니다. 정규화되지 않은 L2와 코사인은 다른 질문입니다.
임베딩하지 마십시오:
- ID, 경로, 해시, 정확히 일치해야 하는 정확한 이름
- 예/아니오/완료
- 이미 쌍으로 만든 두 줄(argubot의 YES/NO 쌍)
- 비밀
네트워크를 호출해서는 안 되는 페이지에 모델을 불러오지 마십시오. Argubot의 편지 페이지에는 fetch가 없습니다. argubot.js의 embedVec은 SVG 벡터를 그립니다. 그것은 임베딩이 아니라 벡터의 그림입니다. 혼동하지 마십시오.
실제 시장
벡터를 생성하는 라이브러리:
| 작업 | 저장소 | 설명 |
|---|---|---|
| Python 임베딩/재순위 | huggingface/sentence-transformers | 기본값. SBERT, 희소, ColBERT. 이름을 고르기 전에 MTEB를 확인하십시오. |
| JS/브라우저 임베딩 | huggingface/transformers.js | ONNX 인프로세스. 기본 영어: Xenova/all-MiniLM-L6-v2 (384-d). 패키지 @huggingface/transformers. |
| 동일 가중치, Python | sentence-transformers/all-MiniLM-L6-v2 | 384-d, 소형. 아닐 때까지는 괜찮습니다. |
이미 가지고 있는 벡터를 검색하는 라이브러리:
| 작업 | 저장소 | 설명 |
|---|---|---|
| 정확/GPU NN | facebookresearch/faiss | 인프로세스. L2 정규화 후 IndexFlatIP는 코사인입니다. 데이터베이스가 아닙니다. |
| 소형 HNSW | unum-cloud/usearch | 헤더 방식, 여러 언어. 여전히 이해가 아닙니다. |
| 필터링 저장소 | qdrant/qdrant | 서버. 필터와 지속성이 필요할 때 사용하십시오. |
| 로컬 장난감 저장소 | chroma-core/chroma | 쉽습니다. 필수가 아닙니다. |
유료 API(OpenAI, Cohere, Nomic)가 존재합니다. 벽 뒤에 있는 모델입니다. 동일한 규칙: 하나의 공간, 절대 혼합하지 말고, 점수를 진리로 취급하지 마십시오.
포니테일 순서: 메모리에서 무차별 코사인. 그 다음 FAISS/USearch. 그 다음 저장소. 배열이 작동한다면 저장소는 건너뛰십시오.
비벡터 우선
항상 비벡터 기준선을 실행하십시오. 겹침이 이미 순위를 매긴다면 모델이 필요하지 않았던 것입니다.
function tokens(s) {
return String(s).toLowerCase().match(/[a-z0-9]+/g) || [];
}
function overlap(a, b) {
const A = new Set(tokens(a));
const B = new Set(tokens(b));
let hit = 0;
for (const t of A) if (B.has(t)) hit += 1;
return hit / Math.max(1, A.size, B.size);
}
정확한 문자열 일치는 정확하게 유지됩니다. ID에 코사인을 사용하지 마십시오.
저렴한 벡터 (모델 없음)
해시된 n-gram은 벡터 모양의 숫자를 만듭니다. 여전히 조각 모음이지 의미가 아닙니다. 코사인을 보기 위해, 그리고 MiniLM이 아님을 알기 위해 사용하십시오.
로컬 프로브 실행 (설치 불필요):
node .cursor/skills/victor/victor.mjs "cars is a fix" "cars makes more problems"
겹침과 해시된 코사인이 나란히 출력됩니다. 쌍은 단어를 공유하므로 두 점수 모두 올라갑니다. 실제 모델은 주제를 공유하기 때문에 여전히 그것들을 가까이 둘 수 있습니다. 그것이 있는 그대로의 세상입니다: 자동차에 대한 YES와 NO는 이웃입니다. 그들은 같은 주장이 아닙니다.
실제 벡터 (모델)
Python, sentence-transformers가 제공하는 그대로:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
vecs = model.encode(["cars is a fix", "cars makes more problems"], normalize_embeddings=True)
# 코사인은 두 단위 벡터의 내적입니다
JS/브라우저, transformers.js 사용. 다운로드가 필요합니다. argubot의 편지 페이지용이 아닙니다.
import { pipeline } from "@huggingface/transformers";
const extractor = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
const out = await extractor(["cars is a fix", "cars makes more problems"], {
pooling: "mean",
normalize: true,
});
항상 pooling: "mean"과 normalize: true를 사용하십시오. 그렇지 않으면 잘못된 것을 측정하는 것입니다. 하나의 파이프라인을 재사용하십시오. 호출할 때마다 새로 구성하지 마십시오.
단위 벡터의 코사인:
function dot(a, b) {
let s = 0;
for (let i = 0; i < a.length; i += 1) s += a[i] * b[i];
return s;
}
정규화하지 않았다면 그것을 코사인이라고 부르지 마십시오.
Victor가 작업을 수행하는 방법
- 문자열을 명명하십시오. 정확히 일치해야 한다면 중단하십시오. 문자열을 사용하십시오.
- 겹침을 실행하십시오(저렴한 벡터를 원한다면
victor.mjs도). - 여전히 의미상 이웃이 필요하다면 하나의 모델을 고르십시오. 임베딩하십시오. 코사인 계산. 점수를 보여주십시오.
- float 배열이 너무 크거나 느려질 때까지 FAISS/Qdrant/Chroma를 추가하지 마십시오.
- 점수가 무엇인지 말하십시오: 그 공간에서의 이웃. 평결이 아닙니다.
Victor는 승자를 고르지 않습니다. 가까우면 가까운 것입니다. 그것이 아는 전부입니다.
