¿Qué es Cortex Search?
Cortex Search es un servicio de búsqueda semántica sobre texto que usa embeddings vectoriales. A diferencia de la búsqueda por palabras clave, encuentra contenido por significado, no por coincidencia exacta.
Búsqueda por palabras clave: “manual servicio” → solo encuentra documentos con esas palabras Búsqueda semántica: “cómo configurar el producto” → encuentra documentos sobre instalación, configuración, setup, aunque no usen esas palabras exactas
Crear un Cortex Search Service
-- Preparar los datos
CREATE TABLE documentos_soporte (
doc_id NUMBER,
titulo TEXT,
contenido TEXT,
categoria TEXT,
fecha_actualizacion DATE
);
-- Crear el servicio de búsqueda
CREATE CORTEX SEARCH SERVICE busqueda_soporte
ON documentos_soporte
ATTRIBUTES categoria, fecha_actualizacion -- filtros disponibles
TARGET_LAG = '1 hour'
WAREHOUSE = mi_wh
AS (
SELECT doc_id, titulo, contenido, categoria, fecha_actualizacion
FROM documentos_soporte
);
Hacer búsquedas
# Via Python con el SDK de Cortex Search
from snowflake.core import Root
root = Root(session)
search_service = (
root.databases["MI_BD"]
.schemas["MI_SCHEMA"]
.cortex_search_services["BUSQUEDA_SOPORTE"]
)
resultado = search_service.search(
query="el sistema no arranca después de la actualización",
columns=["titulo", "contenido", "categoria"],
filter={"@eq": {"categoria": "Soporte Técnico"}},
limit=5
)
for doc in resultado.results:
print(doc["titulo"])
print(doc["contenido"][:200])
print("---")
Patrón RAG (Retrieval-Augmented Generation)
RAG combina búsqueda + generación: primero recupera contexto relevante, luego genera una respuesta con ese contexto.
def responder_pregunta(pregunta: str, session) -> str:
# 1. Recuperar documentos relevantes
docs = search_service.search(
query=pregunta,
columns=["titulo", "contenido"],
limit=3
)
# 2. Construir el contexto
contexto = "\n\n".join([
f"DOCUMENTO: {d['titulo']}\n{d['contenido']}"
for d in docs.results
])
# 3. Generar respuesta con el LLM
prompt = f"""Eres un agente de soporte. Usa solo la información del contexto.
CONTEXTO:
{contexto}
PREGUNTA: {pregunta}
RESPUESTA:"""
from snowflake.cortex import Complete
return Complete("llama3.3-70b", prompt)
Caso de uso: Chatbot de documentación
import streamlit as st
from snowflake.snowpark.context import get_active_session
session = get_active_session()
root = Root(session)
search_svc = root.databases["MI_BD"].schemas["PUBLIC"].cortex_search_services["BUSQUEDA_DOCS"]
st.title("Asistente de Documentación")
if "messages" not in st.session_state:
st.session_state.messages = []
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.write(msg["content"])
if pregunta := st.chat_input("¿Cómo puedo ayudarte?"):
st.session_state.messages.append({"role": "user", "content": pregunta})
# Buscar contexto
resultados = search_svc.search(query=pregunta, columns=["contenido"], limit=3)
contexto = "\n".join([r["contenido"] for r in resultados.results])
# Generar respuesta
from snowflake.cortex import Complete
respuesta = Complete("mistral-large2",
f"Contexto: {contexto}\n\nPregunta: {pregunta}\n\nRespuesta:")
st.session_state.messages.append({"role": "assistant", "content": respuesta})
st.rerun()
Próximos pasos
En la siguiente lección vemos Cortex Agents para workflows más complejos que van más allá de una sola búsqueda.