首页 > 科技周边 > 人工智能 > 建立财务报告检索系统

建立财务报告检索系统

Christopher Nolan
发布: 2025-03-21 10:08:12
原创
234 人浏览过

财务报告对于评估公司健康至关重要。它们跨越数百页,因此很难有效提取特定的见解。分析师和投资者花费数小时筛选资产负债表,损益表和脚注只是为了回答简单的问题,例如 - 2024年公司的收入是多少?随着LLM模型和向量搜索技术的最新进展,我们可以使用LlamainDex和相关框架自动化财务报告分析。这篇博客文章探讨了我们如何使用LlamainDex,Chromadb,Gemini2.0和Ollama来构建一个强大的金融抹布系统,该系统可以从冗长的报告中回答冗长的报告。

学习目标

  • 了解对有效分析的财务报告检索系统的需求。
  • 了解如何使用LlamainDex进行预处理和矢量化财务报告。
  • 探索Chromadb,用于构建一个可靠的矢量数据库进行文档检索。
  • 使用Gemini 2.0和Llama 3.2实施查询引擎进行财务数据分析。
  • 使用LlamainDex来发现高级查询路由技术,以增强见解。

本文作为数据科学博客马拉松的一部分发表

目录

  • 为什么我们需要财务报告检索系统?
  • 项目实施
  • 使用LlamainDex处理的文档
  • 用Chromadb构建矢量数据库
  • 使用Gemini 2.0查询财务数据
  • 使用Llama 3.2的本地查询
  • 与LlamainDex的高级查询路由
  • 结论
  • 常见问题

为什么我们需要财务报告检索系统?

财务报告包含有关公司业绩的重要见解,包括收入,费用,负债和盈利能力。但是,这些报告庞大,漫长且充满了技术术语,使分析师,投资者和高管手动提取相关信息非常耗时。

财务报告检索系统可以通过启用自然语言查询来自动化此过程。用户可以简单地提出诸如“ 2023年的收入是什么? ”或“总结2023年的流动性问题”之类的问题,而不是通过PDF进行搜索。该系统迅速检索并总结了相关部分,节省了手动工作的时间。

项目实施

对于项目实施,我们需要首先设置环境并安装所需的库:

步骤1:设置环境

我们将首先为我们的开发工作创建和Conda Env。

 $ conda create -name finrag python = 3.12

$ conda激活Finrag
登录后复制

步骤2:安装必需的Python库

安装图书馆是任何项目实施的关键步骤:

 $ 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
登录后复制

步骤3:创建项目目录

现在,创建一个项目目录并创建一个名为.env的文件,然后在该文件上放置了所有API键,以进行安全的API密钥管理。

 #on .env文件

Google_api_key =“ <your-api-key>”</your-api-key>
登录后复制

我们加载来自该.ENV文件的环境变量以安全地存储敏感的API密钥。这样可以确保我们的双子座API或Google API仍然受到保护。

我们将使用Jupyter笔记本进行项目。
创建一个Jupyter笔记本文件,然后逐步开始实现。

步骤4:加载API键

现在,我们将在下面加载API密钥:

导入操作系统
来自dotenv import load_dotenv

load_dotenv()

gemini_api_key = os.getEnv(“ google_api_key”)

#仅检查.env是否正确访问。
#print(f“ gemini_api_key:{gemini_api_key}”)
登录后复制

现在,我们的环境准备就绪,因此我们可以进入下一个最重要的阶段。

使用LlamainDex处理的文档

从年度报告网站收集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进行快速,准确和本地矢量数据库。我们嵌入的财务文本表示形式将存储在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查询财务数据

一旦我们的财务数据索引,我们就可以提出自然语言问题并获得准确的答案。为了查询,我们将使用与矢量数据库进行交互的Gemini-2.0 Flash模型来获取相关部分并生成洞察响应。

设置Gemini-2.0

来自llama_index.llms.gemini Import gemini

llm = gemini(api_key = gemini_api_key,model_name =“型号/gemini-2.0-flash”)
登录后复制

使用Gemini 2.0与矢量索引启动查询引擎

query_engine = vector_index.as_query_engine(llm = llm,samelity_top_k = 5)
登录后复制

Exa mple疑问和回应

下面我们有多个疑问,有不同的响应:

查询1

响应= query_engine.query(“截至12月31日截至2022年的收入是多少?”)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

报告中的相应图像:

建立财务报告检索系统

查询2

响应= query_engine.query(Query)(
    “截至12月31日的2022年,Motossport Games Inc.的净亏损是什么?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

报告中的相应图像:

建立财务报告检索系统

查询3

响应= query_engine.query(Query)(
    “ 2023年12月31日公司的流动性和对公司的关注是什么”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

查询4

响应= query_engine.query(Query)(
    “总结公司的主要与代理商的考虑?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

从报告中对照图像:

建立财务报告检索系统

查询5

响应= query_engine.query(Query)(
    “总结使用财务数据的公司每股净亏损?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

从报告中对照图像:

建立财务报告检索系统

查询6

响应= query_engine.query(Query)(
    “总结物业和设备由截至2023年12月31日和2022年12月31日使用财务数据的余额组成?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

报告中的相应图像:

建立财务报告检索系统

查询7

响应= query_engine.query(Query)(
    “总结了2023年12月21日使用财务数据的无形资产?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

查询8

响应= query_engine.query(Query)(
    “使用全年财务数据的公司的租赁是什么?”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

报告中的相应图像:

建立财务报告检索系统

使用Llama 3.2的本地查询

利用美洲驼3.2在本地查询财务报告,而无需依赖基于云的模型。

设置美洲驼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,samelity_top_k = 3)
登录后复制

查询9

响应= local_query_engine.query(Query)(
    “使用公司财务数据的应计费和其他负债图表摘要”
)

打印(str(响应))
登录后复制

回复

建立财务报告检索系统

从报告中对照图像:

建立财务报告检索系统

与LlamainDex的高级查询路由

有时,我们需要详细的检索和总结的见解。我们可以通过组合向量索引和摘要索引来做到这一点。

  • 精确文档检索的向量索引
  • 简明财务摘要的摘要索引

我们已经构建了矢量索引,现在我们将创建一个摘要索引,该索引使用层次结构方法来汇总财务报表。

来自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,
)
登录后复制

我们的高级查询系统已完全设置,现在查询我们新偏爱的高级查询引擎。

查询10

响应= adv_query_engine.query(Query)(
    “总结了描述公司娱乐活动的图表。”
)
打印(str(响应))
登录后复制

回复

建立财务报告检索系统

您可以看到我们的智能路由器会决定使用摘要工具,因为在查询用户中要求摘要。

查询11

响应= adv_query_engine.query(“公司一年的总资产是多少?”)
打印(str(响应))
登录后复制

回复

建立财务报告检索系统

在这里,路由器选择向量工具,因为用户要求提供特定信息,而不是摘要。

本文中使用的所有代码都在这里

结论

我们可以通过LlamainDex,Chromadb和Advanced LLM有效分析财务报告。该系统可实现自动财务见解,实时查询和强大的摘要。这种类型的系统使财务分析在投资,交易和开展业务期间更容易获得和有效地做出更好的决策。

关键要点

  • LLM动力文件检索系统可以大大减少分析复杂财务报告所花费的时间。
  • 使用云和本地LLM的混合方法确保了一种成本效益,隐私和设计系统的灵活方法。
  • LlamainDex的模块化框架提供了一种简单的方法来自动化财务报告抹布工作流程
  • 可以将这种类型的系统适用于不同领域,例如法律文档,医疗报告和监管文件,这使其成为一种多功能的破布解决方案。

常见问题

1。系统如何处理不同的财务报告?

答:该系统旨在通过将其分解成文本块,嵌入并将其存储在Chromadb中来处理任何结构化的财务文件。可以动态添加新报告,而无需完整的重新索引。

2。是否可以扩展以生成财务图表和可视化?

答:是的,通过整合matplotlib,pandas和简化,您可以看到诸如收入增长,净亏损分析或资产分配等趋势。

Q3。查询路由系统如何提高准确性?

答:RouterqueryEngine自动检测查询是否需要汇总响应或特定的财务数据检索。这样可以减少无关紧要的输出并确保响应的精度。

4。在此系统中,适合实时财务分析?

答:可以,但这取决于矢量存储的更新的频率。您可以使用OpenAI嵌入API进行连续摄入管道,以动态地进行实时财务报告查询。

本文所示的媒体不由Analytics Vidhya拥有,并由作者酌情使用。

以上是建立财务报告检索系统的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板