Menu iconMenu icon
OpenAI API Biblia Volumen 2

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.