在金融服務行業,投資組合經理和研究分析師努力篩選大量數據,以在投資中獲得競爭優勢,做出明智的決策需要訪問最相關的數據,并能夠快速合成和解釋這些數據。
傳統上,賣方分析師和基本投資組合經理會專注于一小部分公司,仔細檢查財務報表、盈利通知和公司文件。通過系統分析更大的交易領域的金融文檔可以發現更多見解。由于此類任務的技術和算法難度,直到最近,只有成熟的量化交易公司才能對廣泛的交易領域的轉錄進行系統分析。
與大型語言模型(LLM)在金融 NLP 任務中的功能相比,使用傳統自然語言處理(NLP)方法(如詞袋、情感字典和詞統計)完成這些任務的性能通常低于大型語言模型(LLM)。此外,LLM還在醫學文檔理解、新聞文章摘要和法律文檔檢索等領域展示了出色的性能。
借助 AI 和 NVIDIA 技術,賣方分析師、基礎交易員和零售交易員可以顯著加速其研究工作流程,從金融文檔中提取更細致入微的見解,并覆蓋更多的公司和行業。通過采用這些先進的 AI 工具,金融服務部門可以增強數據分析能力,節省時間并提高投資決策的準確性。根據 NVIDIA 2024 金融服務業 AI 現狀 調查報告,37% 的受訪者正在探索用于報告生成、合成和投資研究的生成式 AI 和 LLM,以減少重復性手動工作。
在本文中,我們將向您展示一個端到端演示,介紹如何構建 AI 助手,以使用 NVIDIA NIM 推理微服務從收益電話會議成績單中提取見解,從而實現一個 檢索增強生成(RAG) 系統。我們將重點介紹如何利用先進的 AI 技術加速工作流程,發現隱藏的見解,并最終增強金融服務行業的決策流程。
使用 NIM 分析收益電話記錄的轉錄
收益電話會議尤其是投資者和分析師的重要來源,為公司提供了溝通重要財務和業務信息的平臺,這些電話會議提供了有關行業、公司產品、競爭對手以及最重要的業務前景的見解。
通過分析收益電話會議成績單,投資者可以收集有關公司未來收益和估值的寶貴信息。收益電話會議成績單已成功用于生成 Alpha 二十多年來。有關更多詳細信息,請參閱自然語言處理 – 第一部分:基礎知識和自然語言處理 – 第二部分:股票選擇。
第 1 步:數據?
在此演示中,我們使用 2016 年至 2020 年期間 NASDAQ 財報電話會議的成績單進行分析。這份財報電話會議成績單數據集可從 Kaggle 下載。
在評估中,我們使用了由 10 家公司組成的子集,然后隨機選擇了 63 份文稿進行手動注釋。對于所有文稿,我們回答了以下問題:
- 公司的主要收入來源是什么?在過去一年中,這些來源有何變化?
- 公司的主要成本構成是什么?在報告期間,這些成本構成有何波動?
- 有哪些資本支出?這些支出如何支持公司的發展?
- 執行了哪些分紅或股票回購?
- 成績單中提到了哪些重大風險?
這總共會生成 315 個問答對,全都是使用結構化的JSON 格式回答的。例如:
問題:公司的主要收入來源是什么?在過去一年中,這些來源有何變化?
答案:
{ "Google Search and Other advertising" : { "year_on_year_change" : "-10%" , "absolute_revenue" : "21.3 billion" , "currency" : "USD" }, "YouTube advertising" : { "year_on_year_change" : "6%" , "absolute_revenue" : "3.8 billion" , "currency" : "USD" }, "Network advertising" : { "year_on_year_change" : "-10%" , "absolute_revenue" : "4.7 billion" , "currency" : "USD" }, "Google Cloud" : { "year_on_year_change" : "43%" , "absolute_revenue" : "3 billion" , "currency" : "USD" }, "Other revenues" : { "year_on_year_change" : "26%" , "absolute_revenue" : "5.1 billion" , "currency" : "USD" } } |
使用 JSON 可以在不依賴主觀語言理解方法的情況下評估模型性能,這些方法如 LLM 作為判斷,可能會在評估中引入不必要的偏差。
第 2 步:NVIDIA NIM?
此演示使用 NVIDIA NIM,這是一套旨在加速企業 生成式 AI 部署的微服務。有關更多詳細信息,請參閱 NVIDIA NIM 提供用于大規模部署 AI 模型的優化推理微服務。NIM 支持各種 AI 模型(包括 NVIDIA 優化的社區和商業合作伙伴模型),可確保利用行業標準 API 在本地或云端進行無縫、可擴展的 AI 推理。
準備投入生產時,NIM 只需一個命令即可部署,以便使用標準 API 和幾行代碼輕松集成到企業級 AI 應用程序中。基于包括 NVIDIA TensorRT、TensorRT-LLM 和 PyTorch 等推理引擎在內的可靠基礎構建,NIM 旨在基于底層硬件提供出色的開箱即用性能,從而實現無縫 AI 推理。同時,具有 NIM 的自托管模型支持保護客戶和企業數據,這是 RAG 應用程序的常見要求。
第 3 步:在 NVIDIA API 目錄上設置?
可以使用 NVIDIA API 目錄訪問 NIM。只需注冊 NVIDIA API 密鑰(在 API 目錄中,單擊“獲取 API 密鑰”即可進行設置:API catalog)。在本文中,我們將其存儲在環境變量中:
export NVIDIA_API_KEY=YOUR_KEY |
LangChain 提供了一個便于 NGC 集成的軟件包。本教程將使用端點運行嵌入、重新排序和聊天模型,以 NIM 為對象。要重現代碼,您需要安裝以下 Python 依賴項:
langchain - nvidia - ai - endpoints = = 0.1 . 2 faiss - cpu = = 1.7 . 4 langchain = = 0.2 . 5 unstructured[ all - docs] = = 0.11 . 2 |
第 4 步:使用 NIM 構建 RAG 管道?
RAG 是一種通過將從大型語料庫中檢索相關文檔與文本生成相結合來增強語言模型的方法。
RAG 的第一步是向量化您的文檔集合。這包括將一系列文檔拆分成較小的塊,然后使用 Embedder 模型將每個塊轉換為神經網絡嵌入(向量),最后將其存儲在一個 向量數據庫。 我們將針對每個收益調用轉錄執行此操作:
import os from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import TextLoader from langchain.vectorstores import FAISS from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings #?Initialise the embedder that converts text to vectors transcript_embedder = NVIDIAEmbeddings(model = 'nvidia/nv-embed-v1' , truncate = 'END' ) #?The document we will be chunking and vectorizing transcript_fp = "Transcripts/GOOGL/2020-Feb-03-GOOGL.txt" raw_document = TextLoader(transcript_fp).load() #?Split the document into chunks of 1500 characters each text_splitter = RecursiveCharacterTextSplitter(chunk_size = 3000 , chunk_overlap = 200 ) documents = text_splitter.split_documents(raw_document) #?Vectorise each chunk into a separate entry in the database vectorstore = FAISS.from_documents(documents, transcript_embedder) vector_store_path = "vector_db/google_transcript_2020_feb.pkl" try : os.remove(vector_store_path) except OSError: pass vectorstore.save_local(vector_store_path) |
構建矢量化數據庫后,最簡單的 RAG 流程如下所示:
- 用戶輸入查詢。例如輸入“What are the company’s main revenue sources?”
- The embedder 模型將查詢嵌入到向量中,然后通過矢量化的文檔數據庫搜索最相關的 Top-K 塊(例如 Top-30)。
- 然后,重新排序模型(也稱為交叉編碼器)會輸出每個查詢文檔對的相似度分數。此外,元數據還可用于幫助提高重新排序步驟的準確性。此分數用于重新排序嵌入程序根據與用戶查詢的相關性檢索的 Top-K 文檔,然后可以應用進一步的過濾,僅保留 Top-N(例如 Top-10)文檔。
- 然后,最相關的 Top-N 文檔與用戶查詢一起傳遞到 LLM。檢索到的文檔用作模型的答案的背景,以便奠定基礎。

請注意,可以進行修改以提高模型的答案準確性,但現在我們將繼續使用最簡單的穩健方法。
請考慮以下用戶查詢和所需的 JSON 格式:
question = "What are the company’s primary revenue streams and how have they changed over the past year?" json_template = """ {"revenue_streams": [ { "name": "<Revenue Stream Name 1>", "amount": <Current Year Revenue Amount 1>, "currency": "<Currency 1>", "percentage_change": <Change in Revenue Percentage 1> }, { "name": "<Revenue Stream Name 2>", "amount": <Current Year Revenue Amount 2>, "currency": "<Currency 2>", "percentage_change": <Change in Revenue Percentage 2> }, // Add more revenue streams as needed ] } """ user_query = question + json_template |
將使用 JSON 模板,以便在管道后續階段,LLM 知道輸出答案時使用有效的 JSON,而非純文本。如步驟 1 中所述,使用 JSON 可以以客觀方式自動評估模型答案。如果首選更具對話式的風格,則可以刪除該選項。
要使用戶查詢符合上下文,請初始化 Embedder 和 Reranker,以便檢索相關文檔并對其進行排序:
from langchain_nvidia_ai_endpoints import NVIDIARerank from langchain.retrievers.contextual_compression import ContextualCompressionRetriever #?How many retrieved documents to keep at each step top_k_documents_retriever = 30 top_n_documents_reranker = 5 #?Initialie retriever for vector database retriever = vectorstore.as_retriever(search_type = 'similarity' , search_kwargs = { 'k' : top_k_documents_retriever}) # Add a reranker to reorder documents by relevance to user query reranker = NVIDIARerank(model = "ai-rerank-qa-mistral-4b" , top_n = top_n_documents_reranker) retriever = ContextualCompressionRetriever(base_compressor = reranker, base_retriever = retriever) #?Retrieve documents, rerank them and pick top-N retrieved_docs = retriever.invoke(user_query) #?Join all retrieved documents into a single string context = "" for doc in retrieved_docs: context + = doc.page_content + "\n\n" |
然后,在檢索相關文檔時,可以將它們與用戶查詢一起傳遞給 LLM。我們使用的是Llama 3 70B NIM:
from langchain_nvidia_ai_endpoints import ChatNVIDIA PROMPT_FORMAT = """" Given the following context: #################### {context} #################### Answer the following question: {question} using the following JSON structure: {json_template} For amounts don't forget to always state if it's in billions or millions and "N/A" if not present. Only use information and JSON keys that are explicitly mentioned in the transcript. If you don't have information for any of the keys use "N/A" as a value. Answer only with JSON. Every key and value in the JSON should be a string. """ llm = ChatNVIDIA(model = "ai-llama3-70b" , max_tokens = 600 , temperature = 0 ) llm_input = PROMPT_FORMAT. format ( * * { "context" : context, "question" : question, "json_template" : json_template }) answer = llm.invoke(llm_input) print (answer.content) |
運行此代碼將生成針對用戶查詢的 JSON 結構化答案。現在可以輕松修改代碼,以讀取多個文稿并回答不同的用戶查詢。
第 5 步:評估?
要評估檢索步驟的性能,請使用前面描述的帶注釋的問答對,將真值 JSON 與預測的 JSON 逐鍵進行比較,考慮以下真值示例:
"Google Cloud" : { "year_on_year_change" : "43%" , "absolute_revenue" : "3 billion" , "currency" : "N/A" } |
預測如下所示:
"Google Cloud" : { "year_on_year_change" : "43%" , "absolute_revenue" : "N/A" , "currency" : "USD" } |
三種可能的結果是:
- 真陽性(TP): 真值和預測匹配,沒有要提取的值。對于上一個示例,prediction for
year_on_year_change
是 TP。 - 誤報(FP):真值為
“N/A”
,換言之,沒有要提取的值,但預測會產生一個值的幻覺;例如,在前面的示例中,貨幣預測就是 FP。 - 假陰性(FN):真值存在,但預測未能捕獲該值。在上一個示例中,prediction for
absolute_revenue
是 FP。
測量這些結果后,接下來計算以下三個主要指標:
- 回想率 = TP/ (TP + FN):高回想率意味著我們的模型會返回越來越多的相關結果。
- 精度 = TP/(TP+FP):我們的模型返回的相關結果與無關結果的比率越高,精度就越高。
- F1 分數 = (2 * 精度 * 召回) / (精度 + 召回):F1 分數是精度和召回的調和平均值。
在對某些屬性進行字符串比較時,用戶可能希望在匹配非數字值方面保持部分靈活性。例如,考慮有關收入來源的問題,其中一個真實答案是“數據中心”,模型輸出“數據中心”。精確匹配評估會將其視為不匹配。要在這種情況下實現更可靠的評估,請使用 Python 默認的 difflib
進行模糊匹配。
import difflib def get_ratio_match(gt_string, pred_string): if len (gt_string) < len (pred_string): min_len = len (gt_string) else : min_len = len (pred_string) matcher = difflib.SequenceMatcher( None , gt_string, pred_string, autojunk = False ) _, _, longest_match = matcher.find_longest_match( 0 , min_len, 0 , min_len) # Return the ratio of match with ground truth return longest_match / min_len |
對于評估,如果字符串屬性的相似度比高于 90%,則將其視為匹配。
表 1 根據我們的手動標注數據顯示了兩個常用開源模型系列(Mistral AI Mixtral 模型和 Meta Llama 3 模型)的結果對于這兩個模型系列,降低參數數量會導致性能明顯下降訪問 NVIDIA API 目錄,體驗這些 NIM。
方法 | F1 | 精度 | 回顧 | |
Llama 3 70B | 84.4% | 91.3% | 78.5% | |
Llama 3 8B | 75.8% | 85.2% | 68.2% | |
Mixtral 8x22B | 回復在簡體中文中,不加解釋。 | 84.4% | 91.9% | 78.0% |
Mixtral 8x7B Reply in Simplified Chinese 以無解釋. |
62.2% | 80.2% | 50.7% |
Mixtral-8x22B 的性能似乎與 Llama 3 70B 大致相當。但是,對于這兩個模型系列而言,減少參數數量確實會導致性能顯著下降,其中 Recall 的下降最為明顯。這經常出現一個權衡,即在選擇更高的準確性與更高的硬件要求之間。
在大多數情況下,可以通過使用特定領域的數據微調 Embedder、Reranker 或 LLM(在本例中,使用通話記錄),在不增加參數數量的情況下提高模型的準確性。
Embedder 外形小巧,因此微調速度最快,且最具成本效益。有關詳細說明,請參閱 NVIDIA NeMo 文檔。此外,NVIDIA NeMo 簡化并提高了微調有效版本 LLM 的效率。
用戶的主要影響
此演示旨在從收益電話會議成績單中提取見解。通過利用先進的 AI 技術,如 NIM,現在可以快速準確地從收益電話會議成績單中檢索信息。該 AI 產品在最密集的文檔和數據分析過程中為多種類金融研究人員、分析師、顧問和基礎投資組合經理提供幫助,使金融專業人員能夠將更多時間用于戰略決策或與客戶溝通。
例如,在資產管理領域,投資組合經理可以使用該助手快速合成大量收益調用中的見解,從而改進投資策略和結果。在保險行業,AI 助手可以分析公司報告中的財務狀況和風險因素,從而改進承銷和風險評估流程。在基礎交易和零售交易中,該助手可以幫助系統信息提取,以確定市場趨勢和情緒變化,從而為未來交易使用更詳細的信息。
即使在銀行業,它也可以通過分析潛在貸款接收者的收益調用來評估其財務穩定性。最終,這項技術提高了效率、準確性和做出數據驅動決策的能力,為用戶在各自市場中提供競爭優勢。
訪問 NVIDIA API 目錄,查看所有可用的 NIM,并嘗試 LangChain 的便捷集成,看看什么方法最適合您自己的數據。
?