Salta el contingut

Tokenització i embeddings en detall

Tokenitzadors BPE

El Byte Pair Encoding (BPE) és l'algorisme de tokenització més usat en LLMs moderns. Funciona:

  1. Comença amb el vocabulari de caràcters individuals
  2. Calcula la freqüència de tots els parells de tokens adjacents
  3. Fusiona el parell més freqüent en un nou token
  4. 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}")