Rumah > Peranti teknologi > AI > Membina Sistem Pengambilan Laporan Kewangan

Membina Sistem Pengambilan Laporan Kewangan

Christopher Nolan
Lepaskan: 2025-03-21 10:08:12
asal
226 orang telah melayarinya

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.

Objektif pembelajaran

  • Memahami keperluan sistem pengambilan laporan kewangan untuk analisis yang cekap.
  • Ketahui cara untuk memproses dan vektor laporan kewangan menggunakan llamaindex.
  • Terokai Chromadb untuk membina pangkalan data vektor yang mantap untuk mendapatkan semula dokumen.
  • Melaksanakan enjin pertanyaan menggunakan Gemini 2.0 dan Llama 3.2 untuk analisis data kewangan.
  • Temui teknik penghalaan pertanyaan lanjutan menggunakan LlamAindex untuk meningkatkan pandangan.

Artikel ini diterbitkan sebagai sebahagian daripada Blogathon Sains Data.

Jadual Kandungan

  • Mengapa kita memerlukan sistem pengambilan laporan kewangan?
  • Pelaksanaan projek
  • Dokumen pemprosesan dengan llamaindex
  • Membina Pangkalan Data Vektor dengan Chromadb
  • Data Kewangan Pertanyaan dengan Gemini 2.0
  • Pertanyaan Tempatan Menggunakan Llama 3.2
  • Routing pertanyaan lanjutan dengan llamaindex
  • Kesimpulan
  • Soalan yang sering ditanya

Mengapa kita memerlukan sistem pengambilan laporan kewangan?

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.

Pelaksanaan projek

Untuk pelaksanaan projek, kami perlu terlebih dahulu menubuhkan persekitaran dan memasang perpustakaan yang diperlukan:

Langkah 1: Menyediakan persekitaran

Kami akan bermula dengan membuat dan Conda Env untuk kerja pembangunan kami.

 $ conda create -nama finrag python = 3.12

$ conda mengaktifkan finrag
Salin selepas log masuk

Langkah 2: Pasang perpustakaan python penting

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
Salin selepas log masuk

Langkah 3: Membuat Direktori Projek

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>
Salin selepas log masuk

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.

Langkah 4: Memuatkan kekunci API

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}")
Salin selepas log masuk

Sekarang, enviroment kami siap supaya kami dapat pergi ke fasa paling penting seterusnya.

Dokumen pemprosesan dengan llamaindex

Mengumpul Laporan Kewangan Motorsport Games Inc. dari Laman Web Tahunan Perubatan.

Muat turun pautan di sini.

Halaman pertama kelihatan seperti:

Membina Sistem Pengambilan Laporan Kewangan

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}")
Salin selepas log masuk

Fail laporan baru hanya mempunyai 38 muka surat, yang akan membantu kami membenamkan dokumen dengan cepat.

Memuat dan Memisahkan Laporan Kewangan

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 ()
Salin selepas log masuk

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
Salin selepas log masuk

Untuk memahami proses pengambilan dokumen lihat di bawah rajah.

Membina Sistem Pengambilan Laporan Kewangan

Sekarang data kewangan kami siap untuk vektor dan menyimpan untuk mendapatkan semula.

Membina Pangkalan Data Vektor dengan Chromadb

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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
)
Salin selepas log masuk

Ini akan membolehkan anda menggunakan fail penyembuhan Chromadb dari storan.

Sekarang pemuatan berat kami telah selesai, masa untuk menanyakan laporan dan berehat.

Data Kewangan Pertanyaan dengan Gemini 2.0

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.

Menetapkan Gemini-2.0

 dari llama_index.llms.gemini import Gemini

llm = gemini (api_key = gemini_api_key, model_name = "model/gemini-2.0-flash")
Salin selepas log masuk

Memulakan enjin pertanyaan menggunakan Gemini 2.0 dengan indeks vektor

 query_engine = vector_index.as_query_engine (llm = llm, persamaan_top_k = 5)
Salin selepas log masuk

Pertanyaan dan tindak balas exa mple

Di bawah ini kami mempunyai banyak pertanyaan dengan respons yang berbeza:

Pertanyaan-1

 Response = query_engine.Query ("Apakah pendapatan pada tahun 2022 berakhir 31 Disember?")

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Imej yang sepadan dari laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-2

 respons = query_engine.query (
    "Apakah kerugian bersih yang disebabkan oleh Motossport Games Inc. pada tahun 2022 yang berakhir pada 31 Disember?"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Imej yang sepadan dari laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-3

 respons = query_engine.query (
    "Apakah kecairan dan kebimbangan syarikat pada 31 Disember 2023"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-4

 respons = query_engine.query (
    "Meringkaskan pertimbangan utama berbanding ejen syarikat?"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Corresonding Image dari Laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-5

 respons = query_engine.query (
    "Meringkaskan kerugian bersih bagi setiap bahagian biasa syarikat dengan data kewangan?"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Corresonding Image dari Laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-6

 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))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Imej yang sepadan dari laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-7

 respons = query_engine.query (
    "Meringkaskan aset tidak ketara pada 21 Disember, 2023 Syarikat dengan data kewangan?"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan-8

 respons = query_engine.query (
    "Apakah pajakan syarikat dengan data kewangan tahunan?"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Imej yang sepadan dari laporan:

Membina Sistem Pengambilan Laporan Kewangan

Pertanyaan Tempatan Menggunakan Llama 3.2

Leverage Llama 3.2 Secara tempatan untuk menanyakan laporan kewangan tanpa bergantung pada model berasaskan awan.

Menetapkan Llama 3.2: 1b

 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)
Salin selepas log masuk

Pertanyaan-9

 respons = local_query_engine.Query (
    "Ringkasan carta perbelanjaan terakru dan liabiliti lain menggunakan data kewangan syarikat"
)

cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Corresonding Image dari Laporan:

Membina Sistem Pengambilan Laporan Kewangan

Routing pertanyaan lanjutan dengan llamaindex

Kadang -kadang, kita memerlukan pengambilan terperinci dan meringkaskan pandangan. Kita boleh melakukan ini dengan menggabungkan kedua -dua indeks vektor dan indeks ringkasan.

  • Indeks vektor untuk pengambilan dokumen yang tepat
  • Indeks ringkasan untuk ringkasan kewangan ringkas

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)
Salin selepas log masuk

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
Salin selepas log masuk

Sekarang buat enjin pertanyaan ringkasan

 summary_query_engine = summary_index.as_query_engine (
    llm = llm, response_mode = "tre_summarize", use_async = true
)
Salin selepas log masuk

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."
    ))
)
Salin selepas log masuk

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,
)
Salin selepas log masuk

Sistem pertanyaan lanjutan kami telah disediakan sepenuhnya, kini menanyakan enjin pertanyaan maju kami yang baru disukai.

Pertanyaan-10

 respons = adv_query_engine.query (
    "Meringkaskan carta yang menggambarkan pendapatan syarikat."
)
cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Anda dapat melihat bahawa penghala pintar kami akan memutuskan untuk menggunakan alat ringkasan kerana dalam pengguna pertanyaan meminta ringkasan.

Pertanyaan-11

 Response = adv_query_engine.Query ("Berapakah jumlah aset syarikat?")
cetak (str (respons))
Salin selepas log masuk

Respons

Membina Sistem Pengambilan Laporan Kewangan

Dan di sini penghala memilih alat vektor kerana pengguna meminta maklumat khusus, bukan ringkasan.

Semua kod yang digunakan dalam artikel ini ada di sini

Kesimpulan

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.

Takeaways utama

  • Sistem pengambilan dokumen berkuasa LLM secara drastik dapat mengurangkan masa yang dihabiskan untuk menganalisis laporan kewangan yang kompleks.
  • Pendekatan hibrid menggunakan awan dan LLM tempatan memastikan cara yang berkesan, privasi, dan fleksibel untuk mereka bentuk sistem.
  • Rangka Kerja Modular Llamaindex membolehkan cara mudah untuk mengautomasikan aliran kerja RAG laporan kewangan
  • Sistem jenis ini boleh disesuaikan untuk domain yang berbeza seperti dokumen undang -undang, laporan perubatan dan pemfailan peraturan, yang menjadikannya penyelesaian kain serba boleh.

Soalan yang sering ditanya

Q 1. Bagaimanakah sistem mengendalikan laporan kewangan yang berbeza?

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan