Usando file_search con Responses API

Puesto que Responses API es relativamente nueva, ChatGPT aún no ha interiorizado cómo utilizar correctamente file_search. Por este motivo, explicar esta funcionalidad será el objetivo de esta entrada.

Primero que todo, file_search es una herramienta que permite a los modelos buscar información relevante en tus archivos para, posteriormente, generar la respuesta. Evidentemente, para usarla hay que subir el archivo que queremos leer; por tanto, la primera variable a considerar es el formato de este.

Según la documentación oficial, para archivos de texto la codificación debe ser UTF-8, UTF-16 o ASCII. Adicionalmente, las extensiones soportadas que no son de texto vienen dadas por .doc, .docx, .pdf y .pptx. Entonces, supongamos que contamos con un archivo con estas características. Con el objetivo de que nuestro archivo sea leído por file_search, tenemos que llevar a cabo cuatro pasos: crear un vector store, subir el archivo, enlazar el archivo al vector store y realizar la consulta.

Podemos empezar creando el vector store o subiendo el archivo, puesto que el orden entre ambos pasos no es relevante. Para ilustrar la idea, empezaremos con la creación del vector store.

Creando un vector store

Tomando el ejemplo de la documentación, nuestro request viene dado por:

curl https://api.openai.com/v1/vector_stores \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-H "OpenAI-Beta: assistants=v2" \
-d '{
"name": "Support FAQ"
}'

donde $OPENAI_API_KEY es nuestra API key. Una respuesta hipotética viene dada por:

{
  "id": "vs_abc123",
  "object": "vector_store",
  "created_at": 1699061776,
  "name": "Support FAQ",
  "description": "Contains commonly asked questions and answers, organized by topic.",
  "bytes": 139920,
  "file_counts": {
    "in_progress": 0,
    "completed": 3,
    "failed": 0,
    "cancelled": 0,
    "total": 3
  }
}

De aquella respuesta, nos interesa el ID, que en este ejemplo es «vs_abc123». Una vez guardado, el paso siguiente es subir el archivo. Nuevamente, utilizando el ejemplo de la documentación, un request válido podría venir dado por:

curl https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F purpose="fine-tune" \
  -F file="@mydata.jsonl"
  -F expires_after[anchor]="created_at"
  -F expires_after[seconds]=2592000

donde mydata.jsonl es el nombre del archivo local. Una vez enviada esta consulta, la respuesta podría venir dada por:

{
"id": "file-abc123",
"object": "file",
"bytes": 120000,
"created_at": 1677610602,
"expires_at": 1677614202,
"filename": "mydata.jsonl",
"purpose": "fine-tune",
}

De esta respuesta debemos guardar el ID, que en este caso es «file-abc123». Ahora, con el vector_store_id y el file_id en mano, estamos en condiciones de enlazar el archivo a nuestro vector store.

Enlazando el archivo al vector store

Nuevamente, usando el ejemplo de la documentación, un request ejemplo podría ser:

curl https://api.openai.com/v1/vector_stores/vs_abc123/files \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-H "OpenAI-Beta: assistants=v2" \
-d '{
"file_id": "file-abc123"
}'

cuya respuesta vendría dada por:

{
  "id": "file-abc123",
  "object": "vector_store.file",
  "created_at": 1699061776,
  "usage_bytes": 1234,
  "vector_store_id": "vs_abcd",
  "status": "completed",
  "last_error": null
}

En este momento, tenemos todos los ingredientes para consultar nuestro archivo con algún modelo.

Consultando nuestro archivo…

Para consultar el contenido de nuestro archivo, utilizaremos el modelo GPT-5, y Responses API. Una consulta simplificada podría venir dada por la siguiente:

curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-5",
"instructions": "Eres un asistente de la empresa Pülki, y debes responder preguntas sobre ella, y sobre cómo implementar IA en diferentes contextos.",
"input": "¿De qué trata Pülki?.",
"reasoning": { "effort": "low" },
"text": { "verbosity": "low" },
"max_output_tokens": 500,
"tools": [
{
"type": "file_search",
"vector_store_ids": ["'"$VECTOR_STORE_ID"'"],
"max_num_results": 1
}
]
}'

En este request, $VECTOR_STORE_ID contiene el ID del vector store que creamos en el primer apartado. Como podemos ver, no es necesario hacer referencia a ningún file_id. file_search busca automáticamente entre los archivos enlazados con el vector y genera una respuesta en base a ello.

José Miguel Muñoz Urra – jmunozu@pulki.es

Referencias