- Publicado el
Evaluación de la Inserción de Documentos en Fireworks: Fortalezas y Limitaciones en el Análisis de PDFs e Imágenes

Esta publicación evalúa la funcionalidad de inserción de documentos ofrecida por Fireworks, que permite a los usuarios procesar PDFs e imágenes convirtiendo su contenido en un formato consultable. Esta característica facilita la extracción y el análisis de texto y datos estructurados mediante consultas en lenguaje natural impulsadas por modelos de lenguaje grandes (LLMs).
La inserción de documentos aprovecha modelos de texto especializados, permitiendo un razonamiento superior en comparación con los modelos tradicionales de visión y lenguaje (VLMs) en tareas con mucho texto. Al reducir la necesidad de manejo manual de datos, mejora la eficiencia y permite interacciones avanzadas con contenido multimodal. Para esta evaluación, utilicé el modelo Llama (llama-v3p3-70b-instruct) desplegado en Fireworks para explorar su efectividad en tres casos prácticos.
Para más detalles, consulta mi entrada de blog sobre Inserción de Documentos en Fireworks.
Entorno de Evaluación
Para replicar esta evaluación, necesitarás:
- Una clave API de Fireworks AI, ya que la inserción de documentos y la inferencia se realizan a través del proveedor de LLMs de Fireworks.
- Un entorno Python para ejecutar el script.
Script de Python para la Inserción de Documentos
Siguiendo el ejemplo de Fireworks, se desarrolló un script en Python para evaluar las capacidades de inserción de documentos para PDFs e imágenes a través de la API de Fireworks. La API de inserción admite dos métodos de entrada: proporcionar URLs directas a los documentos (PDFs o imágenes) o cargar archivos locales. Para esta evaluación, se decidió utilizar exclusivamente documentos locales, ya que esto se alinea mejor con los casos de uso previstos de manejo de datos privados o fuera de línea.
El script procesa archivos locales codificándolos como URLs Base64, los envía a la API y permite a los usuarios consultar el contenido insertado utilizando prompts en lenguaje natural. Admite múltiples archivos en una sola ejecución y ofrece la opción de especificar un modelo LLM personalizado, con el valor predeterminado establecido en "llama-v3p3-70b-instruct".
Para ejecutar el script, ejecútalo desde la línea de comandos, proporcionando las rutas de los archivos, un prompt de consulta y, opcionalmente, un nombre de modelo. Por ejemplo:
python script_name.py file1.pdf file2.pdf "Tu consulta aquí"
El script completo en Python se proporciona a continuación.
"""
Script para interactuar con la API de Fireworks para procesar archivos y generar respuestas basadas en un prompt proporcionado por el usuario.
Características:
- Admite múltiples tipos de archivos (PDF, PNG, JPG, GIF, TIFF) codificándolos como URLs Base64.
- Envía los archivos y el prompt a la API de Fireworks para su procesamiento.
- Permite especificar un nombre de modelo opcional; por defecto es "llama-v3p3-70b-instruct".
- Imprime la respuesta de la API en un formato estructurado y fácil de leer.
Uso:
python script_name.py <ruta_al_archivo1> [<ruta_al_archivo2> ... <ruta_al_archivoN>] <prompt> [<nombre_del_modelo>]
Requisitos:
- Establecer la variable de entorno FIREWORKS_API_KEY con una clave API válida.
- Instalar la biblioteca requests.
Ejemplo:
python script_name.py sample1.pdf sample2.pdf "Extrae datos de estos documentos." "custom/model/path"
"""
import requests
import json
import os
import sys
import base64
# Obtener la clave API de la variable de entorno
api_key = os.getenv("FIREWORKS_API_KEY")
if not api_key:
print("Error: La variable de entorno FIREWORKS_API_KEY no está configurada.")
sys.exit(1)
# Endpoint de la API
url = "https://api.fireworks.ai/inference/v1/chat/completions"
# Función para codificar un archivo a una URL Base64 según su tipo
def encode_file_to_base64_data_url(file_path):
_, file_extension = os.path.splitext(file_path.lower())
# Determinar el tipo MIME según la extensión del archivo
mime_type = None
if file_extension == ".pdf":
mime_type = "application/pdf"
elif file_extension in [".png"]:
mime_type = "image/png"
elif file_extension in [".jpg", ".jpeg"]:
mime_type = "image/jpeg"
elif file_extension == ".gif":
mime_type = "image/gif"
elif file_extension == ".tiff":
mime_type = "image/tiff"
else:
print(f"Extensión de archivo no soportada: {file_extension}")
sys.exit(1)
# Leer el archivo y codificarlo a Base64
try:
with open(file_path, "rb") as file:
base64_data = base64.b64encode(file.read()).decode("utf-8")
return f"data:{mime_type};base64,{base64_data}#transform=inline"
except FileNotFoundError:
print(f"Error: El archivo '{file_path}' no existe.")
sys.exit(1)
except Exception as e:
print(f"Ocurrió un error al codificar el archivo: {e}")
sys.exit(1)
# Asegurarse de que haya al menos dos argumentos (archivos y prompt)
if len(sys.argv) < 3:
print("Uso: python script_name.py <ruta_al_archivo1> [<ruta_al_archivo2> ... <ruta_al_archivoN>] <prompt> [<nombre_del_modelo>]")
sys.exit(1)
# Separar rutas de archivos, prompt y nombre de modelo opcional
if sys.argv[-1].startswith("accounts/"):
model_name = sys.argv[-1]
prompt = sys.argv[-2]
file_paths = sys.argv[1:-2]
else:
model_name = "accounts/fireworks/models/llama-v3p3-70b-instruct"
prompt = sys.argv[-1]
file_paths = sys.argv[1:-1]
# Validar que se proporcione al menos un archivo
if not file_paths:
print("Error: Se debe especificar al menos un archivo.")
sys.exit(1)
# Imprimir el modelo que se está utilizando
print(f"\nUsando el modelo: {model_name}\n")
# Codificar todos los archivos a URLs Base64
data_urls = []
for file_path in file_paths:
data_urls.append(encode_file_to_base64_data_url(file_path))
# Crear mensajes para cada archivo
file_messages = [
{
"type": "image_url",
"image_url": {
"url": data_url
}
}
for data_url in data_urls
]
# Payload para la solicitud a la API
payload = {
"model": model_name,
"max_tokens": 16384,
"top_p": 1,
"top_k": 40,
"presence_penalty": 0,
"frequency_penalty": 0,
"temperature": 0.6,
"messages": [
{
"role": "user",
"content": file_messages + [
{
"type": "text",
"text": prompt
}
]
}
]
}
# Encabezados para la solicitud a la API
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
try:
# Imprimir el prompt
print("\nPrompt:")
print(f"- {prompt}")
# Imprimir los archivos que se están procesando
print("\nArchivos:")
for file_path in file_paths:
print(f"- {file_path}")
# Realizar la solicitud POST a la API
response = requests.post(url, headers=headers, data=json.dumps(payload))
# Lanzar un HTTPError para respuestas incorrectas (4xx y 5xx)
response.raise_for_status()
# Analizar la respuesta JSON
response_data = response.json()
# Imprimir la salida formateada
print("\nRespuesta de la API:")
print(f"ID: {response_data.get('id')}")
print(f"Modelo: {response_data.get('model')}\n")
# Imprimir el encabezado de las opciones
print("Texto de la Respuesta:")
for choice in response_data.get('choices', []):
print(f"- Razón de Finalización: {choice.get('finish_reason')}")
print(f" Contenido: \n{choice['message']['content']}\n")
# Imprimir detalles de uso
print("Uso:")
usage = response_data.get('usage', {})
print(f"- Tokens de Prompt: {usage.get('prompt_tokens')}")
print(f"- Tokens de Completación: {usage.get('completion_tokens')}")
print(f"- Tokens Totales: {usage.get('total_tokens')}")
except requests.exceptions.RequestException as e:
print(f"Ocurrió un error: {e}")
Casos de Evaluación
Caso 1: Comparación de Dos Documentos PDF
Objetivo: Analizar dos artículos de investigación en formato PDF e identificar puntos clave en común y diferencias.
- Documentos: Dos artículos de investigación almacenados localmente:
- Prompt: Resumir puntos en común y diferencias clave entre los dos artículos.
Ejecución: El script se ejecutó con los dos documentos PDF almacenados localmente y el prompt proporcionado. El comando utilizado fue:
python3 inline_fireworks.py data/2408.02479v1.pdf data/2411.00932v1.pdf "Identifica los títulos de ambos artículos proporcionados y compara su contenido. Resume sus puntos en común y destaca las diferencias clave."
Resultados: Se generó la siguiente salida al ejecutar el script:
Los dos artículos proporcionados son:
1. "From LLMs to LLM-based Agents for Software Engineering: A Survey of Current, Challenges and Future"
2. "LLMs: A Game-Changer for Software Engineers?"
Comparando su contenido, ambos artículos discuten la aplicación de los Modelos de Lenguaje Grandes (LLMs) en la ingeniería de software, destacando su potencial para revolucionar el campo. Exploran las capacidades y limitaciones de los LLMs, así como sus direcciones futuras y desafíos.
**Puntos en común entre los dos artículos incluyen:**
- La discusión sobre la capacidad de los LLMs para automatizar tareas como la generación de código, pruebas y depuración.
- El potencial de los LLMs para mejorar la productividad y calidad del desarrollo de software.
- La necesidad de supervisión humana y revisión del código generado por LLMs para garantizar precisión y seguridad.
- La importancia de abordar preocupaciones éticas, como el sesgo y la propiedad intelectual, en el desarrollo y uso de los LLMs.
**Diferencias clave entre los dos artículos incluyen:**
- El primer artículo se centra específicamente en agentes basados en LLMs, diseñados para trabajar de manera autónoma y tomar decisiones, mientras que el segundo artículo proporciona una visión más general de los LLMs en la ingeniería de software.
- El primer artículo ofrece un análisis detallado de la arquitectura y los puntos de referencia utilizados en los agentes basados en LLMs, mientras que el segundo artículo discute las fortalezas técnicas y beneficios de los LLMs en la ingeniería de software, así como sus desafíos y direcciones futuras.
- El primer artículo está más enfocado en los aspectos académicos y de investigación de los agentes basados en LLMs, mientras que el segundo artículo está más orientado a profesionales y la industria, proporcionando una perspectiva más práctica sobre la adopción y uso de los LLMs en la ingeniería de software.
En general, ambos artículos contribuyen al creciente cuerpo de investigación sobre los LLMs en la ingeniería de software, destacando su potencial para transformar el campo y mejorar las prácticas de desarrollo de software. Sin embargo, abordan el tema desde diferentes ángulos, con el primer artículo centrándose en los aspectos técnicos de los agentes basados en LLMs y el segundo artículo proporcionando una visión más general y práctica de los LLMs en la ingeniería de software.
Evaluación: El modelo identificó efectivamente los títulos de ambos artículos y extrajo comparaciones detalladas de su contenido. Los resultados demostraron una buena comprensión de los temas, destacando puntos en común y diferencias de manera exhaustiva. Este caso muestra la capacidad de Fireworks para analizar texto estructurado y proporcionar comparaciones perspicaces. Sin embargo, pequeñas mejoras en la redacción de los puntos en común y diferencias podrían mejorar aún más la legibilidad y claridad.
Caso 2: OCR de Imágenes de Documentos
Objetivo: Realizar OCR en dos imágenes de documentos locales en una sola llamada, extrayendo su contenido y analizando las diferencias de palabras.
La evaluación se realizó utilizando dos imágenes de documentos almacenadas localmente, mostradas a continuación:

Figura 1: Primera imagen de documento utilizada para el análisis de OCR.

Figura 2: Segunda imagen de documento utilizada para el análisis de OCR.
Ejecución: El script se ejecutó con los dos archivos de imagen locales y el prompt proporcionado. El comando utilizado fue:
python3 inline_fireworks.py data/example_01_mistral_exec_01.png data/example_01_mistral_exec_02.png "Identifica palabras comunes y únicas en los dos archivos proporcionados."
Resultados: Se generó la siguiente salida al ejecutar el script:
Para identificar las palabras comunes y únicas en los dos archivos proporcionados, analicemos las listas de Modelos de Lenguaje Grandes (LLMs) mencionados:
### Primer Archivo:
1. Mistral
2. ChatGPT
3. Clude LLaMA
4. Gemini
5. Falcon
### Segundo Archivo:
1. Mistral
2. Mistral
3. ChatGPT
4. CLaude
5. LLaMA
6. Gemini/Falcon
### Palabras Comunes:
- **Mistral**: Aparece en ambos archivos.
- **ChatGPT**: Aparece en ambos archivos.
- **Gemini** y **Falcon**: Aunque se presentan como una sola entidad en el segundo archivo (Gemini/Falcon), se enumeran individualmente en el primer archivo. Considerando la intención, pueden considerarse comunes, aunque se presenten de manera diferente.
- **LLaMA**: Aparece en el primer archivo como parte de "Clude LLaMA" y por separado en el segundo archivo. Asumiendo que "Clude LLaMA" se refiere al mismo modelo que "LLaMA" en el contexto de estas listas, LLaMA puede considerarse común.
### Palabras Únicas:
- **Clude**: Parece ser un error tipográfico o una variación en el primer archivo ("Clude LLaMA") y se presenta como "CLaude" en el segundo archivo. Si "CLaude" se considera un modelo distinto de "Clude LLaMA", entonces "CLaude" es único en el segundo archivo.
Corrigiendo el aparente error tipográfico y considerando la intención detrás de la nomenclatura:
- "Clude LLaMA" en el primer archivo probablemente se refiere a "CLaude" y "LLaMA" como entidades separadas, haciendo que "CLaude" sea una mención única en el segundo archivo en comparación con la lista del primer archivo.
- "LLaMA" es común, dado que es parte de "Clude LLaMA" en el primer archivo y se enumera por separado en el segundo.
Por lo tanto, la palabra única, considerando correcciones para errores tipográficos e intención, sería "CLaude", ya que se enumera explícitamente de esa manera solo en el segundo archivo, y hay una duplicación de "Mistral" en el segundo archivo que no está presente en el primero.
Evaluación: El proceso de OCR fue efectivo, capturando información clave y distinguiendo entre palabras comunes y únicas con precisión.
Caso 3: Consulta de una Imagen de Horario de Autobuses
Objetivo: Hacer preguntas sobre una imagen que contiene un horario de autobuses extraído de aquí.
La evaluación se realizó utilizando una imagen local de un horario de autobuses, mostrada a continuación:

Figura 3: La imagen del horario de autobuses utilizada para la consulta.
- Documento: Una imagen local de un horario de autobuses.
- Prompt: Una pregunta sobre los horarios de salida desde una parada de autobús en el horario de lunes a viernes.
Ejecución: El script se ejecutó con el archivo de imagen local y el prompt proporcionado. El comando utilizado fue:
python3 inline_fireworks.py data/whitsunday_bus_timetable.jpg "Basado en la imagen adjunta, dame los horarios de salida en Flametree de lunes a viernes. Simplemente responde No lo sé si no puedes encontrarlos en la imagen adjunta."
Resultados: Se generó la siguiente salida al ejecutar el script:
No lo sé.
Para evaluar aún más el rendimiento, el script se ejecutó utilizando el modelo qwen2p5-72b-instruct con el siguiente comando:
python3 inline_fireworks.py data/whitsunday_bus_timetable.jpg "Basado en la imagen adjunta, dame los horarios de salida desde Flametree de lunes a viernes. Simplemente responde No lo sé si no puedes encontrarlos en la imagen adjunta." accounts/fireworks/models/qwen2p5-72b-instruct
La salida permaneció igual, lo que indica que el problema radica en la integración de OCR con el contexto en lugar del modelo específico utilizado.
Evaluación:
Este caso resalta una limitación en el procesamiento de datos tabulares dentro de imágenes. La respuesta consistente de 'No lo sé' en ambos modelos sugiere que el problema puede provenir del proceso de inserción o de las capacidades de extracción de datos del OCR. Abordar estas áreas podría mejorar el manejo de Fireworks de formatos estructurados en imágenes como horarios.
Conclusión
La funcionalidad de inserción de documentos en Fireworks demuestra un fuerte potencial para analizar y consultar PDFs e imágenes, ofreciendo beneficios notables de productividad para tareas que involucran extracción y análisis de texto. La evaluación mostró un rendimiento efectivo en el procesamiento y comparación de texto de documentos PDF (Caso 1) y la extracción de contenido de imágenes de documentos (Caso 2), identificando detalles clave y generando resultados significativos.
Sin embargo, se evidenciaron limitaciones en la interpretación de formatos de datos estructurados como horarios dentro de imágenes (Caso 3), donde el modelo no logró extraer información relevante de manera consistente, probablemente debido a desafíos en el análisis durante el proceso de inserción o en el OCR. Estos resultados sugieren que, aunque Fireworks es una herramienta valiosa para texto no estructurado y semiestructurado, sus capacidades en el manejo de formatos estructurados como tablas requieren un mayor desarrollo. Mejorar estos aspectos ampliaría significativamente su utilidad en aplicaciones del mundo real.
¿Disfrutaste esta publicación? ¿Te resultó útil? No dudes en dejar un comentario a continuación para compartir tus pensamientos o hacer preguntas. Se requiere una cuenta de GitHub para unirse a la discusión.
Sigue leyendo
Posts relacionados
Jun 17, 2025
0ComentariosPresentamos Codestral Embed: El Nuevo Modelo de Embedding de Código de Última Generación de Mistral AI
Análisis de Codestral Embed de Mistral AI, un nuevo modelo de embedding de última generación especializado en código, detallando su rendimiento, flexibilidad, casos de uso clave como RAG y búsqueda semántica, y disponibilidad.
Apr 8, 2025
0ComentariosManus AI Bajo el Microscopio: ¿Puede Este Agente Autónomo Ofrecer Investigación Real? (¿Y Vale la Pena el Costo?)
Esta publicación describe nuestra evaluación en el mundo real de Manus AI utilizando un plan gratuito de 1000 créditos para generar un informe de investigación integral de la industria sobre Robot Framework. Exploramos la calidad del informe, el uso de tokens, el tiempo de entrega y la viabilidad práctica de Manus AI para tareas de investigación.
Mar 15, 2025
0ComentariosDeepSeek R2: El Modelo de IA que Revolucionará la Industria
DeepSeek está acelerando el lanzamiento de su modelo R2, prometiendo avances revolucionarios en razonamiento de IA, codificación y capacidades multilingües. Con un enfoque en la eficiencia de costos y la innovación de código abierto, R2 podría desafiar a gigantes de la IA occidentales como OpenAI y Anthropic.