Avanzado 2 min de lectura

Cortex Search: Búsqueda Semántica y RAG

Implementa búsqueda semántica sobre tus datos no estructurados con Cortex Search. Construye aplicaciones RAG (Retrieval-Augmented Generation) en Snowflake.

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.

#cortex-search #rag #embeddings #busqueda-semantica #vectores