财务报告对于评估公司健康至关重要。它们跨越数百页,因此很难有效提取特定的见解。分析师和投资者花费数小时筛选资产负债表,损益表和脚注只是为了回答简单的问题,例如 - 2024年公司的收入是多少?随着LLM模型和向量搜索技术的最新进展,我们可以使用LlamainDex和相关框架自动化财务报告分析。这篇博客文章探讨了我们如何使用LlamainDex,Chromadb,Gemini2.0和Ollama来构建一个强大的金融抹布系统,该系统可以从冗长的报告中回答冗长的报告。
本文作为数据科学博客马拉松的一部分发表。
财务报告包含有关公司业绩的重要见解,包括收入,费用,负债和盈利能力。但是,这些报告庞大,漫长且充满了技术术语,使分析师,投资者和高管手动提取相关信息非常耗时。
财务报告检索系统可以通过启用自然语言查询来自动化此过程。用户可以简单地提出诸如“ 2023年的收入是什么? ”或“总结2023年的流动性问题”之类的问题,而不是通过PDF进行搜索。该系统迅速检索并总结了相关部分,节省了手动工作的时间。
对于项目实施,我们需要首先设置环境并安装所需的库:
我们将首先为我们的开发工作创建和Conda Env。
$ conda create -name finrag python = 3.12 $ conda激活Finrag
安装图书馆是任何项目实施的关键步骤:
$ pip安装骆驼索引 - 骆驼 - 索引 - 矢量 - chroma-chroma chromadb $ PIP安装Llama-index-llms-gemini Llama-index-llms-ollama $ pip安装骆驼 - 索引 - embeddings-gemini llama-index-embeddings-ollama $ pip安装python-dotenv nest-asyncio pypdf
现在,创建一个项目目录并创建一个名为.env的文件,然后在该文件上放置了所有API键,以进行安全的API密钥管理。
#on .env文件 Google_api_key =“ <your-api-key>”</your-api-key>
我们加载来自该.ENV文件的环境变量以安全地存储敏感的API密钥。这样可以确保我们的双子座API或Google API仍然受到保护。
我们将使用Jupyter笔记本进行项目。
创建一个Jupyter笔记本文件,然后逐步开始实现。
现在,我们将在下面加载API密钥:
导入操作系统 来自dotenv import load_dotenv load_dotenv() gemini_api_key = os.getEnv(“ google_api_key”) #仅检查.env是否正确访问。 #print(f“ gemini_api_key:{gemini_api_key}”)
现在,我们的环境准备就绪,因此我们可以进入下一个最重要的阶段。
从年度报告网站收集Motorsport Games Inc.财务报告。
在此处下载链接。
第一页看起来像:
该报告总共有123页,但我只是采用了报告的财务报表,并为我们的项目创建了新的PDF。
我怎么做? PYPDF库非常容易。
来自pypdf import pdfreader 来自pypdf import pdfwriter 读取器= pdfreader(“ nasdaq_msgm_2023.pdf”) writer = pdfwriter() #第66至104页有财务报表。 page_to_extract = range(66,104) page_num in Page_to_extract: writer.add_page(reader.pages [page_num]) output_pdf =“ Motorsport_games_financial_report.pdf” 使用开放(output_pdf,“ wb”)作为外档: writer.write(output_pdf) print(f“新的pdf创建:{output_pdf}”)
新报告文件只有38页,这将帮助我们快速嵌入文档。
在您的项目数据目录中,放置您的新创建的Motorsport_games_financial_report.pdf文件,该文件将为该项目索引。
财务报告通常采用PDF格式,其中包含广泛的表格数据,脚注和法律声明。我们使用LlamainDex的SimpleDirectoryReader加载这些文档并将其转换为文档。
来自llama_index.core导入simpledirectoryReader documents = simpleDirectoryReader(“ ./ data”).load_data()
由于报告作为单个文档非常大,因此我们将其拖入较小的块或节点。每个块对应于页面或部分,它有助于更有效地检索。
从副本导入deepcopy 来自llama_index.core.schema导入textnode def get_page_nodes(docs,saparator =“ \ n --- \ n”): “”“将每个文档分为分隔符中的页面节点。”“” 节点= [] 对于文档中的文档: doc_chunks = doc.text.split(分隔器) 对于doc_chunks中的doc_chunk: node = textnode( text = doc_chunk, 元数据= deepcopy(doc.metadata), ) nodes.append(节点) 返回节点
要了解文档摄入的过程,请参见下图。
现在,我们的财务数据已准备好进行矢量化和存储以进行检索。
我们将使用Chromadb进行快速,准确和本地矢量数据库。我们嵌入的财务文本表示形式将存储在Chromadb中。
我们初始化了矢量数据库,并使用Ollama进行局部嵌入生成的配置,并配置提名 - embed-Text模型。
进口Chromadb 来自llama_index.llms.gemini Import gemini 来自llama_index.embeddings.ollama进口ollamaemembedding 来自llama_index.vector_stores.Chroma Import Chromavector Stortore 来自llama_index.core导入设置 embed_model = ollamaembedding(model_name =“ nomic-embed-text”) chroma_client = Chromadb.persistentclient(路径=“ ./ Chroma_db”) chroma_collection = chroma_client.get_or_create_collection(“ financial_collection”) vector_store = chromavectorstore(chroma_collection = chroma_collection)
最后,我们使用LlamainDex的VectorStoreIndex创建了一个向量索引。该索引将我们的矢量数据库与LlamainDex的查询引擎联系起来。
来自llama_index.core导入vectorstoreindex,StorageContext Storage_Context = StorageContext.from_defaults(vector_store = vector_store) vector_index = vectorstoreindex.from_documents(documents = documents,storege_context = storege_context,embed_model = embed_model)
上面的代码将使用财务文本文档中的提名 - 内容文本创建矢量索引。这将需要时间,具体取决于您的本地系统规范。
完成索引后,您可以使用代码在必要时嵌入无需重新索引的代码。
vector_index = vectorstoreIndex.from_vector_store( vector_store = vector_store,embed_model = embed_model )
这将允许您使用存储中的Chromadb嵌入文件。
现在,我们已经完成了重负荷,是时候查询报告并放松了。
一旦我们的财务数据索引,我们就可以提出自然语言问题并获得准确的答案。为了查询,我们将使用与矢量数据库进行交互的Gemini-2.0 Flash模型来获取相关部分并生成洞察响应。
来自llama_index.llms.gemini Import gemini llm = gemini(api_key = gemini_api_key,model_name =“型号/gemini-2.0-flash”)
query_engine = vector_index.as_query_engine(llm = llm,samelity_top_k = 5)
下面我们有多个疑问,有不同的响应:
响应= query_engine.query(“截至12月31日截至2022年的收入是多少?”) 打印(str(响应))
报告中的相应图像:
响应= query_engine.query(Query)( “截至12月31日的2022年,Motossport Games Inc.的净亏损是什么?” ) 打印(str(响应))
报告中的相应图像:
响应= query_engine.query(Query)( “ 2023年12月31日公司的流动性和对公司的关注是什么” ) 打印(str(响应))
响应= query_engine.query(Query)( “总结公司的主要与代理商的考虑?” ) 打印(str(响应))
从报告中对照图像:
响应= query_engine.query(Query)( “总结使用财务数据的公司每股净亏损?” ) 打印(str(响应))
从报告中对照图像:
响应= query_engine.query(Query)( “总结物业和设备由截至2023年12月31日和2022年12月31日使用财务数据的余额组成?” ) 打印(str(响应))
报告中的相应图像:
响应= query_engine.query(Query)( “总结了2023年12月21日使用财务数据的无形资产?” ) 打印(str(响应))
响应= query_engine.query(Query)( “使用全年财务数据的公司的租赁是什么?” ) 打印(str(响应))
报告中的相应图像:
利用美洲驼3.2在本地查询财务报告,而无需依赖基于云的模型。
local_llm = ollama(model =“ llama3.2:1b”,request_timeout = 1000.0) local_query_engine = vector_index.as_query_engine(llm = local_llm,samelity_top_k = 3)
响应= local_query_engine.query(Query)( “使用公司财务数据的应计费和其他负债图表摘要” ) 打印(str(响应))
从报告中对照图像:
有时,我们需要详细的检索和总结的见解。我们可以通过组合向量索引和摘要索引来做到这一点。
我们已经构建了矢量索引,现在我们将创建一个摘要索引,该索引使用层次结构方法来汇总财务报表。
来自llama_index.core导入summaryIndex summary_index = summaryIndex(nodes = page_nodes)
然后集成RouterqueryEngine,该RouterqueryEngine可以根据查询类型有条件地决定是否从摘要索引或向量索引检索数据。
来自llama_index.core.tools导入queryenginetool 来自llama_index.core.query_engine.router_query_engine import routerqueryEngine 来自llama_index.core.selectors import llmsingleselector
现在创建摘要查询引擎
summary_query_engine = summary_index.as_query_engine( llm = llm,response_mode =“ tree_summarize”,use_async = true )
该摘要查询引擎进入摘要工具。向量查询引擎进入矢量工具。
#创建摘要工具 summary_tool = queryenginetool.from_defaults( query_engine = summary_query_engine, 描述=(( “对于与赛车运动公司有关的摘要问题有用。” ), ) #创建向量工具 vector_tool = queryenginetool.from_defaults( query_engine = query_engine, 描述=(( “对于从Motorsport Games Company检索特定环境有用。” ), )
现在完成了两个工具,我们通过路由器连接这些工具,因此当通过路由器查询屁股时,它将决定通过分析用户查询使用哪种工具。
#路由器查询引擎 adv_query_engine = RouterqueryEngine( llm = llm, selector = llmsingleselector.from_defaults(llm = llm), query_engine_tools = [summary_tool,vector_tool], 详细= true, )
我们的高级查询系统已完全设置,现在查询我们新偏爱的高级查询引擎。
响应= adv_query_engine.query(Query)( “总结了描述公司娱乐活动的图表。” ) 打印(str(响应))
您可以看到我们的智能路由器会决定使用摘要工具,因为在查询用户中要求摘要。
响应= adv_query_engine.query(“公司一年的总资产是多少?”) 打印(str(响应))
在这里,路由器选择向量工具,因为用户要求提供特定信息,而不是摘要。
本文中使用的所有代码都在这里
我们可以通过LlamainDex,Chromadb和Advanced LLM有效分析财务报告。该系统可实现自动财务见解,实时查询和强大的摘要。这种类型的系统使财务分析在投资,交易和开展业务期间更容易获得和有效地做出更好的决策。
答:该系统旨在通过将其分解成文本块,嵌入并将其存储在Chromadb中来处理任何结构化的财务文件。可以动态添加新报告,而无需完整的重新索引。
问2。是否可以扩展以生成财务图表和可视化?答:是的,通过整合matplotlib,pandas和简化,您可以看到诸如收入增长,净亏损分析或资产分配等趋势。
Q3。查询路由系统如何提高准确性?答:RouterqueryEngine自动检测查询是否需要汇总响应或特定的财务数据检索。这样可以减少无关紧要的输出并确保响应的精度。
问4。在此系统中,适合实时财务分析?答:可以,但这取决于矢量存储的更新的频率。您可以使用OpenAI嵌入API进行连续摄入管道,以动态地进行实时财务报告查询。
本文所示的媒体不由Analytics Vidhya拥有,并由作者酌情使用。
以上是建立财务报告检索系统的详细内容。更多信息请关注PHP中文网其他相关文章!