CFAAgent es un sistema multi-agente avanzado especializado en finanzas, diseñado para asistir en el estudio del programa CFA (Chartered Financial Analyst). Implementa una arquitectura empresarial basada en microservicios con clasificación inteligente y RAG optimizado.
- 8 Agentes Especializados:
- 🏦 Agente de Renta Fija (6 herramientas CFA Level I)
- 💼 Agente de Finanzas Corporativas (5 herramientas)
- 📈 Agente de Equity (Gordon Growth Model)
- 📊 Agente de Gestión de Portafolios (7 herramientas)
- 📉 Agente de Derivados (3 herramientas Black-Scholes)
- 📚 Agente RAG (búsqueda en microservicio)
- ℹ️ Agente de Ayuda
- ✍️ Agente de Síntesis
- Clasificación en 3 categorías: TEORICA / PRACTICA / AYUDA
- Optimización de queries para búsqueda vectorial
- Traducción automática al inglés para queries teóricas
- ~0.5s de latencia por clasificación
- Búsqueda multi-query paralela con timeout
- Índice inverso O(1) para términos técnicos
- Deduplicación robusta con SHA256
- Elasticsearch Cloud como vector store
- Cadena de fallback: Claude → OpenAI → Gemini
- Alta disponibilidad (~99.9%)
- Ping tests automáticos
- Degradación gradual
graph TB
User[👤 Usuario Streamlit] -->|Query| Supervisor[🧠 Supervisor LLM]
Supervisor -->|Clasificación| Decision{Categoría?}
Decision -->|TEORICA| OptimizeQ[📝 Optimiza Query<br/>Español → Inglés<br/>+ Términos CFA]
Decision -->|PRACTICA| Router[🔀 Router Especialista]
Decision -->|AYUDA| Help[ℹ️ Agente Ayuda]
OptimizeQ -->|Query Optimizada| RAG[📚 Agente RAG]
RAG -->|HTTP POST| Microservice[☁️ Microservicio RAG<br/>Google Cloud Run]
Microservice -->|Multi-Query| Parallel{Búsqueda Paralela}
Parallel -->|Variación 1| ES1[(🔍 Elasticsearch<br/>Query Original)]
Parallel -->|Variación 2| ES2[(🔍 Elasticsearch<br/>Query Enriquecida)]
Parallel -->|Variación 3| ES3[(🔍 Elasticsearch<br/>Keywords)]
ES1 --> Dedupe[🔗 Deduplicación SHA256]
ES2 --> Dedupe
ES3 --> Dedupe
Dedupe -->|Top 4-6 Docs| Format[📄 Formateo]
Format -->|Contexto| RAG
Router -->|VAN, TIR, etc.| FinCorp[💼 Agente Fin. Corp.]
Router -->|CAPM, Sharpe| Port[📊 Agente Portafolio]
Router -->|Bonos, Duration| RF[🏦 Agente Renta Fija]
Router -->|Options, B-S| Deriv[📉 Agente Derivados]
Router -->|Gordon Growth| Equity[📈 Agente Equity]
FinCorp -->|22 Tools| Calc[🧮 Herramientas CFA<br/>numpy-financial]
Port --> Calc
RF --> Calc
Deriv --> Calc
Equity --> Calc
Calc -->|Resultado| Response[✅ Respuesta Usuario]
RAG -->|Contexto| Response
Help -->|Guía| Response
Response --> PG[(🗄️ PostgreSQL<br/>Checkpoints)]
style Microservice fill:#e1f5ff
style ES1 fill:#fff4e1
style ES2 fill:#fff4e1
style ES3 fill:#fff4e1
style PG fill:#e8f5e9
style Supervisor fill:#f3e5f5
style Decision fill:#fff9c4
sequenceDiagram
participant U as Usuario
participant S as Supervisor
participant LLM as Claude/OpenAI
participant R as Agente RAG
participant M as Microservicio RAG
participant E as Elasticsearch
participant A as Agente Especialista
U->>S: "¿Qué es el WACC?"
rect rgb(230, 240, 255)
Note over S,LLM: Clasificación Single-Shot
S->>LLM: System Prompt + Query
LLM->>S: {categoria: "TEORICA"<br/>query_optimizada: "WACC definition weighted average cost of capital formula components"<br/>razonamiento: "Pregunta conceptual, material en inglés"}
end
alt Categoría: TEORICA
S->>R: Query Optimizada
R->>M: POST /search
rect rgb(255, 245, 230)
Note over M,E: Multi-Query Paralelo
par Variación 1
M->>E: "WACC definition..."
and Variación 2
M->>E: "WACC definition... + sinónimos"
and Variación 3
M->>E: "WACC weighted average"
end
E-->>M: Docs Variación 1
E-->>M: Docs Variación 2
E-->>M: Docs Variación 3
M->>M: Deduplicación SHA256
M->>M: Top 4-6 Docs
end
M-->>R: Contexto Formateado
R-->>U: Explicación + Fórmula
else Categoría: PRACTICA
S->>A: Query Original
A->>A: Ejecuta Herramienta
A-->>U: Resultado Numérico
else Categoría: AYUDA
S->>S: Agente Ayuda
S-->>U: Guía de Uso
end
- Python 3.11+
- PostgreSQL 15+ (opcional, para persistencia)
- Acceso a Elasticsearch Cloud
- API Keys:
- Anthropic Claude (primario)
- OpenAI (fallback + embeddings)
- Google Gemini (fallback opcional)
- Clonar el repositorio
git clone https://github.com/Fjgl96/CFAAgent.git
cd CFAAgent- Crear entorno virtual
python -m venv venv
source venv/bin/activate # Linux/Mac
# o
venv\Scripts\activate # Windows- Instalar dependencias
pip install -r requirements.txt- Configurar variables de entorno
cp .env.example .env
# Editar .env con tus API keysVariables críticas:
# API Keys
ANTHROPIC_API_KEY=sk-ant-xxx
OPENAI_API_KEY=sk-proj-xxx
GOOGLE_API_KEY=AIzaSyxxx # Opcional
# Microservicio RAG
RAG_API_URL=[https://rag-service-740905672912.us-central1.run.app]
# PostgreSQL (opcional)
ENABLE_POSTGRES_PERSISTENCE=true
POSTGRES_URI=postgresql://user:pass@host:5432/db- Ejecutar la aplicación
streamlit run streamlit_app.pyUsuario: "Calcula VAN: inversión 100k, flujos [30k, 40k, 50k], tasa 10%"
Sistema:
graph LR
A[Supervisor] -->|Clasifica: PRACTICA| B[Agente Fin. Corp]
B -->|calcular_van| C[numpy-financial]
C -->|VAN = $2,892.37| D[Usuario]
Usuario: "¿Qué es el WACC y cómo se calcula?"
Sistema:
graph LR
A[Supervisor] -->|Clasifica: TEORICA| B[Optimiza Query]
B -->|WACC definition weighted...| C[Microservicio RAG]
C -->|Multi-Query Paralelo| D[Elasticsearch]
D -->|Top 4 Docs| E[Síntesis]
E -->|Definición + Fórmula| F[Usuario]
Usuario: "¿Qué puedes hacer?"
Sistema:
graph LR
A[Supervisor] -->|Clasifica: AYUDA| B[Agente Ayuda]
B -->|Guía de Uso| C[Usuario]
calcular_valor_bono- Valor presente de bonoscalcular_duration_macaulay- Duration Macaulaycalcular_duration_modificada- Duration Modificadacalcular_convexity- Convexidadcalcular_current_yield- Rendimiento corrientecalcular_bono_cupon_cero- Bonos cupón cero
calcular_van- Valor Actual Neto (NPV)calcular_wacc- Costo Promedio Ponderado de Capitalcalcular_tir- Tasa Interna de Retorno (IRR)calcular_payback_period- Periodo de Recuperacióncalcular_profitability_index- Índice de Rentabilidad
calcular_gordon_growth- Modelo Gordon Growth
calcular_capm- Capital Asset Pricing Modelcalcular_sharpe_ratio- Ratio de Sharpecalcular_treynor_ratio- Ratio de Treynorcalcular_jensen_alpha- Alpha de Jensencalcular_beta_portafolio- Beta de Portafoliocalcular_retorno_portafolio- Retorno Esperadocalcular_std_dev_portafolio- Desviación Estándar
calcular_opcion_call- Opción Call (Black-Scholes)calcular_opcion_put- Opción Put (Black-Scholes)calcular_put_call_parity- Paridad Put-Call
CFAAgent/
├── agents/
│ └── financial_agents.py # Agentes + Clasificador LLM
├── graph/
│ └── agent_graph.py # Grafo LangGraph + Circuit Breaker
├── tools/
│ ├── financial_tools.py # 22 herramientas CFA
│ ├── schemas.py # Pydantic schemas
│ └── help_tools.py # Ayuda
├── config.py # Multi-LLM + PostgreSQL
├── config_elasticsearch.py # Config Elasticsearch (legacy)
├── streamlit_app.py # Interfaz Streamlit
├── requirements.txt # Dependencias
└── README.md # Este archivo
Microservicio RAG (Repo Separado):
rag-microservice/
├── main.py # FastAPI app
├── rag/
│ └── financial_rag_elasticsearch.py # Sistema RAG optimizado
├── config.py # OpenAI API Key
├── config_elasticsearch.py # Elasticsearch Cloud
├── requirements.txt
└── Dockerfile # Despliegue Google Cloud Run
El sistema RAG corre como microservicio independiente en Google Cloud Run:
# Desplegar microservicio
cd rag-microservice
gcloud run deploy rag-service \
--source . \
--platform managed \
--region us-central1 \
--allow-unauthenticatedVariables de entorno del microservicio:
OPENAI_API_KEY=sk-xxx
ES_SCHEME=https
ES_HOST=tu-cluster.es.gcp.cloud.es.io
ES_PORT=9200
ES_USERNAME=elastic
ES_PASSWORD=xxx
ES_INDEX_NAME=cfa_documents
EMBEDDING_MODEL=text-embedding-3-large- Crear base de datos
CREATE DATABASE cfaagent_db;- Configurar .env
ENABLE_POSTGRES_PERSISTENCE=true
POSTGRES_URI=postgresql://user:pass@host:5432/cfaagent_db- Reiniciar aplicación Las tablas se crean automáticamente.
| Aspecto | v1.0 (Routing 3 Capas) | v2.0 (Clasificación LLM) |
|---|---|---|
| Routing | FastPatternRouter + LLMRouter | Clasificación LLM Single-Shot |
| Latencia | ~1.3s (con bypass) | ~0.5s (siempre) |
| Complejidad | 500+ líneas (3 capas) | ~100 líneas |
| Mantenibilidad | Requiere actualizar YAML | Auto-adapta |
| Casos Ambiguos | Fallback a LLM | Maneja nativamente |
| RAG | Local (volátil) | Microservicio (escalable) |
| Optimización Query | No | Sí (traducción + enriquecimiento) |
# Ejecutar tests
pytest tests/
# Test específico
python tests/test_agents.py
python tests/test_supervisor.py
python tests/test_financial_tools.py
# Validar routing
python test_simple_routing.py- ARQUITECTURA_5_PILARES.md - Guía técnica completa (histórico)
- MICROSERVICE_UPDATE_GUIDE.md - Actualizar microservicio RAG
- ARCHITECTURE_IMPLEMENTATION_SUMMARY.md - Sistema de routing (deprecado)
- LangChain Docs - Framework principal
- LangGraph Docs - Sistema multi-agente
- Fork el proyecto
- Crear feature branch (
git checkout -b feature/AmazingFeature) - Commit cambios (
git commit -m 'Add AmazingFeature') - Push al branch (
git push origin feature/AmazingFeature) - Abrir Pull Request
- ✨ Reemplazo de routing de 3 capas por clasificación LLM simple
- ✨ Optimización automática de queries para RAG (traducción + enriquecimiento)
- ✨ Microservicio RAG independiente en Google Cloud Run
- ✨ Multi-query paralelo con índice inverso O(1)
- 🔧 Eliminación de 500+ líneas de código complejo
- 🔧 Mejor manejo de casos ambiguos
- ✨ Ingesta semántica con LlamaIndex
- ✨ Agente ReAct autónomo
- ✨ Persistencia PostgreSQL
- ✨ Multi-LLM resilience (Claude → OpenAI → Gemini)
- 📦 22 herramientas financieras CFA Level I
- Sistema multi-agente básico
- RAG con Elasticsearch
- 15 herramientas financieras
- Interfaz Streamlit
Solución: Verificar que el servicio esté activo
curl https://rag-service-740905672912.us-central1.run.app/healthSolución: Verificar que PostgreSQL esté corriendo
pg_isreadyEste proyecto está bajo la Licencia MIT - ver LICENSE para detalles.
Felipe Javier García López
- GitHub: @Fjgl96
- LangChain por el framework
- Anthropic por Claude
- Google Cloud por Cloud Run
- CFA Institute por el material de estudio
Última actualización: 2025-01-29