MVP del Agente S&P500 lanzado: Respondiendo preguntas financieras fundamentadas con datos de la SEC
Construí un agente de IA que responde preguntas financieras usando 10 años de datos de la SEC — y finalmente resolví mis desafíos de streaming para hacerlo en tiempo real y verificable.
Actualización (2026): El Agente S&P 500 ha sido retirado. Esta publicación documenta el lanzamiento del MVP original con fines históricos. Sydney ahora se centra en el contenido del blog y los productos de Chandler. Prueba el Sydney actual →
Hola a todos,
Me alegra compartir que desde mi última publicación sobre mi lucha trabajando en el Agente S&P500, ¡la versión MVP está lista! :D Déjame guiarte por lo que puede hacer este producto mínimo viable y cómo llegó a existir.
¿Qué puede hacer este MVP?
- Sumergirse en una Década de Datos: La base de datos del agente incluye los últimos 10 años de hechos de las empresas enviados a SEC EDGAR. ¡Bastante interesante, verdad?
- Respuestas Fiables: Dado que está fundamentado con hechos reales enviados a la SEC, puedes confiar en la calidad de las respuestas.
- Fácil de Verificar: El agente siempre incluye datos de referencia en su respuesta final. ¡Así que si eres escéptico, puedes comprobarlo tú mismo!
- Maneja Preguntas Complejas: Puede abordar consultas semi-complejas como "¿Compara los ingresos de Apple y Microsoft entre 2020 y 2022?" o "¿Cómo cambió el margen operativo de Microsoft de 2020 a 2022?" ¿Por qué son semi-complejas? Bueno, el agente necesita "razonar" y desglosar estas preguntas amplias en preguntas más pequeñas, buscar información en la base de datos y luego unirlo todo.
- Por ejemplo, para responder la primera pregunta, el agente necesita conocer los ingresos individuales de la empresa para cada año 2020, 2021 y 2022 y luego hacer la comparación.
- Actualizado (Casi): La fecha de corte es agosto de 2024. Cualquier cosa enviada a la SEC después de eso no está en esta versión MVP.
- HTML streaming: ¡El streaming funciona! ¡Yupi! :D Resulta que DRF y React admiten nativamente el streaming, así que con LangGraph, tenemos un flujo de conversación receptivo, mostrado en un formato fácil de leer. Llevaba un tiempo luchando con el streaming HTML.
Un vistazo bajo el capó
Si sigues leyendo en este punto, probablemente quieres saber más sobre cómo construí este MVP y superé algunos de los desafíos que mencioné antes. ¡Así que pongámonos un poco técnicos!
- Datos reducidos: En lugar de usar informes 10-K o 10-Q completos, estoy usando los "Hechos" enviados a la SEC. ¡Esto significa que nuestra base de datos es significativamente más pequeña — menos de 2 GB! A continuación hay algunos ejemplos de lo que las empresas públicas enviaron a la SEC:
"AccruedRoyaltiesCurrent": \{
"label": "Accrued Royalties, Current"
\},
"AccumulatedDepreciationDepletionAndAmortizationPropertyPlantAndEquipment": \{
"label": "Accumulated Depreciation, Depletion and Amortization, Property, Plant, and Equipment"
\},
"AccumulatedOtherComprehensiveIncomeLossNetOfTax": \{
"label": "Accumulated Other Comprehensive Income (Loss), Net of Tax"
\},
"AccumulatedOtherComprehensiveIncomeLossOtherThanTemporaryImpairmentNotCreditLossNetOfTaxAvailableforsaleDebtSecurities": \{
"label": "Accumulated Other Comprehensive Income (Loss), Other than Temporary Impairment, Not Credit Loss, Net of Tax, Available-for-sale, Debt Securities"
\},
"AdditionalPaidInCapitalCommonStock": {
"label": "Additional Paid in Capital, Common Stock"
Esto también significa que no necesito usar un vector store a gran escala y rápido, que es muy caro (en el rango de $600 - $700/mes)
2. Cloud SQL PostgreSQL como base de datos principal: Estoy usando Cloud SQL PostgreSQL como base de datos principal. Como ya estaba usando Cloud Run CI/CD de GCP, tenía sentido seguir con las ofertas de Google. Este es un concepto completamente nuevo para mí, así que tuve que aprender cómo hacer la migración de base de datos de local a la nube y luego cómo configurar el backend para que funcione con la base de datos Cloud SQL usando IP privada. La documentación de GCP ha sido útil.
3. React se une a Django: Este es mi primer rodeo desplegando con éxito tanto el frontend React como el backend Django Rest Framework (DRF) con una base de datos Cloud SQL. Ha sido un viaje de prueba y error, pero el o1-preview de ChatGPT y Anthropic Claude 3.5 Sonnet han sido de gran ayuda. Son realmente muy poderosos, especialmente cuando les das suficiente contexto del problema que estás resolviendo.
4. Agente Inteligente: El agente está construido usando LangGraph. Tiene dos herramientas principales: Google Search y una herramienta de Respuesta a Preguntas Financieras. Decide cuál usar según tu pregunta.
5. ¿Cómo se generan las consultas SQL?
No es sencillo convertir una pregunta genérica/amplia del usuario en consultas SQL adecuadas, aptas para la base de datos. Una de las principales razones es que cuando las empresas envían los hechos financieros a la SEC, usan conceptos/terminologías financieras que no son intuitivos para la gente normal.
Por ejemplo, "ingresos" puede estar representado por múltiples hechos como:
- Revenue
- Revenue from Contract with Customer, Excluding Assessed Tax
- Revenue from related Parties
- Deferred Revenue
- etc...
Y entre empresas, pueden elegir usar etiquetas diferentes para el mismo concepto. Por ejemplo, Apple usa "Revenue from Contract with Customer, Excluding Assessed Tax" mientras que Tesla usa "Revenue".
O cuando pides el "margen operativo", es posible que ese no sea un hecho que la empresa envíe a la SEC. En cambio, envían los ingresos totales y el Resultado Operativo (Pérdida).
Otra situación es cuando las empresas cambian de nombre con el tiempo, por lo que debes asegurarte de que las consultas SQL incluyan tanto el nombre antiguo como el nuevo.
Entonces, ¿cómo le indico a la máquina que seleccione el hecho/etiqueta correcto para una pregunta amplia concreta?
Uso búsqueda híbrida con Weaviate para encontrar los hechos o etiquetas más relevantes y enviarlos de vuelta al modelo LLM.
6. Las pruebas desglosadas son clave
Antes del despliegue final a producción, desglosé el proceso en pasos y probé cada uno:
1. Prueba local del backend DRF con una base de datos local.
2. Prueba del backend en contenedor Docker con base de datos local.
3. Migración de la base de datos PostgreSQL a Cloud SQL y prueba.
4. Prueba del backend en contenedor Docker con Cloud SQL.
5. Prueba local del frontend React.
6. Frontend React con backend de producción y Cloud SQL.
7. Migración del frontend React a WordPress en producción.
8. Prueba de extremo a extremo.
Tuve que aprender este enfoque paso a paso de la manera difícil. Inicialmente, me salté algunos pasos y probé en bloques más grandes, pero los modelos de lenguaje (LLM) no podían identificar exactamente dónde salían mal las cosas.
¿Qué sigue?
- Solucionar el problema de arranque en frío: En este momento, el agente tarda un poco en responder la primera pregunta. Estoy trabajando en una solución rentable.
- Mostrar pasos intermedios a los usuarios: Al responder preguntas complejas como "Compara los ingresos de Apple y Microsoft entre 2020 y 2022", el agente tarda un tiempo en generar la respuesta final. Mostrar los pasos en los que trabaja el agente en tiempo real podría mejorar la experiencia del usuario.
- Enriquecer con contenido textual de 10-K/10-Q: Planeo incluir más contenido textual relevante de los archivos 10-K y 10-Q para proporcionar respuestas más detalladas.
Eso es todo de mi parte por ahora. ¡Prueba la versión MVP y dime qué piensas! ¿Has intentado construir algo con datos financieros o archivos de la SEC? Me encantaría escuchar tu experiencia — deja un comentario abajo o escríbeme directamente (chandler@chandlernguyen.com).
Un abrazo,
Chandler





