Laporan kewangan adalah penting untuk menilai kesihatan syarikat. Mereka merangkumi beratus -ratus halaman, menjadikannya sukar untuk mengekstrak pandangan tertentu dengan cekap. Penganalisis dan pelabur menghabiskan berjam -jam menyaring melalui kunci kira -kira, penyata pendapatan dan nota kaki hanya untuk menjawab soalan mudah seperti - apakah pendapatan syarikat pada tahun 2024? Dengan kemajuan baru -baru ini dalam model LLM dan teknologi carian vektor, kami boleh mengautomasikan analisis laporan kewangan menggunakan llamaindex dan rangka kerja yang berkaitan. Pos blog ini meneroka bagaimana kita boleh menggunakan Llamaindex, Chromadb, Gemini2.0, dan Ollama untuk membina sistem rag kewangan yang mantap yang menjawab pertanyaan dari laporan yang panjang dengan ketepatan.
Artikel ini diterbitkan sebagai sebahagian daripada Blogathon Sains Data.
Laporan kewangan mengandungi pandangan kritikal mengenai prestasi syarikat, termasuk pendapatan, perbelanjaan, liabiliti, dan keuntungan. Walau bagaimanapun, laporan ini adalah besar, panjang, dan penuh dengan jargon teknikal, menjadikannya sangat memakan masa untuk penganalisis, pelabur, dan eksekutif untuk mengekstrak maklumat yang relevan secara manual.
Sistem pengambilan laporan kewangan boleh mengautomasikan proses ini dengan membolehkan pertanyaan bahasa semulajadi. Daripada mencari melalui PDF, pengguna hanya boleh bertanya seperti, " Apakah hasilnya pada tahun 2023? " Atau " meringkaskan kebimbangan kecairan untuk 2023. " Sistem ini dengan cepat mengambil semula dan meringkaskan bahagian yang relevan, menjimatkan jam usaha manual.
Untuk pelaksanaan projek, kami perlu terlebih dahulu menubuhkan persekitaran dan memasang perpustakaan yang diperlukan:
Kami akan bermula dengan membuat dan Conda Env untuk kerja pembangunan kami.
$ conda create -nama finrag python = 3.12 $ conda mengaktifkan finrag
Memasang Libraires adalah langkah penting untuk sebarang pelaksanaan projek:
$ pip memasang llama-index llama-index-vector-stores-chroma chromadb $ pip Pasang llama-index-llms-gemini llama-index-llms-ollama $ pip Pasang llama-index-empeddings-gemini llama-index-empeddings-ollama $ pip Pasang Python-Dotenv Nest-Asyncio Pypdf
Sekarang buat direktori projek dan buat fail yang dinamakan .Env dan pada fail itu meletakkan semua kekunci API anda untuk pengurusan kunci API yang selamat.
# pada fail .env Google_API_KEY = "<your-api-key>"</your-api-key>
Kami memuatkan pembolehubah persekitaran dari fail .env untuk menyimpan kunci API sensitif dengan selamat. Ini memastikan bahawa API Gemini atau API Google kami masih dilindungi.
Kami akan melakukan projek kami menggunakan buku nota Jupyter.
Buat fail notebook Jupyter dan mula melaksanakan langkah demi langkah.
Sekarang kita akan memuatkan kunci API di bawah:
Import OS dari dotenv import load_dotenv LOAD_DOTENV () Gemini_api_key = os.getenv ("Google_API_KEY") # Hanya untuk memeriksa .Env sedang mengakses dengan betul atau tidak. # cetak (f "Gemini_api_key: {Gemini_api_key}")
Sekarang, enviroment kami siap supaya kami dapat pergi ke fasa paling penting seterusnya.
Mengumpul Laporan Kewangan Motorsport Games Inc. dari Laman Web Tahunan Perubatan.
Muat turun pautan di sini.
Halaman pertama kelihatan seperti:
Laporan ini mempunyai sejumlah 123 halaman, tetapi saya hanya mengambil penyata kewangan laporan dan membuat PDF baru untuk projek kami.
Bagaimana saya melakukannya? Ia sangat mudah dengan perpustakaan PYPDF.
dari pdfreader import pypdf dari PYPDF Import PDFWriter pembaca = pdfreader ("nasdaq_msgm_2023.pdf") penulis = pdfwriter () # Page 66 hingga 104 mempunyai penyata kewangan. page_to_extract = julat (66, 104) untuk page_num di page_to_extract: penulis.add_page (reader.pages [page_num]) output_pdf = "motorsport_games_financial_report.pdf" dengan buka (output_pdf, "wb") sebagai outsfile: penulis.write (output_pdf) cetak (f "pdf baru dicipta: {output_pdf}")
Fail laporan baru hanya mempunyai 38 muka surat, yang akan membantu kami membenamkan dokumen dengan cepat.
Dalam direktori data projek anda, letakkan fail yang baru dicipta oleh anda
Laporan kewangan biasanya dalam format PDF, yang mengandungi data tabular yang luas, nota kaki, dan penyata undang -undang. Kami menggunakan SimpleDirectoryReader Llamaindex untuk memuatkan dokumen -dokumen ini dan menukarnya ke dokumen.
dari llama_index.core import SimpleDirectoryReader Dokumen = SimpleDirectoryReader ("./ Data"). LOAD_DATA ()
Oleh kerana laporan sangat besar untuk diproses sebagai satu dokumen, kami mencairkannya ke dalam bahagian kecil atau nod. Setiap bahagian sepadan dengan halaman atau bahagian, ia membantu mendapatkan semula dengan lebih cekap.
Dari salinan Import DeepCopy dari llama_index.core.Schema Import TextNode def get_page_nodes (docs, pemisah = "\ n --- \ n"): "" "Pecahkan setiap dokumen ke dalam nod halaman, oleh pemisah." "" nod = [] untuk dokumen dalam dokumen: doc_chunks = doc.text.split (pemisah) untuk doc_chunk di doc_chunks: nod = textNode ( teks = doc_chunk, metadata = deepCopy (doc.metadata), ) nod.append (nod) Kembali nod
Untuk memahami proses pengambilan dokumen lihat di bawah rajah.
Sekarang data kewangan kami siap untuk vektor dan menyimpan untuk mendapatkan semula.
Kami akan menggunakan ChromAdb untuk pangkalan data vektor yang cepat, tepat, dan tempatan. Perwakilan tertanam teks kewangan kami akan disimpan ke dalam Chromadb.
Kami memulakan pangkalan data vektor dan mengkonfigurasi model teks-teks nomik menggunakan Ollama untuk generasi penyembuhan tempatan.
Import Chromadb dari llama_index.llms.gemini import Gemini dari llama_index.embeddings.ollama import ollamaembedding dari llama_index.vector_stores.chroma import chromavectorstore dari tetapan import llama_index.core embed_model = ollamaembedding (model_name = "nomic-embed-text") chroma_client = chromadb.persistentClient (path = "./ chroma_db") chroma_collection = chroma_client.get_or_create_collection ("financial_collection") vector_store = chromavectorstore (chroma_collection = chroma_collection)
Akhirnya, kami membuat indeks vektor menggunakan VectorStoreIndex Llamaindex. Indeks ini menghubungkan pangkalan data vektor kami ke enjin pertanyaan Llamaindex.
dari llama_index.core import vectorstoreIndex, storageContext storage_context = storageContext.from_defaults (vector_store = vector_store) vector_index = vectorstoreIndex.from_documents (dokumen = dokumen, storage_context = storage_context, embed_model = embed_model)
Kod di atas akan membuat indeks vektor menggunakan teks-teks nomik dari dokumen teks kewangan. Ia akan mengambil masa, bergantung kepada spesifikasi sistem tempatan anda.
Apabila pengindeksan anda selesai, maka anda boleh menggunakan kod untuk digunakan semula yang tertanam apabila perlu tanpa mengindeks semula.
vector_index = vectorstoreindex.from_vector_store ( vector_store = vector_store, embed_model = embed_model )
Ini akan membolehkan anda menggunakan fail penyembuhan Chromadb dari storan.
Sekarang pemuatan berat kami telah selesai, masa untuk menanyakan laporan dan berehat.
Sebaik sahaja data kewangan kami diindeks, kami boleh bertanya soalan bahasa semulajadi dan menerima jawapan yang tepat. Untuk pertanyaan, kami akan menggunakan model Flash Gemini-2.0 yang berinteraksi dengan pangkalan data vektor kami untuk mengambil bahagian yang relevan dan menghasilkan respons pandangan.
dari llama_index.llms.gemini import Gemini llm = gemini (api_key = gemini_api_key, model_name = "model/gemini-2.0-flash")
query_engine = vector_index.as_query_engine (llm = llm, persamaan_top_k = 5)
Di bawah ini kami mempunyai banyak pertanyaan dengan respons yang berbeza:
Response = query_engine.Query ("Apakah pendapatan pada tahun 2022 berakhir 31 Disember?") cetak (str (respons))
Imej yang sepadan dari laporan:
respons = query_engine.query ( "Apakah kerugian bersih yang disebabkan oleh Motossport Games Inc. pada tahun 2022 yang berakhir pada 31 Disember?" ) cetak (str (respons))
Imej yang sepadan dari laporan:
respons = query_engine.query ( "Apakah kecairan dan kebimbangan syarikat pada 31 Disember 2023" ) cetak (str (respons))
respons = query_engine.query ( "Meringkaskan pertimbangan utama berbanding ejen syarikat?" ) cetak (str (respons))
Corresonding Image dari Laporan:
respons = query_engine.query ( "Meringkaskan kerugian bersih bagi setiap bahagian biasa syarikat dengan data kewangan?" ) cetak (str (respons))
Corresonding Image dari Laporan:
respons = query_engine.query ( "Meringkaskan harta dan peralatan terdiri daripada baki berikut pada 31 Disember, 2023 dan 2022 Syarikat dengan data kewangan?" ) cetak (str (respons))
Imej yang sepadan dari laporan:
respons = query_engine.query ( "Meringkaskan aset tidak ketara pada 21 Disember, 2023 Syarikat dengan data kewangan?" ) cetak (str (respons))
respons = query_engine.query ( "Apakah pajakan syarikat dengan data kewangan tahunan?" ) cetak (str (respons))
Imej yang sepadan dari laporan:
Leverage Llama 3.2 Secara tempatan untuk menanyakan laporan kewangan tanpa bergantung pada model berasaskan awan.
local_llm = ollama (model = "llama3.2: 1b", request_timeout = 1000.0) local_query_engine = vector_index.as_query_engine (llm = local_llm, persamaan_top_k = 3)
respons = local_query_engine.Query ( "Ringkasan carta perbelanjaan terakru dan liabiliti lain menggunakan data kewangan syarikat" ) cetak (str (respons))
Corresonding Image dari Laporan:
Kadang -kadang, kita memerlukan pengambilan terperinci dan meringkaskan pandangan. Kita boleh melakukan ini dengan menggabungkan kedua -dua indeks vektor dan indeks ringkasan.
Kami telah membina indeks vektor, kini kami akan membuat indeks ringkasan yang menggunakan pendekatan hierarki untuk meringkaskan penyata kewangan.
dari llama_index.core Import SummaryIndex summary_index = summaryIndex (node = page_nodes)
Kemudian mengintegrasikan routerQueryEngine, yang secara kondusif memutuskan sama ada untuk mendapatkan data dari indeks ringkasan atau indeks vektor berdasarkan jenis pertanyaan.
dari llama_index.core.tools import queryenginetool dari llama_index.core.query_engine.Router_Query_engine Import RouterQueryEngine dari llama_index.core.Selectors import llmsingleselector
Sekarang buat enjin pertanyaan ringkasan
summary_query_engine = summary_index.as_query_engine ( llm = llm, response_mode = "tre_summarize", use_async = true )
Enjin pertanyaan ringkasan ini masuk ke dalam alat ringkasan. dan enjin pertanyaan vektor ke dalam alat vektor.
# Membuat alat ringkasan summary_tool = queryenginetool.from_defaults ( query_engine = summary_query_engine, Penerangan = ( "Berguna untuk soalan ringkasan yang berkaitan dengan Motorsport Games Company." )) ) # Membuat alat vektor vector_tool = queryenginetool.from_defaults ( query_engine = query_engine, Penerangan = ( "Berguna untuk menarik balik konteks khusus dari syarikat Motorsport Games." )) )
Kedua -dua alat itu dilakukan sekarang kami menyambungkan alat ini melalui penghala supaya apabila pertanyaan pantat melalui penghala ia akan menentukan alat mana yang hendak digunakan dengan menganalisis pertanyaan pengguna.
# Enjin Pertanyaan Router adv_query_engine = routerQueryengine ( llm = llm, pemilih = llmsingleselector.from_defaults (llm = llm), query_engine_tools = [summary_tool, vector_tool], verbose = benar, )
Sistem pertanyaan lanjutan kami telah disediakan sepenuhnya, kini menanyakan enjin pertanyaan maju kami yang baru disukai.
respons = adv_query_engine.query ( "Meringkaskan carta yang menggambarkan pendapatan syarikat." ) cetak (str (respons))
Anda dapat melihat bahawa penghala pintar kami akan memutuskan untuk menggunakan alat ringkasan kerana dalam pengguna pertanyaan meminta ringkasan.
Response = adv_query_engine.Query ("Berapakah jumlah aset syarikat?") cetak (str (respons))
Dan di sini penghala memilih alat vektor kerana pengguna meminta maklumat khusus, bukan ringkasan.
Semua kod yang digunakan dalam artikel ini ada di sini
Kami dapat menganalisis laporan kewangan dengan cekap dengan Llamaindex, ChromAdb dan LLM Lanjutan. Sistem ini membolehkan wawasan kewangan automatik, pertanyaan masa nyata, dan ringkasan yang kuat. Sistem jenis ini menjadikan analisis kewangan lebih mudah dan cekap untuk mengambil keputusan yang lebih baik semasa melabur, berdagang, dan menjalankan perniagaan.
A. Sistem ini direka untuk memproses mana -mana dokumen kewangan berstruktur dengan memecahkannya ke dalam ketulan teks, membenamkannya dan menyimpannya di Chromadb. Laporan baru boleh ditambah secara dinamik tanpa memerlukan pengindeksan semula lengkap.
Q 2. Bolehkah ini diperluaskan untuk menjana carta kewangan dan visualisasi?A. Ya, dengan mengintegrasikan matplotlib, panda dan streamlit, anda boleh memvisualisasikan trend seperti pertumbuhan pendapatan, analisis kerugian bersih, atau pengedaran aset.
Q3. Bagaimanakah sistem penghalaan pertanyaan meningkatkan ketepatan?A. RouterQueryEngine secara automatik mengesan sama ada pertanyaan memerlukan tindak balas yang diringkaskan atau pengambilan data kewangan tertentu. Ini mengurangkan output yang tidak relevan dan memastikan ketepatan respons.
Q 4. Dalam sistem ini sesuai untuk analisis kewangan masa nyata?A. Ia boleh, tetapi ia bergantung kepada berapa kerap kedai vektor dikemas kini. Anda boleh menggunakan API Embedding OpenAI untuk saluran paip pengambilan berterusan untuk pertanyaan laporan kewangan masa nyata secara dinamik.
Media yang ditunjukkan dalam artikel ini tidak dimiliki oleh Analytics Vidhya dan digunakan atas budi bicara penulis.
Atas ialah kandungan terperinci Membina Sistem Pengambilan Laporan Kewangan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!