S&P500 에이전트 MVP 출시: SEC 데이터 기반 금융 질문 답변
10년간의 SEC 데이터를 사용하여 금융 질문에 답하는 AI 에이전트를 만들었습니다 — 그리고 마침내 스트리밍 문제를 해결하여 실시간으로 검증 가능하게 만들었습니다.
업데이트 (2026): S&P 500 에이전트는 폐기되었습니다. 이 글은 역사적 기록을 위해 원본 MVP 출시를 문서화합니다. Sydney는 이제 블로그 콘텐츠와 Chandler의 제품에 집중합니다. 현재 Sydney 사용해보기 →
안녕하세요,
S&P500 에이전트 작업에서의 고군분투에 대한 마지막 글 이후, MVP 버전이 준비되었다는 것을 기쁘게 공유합니다! :D 이 최소 기능 제품이 무엇을 할 수 있고 어떻게 만들어졌는지 안내하겠습니다.
이 MVP는 무엇을 할 수 있나요?
- 10년간의 데이터에 뛰어들기: 에이전트의 데이터베이스에는 기업들이 SEC EDGAR에 제출한 지난 10년간의 데이터가 포함되어 있습니다. 꽤 멋지지 않나요?
- 신뢰할 수 있는 답변: SEC에 제출된 실제 사실을 기반으로 하므로 답변의 품질을 신뢰할 수 있습니다.
- 팩트체크 가능: 에이전트는 항상 최종 답변에 참조 데이터를 포함합니다. 의심이 드시면 직접 확인할 수 있습니다!
- 까다로운 질문 처리: "2020년부터 2022년까지 Apple과 Microsoft의 매출을 비교해보세요?"나 "2020년부터 2022년까지 Microsoft의 영업이익률은 어떻게 변했나요?"와 같은 준복잡한 질문을 처리할 수 있습니다. 왜 준복잡할까요? 에이전트가 이 넓은 질문을 더 작은 질문으로 "추론"하고 분해하고, 데이터베이스에서 정보를 찾아 모두 합쳐야 하기 때문입니다.
- 예를 들어, 첫 번째 질문에 답하려면 에이전트는 2020, 2021, 2022년 각각의 개별 기업 매출을 알고 비교해야 합니다.
- 최신 (거의): 마감일은 2024년 8월입니다. 그 이후 SEC에 제출된 것은 이 MVP 버전에 포함되어 있지 않습니다.
- HTML 스트리밍: 스트리밍이 작동합니다! 야! :D 결과적으로 DRF와 React는 네이티브로 스트리밍을 지원하므로, langgraph와 함께 읽기 쉬운 형식으로 표시되는 반응적인 대화 흐름을 갖게 되었습니다. HTML 스트리밍에 한동안 고군분투했었습니다.
내부 들여다보기
여기까지 읽고 계시다면, 이 MVP를 어떻게 구축하고 이전에 언급한 몇 가지 도전을 어떻게 극복했는지 더 알고 싶으실 것입니다. 그럼 약간 기술적으로 들어가겠습니다!
- 데이터 축소: 전체 10-K 또는 10-Q 보고서를 사용하는 대신, SEC에 제출된 "Facts"를 사용하고 있습니다. 덕분에 데이터베이스가 2GB 미만으로 상당히 작아졌습니다! 아래는 공개 기업들이 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"
이것은 또한 매우 비싼 (월 $600 - $700 범위의) 대규모 고속 벡터 저장소가 필요 없다는 것을 의미합니다
2. 메인 데이터베이스로 Cloud SQL PostgreSQL: Cloud SQL PostgreSQL을 메인 데이터베이스로 사용하고 있습니다. 이미 GCP의 Cloud Run CI/CD를 사용하고 있었으므로 Google 서비스를 계속 사용하는 것이 합리적이었습니다. 이것은 완전히 새로운 개념이어서 로컬에서 클라우드로의 데이터베이스 마이그레이션 방법과 프라이빗 IP를 사용하여 백엔드가 Cloud SQL 데이터베이스와 작동하도록 구성하는 방법을 배워야 했습니다. GCP의 문서가 도움이 되었습니다.
3. React와 Django의 만남: React 프론트엔드와 Django Rest Framework(DRF) 백엔드를 Cloud SQL 데이터베이스와 함께 성공적으로 배포한 첫 번째 경험입니다. 시행착오의 여정이었지만, ChatGPT의 o1-preview와 Anthropic Claude 3.5 Sonnet이 큰 도움이 되었습니다. 특히 해결하려는 문제에 대해 충분한 컨텍스트를 제공하면 정말 강력합니다.
4. 스마트 에이전트: 에이전트는 Langgraph를 사용하여 구축되었습니다. Google 검색과 금융 질문 답변 도구의 두 가지 주요 도구가 있습니다. 질문에 따라 어느 것을 사용할지 결정합니다.
5. SQL 쿼리는 어떻게 생성되나요?
일반적/광범위한 사용자 질문을 데이터베이스에 적합한 SQL 쿼리로 변환하는 것은 간단하지 않습니다. 주요 이유 중 하나는 기업들이 SEC에 재무 사실을 제출할 때 일반인에게 직관적이지 않은 금융 개념/용어를 사용하기 때문입니다.
예를 들어, "매출"은 다음과 같은 여러 사실로 표현될 수 있습니다:
- Revenue
- Revenue from Contract with Customer, Excluding Assessed Tax
- Revenue from related Parties
- Deferred Revenue
- 등...
그리고 기업 간에 같은 개념에 대해 다른 레이블을 사용할 수 있습니다. 예를 들어, Apple은 "Revenue from Contract with Customer, Excluding Assessed Tax"를 사용하는 반면 Tesla는 "Revenue"를 사용합니다.
또는 "영업이익률"을 물어보면, 그것은 기업이 SEC에 제출하는 사실이 아닐 수 있습니다. 대신, 총 매출과 영업이익(손실)을 제출합니다.
또 다른 상황은 기업이 시간이 지남에 따라 이름을 변경한 경우이므로 SQL 쿼리에 이전 이름과 새 이름을 모두 포함해야 합니다.
그렇다면 특정 광범위한 질문에 대해 올바른 사실/레이블을 선택하도록 기계에게 어떻게 지시할까요?
Weaviate를 사용한 하이브리드 검색으로 가장 관련 있는 사실이나 레이블을 찾고 이를 LLM 모델에 다시 보냅니다.
6. 단계별 테스트가 핵심입니다
최종 프로덕션 배포 전에 프로세스를 단계별로 나누어 각 단계를 테스트했습니다:
1. 로컬 데이터베이스로 DRF 백엔드 로컬 테스트.
2. 로컬 데이터베이스로 Docker 컨테이너 백엔드 테스트.
3. PostgreSQL 데이터베이스를 Cloud SQL로 마이그레이션하고 테스트.
4. Cloud SQL로 Docker 컨테이너 백엔드 테스트.
5. React 프론트엔드 로컬 테스트.
6. 프로덕션 백엔드와 Cloud SQL로 React 프론트엔드.
7. React 프론트엔드를 프로덕션 Wordpress로 마이그레이션.
8. 엔드투엔드 테스트.
이 단계적 접근 방식을 어렵게 배워야 했습니다. 처음에는 일부 단계를 건너뛰고 더 큰 덩어리로 테스트했는데, 언어 모델(LLM)이 정확히 어디서 문제가 생겼는지 짚어낼 수 없었습니다.
다음은 무엇인가요?
- 콜드 스타트 문제 수정: 현재 에이전트가 첫 번째 질문에 답하는 데 약간의 시간이 걸립니다. 비용 효율적인 솔루션을 작업 중입니다.
- 사용자에게 중간 단계 표시: "2020년에서 2022년 사이 Apple과 Microsoft의 매출을 비교하라"와 같은 복잡한 질문에 답하는 동안, 에이전트가 최종 답변을 생성하는 데 시간이 걸립니다. 에이전트가 실시간으로 작업 중인 단계를 보여주면 사용자 경험이 개선될 수 있습니다.
- 10-K/10-Q 텍스트 콘텐츠로 보강: 더 상세한 답변을 제공하기 위해 10-K와 10-Q 보고서에서 더 관련 있는 텍스트 콘텐츠를 포함할 계획입니다.
지금은 여기까지입니다. MVP 버전을 사용해보시고 어떻게 생각하시는지 알려주세요! 금융 데이터나 SEC 보고서로 무언가를 만들어보신 적이 있나요? 경험을 듣고 싶습니다 — 아래에 댓글을 남기거나 직접 이메일을 보내주세요 (chandler@chandlernguyen.com).
감사합니다,
Chandler





