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}")
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}")