FinWise es una aplicacion para analizar documentos financieros en PDF con un flujo RAG. El proyecto combina un backend en FastAPI con un frontend en Gradio para subir archivos, cargarlos al sistema, consultarlos en lenguaje natural y obtener respuestas con sus fuentes.
- Backend API en FastAPI funcional.
- Frontend en Gradio operativo en
app/app.py. - Carga de multiples PDFs al directorio
uploads/. - Procesamiento de PDFs con
PyPDFLoadery fragmentacion conRecursiveCharacterTextSplitter. - Indexacion semantica en memoria con FAISS y embeddings de OpenAI.
- Consulta de documentos con un flujo RAG y devolucion de fuentes.
- Preguntas sugeridas y botones de analisis rapido en la interfaz.
- Formato fijo de respuesta para todo el chat con secciones de resumen, hallazgos, riesgos y fuentes.
- Reinicio del estado documental mediante eliminacion de archivos y limpieza del vector store.
- FastAPI
- Gradio
- LangChain
- OpenAI
- FAISS
- PyPDF
- Python dotenv
app/
|-- app.py # Frontend en Gradio
|-- main.py # App FastAPI y ciclo de vida del backend
|-- core/
| |-- config.py
| `-- constants.py
|-- models/
| `-- schemas.py # Modelos de request y response
|-- routers/
| |-- upload.py # Endpoints de carga, listado y limpieza de archivos
| |-- index.py # POST /index/
| `-- query.py # POST /query/
`-- services/
|-- processor.py # Carga y fragmentacion de PDFs
`-- vector_store.py # Gestion del indice FAISS
- El usuario sube uno o varios PDF a
/upload/. - El backend guarda los archivos en
uploads/. - Se llama
/index/para cargar, dividir e indexar los documentos. - El usuario consulta
/query/con una pregunta libre o dispara un analisis rapido desde la interfaz. - El sistema recupera contexto relevante y genera una respuesta en formato fijo con sus fuentes.
- Si hace falta reiniciar la sesion documental, se pueden listar o eliminar archivos desde los endpoints de
upload.
Una vez que los archivos han sido cargados al chat, la interfaz de Gradio permite:
- Hacer preguntas libres en lenguaje natural.
- Lanzar analisis rapidos desde botones predefinidos.
- Usar preguntas sugeridas como punto de partida para explorar el contenido.
- Recibir respuestas con una estructura fija para facilitar la lectura.
Los analisis rapidos incluidos actualmente son:
Resumen ejecutivoHallazgos claveRiesgos y alertasMetricas financierasGuidance y outlook
El formato de respuesta del asistente sigue esta estructura:
Resumen ejecutivoHallazgos claveRiesgos o alertasFuentes
| Metodo | Ruta | Descripcion |
|---|---|---|
| POST | /upload/ |
Recibe y guarda uno o varios archivos PDF |
| GET | /upload/files |
Devuelve la lista de archivos subidos actualmente |
| DELETE | /upload/delete |
Elimina todos los archivos subidos y reinicia el vector store |
| POST | /index/ |
Procesa los PDFs guardados y construye el indice FAISS |
| POST | /query/ |
Responde preguntas usando los documentos cargados |
Crea un archivo .env a partir de .env.example:
OPENAI_API_KEY=sk-...pip install -r requirements.txtuvicorn app.main:app --reloadDocumentacion interactiva:
http://localhost:8000/docs
Con el backend corriendo, abre otra terminal y ejecuta:
python app/app.pyLa interfaz de Gradio te permite:
- Subir archivos PDF.
- Cargar los archivos al chat.
- Hacer preguntas libres sobre el contenido.
- Usar preguntas sugeridas y botones de analisis rapido.
- Ver respuestas en formato fijo con fuentes.
- Limpiar la conversacion sin tocar los archivos ya cargados.
- El indice FAISS vive en memoria y se reinicia cuando el servidor se apaga.
app.state.vector_storecomparte la instancia del vector store entre los routers.- La logica de consulta al LLM esta actualmente dentro de
app/routers/query.py. - El formato fijo de las respuestas se controla desde el prompt del endpoint
POST /query/. - El endpoint
DELETE /upload/deletetambien reinicia el vector store para dejar la sesion limpia.