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

Recuperación

Busca en tus datos mediante similitud semántica.

La API de recuperación te permite realizar búsquedas semánticas en tus datos. Esta técnica encuentra resultados semánticamente similares, incluso cuando coinciden pocas palabras clave o ninguna. La recuperación es útil por sí sola, pero resulta especialmente potente cuando se combina con nuestros modelos para sintetizar respuestas.

Ilustración de la recuperación

La API de recuperación utiliza almacenes vectoriales, que funcionan como índices para tus datos. Esta guía explica cómo realizar búsquedas semánticas y describe en detalle los almacenes vectoriales.

Inicio rápido

  • Crea un almacén vectorial y carga 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 Síntesis de respuestas.

    La búsqueda semántica es una técnica que utiliza embeddings vectoriales para encontrar resultados semánticamente relevantes. Esto incluye resultados con pocas palabras clave en común o ninguna, que las técnicas de búsqueda tradicionales podrían pasar por alto.

    Por ejemplo, veamos algunos resultados posibles para "When did we go to the moon?":

    TextoSimilitud de palabras claveSimilitud semántica
    El primer alunizaje ocurrió en julio de 1969.0 %65 %
    El primer hombre en la Luna fue Neil Armstrong.27 %43 %
    Cuando probé el pastel de luna, me pareció delicioso.40 %28 %

    (La similitud de palabras clave utiliza la intersección sobre unión; la similitud semántica utiliza la similitud del coseno con text-embedding-3-small.)

    Observa cómo el resultado más relevante no contiene ninguna de las palabras de la consulta de búsqueda. Esta flexibilidad convierte la búsqueda semántica en una técnica potente para consultar bases de conocimiento de cualquier tamaño.

    La búsqueda semántica utiliza almacenes vectoriales, que se describen en detalle más adelante en la guía. Esta sección se centra en el funcionamiento de la búsqueda semántica.

    Puedes consultar un almacén vectorial con la función search, especificando una query en lenguaje natural. Esto devolverá una lista de resultados, cada uno con los fragmentos relevantes, las 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, una respuesta contendrá un máximo de 10 resultados, pero puedes configurar hasta 50 con el parámetro max_num_results.

    Reformulación de consultas

    Ciertas formas de redactar las consultas producen mejores resultados, por lo que ofrecemos una opción para reformularlas automáticamente y optimizar su rendimiento. Activa esta función configurando rewrite_query=true al ejecutar search.

    La consulta reformulada estará disponible en el campo search_query del resultado.

    OriginalReformulada
    Me gustaría saber la altura del edificio principal de oficinas.altura del edificio principal de oficinas
    ¿Cuáles son las normas de seguridad para transportar materiales peligrosos?normas de seguridad para materiales peligrosos
    ¿Cómo presento una queja por un problema con el servicio?proceso para presentar una queja sobre el servicio

    Filtrado por atributos

    El filtrado por atributos permite acotar los resultados mediante criterios, como restringir las búsquedas a un intervalo de fechas específico. Puedes definir y combinar criterios en attribute_filter para seleccionar archivos según sus atributos antes de realizar la búsqueda semántica.

    Usa filtros de comparación para comparar una key específica de los attributes de un archivo con un value determinado, y filtros compuestos para combinar varios filtros mediante 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.

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

    Clasificación

    Si los resultados de la búsqueda de archivos no son lo suficientemente relevantes, puedes ajustar ranking_options para mejorar la calidad de las respuestas. Esto incluye especificar un ranker, como auto o default-2024-08-21, y establecer un score_threshold entre 0,0 y 1,0. Un valor más alto de score_threshold limitará los resultados a los fragmentos más relevantes, aunque puede excluir algunos que podrían ser útiles. Cuando se proporciona ranking_options.hybrid_search, también puedes ajustar hybrid_search.embedding_weight (rrf_embedding_weight) y hybrid_search.text_weight (rrf_text_weight) para controlar cómo la fusión de rangos recíprocos equilibra las coincidencias semánticas de embeddings y las coincidencias de palabras clave con representaciones dispersas. Aumenta el primer peso para dar más importancia a la similitud semántica y el segundo para dar más importancia a la coincidencia textual, y asegúrate de que al menos uno de los pesos sea mayor que cero.

    Almacenes vectoriales

    Los almacenes vectoriales son los contenedores que permiten la búsqueda semántica en la API de recuperación y la herramienta de búsqueda de archivos. Cuando agregas un archivo a un almacén vectorial, se divide en fragmentos, se generan sus embeddings y se indexa automáticamente.

    Los almacenes vectoriales contienen objetos vector_store_file, cada uno de los cuales se basa en un objeto file.

    Tipo de objeto
    Descripción
    fileRepresenta contenido cargado mediante la API de archivos. Suele usarse con almacenes vectoriales, pero también para el ajuste fino y otros casos de uso.
    vector_storeContenedor de archivos en los que se pueden realizar búsquedas.
    vector_store.fileTipo contenedor que representa específicamente un file que se ha dividido en fragmentos, para el que se han generado embeddings y que se ha asociado con un vector_store.
    Contiene un mapa attributes que se usa para filtrar.

    Precios

    Se te cobrará según el almacenamiento total utilizado en todos tus almacenes vectoriales, determinado por el tamaño de los fragmentos analizados y sus embeddings correspondientes.

    AlmacenamientoCosto
    Hasta 1 GB (entre todos los almacenes)Gratis
    Más de 1 GB$0,10/GB/día

    Consulta las políticas de vencimiento para conocer las opciones que 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 almacenes vectoriales

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

    La adición de archivos está sujeta a un límite de solicitudes por ID de almacén vectorial. Las solicitudes a /vector_stores/{vector_store_id}/files y /vector_stores/{vector_store_id}/file_batches comparten un límite de 300 solicitudes por minuto por almacén vectorial.

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

    Operaciones por lotes

    Operación de creación de 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",
                    "max_chunk_size_tokens": 1200,
                    "chunk_overlap_tokens": 200
                }
            }
        ]
    )

    Al crear un lote, puedes proporcionar file_ids con attributes y/o chunking_strategy opcionales, o usar el arreglo files para pasar objetos que incluyan un file_id y, de forma opcional, attributes y chunking_strategy para cada archivo. Las dos opciones son mutuamente excluyentes, lo que te permite controlar con claridad si todos los archivos comparten la misma configuración o si necesitas ajustes específicos para cada archivo.

    Para lograr un mayor rendimiento de ingesta en un solo almacén vectorial, recomendamos crear archivos por lotes siempre que sea posible. Los lotes pueden incluir hasta 500 archivos en una sola solicitud, lo que suele reducir la contención y mejorar la latencia de extremo a extremo en comparación con el envío de muchas solicitudes de creación de archivos individuales.

    Atributos

    Cada vector_store.file puede tener un diccionario attributes asociado, cuyos valores se pueden consultar al realizar una búsqueda semántica con filtrado por atributos. El diccionario puede tener un máximo de 16 claves, con un límite de 256 caracteres cada una.

    Crear un archivo en un almacén vectorial con atributos
    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 establecer una política de vencimiento para los objetos vector_store con expires_after. Cuando venza un almacén vectorial, se eliminarán todos los objetos vector_store.file asociados y dejarán de generar cargos.

    Establecer 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 archivo es de 512 MB. Cada archivo debe contener como máximo 5 000 000 de tokens (la cantidad se calcula automáticamente al adjuntar un archivo).

    División en fragmentos

    De forma predeterminada, max_chunk_size_tokens se establece en 800 y chunk_overlap_tokens en 400. Esto significa que cada archivo se indexa dividiéndolo en fragmentos de 800 tokens, con una superposición de 400 tokens entre fragmentos consecutivos.

    Puedes ajustar este comportamiento configurando chunking_strategy al agregar archivos al almacén vectorial. La estrategia tiene ciertas limitaciones:

    • max_chunk_size_tokens debe estar entre 100 y 4096, ambos incluidos.
    • chunk_overlap_tokens debe ser mayor o igual que cero y no debería superar max_chunk_size_tokens / 2.

    Síntesis de respuestas

    Después de realizar una consulta, quizá quieras sintetizar una respuesta a partir de los resultados. Para hacerlo, puedes proporcionar los resultados y la consulta original a nuestros modelos y obtener una respuesta fundamentada en ellos.

    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."

    Este ejemplo usa una función format_results, que podría implementarse de la siguiente manera:

    Función de ejemplo 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.file_name}'>"
            )
            for part in result.content:
                formatted_result += f"<content>{part.text}</content>"
            formatted_results += formatted_result + "</result>"
        return f"<sources>{formatted_results}</sources>"