Tokenització i embeddings en detall
Tokenitzadors BPE
El Byte Pair Encoding (BPE) és l'algorisme de tokenització més usat en LLMs moderns. Funciona:
- Comença amb el vocabulari de caràcters individuals
- Calcula la freqüència de tots els parells de tokens adjacents
- Fusiona el parell més freqüent en un nou token
- Repeteix N vegades fins arribar a la mida del vocabulari desitjada
GPT-4 usa cl100k_base: vocabulari de 100.000 tokens. En anglès, un token correspon aproximadament a 0,75 paraules. En català, la relació és similar.
Implicació pràctica del cost: Les APIs d'OpenAI i Anthropic cobren per token. Saber estimar el nombre de tokens d'un text és crucial per controlar els costos.
import tiktoken
# Comptador de tokens per GPT-4
enc = tiktoken.get_encoding("cl100k_base")
text_catala = """
La intel·ligència artificial és una disciplina de la informàtica
que busca crear sistemes capaços de realitzar tasques que normalment
requeririen intel·ligència humana.
"""
tokens = enc.encode(text_catala)
print(f"Text: {len(text_catala)} caràcters")
print(f"Tokens: {len(tokens)}")
print(f"Tokens decodificats: {[enc.decode([t]) for t in tokens[:20]]}")
# Cost estimat (juny 2025: GPT-4o input = $0.005 per 1K tokens)
cost_per_1k = 0.005
cost = (len(tokens) / 1000) * cost_per_1k
print(f"Cost estimat: ${cost:.6f}")
Word embeddings clàssics: Word2Vec
Abans dels embeddings contextuals (vegeu Evolució del PLN), Word2Vec (Mikolov et al., 2013) va ser el primer mètode capaç d'aprendre vectors de paraules que capturen relacions semàntiques directament de grans quantitats de text sense etiquetar. S'entrena amb una tasca senzilla —predir les paraules del context a partir d'una paraula central (skip-gram) o a l'inrevés (CBOW, Continuous Bag of Words)— però el subproducte d'aquest entrenament (els pesos de la capa oculta) esdevé un espai vectorial on paraules que apareixen en contextos similars acaben amb vectors propers.
# pip install gensim
import gensim.downloader as api
# Model preentrenat sobre 100.000 milions de paraules de notícies (Google News, anglès)
model = api.load("word2vec-google-news-300")
model.similarity("king", "queen") # alta similitud (~0.65)
model.similarity("king", "potato") # baixa similitud (~0.15)
model.most_similar(["king", "queen"], topn=5)
# Aritmètica vectorial: "king - man + woman" hauria d'aproximar-se a "queen"
model.most_similar(positive=["king", "woman"], negative=["man"], topn=1)
Notebook de Colab per practicar
Un embedding, un únic significat
Aquest model, igual que GloVe, assigna un sol vector per paraula, independentment del context (la limitació ja comentada a Evolució del PLN). A més, word2vec-google-news-300 s'ha entrenat només amb text en anglès: per treballar en català cal recórrer a fastText (que sí publica vectors per a més de 150 idiomes, inclòs el català) o directament a embeddings contextuals multilingües com els que s'usen a la secció següent.
Embeddings i biaix: com que Word2Vec aprèn només de patrons estadístics del text, també aprèn —i amplifica— els biaixos socials presents en el corpus d'entrenament. L'exemple més citat és l'analogia computer_programmer - man + woman, que en el paper original de debiasing "Man is to Computer Programmer as Woman is to Homemaker?" (Bolukbasi et al., 2016) retornava homemaker (mestressa de casa) en lloc d'una altra professió neutra. Aquest problema es retroba a Limitacions del PLN, ja que els biaixos apresos en aquesta etapa es propaguen a tots els models posteriors que reutilitzen aquests embeddings.
Miniactivitat — AC5071/03/09
RA3 · CA3.3
Amb el codi anterior, calcula 5 analogies pel patró A - B + C amb parelles de professions i gèneres (p. ex. nurse - woman + man, doctor - man + woman). Registra els resultats i identifica si n'hi ha algun que reflecteixi un estereotip de gènere. Relaciona la troballa amb l'apartat de Biaixos algorítmics: d'on prové aquest biaix i quines mesures de mitigació coneixes?
Vector stores i cerca semàntica
Un vector store (o base de dades vectorial) emmagatzema embeddings de documents i permet cercar de forma eficient per similitud semàntica (cerca del veí més proper).
Bases de dades vectorials populars el 2025: - Chroma: local, senzill, ideal per a prototips - Pinecone: cloud, gestionat, molt escalable - Weaviate: obert, suporta vector + text search - Qdrant: alta rendiment, Rust, self-hosted - pgvector: extensió de PostgreSQL per a vectors
# Exemple amb ChromaDB i embeddings locals
# pip install chromadb sentence-transformers
import chromadb
from sentence_transformers import SentenceTransformer
# Model d'embeddings multilingüe (suporta català)
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
# Crear client ChromaDB en memòria
client = chromadb.Client()
col = client.create_collection("documents_empresa")
# Documents d'exemple
documents = [
"La política de vacances és de 23 dies laborables l'any.",
"El teletreball és possible fins a 3 dies per setmana.",
"El servei mèdic de l'empresa atén els dimecres de 9 a 14h.",
"La cantina ofereix menú diari per 5,50 euros.",
"Les formacions internes es realitzen els divendres a la tarda."
]
# Generar embeddings i afegir a la col·lecció
embeddings = model.encode(documents).tolist()
col.add(
documents=documents,
embeddings=embeddings,
ids=[f"doc_{i}" for i in range(len(documents))]
)
# Cerca semàntica
consulta = "Quants dies de vacances tinc?"
emb_consulta = model.encode([consulta]).tolist()
resultats = col.query(query_embeddings=emb_consulta, n_results=2)
print(f"Consulta: {consulta}")
for doc, dist in zip(resultats['documents'][0], resultats['distances'][0]):
print(f"Similitud: {1-dist:.2%} | Document: {doc}")