For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Recuperación de información

Busca en tus datos mediante la similitud semántica.

La API de recuperación te permite realizar búsquedas semánticas en tus datos. Esta técnica encuentra resultados con un significado similar al de la consulta, incluso cuando comparten pocas palabras clave o ninguna. La recuperación de información es útil por sí sola y resulta especialmente eficaz cuando la combinas con nuestros modelos para sintetizar respuestas.

Ilustración del proceso de recuperación de información

La API de recuperación utiliza almacenes vectoriales que sirven como índices de tus datos. En esta guía aprenderás a realizar búsquedas semánticas y conocerás en detalle cómo funcionan los almacenes vectoriales.

Inicio rápido

  • Crea un almacén vectorial y sube archivos.

  • Crear un almacén vectorial con archivos
    from openai import OpenAI
    
    client = OpenAI()
    
    vector_store = client.vector_stores.create(        # Create vector store
        name="Support FAQ",
    )
    
    client.vector_stores.files.upload_and_poll(        # Upload file
        vector_store_id=vector_store.id,
        file=open("customer_policies.txt", "rb")
    )
  • Envía una consulta de búsqueda para obtener resultados relevantes.

  • Consulta de búsqueda
    user_query = "What is the return policy?"
    
    results = client.vector_stores.search(
        vector_store_id=vector_store.id,
        query=user_query,
    )

    Para aprender a usar los resultados con nuestros modelos, consulta la sección sobre la síntesis de respuestas.

    Búsqueda semántica

    La búsqueda semántica utiliza representaciones vectoriales para encontrar resultados relevantes por su significado. Así puede encontrar resultados que comparten pocas palabras clave con la consulta o ninguna, y que las técnicas de búsqueda tradicionales podrían pasar por alto.

    Por ejemplo, la consulta "When did we go to the moon?" (“¿Cuándo fuimos a la Luna?”) podría devolver los siguientes resultados. Ambos porcentajes de similitud se calculan al comparar la consulta en inglés con el texto original en inglés de cada resultado.

    Texto original y traducción Similitud de palabras clave Similitud semántica
    The first lunar landing occurred in July of 1969. (El primer alunizaje ocurrió en julio de 1969.) 0 % 65 %
    The first man on the moon was Neil Armstrong. (El primer hombre en la Luna fue Neil Armstrong.) 27 % 43 %
    When I ate the moon cake, it was delicious. (Cuando probé el pastel de luna, me pareció delicioso.) 40 % 28 %

    (La similitud de palabras clave se calcula mediante el cociente entre la intersección y la unión. Para la similitud semántica se usa la similitud del coseno con text-embedding-3-small.)

    Observa que el resultado más relevante obtiene un 0 % de similitud de palabras clave con la consulta. Gracias a esta flexibilidad, la búsqueda semántica es una técnica eficaz para consultar bases de conocimiento de cualquier tamaño.

    La búsqueda semántica utiliza almacenes vectoriales, que veremos en detalle más adelante. Esta sección se centra en cómo funciona la búsqueda semántica.

    Cómo realizar una búsqueda semántica

    Para consultar un almacén vectorial, usa la función search y especifica la consulta en lenguaje natural en el parámetro query. Obtendrás una lista de resultados. Cada resultado incluye los fragmentos relevantes, sus puntuaciones de similitud y el archivo de origen.

    Consulta de búsqueda
    results = client.vector_stores.search(
        vector_store_id=vector_store.id,
        query="How many woodchucks are allowed per passenger?",
    )
    Resultados
    {
      "object": "vector_store.search_results.page",
      "search_query": "How many woodchucks are allowed per passenger?",
      "data": [
        {
          "file_id": "file-12345",
          "filename": "woodchuck_policy.txt",
          "score": 0.85,
          "attributes": {
            "region": "North America",
            "author": "Wildlife Department"
          },
          "content": [
            {
              "type": "text",
              "text": "According to the latest regulations, each passenger is allowed to carry up to two woodchucks."
            },
            {
              "type": "text",
              "text": "Ensure that the woodchucks are properly contained during transport."
            }
          ]
        },
        {
          "file_id": "file-67890",
          "filename": "transport_guidelines.txt",
          "score": 0.75,
          "attributes": {
            "region": "North America",
            "author": "Transport Authority"
          },
          "content": [
            {
              "type": "text",
              "text": "Passengers must adhere to the guidelines set forth by the Transport Authority regarding the transport of woodchucks."
            }
          ]
        }
      ],
      "has_more": false,
      "next_page": null
    }

    De forma predeterminada, cada respuesta contiene un máximo de 10 resultados. Puedes aumentar el máximo hasta 50 con el parámetro max_num_results.

    Reescritura de consultas

    Algunas formas de redactar una consulta dan mejores resultados. Por eso, puedes activar una opción que reescribe tus consultas automáticamente para optimizar el rendimiento. Para activarla, establece rewrite_query=true al realizar una búsqueda con search.

    Encontrarás la consulta reescrita en el campo search_query del resultado.

    Consulta original Consulta reescrita
    Me gustaría saber cuánto mide el edificio principal de oficinas. altura del edificio principal de oficinas
    ¿Qué normas de seguridad se aplican al transporte de materiales peligrosos? normas de seguridad para materiales peligrosos
    ¿Cómo presento una queja por un problema con el servicio? procedimiento para presentar quejas sobre el servicio

    Filtrado por atributos

    El filtrado por atributos te permite acotar los resultados con criterios como un intervalo de fechas. Antes de realizar la búsqueda semántica, puedes definir y combinar criterios en filters para seleccionar archivos según sus atributos.

    Usa filtros de comparación para comparar el valor de una clave (key) de los attributes de un archivo con el valor indicado en value. Usa filtros compuestos para combinar varios filtros con and y or.

    Filtro de comparación
    {
      "type": "eq" | "ne" | "gt" | "gte" | "lt" | "lte" | "in" | "nin",  // comparison operators
      "key": "attributes_key",                           // attributes key
      "value": "target_value"                             // value to compare against
    }
    Filtro compuesto
    {
      "type": "and" | "or",                                // logical operators
      "filters": [...]
    }

    A continuación se muestran algunos ejemplos de filtros.

    Los ejemplos que filtran por nombre de archivo buscan coincidencias con un atributo personalizado llamado filename. Debes definirlo explícitamente en cada archivo del almacén vectorial, por ejemplo, {"filename": "example.txt"}. Estos filtros no usan automáticamente el nombre del archivo que subiste.

    Filtrar por región
    {
      "type": "eq",
      "key": "region",
      "value": "us"
    }

    Clasificación de resultados

    Si los resultados de la búsqueda de archivos no son lo bastante relevantes, puedes ajustar ranking_options para mejorar la calidad de las respuestas. Puedes especificar un método de clasificación en ranker, como auto o default-2024-08-21, y establecer un umbral de puntuación (score_threshold) entre 0,0 y 1,0. Un score_threshold más alto limita los resultados a los fragmentos más relevantes, aunque puede excluir algunos que podrían ser útiles. Si especificas ranking_options.hybrid_search, también puedes ajustar hybrid_search.embedding_weight (rrf_embedding_weight) y hybrid_search.text_weight (rrf_text_weight). Estos pesos controlan cómo la fusión de rangos recíprocos combina las coincidencias semánticas entre representaciones vectoriales con las coincidencias por palabras clave de la búsqueda dispersa. Aumenta el primer peso para dar más importancia a la similitud semántica o el segundo para dar más importancia a las coincidencias de texto. Asegúrate de que al menos uno de los pesos sea mayor que cero.

    Almacenes vectoriales

    Los almacenes vectoriales son los contenedores que permiten realizar búsquedas semánticas con la API de recuperación y la herramienta de búsqueda de archivos. Cuando agregas un archivo a un almacén vectorial, el sistema lo divide en fragmentos, genera sus representaciones vectoriales y los indexa automáticamente.

    Los almacenes vectoriales contienen objetos vector_store_file, cada uno respaldado por un objeto file.

    Tipo de objeto
    Descripción
    file Representa el contenido que subes mediante la API de archivos. Suele usarse con almacenes vectoriales, aunque también se usa para el ajuste fino y otros fines.
    vector_store Contenedor de archivos en los que puedes realizar búsquedas.
    vector_store.file Tipo contenedor que representa un objeto file dividido en fragmentos. Cada fragmento tiene una representación vectorial y el archivo está asociado a un vector_store.
    Contiene un mapa de attributes que se usa para filtrar.

    Precios

    El costo depende del espacio total que ocupan todos tus almacenes vectoriales. Se calcula a partir del tamaño de los fragmentos obtenidos al procesar los archivos y de sus representaciones vectoriales.

    Almacenamiento Costo
    Hasta 1 GB (entre todos los almacenes) Gratis
    Por encima de 1 GB USD 0,10 por GB al día

    Consulta las políticas de vencimiento para conocer las opciones que te permiten minimizar los costos.

    Operaciones con almacenes vectoriales

    Crear un almacén vectorial
    client.vector_stores.create(
        name="Support FAQ",
        file_ids=["file_123"]
    )

    Operaciones con archivos de un almacén vectorial

    Algunas operaciones, como create para vector_store.file, son asíncronas y pueden tardar en completarse. Usa una de nuestras funciones auxiliares, como create_and_poll, para que la ejecución espere hasta que termine la operación. También puedes consultar el estado de la operación. La eliminación de archivos de un almacén vectorial sigue un modelo de consistencia eventual, por lo que los resultados de búsqueda pueden seguir incluyendo contenido de un archivo eliminado durante un breve período.

    Las operaciones para agregar archivos tienen un límite de solicitudes por ID de almacén vectorial. Las solicitudes a /vector_stores/{vector_store_id}/files y a /vector_stores/{vector_store_id}/file_batches comparten un límite de 300 solicitudes por minuto por almacén vectorial.

    Crear un archivo en un almacén vectorial
    client.vector_stores.files.create_and_poll(
        vector_store_id="vs_123",
        file_id="file_123"
    )

    Operaciones por lotes

    Crear un lote
    client.vector_stores.file_batches.create_and_poll(
        vector_store_id="vs_123",
        files=[
            {
                "file_id": "file_123",
                "attributes": {"department": "finance"}
            },
            {
                "file_id": "file_456",
                "chunking_strategy": {
                    "type": "static",
                    "static": {
                        "max_chunk_size_tokens": 1200,
                        "chunk_overlap_tokens": 200
                    }
                }
            }
        ]
    )

    Al crear un lote, puedes proporcionar file_ids y, si lo necesitas, attributes, chunking_strategy o ambos. También puedes usar el arreglo files para pasar un objeto por archivo con un file_id y los campos opcionales attributes y chunking_strategy. Las dos opciones son mutuamente excluyentes. La primera te permite usar la misma configuración para todos los archivos y la segunda te permite ajustarla para cada uno.

    Para mejorar el rendimiento al incorporar archivos a un mismo almacén vectorial, te recomendamos crearlos por lotes siempre que sea posible. Un lote puede incluir hasta 500 archivos en una sola solicitud. En comparación con el envío de muchas solicitudes de creación de un solo archivo, esto suele reducir la contención y mejorar la latencia de extremo a extremo.

    Atributos

    Cada vector_store.file puede tener un diccionario de valores asociado llamado attributes. Puedes consultar esos valores al realizar una búsqueda semántica con filtrado por atributos. El diccionario admite hasta 16 claves de un máximo de 256 caracteres cada una.

    Crear un archivo con atributos en un almacén vectorial
    client.vector_stores.files.create(
        vector_store_id="<vector_store_id>",
        file_id="file_123",
        attributes={
            "region": "US",
            "category": "Marketing",
            "date": 1672531200      # Jan 1, 2023
        }
    )

    Políticas de vencimiento

    Puedes definir una política de vencimiento para los objetos vector_store con expires_after. Cuando vence un almacén vectorial, se eliminan todos los objetos vector_store.file asociados y dejas de pagar por ellos.

    Definir una política de vencimiento para un almacén vectorial
    client.vector_stores.update(
        vector_store_id="vs_123",
        expires_after={
            "anchor": "last_active_at",
            "days": 7
        }
    )

    Límites

    El tamaño máximo de cada archivo es de 512 MB. Cada archivo debe contener como máximo 5 000 000 de tokens. El recuento se calcula automáticamente cuando adjuntas el archivo.

    División en fragmentos

    De forma predeterminada, max_chunk_size_tokens tiene el valor 800 y chunk_overlap_tokens tiene el valor 400. Para indexar cada archivo, el sistema lo divide en fragmentos de 800 tokens. Dos fragmentos consecutivos comparten 400 tokens.

    Puedes cambiar esta configuración mediante chunking_strategy al agregar archivos al almacén vectorial. La estrategia tiene los siguientes límites:

    • max_chunk_size_tokens debe estar entre 100 y 4096, ambos inclusive.
    • chunk_overlap_tokens debe ser mayor o igual que cero y se recomienda que no supere max_chunk_size_tokens / 2.

    Síntesis de respuestas

    Después de realizar una consulta, puedes usar nuestros modelos para sintetizar una respuesta a partir de los resultados. Proporciona al modelo los resultados y la consulta original para obtener una respuesta fundamentada en esos resultados.

    Realizar una consulta de búsqueda para obtener resultados
    from openai import OpenAI
    
    client = OpenAI()
    
    user_query = "What is the return policy?"
    
    results = client.vector_stores.search(
        vector_store_id=vector_store.id,
        query=user_query,
    )
    Sintetizar una respuesta a partir de los resultados
    # Use results and user_query from the preceding search step.
    formatted_results = format_results(results.data)
    
    "\n".join("\n".join(c.text for c in result.content) for result in results.data)
    
    completion = client.chat.completions.create(
        model="gpt-6-astra",
        messages=[
            {
                "role": "developer",
                "content": "Produce a concise answer to the query based on the provided sources.",
            },
            {
                "role": "user",
                "content": f"Sources: {formatted_results}\n\nQuery: '{user_query}'",
            },
        ],
    )
    
    print(completion.choices[0].message.content)
    "Our return policy allows returns within 30 days of purchase."

    El ejemplo usa la función format_results, que puedes implementar así:

    Ejemplo de función para dar formato a los resultados
    def format_results(results):
        formatted_results = ""
        for result in results.data:
            formatted_result = (
                f"<result file_id='{result.file_id}' file_name='{result.filename}'>"
            )
            for part in result.content:
                formatted_result += f"<content>{part.text}</content>"
            formatted_results += formatted_result + "</result>"
        return f"<sources>{formatted_results}</sources>"