Skip to content
··5 मिनट पढ़ने का समय

एक Self-Evaluating Financial Chatbot बनाना: Data, Code और Struggles की एक Journey

मैंने एक financial chatbot बनाया जो SEC data से S&P 500 के सवालों का जवाब देता है — एक self-critique agent के साथ जो आपको दिखाने से पहले answers को improve करता है।

Update (2026): नीचे दिया गया financial chatbot project अंततः S&P 500 agent बन गया (MVP launched Sep 2024)। उसे ship करने के बाद, मैंने Sydney को blog content और दो नए products पर focus करने के लिए shift किया: STRATUM (marketing intelligence) और DIALOGUE (podcast generation)।

Sydney से पूछें →


अप्रैल 2024 की original post नीचे context के लिए preserved है।

इस blog post में, मैं एक fascinating hobby project पर काम करने के अपने अनुभव share करना चाहता हूँ — self-evaluation capabilities के साथ एक financial chatbot/agent बनाना। इस project का लक्ष्य एक ऐसा agent बनाना है जो SEC (U.S. Securities and Exchange Commission — अमेरिकी प्रतिभूति और विनिमय आयोग) filings से directly data का उपयोग करके S&P 500 में companies की financial conditions और trends के बारे में questions का जवाब दे सके। इस agent के मुख्य benefits हैं (या होंगे :P):

  • आपको S&P 500 की companies में financial conditions और trends के बारे में questions पूछने की अनुमति देना।
  • यह इन companies की SEC के साथ official financial filings से directly data का उपयोग करता है, hallucination से बचने के लिए
  • यह प्रत्येक answer के नीचे detailed references प्रदान करता है ताकि आप चाहें तो answer को fact-check कर सकें
  • Database में पिछले 5-10 सालों के financial filing data हैं, इसलिए आप agent से समय के साथ trends के बारे में reason करने के लिए कह सकते हैं
  • प्रत्येक answer आपको return होने से पहले, एक और agent है जिसका काम है LLM के draft answer की critique करना और इसे improve करने का प्रस्ताव देना
  • ये suggestions और पूरा context फिर original agent के साथ share किए जाते हैं। Agent फिर database से बेहतर information retrieve करने के लिए अलग queries formulate करने या simply suggestions को final answer में incorporate करने का decide कर सकता है
  • यह final answer user को provide किया जाता है।

जाहिर है, मेरे पास Bloomberg terminal तक access नहीं है इसलिए मुझे नहीं पता कि Bloomberg chatbot पहले से ऊपर के सब कुछ कर सकता है या नहीं। (मेरा educated guess है कि यह कर सकता है — एक हद तक। Self-critique part और revision कितने अच्छे हैं, मुझे नहीं पता लेकिन जानना चाहूँगा :P)

मैं इन जैसे questions का जवाब देना चाहता हूँ:

  • पिछले 5-10 सालों में Apple का marketing spend trend क्या है?
  • पिछले 5 सालों में XYZ company द्वारा किए गए सभी major acquisitions क्या हैं
  • पिछले 5 सालों में Nvidia और Microsoft के R&D spend की तुलना करें
  • आदि।

तो मैं इस project में कहाँ हूँ? मैंने क्या सीखा है? Struggles क्या हैं?

SEC से Data कैसे प्राप्त करूँ?

मेरे सामने शुरुआती challenges में से एक SEC से आवश्यक data प्राप्त करना था। जबकि SEC EDGAR data access करने पर guides और documentation provide करता है, scale पर प्रत्येक company के लिए financial filings download करने की process को समझने में कुछ समय लगा।

क्या मेरे लिए SEC से filings download और process किए बिना अगले step पर proceed करने का कोई दूसरा तरीका है?

मैंने Langchain documentation देखा और पाया कि Kay.ai नाम का एक financial retriever था। मैंने retriever को test किया। हालाँकि, यह asynchronous calls या advanced metadata filtering support नहीं करता। इसलिए मैंने इस part को खुद करना explore करना जारी रखने का decide किया।

Actual Python scripts Share करना

SEC EDGAR से financial filings download करने के लिए Python script

बहुत सारे trials और errors के बाद, chatGPT की मदद से, यह वो code है जो U.S. Securities and Exchange Commission (SEC) database से XBRL और TXT filings automatically download करता है। यह Central Index Key (CIK) का उपयोग करके specified companies के लिए recent filings fetch करने के लिए designed है।

मैं .zip file और .txt file दोनों क्यों download करना चाहता हूँ?

प्रत्येक company के लिए .txt file बहुत comprehensive है। इसमें प्रत्येक filing के बारे में बहुत valuable metadata है जैसे form type (10K या 10Q — वार्षिक या तिमाही रिपोर्ट), reporting period, filed date, company CIK/name, आदि। ये मेरे metadata के types हैं जिनकी मुझे agent बनाने के लिए बाद में ज़रूरत होगी।

<SEC-DOCUMENT>0000320193-19-000119.txt : 20191031
CONFORMED SUBMISSION TYPE:	10-K
CONFORMED PERIOD OF REPORT:	20190928
COMPANY CONFORMED NAME:			Apple Inc.
CENTRAL INDEX KEY:			0000320193

.txt file में बहुत और data भी है, core financial report के अलावा। इसीलिए प्रत्येक file बहुत बड़ी है (10+ MB या 40+ MB भी)। एक company के लिए, मैं पिछले 5-10 सालों के सभी 10K और 10Q download करना चाहता हूँ, इसलिए easily 20+ files per company। इन बड़ी files को process/clean up/chunk करना बहुत unproductive है क्योंकि एक normal laptop के साथ इसमें बहुत time लगेगा और embedding की cost astronomical होगी।

यही वो जगह है जहाँ .zip file आती है। प्रत्येक .zip files में, आपको core financial report .htm format में मिलेगी।

Metadata को main financial report के साथ Combine करना

यह वो script है जो multiple companies की filings से financial statements और उनसे जुड़े metadata को automatically extract करती है।

Chunking से पहले unnecessary content/characters को Clean up करना

Good news यह है कि ऊपर के approach का उपयोग करके, प्रत्येक report (10K या 10Q) अब केवल 3 MB से कम है। लेकिन यह अभी भी बहुत लंबा है और इसमें बहुत सारी information है जिसकी हमें ज़रूरत नहीं है इसलिए chunking से पहले इसे और clean up करना होगा। अगर embedding के लिए सिर्फ $0.1 प्रति report खर्च होती है, तो 5 साल की 10K और 10Q reports के लिए एक company के लिए पहले से ही $2.5 है। अगर आप S&P 500 के ज़्यादातर को cover करना चाहते हैं या period को 10 साल तक extend करना चाहते हैं, तो यह बहुत जल्दी बढ़ जाता है।

तो यहाँ है script cleaning के लिए। Process के बाद, प्रत्येक output 0.2 Mb से कम है, 10x smaller।

मुझे कौन सा vector store use करना चाहिए?

यहाँ कई options हैं (50 से ज़्यादा vector store options के साथ)। मैंने अब तक Chroma, ElasticSearch और FAISS के साथ experiment किया है।

जबकि Chroma और ElasticSearch ने robust functionality provide की, उनके index sizes relatively बड़े थे (Chroma के लिए 550+ MB और ElasticSearch के लिए 800+ MB)। ये indexes सिर्फ 5 test companies के लिए हैं। यह अच्छा नहीं है क्योंकि जैसे-जैसे मैं इसे बाकी S&P 500 में scale करूँगा, final index size 100x बड़ी हो सकती है।

दूसरी ओर FAISS index, उन्हीं 5 test companies के लिए केवल 200+ MB है।

Query structuring

import datetime
from typing import Optional
from pydantic import BaseModel, Field

class FinancialFilingsSearch(BaseModel):
    content_search: str = Field(...)
    conformed_submission_type: str = Field(None)
    conformed_period_of_report: Optional[datetime.date] = Field(None)
    company_conformed_name: str = Field(None)
    central_index_key: str = Field(None)
    form_type: str = Field(None)

मैं इस लंबी (LONG) post से क्या achieve करने की उम्मीद करता हूँ?

1. Share किए गए Python codes किसी तरह आपकी मदद करें।

2. आप मुझे अपने thoughts/comments share करें या advice दें।

Update Jul 2024

यह chatbot अभी काम नहीं कर रहा है, इसलिए अगर आप मेरी site पर current chatbot try करते हैं और financial questions पूछते हैं, तो यह नहीं जानता :D

Curiosity gap का ध्यान रखें :)

क्या आपने SEC filings के साथ काम किया है या self-evaluating agent बनाने की कोशिश की है? मुझे बताएं कि आपने vector store और metadata filtering challenges को कैसे approach किया।

शुभकामनाओं सहित, Chandler

P.S: Coursera पर एक newly released course है जिसे मैं लेने का plan कर रहा हूँ "Generative AI for Software Development Skill Certificate"।

पढ़ना जारी रखें

मेरा सफ़र
जुड़ें
भाषा
सेटिंग्स