Capítulo 3: Embeddings y Búsqueda Semántica
Ejercicios Prácticos — Capítulo 3
Ejercicio 1: Generar Embeddings para una Lista de Textos
Tarea:
Crear embeddings para una lista de descripciones de productos utilizando el modelo text-embedding-3-small
de OpenAI e imprimir la dimensión de cada vector.
Solución:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
products = [
"Eco-friendly water bottle made from recycled plastic",
"Wireless noise-cancelling headphones",
"Ergonomic office chair with lumbar support"
]
embeddings = []
for product in products:
response = openai.Embedding.create(input=product, model="text-embedding-3-small")
vector = response["data"][0]["embedding"]
embeddings.append(vector)
print(f"🔢 Vector length: {len(vector)}")
Ejercicio 2: Calcular la Similitud Entre Dos Textos
Tarea:
Comparar la similitud semántica entre dos reseñas de usuarios utilizando similitud del coseno.
Solución:
from numpy import dot
from numpy.linalg import norm
review_1 = "The delivery was super fast and the packaging was great!"
review_2 = "Shipping was quick and everything arrived safely."
def get_embedding(text):
return openai.Embedding.create(input=text, model="text-embedding-3-small")["data"][0]["embedding"]
vec1 = get_embedding(review_1)
vec2 = get_embedding(review_2)
similarity = dot(vec1, vec2) / (norm(vec1) * norm(vec2))
print("🔗 Semantic Similarity:", round(similarity, 3))
Ejercicio 3: Crear y Consultar un Índice FAISS
Tarea:
Indexar un conjunto de artículos de soporte y buscar el más relevante según una consulta.
Solución:
import faiss
import numpy as np
articles = [
"Resetting your password from the login page",
"Changing your profile photo and bio",
"Canceling your subscription and managing refunds"
]
# Generate embeddings
vectors = [get_embedding(article) for article in articles]
matrix = np.array(vectors).astype("float32")
faiss.normalize_L2(matrix)
# Create FAISS index
index = faiss.IndexFlatIP(len(matrix[0]))
index.add(matrix)
# Query
query = "How do I cancel my membership?"
query_vec = np.array([get_embedding(query)]).astype("float32")
faiss.normalize_L2(query_vec)
# Search
similarities, idxs = index.search(query_vec, k=2)
for i in idxs[0]:
print("📄 Match:", articles[i])
Ejercicio 4: Construir una Aplicación Simple de Búsqueda Semántica con Pinecone
Tarea:
Usar Pinecone para almacenar embeddings y devolver el documento que mejor coincida con una pregunta del usuario.
Solución:
import pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"),
environment=os.getenv("PINECONE_ENV")
)
# Create or connect to index
index_name = "quick-search"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=1536, metric="cosine")
index = pinecone.Index(index_name)
docs = {
"a1": "How to export data from your dashboard",
"a2": "Steps to upgrade your subscription plan",
"a3": "Changing your registered email address"
}
# Insert documents
to_upsert = [
(doc_id, get_embedding(text), {"text": text})
for doc_id, text in docs.items()
]
index.upsert(vectors=to_upsert)
# Search
user_query = "Can I switch to a higher plan?"
query_vec = get_embedding(user_query)
results = index.query(vector=query_vec, top_k=1, include_metadata=True)
print("🔍 Top match:", results["matches"][0]["metadata"]["text"])
Ejercicio 5: Recomendar Entradas de Blog Similares
Tarea:
Usar embeddings para recomendar entradas de blog que estén semánticamente relacionadas con una dada.
Solución:
posts = [
"10 Python tricks you didn’t know",
"Deploying machine learning models with FastAPI",
"Understanding transformer models in NLP",
"Intro to JavaScript for data scientists"
]
# Embed posts
post_embeddings = [get_embedding(post) for post in posts]
# Define base post
base = "How transformers work in deep learning"
base_vec = get_embedding(base)
# Compute similarity
scores = [dot(base_vec, vec) / (norm(base_vec) * norm(vec)) for vec in post_embeddings]
top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:2]
print("📚 Recommended Posts:")
for i in top_indices:
print("-", posts[i])
Resumen de lo que practicaste
- Creación de embeddings de OpenAI a partir de texto sin procesar
- Comparación de vectores con similitud del coseno
- Construcción de un índice FAISS para búsqueda vectorial local rápida
- Uso de Pinecone para persistir y consultar vectores en la nube
- Creación de recomendaciones prácticas basadas en similitud semántica
Estos ejercicios te han equipado con los flujos de trabajo fundamentales que impulsan asistentes inteligentes, chatbots, sistemas de recomendación y herramientas de búsqueda semántica a escala.
Ejercicios Prácticos — Capítulo 3
Ejercicio 1: Generar Embeddings para una Lista de Textos
Tarea:
Crear embeddings para una lista de descripciones de productos utilizando el modelo text-embedding-3-small
de OpenAI e imprimir la dimensión de cada vector.
Solución:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
products = [
"Eco-friendly water bottle made from recycled plastic",
"Wireless noise-cancelling headphones",
"Ergonomic office chair with lumbar support"
]
embeddings = []
for product in products:
response = openai.Embedding.create(input=product, model="text-embedding-3-small")
vector = response["data"][0]["embedding"]
embeddings.append(vector)
print(f"🔢 Vector length: {len(vector)}")
Ejercicio 2: Calcular la Similitud Entre Dos Textos
Tarea:
Comparar la similitud semántica entre dos reseñas de usuarios utilizando similitud del coseno.
Solución:
from numpy import dot
from numpy.linalg import norm
review_1 = "The delivery was super fast and the packaging was great!"
review_2 = "Shipping was quick and everything arrived safely."
def get_embedding(text):
return openai.Embedding.create(input=text, model="text-embedding-3-small")["data"][0]["embedding"]
vec1 = get_embedding(review_1)
vec2 = get_embedding(review_2)
similarity = dot(vec1, vec2) / (norm(vec1) * norm(vec2))
print("🔗 Semantic Similarity:", round(similarity, 3))
Ejercicio 3: Crear y Consultar un Índice FAISS
Tarea:
Indexar un conjunto de artículos de soporte y buscar el más relevante según una consulta.
Solución:
import faiss
import numpy as np
articles = [
"Resetting your password from the login page",
"Changing your profile photo and bio",
"Canceling your subscription and managing refunds"
]
# Generate embeddings
vectors = [get_embedding(article) for article in articles]
matrix = np.array(vectors).astype("float32")
faiss.normalize_L2(matrix)
# Create FAISS index
index = faiss.IndexFlatIP(len(matrix[0]))
index.add(matrix)
# Query
query = "How do I cancel my membership?"
query_vec = np.array([get_embedding(query)]).astype("float32")
faiss.normalize_L2(query_vec)
# Search
similarities, idxs = index.search(query_vec, k=2)
for i in idxs[0]:
print("📄 Match:", articles[i])
Ejercicio 4: Construir una Aplicación Simple de Búsqueda Semántica con Pinecone
Tarea:
Usar Pinecone para almacenar embeddings y devolver el documento que mejor coincida con una pregunta del usuario.
Solución:
import pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"),
environment=os.getenv("PINECONE_ENV")
)
# Create or connect to index
index_name = "quick-search"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=1536, metric="cosine")
index = pinecone.Index(index_name)
docs = {
"a1": "How to export data from your dashboard",
"a2": "Steps to upgrade your subscription plan",
"a3": "Changing your registered email address"
}
# Insert documents
to_upsert = [
(doc_id, get_embedding(text), {"text": text})
for doc_id, text in docs.items()
]
index.upsert(vectors=to_upsert)
# Search
user_query = "Can I switch to a higher plan?"
query_vec = get_embedding(user_query)
results = index.query(vector=query_vec, top_k=1, include_metadata=True)
print("🔍 Top match:", results["matches"][0]["metadata"]["text"])
Ejercicio 5: Recomendar Entradas de Blog Similares
Tarea:
Usar embeddings para recomendar entradas de blog que estén semánticamente relacionadas con una dada.
Solución:
posts = [
"10 Python tricks you didn’t know",
"Deploying machine learning models with FastAPI",
"Understanding transformer models in NLP",
"Intro to JavaScript for data scientists"
]
# Embed posts
post_embeddings = [get_embedding(post) for post in posts]
# Define base post
base = "How transformers work in deep learning"
base_vec = get_embedding(base)
# Compute similarity
scores = [dot(base_vec, vec) / (norm(base_vec) * norm(vec)) for vec in post_embeddings]
top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:2]
print("📚 Recommended Posts:")
for i in top_indices:
print("-", posts[i])
Resumen de lo que practicaste
- Creación de embeddings de OpenAI a partir de texto sin procesar
- Comparación de vectores con similitud del coseno
- Construcción de un índice FAISS para búsqueda vectorial local rápida
- Uso de Pinecone para persistir y consultar vectores en la nube
- Creación de recomendaciones prácticas basadas en similitud semántica
Estos ejercicios te han equipado con los flujos de trabajo fundamentales que impulsan asistentes inteligentes, chatbots, sistemas de recomendación y herramientas de búsqueda semántica a escala.
Ejercicios Prácticos — Capítulo 3
Ejercicio 1: Generar Embeddings para una Lista de Textos
Tarea:
Crear embeddings para una lista de descripciones de productos utilizando el modelo text-embedding-3-small
de OpenAI e imprimir la dimensión de cada vector.
Solución:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
products = [
"Eco-friendly water bottle made from recycled plastic",
"Wireless noise-cancelling headphones",
"Ergonomic office chair with lumbar support"
]
embeddings = []
for product in products:
response = openai.Embedding.create(input=product, model="text-embedding-3-small")
vector = response["data"][0]["embedding"]
embeddings.append(vector)
print(f"🔢 Vector length: {len(vector)}")
Ejercicio 2: Calcular la Similitud Entre Dos Textos
Tarea:
Comparar la similitud semántica entre dos reseñas de usuarios utilizando similitud del coseno.
Solución:
from numpy import dot
from numpy.linalg import norm
review_1 = "The delivery was super fast and the packaging was great!"
review_2 = "Shipping was quick and everything arrived safely."
def get_embedding(text):
return openai.Embedding.create(input=text, model="text-embedding-3-small")["data"][0]["embedding"]
vec1 = get_embedding(review_1)
vec2 = get_embedding(review_2)
similarity = dot(vec1, vec2) / (norm(vec1) * norm(vec2))
print("🔗 Semantic Similarity:", round(similarity, 3))
Ejercicio 3: Crear y Consultar un Índice FAISS
Tarea:
Indexar un conjunto de artículos de soporte y buscar el más relevante según una consulta.
Solución:
import faiss
import numpy as np
articles = [
"Resetting your password from the login page",
"Changing your profile photo and bio",
"Canceling your subscription and managing refunds"
]
# Generate embeddings
vectors = [get_embedding(article) for article in articles]
matrix = np.array(vectors).astype("float32")
faiss.normalize_L2(matrix)
# Create FAISS index
index = faiss.IndexFlatIP(len(matrix[0]))
index.add(matrix)
# Query
query = "How do I cancel my membership?"
query_vec = np.array([get_embedding(query)]).astype("float32")
faiss.normalize_L2(query_vec)
# Search
similarities, idxs = index.search(query_vec, k=2)
for i in idxs[0]:
print("📄 Match:", articles[i])
Ejercicio 4: Construir una Aplicación Simple de Búsqueda Semántica con Pinecone
Tarea:
Usar Pinecone para almacenar embeddings y devolver el documento que mejor coincida con una pregunta del usuario.
Solución:
import pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"),
environment=os.getenv("PINECONE_ENV")
)
# Create or connect to index
index_name = "quick-search"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=1536, metric="cosine")
index = pinecone.Index(index_name)
docs = {
"a1": "How to export data from your dashboard",
"a2": "Steps to upgrade your subscription plan",
"a3": "Changing your registered email address"
}
# Insert documents
to_upsert = [
(doc_id, get_embedding(text), {"text": text})
for doc_id, text in docs.items()
]
index.upsert(vectors=to_upsert)
# Search
user_query = "Can I switch to a higher plan?"
query_vec = get_embedding(user_query)
results = index.query(vector=query_vec, top_k=1, include_metadata=True)
print("🔍 Top match:", results["matches"][0]["metadata"]["text"])
Ejercicio 5: Recomendar Entradas de Blog Similares
Tarea:
Usar embeddings para recomendar entradas de blog que estén semánticamente relacionadas con una dada.
Solución:
posts = [
"10 Python tricks you didn’t know",
"Deploying machine learning models with FastAPI",
"Understanding transformer models in NLP",
"Intro to JavaScript for data scientists"
]
# Embed posts
post_embeddings = [get_embedding(post) for post in posts]
# Define base post
base = "How transformers work in deep learning"
base_vec = get_embedding(base)
# Compute similarity
scores = [dot(base_vec, vec) / (norm(base_vec) * norm(vec)) for vec in post_embeddings]
top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:2]
print("📚 Recommended Posts:")
for i in top_indices:
print("-", posts[i])
Resumen de lo que practicaste
- Creación de embeddings de OpenAI a partir de texto sin procesar
- Comparación de vectores con similitud del coseno
- Construcción de un índice FAISS para búsqueda vectorial local rápida
- Uso de Pinecone para persistir y consultar vectores en la nube
- Creación de recomendaciones prácticas basadas en similitud semántica
Estos ejercicios te han equipado con los flujos de trabajo fundamentales que impulsan asistentes inteligentes, chatbots, sistemas de recomendación y herramientas de búsqueda semántica a escala.
Ejercicios Prácticos — Capítulo 3
Ejercicio 1: Generar Embeddings para una Lista de Textos
Tarea:
Crear embeddings para una lista de descripciones de productos utilizando el modelo text-embedding-3-small
de OpenAI e imprimir la dimensión de cada vector.
Solución:
import openai
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
products = [
"Eco-friendly water bottle made from recycled plastic",
"Wireless noise-cancelling headphones",
"Ergonomic office chair with lumbar support"
]
embeddings = []
for product in products:
response = openai.Embedding.create(input=product, model="text-embedding-3-small")
vector = response["data"][0]["embedding"]
embeddings.append(vector)
print(f"🔢 Vector length: {len(vector)}")
Ejercicio 2: Calcular la Similitud Entre Dos Textos
Tarea:
Comparar la similitud semántica entre dos reseñas de usuarios utilizando similitud del coseno.
Solución:
from numpy import dot
from numpy.linalg import norm
review_1 = "The delivery was super fast and the packaging was great!"
review_2 = "Shipping was quick and everything arrived safely."
def get_embedding(text):
return openai.Embedding.create(input=text, model="text-embedding-3-small")["data"][0]["embedding"]
vec1 = get_embedding(review_1)
vec2 = get_embedding(review_2)
similarity = dot(vec1, vec2) / (norm(vec1) * norm(vec2))
print("🔗 Semantic Similarity:", round(similarity, 3))
Ejercicio 3: Crear y Consultar un Índice FAISS
Tarea:
Indexar un conjunto de artículos de soporte y buscar el más relevante según una consulta.
Solución:
import faiss
import numpy as np
articles = [
"Resetting your password from the login page",
"Changing your profile photo and bio",
"Canceling your subscription and managing refunds"
]
# Generate embeddings
vectors = [get_embedding(article) for article in articles]
matrix = np.array(vectors).astype("float32")
faiss.normalize_L2(matrix)
# Create FAISS index
index = faiss.IndexFlatIP(len(matrix[0]))
index.add(matrix)
# Query
query = "How do I cancel my membership?"
query_vec = np.array([get_embedding(query)]).astype("float32")
faiss.normalize_L2(query_vec)
# Search
similarities, idxs = index.search(query_vec, k=2)
for i in idxs[0]:
print("📄 Match:", articles[i])
Ejercicio 4: Construir una Aplicación Simple de Búsqueda Semántica con Pinecone
Tarea:
Usar Pinecone para almacenar embeddings y devolver el documento que mejor coincida con una pregunta del usuario.
Solución:
import pinecone
pinecone.init(
api_key=os.getenv("PINECONE_API_KEY"),
environment=os.getenv("PINECONE_ENV")
)
# Create or connect to index
index_name = "quick-search"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=1536, metric="cosine")
index = pinecone.Index(index_name)
docs = {
"a1": "How to export data from your dashboard",
"a2": "Steps to upgrade your subscription plan",
"a3": "Changing your registered email address"
}
# Insert documents
to_upsert = [
(doc_id, get_embedding(text), {"text": text})
for doc_id, text in docs.items()
]
index.upsert(vectors=to_upsert)
# Search
user_query = "Can I switch to a higher plan?"
query_vec = get_embedding(user_query)
results = index.query(vector=query_vec, top_k=1, include_metadata=True)
print("🔍 Top match:", results["matches"][0]["metadata"]["text"])
Ejercicio 5: Recomendar Entradas de Blog Similares
Tarea:
Usar embeddings para recomendar entradas de blog que estén semánticamente relacionadas con una dada.
Solución:
posts = [
"10 Python tricks you didn’t know",
"Deploying machine learning models with FastAPI",
"Understanding transformer models in NLP",
"Intro to JavaScript for data scientists"
]
# Embed posts
post_embeddings = [get_embedding(post) for post in posts]
# Define base post
base = "How transformers work in deep learning"
base_vec = get_embedding(base)
# Compute similarity
scores = [dot(base_vec, vec) / (norm(base_vec) * norm(vec)) for vec in post_embeddings]
top_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:2]
print("📚 Recommended Posts:")
for i in top_indices:
print("-", posts[i])
Resumen de lo que practicaste
- Creación de embeddings de OpenAI a partir de texto sin procesar
- Comparación de vectores con similitud del coseno
- Construcción de un índice FAISS para búsqueda vectorial local rápida
- Uso de Pinecone para persistir y consultar vectores en la nube
- Creación de recomendaciones prácticas basadas en similitud semántica
Estos ejercicios te han equipado con los flujos de trabajo fundamentales que impulsan asistentes inteligentes, chatbots, sistemas de recomendación y herramientas de búsqueda semántica a escala.