Kay x Cybersyn x LangChain: Embedding SEC Filings for RAG

Kay x Cybersyn x LangChain:嵌入 SEC 文件用于 RAG

9 分钟阅读

编者按:本文由 Kay 团队与 Cybersyn 合作撰写。 金融数据处理非常困难。LangChain 上的 SEC Retriever – 由 Kay 和 Cybersyn 驱动 – 使开发者能够轻松地从 SEC 文件中检索上下文,用于其生成式和对话式代理。

金融文件蕴含着丰富的细致信息,这些信息经常在高风险场景中使用,从投资到企业战略。SEC 文件 是美国上市公司此类金融知识的常见来源。许多团队开始挖掘这些非结构化数据用于 LLM 用例,但遇到了多重挑战。

  • LLM 缺少上下文: LLM 的知识水平取决于最近一次训练的日期。金融市场变化迅速,开发者需要利用检索增强生成(RAG)为 LLM 提供最新的知识。此外,由于数据格式的原因,SEC 文件很难被搜索引擎索引。开发者随后选择基于与这些文件相关的衍生文章进行训练,但这可能会忽略源上下文和不太知名的公司。
  • 嵌入基础设施正在快速发展: 无论是在规划还是实施方面,RAG 的基础设施都很难做好。构建自己 RAG 管道的开发者面临着大量的选择。有超过 50 个向量数据库可供选择,MTEB 排行榜上嵌入模型的列表也在不断变化。每周都有新的嵌入和检索方法出现。当您尝试获取更多 GPU 容量并建立大规模离线批量嵌入管道时,情况会变得更加复杂;所有这些都发生在您试图控制计算成本的同时。
  • 金融文件非常复杂: 除了从晦涩的数据格式中提取数据外,金融文件还需要仔细的数据处理和分块。开发者需要尝试不同的方法来转换表格、确定相关实体并将它们链接到父章节。在检索这些文档时,对误报的容忍度很低,因为这些数字直接影响重要的决策。

许多团队都在内部构建完全相同的管道,从而推高了成本。这就是 LangChain 上的 SEC Retriever 的用武之地。在 Kay 和 Cybersyn 的驱动下,开发者可以轻松地从 SEC 文件中检索上下文,用于其生成式和对话式代理。

Kay 提供专门为 RAG 设计的数据 API。我们提供大型数据集的完全托管嵌入,因此开发者无需收集数据、生成嵌入和扩展检索。Cybersyn 是一家数据即服务公司,在 Snowflake Marketplace 上提供分析就绪的经济数据。Cybersyn 最初专注于企业和消费者在哪里花钱和时间,通过 Snowflake 提供多种数据产品,包括包含 SEC 文件的 LLM 训练数据集。Kay 进一步丰富、嵌入这些数据,并为其建立语义检索 API。在本博客中,我们将介绍如何开始使用此 API 以及其背后的基础设施概述。

开始使用

在 LangChain 中使用 Kay 非常简单直接。

首先,安装 Kay (pip install kay) 并在 Kay.ai 上获取您的免费 API 密钥。

其次,使用您需要的数据集初始化 KayAiRetriever。目前,我们索引了多个与公司相关的数据集。这些数据集包括金融文件、新闻稿、工程博客等(文档)。在本例中,我们将访问 10-K 和 10-Q 文件,并为给定的查询检索前 6 个块。

from langchain.retrievers import KayAiRetriever

retriever = KayAiRetriever.create(dataset_id="company", data_types=["10-K", "10-Q"], num_contexts=6)

从这里开始,一切都和往常一样。将此上下文插入到您现有的提示中,并将其传递给您最喜欢的 LLM。这是一个示例查询,它真正突显了嵌入式 SEC 数据的强大功能。

**Question**: What are patterns in Nvidia's financial performance over the past three quarters?

**Answer**: Based on the provided financial statements, here are some patterns in NVIDIA's financial performance over the past three quarters:

1. Cash Flows from Operating Activities: The net cash provided by operating activities has shown a consistent increase over the three quarters. It was $1,874 million in Q1 2023, $1,731 million in Q2 2023, and $1,288 million in Q3 2023.

2. Cash Flows from Investing Activities: The net cash provided by investing activities has fluctuated significantly. In Q1 2023, it was $2,612 million, indicating a positive cash flow. However, in Q2 2023, it was negative with a cash outflow of $8,244 million. In Q3 2023, it turned positive again with a cash inflow of $7,378 million.

3. Cash Flows from Financing Activities: The net cash provided by financing activities has also shown variation. In Q1 2023, it was $4,146 million, indicating a positive cash flow. In Q2 2023, it was negative with a cash outflow of $9,961 million. In Q3 2023, it remained negative but decreased to $2,610 million.

4. Acquisitions and Investments: NVIDIA has made acquisitions and investments in all three quarters, but the amounts have varied. In Q1 2023, the net cash used in investing activities was $1,272 million. In Q2 2023, it was a significant cash outflow of $8,244 million. In Q3 2023, it turned positive with a cash inflow of $7,378 million.

5. Payments related to Repurchases of Common Stock: NVIDIA made significant payments related to repurchases of common stock in Q2 2023, with a cash outflow of $8,826 million. This suggests a focus on returning value to shareholders through stock buybacks.

These patterns indicate fluctuations in cash flows from investing and financing activities, while operating cash flows have remained relatively stable. Acquisition and investment activities have also contributed to the variations in cash flows. Additionally, NVIDIA's focus on returning value to shareholders is evident through payments related to repurchases of common stock.

相比之下,尝试使用启用搜索的 LLM(如 ChatGPT、Bard 或 Perplexity)进行相同的查询。Kay 捕捉到了更多的细微差别,因为我们预先嵌入了所有这些数据,并为每个数据集和用例定制了我们的检索。这包括数据丰富、最先进的嵌入、查询理解以及下文基础设施部分中涵盖的许多其他主题。

用例

SEC 文件是大型的非结构化文档。它们捕捉了关于美国上市公司的关键信息。过去,所有这些数据都被压缩到几个僵化的表格中,导致大多数从业者错过了这些文件中的宝贵信号。现在,我们可以让分析师、审计师、投资者、高管、销售和营销团队在几秒钟内解析这些信息。以下是一些用户已经如何利用这些数据的示例。

分析财务绩效

“显示 X 公司过去五年的收入增长趋势。”

“比较 A 公司和 B 公司的债务权益比率。”

识别销售机会

“X 公司今年发布了哪些新的硬件产品?” “总结 A 公司的战略方向及其扩张计划。”

监控行业趋势

“X 公司正在利用哪些关键市场趋势?” “识别 A 公司和 B 公司之间定位的差异。”

合规性研究

“X 公司如何适应最近的 GDPR 指南?” “收购 A 公司有哪些潜在风险?”

幕后揭秘:基础设施

RAG 系统由三个基本组件组成:数据、表示和检索。在这种情况下,数据通常表示为嵌入。我们关于这些组件的决策直接影响性能。在 Kay,我们非常关注这些选择,并不断更新最新的技术。下图描述了每个组件中的一些关键流程。让我们来详细分析一下

收集数据

我们系统的基础是高质量的数据。所有美国上市公司都通过 SEC 的电子数据收集、分析和检索 (EDGAR) 系统提交其强制性文件。虽然这些数据可以通过 API 获取,但由于其多样的数据格式,处理和嵌入这些数据可能具有挑战性。这就是 Cybersyn 发挥作用的地方。

Cybersyn 从难以获取、清理或连接的专有和公共数据集中构建衍生数据产品。他们的一个数据产品是 LLM Training Essentials,其中包括 SEC 文件以及其他几个政府数据集。这为我们带来了多项好处

  • Cybersyn 将非结构化的 TXT 和 XBRL 数据转换为关系数据库,从而无需从 Filing PDF 文件中设置您自己的 OCR 和文本提取管道。
  • 他们还提供额外的元数据,帮助用户使用通用的公司标识符(包括 CIK、EIN、LEI、PermID 和 OpenFIGI)连接公司。这在后续的检索中被证明非常有用。
  • 然后,这些数据被加载到 Snowflake Marketplace 上。Snowflake 确保对这些数据的安全且完全受控的访问,允许用户使用 SQL 查询读取和与之交互。这大大提高了访问的便捷性。
  • Cybersyn 还负责定期更新这些数据,认识到其对于涉及 SEC 数据的用例的时间敏感性。

与 Cybersyn 和 Snowflake 的合作极大地提高了 Kay 的数据质量、可访问性和可靠性。我们强烈建议您探索他们所有的数据产品。

生成嵌入

一旦我们有了原始文本数据,我们就开始数据丰富。我们专注于创建两种类型的元数据。

  • 公司元数据:我们获取公司信息,例如股票代码、行业、地点、摘要、网站等。这些数据帮助我们规范化和分组公司,以便进行高效检索。
  • 文档元数据:我们还提取特定于每个文档的信息,例如不同的章节、所有时间和日期的提及以及使用 NER 识别的重要实体。这些元数据进一步增强了检索。其中一些与块一起嵌入,另一些用于过滤。

下一步是选择嵌入模型。首先,我们很快决定从 OpenAI 嵌入 API 转向自托管开源模型。OSS 嵌入模型是最先进的,可以完全控制扩展,更便宜,并为后续的微调功能打开了大门。这对于我们快速迭代和后续扩展能力至关重要。在 OSS 模型中,在对该数据集的不同用例进行内部评估后,我们选择了 gte-base,它是当前 排行榜 上的顶级模型之一。

为了处理 SEC 数据,我们基于章节实施动态可变分块,确保使用句子将块大小限制在平均 1500 个字符以内。我们通过让 LLM 以自然语言总结表格来不同地处理包含表格的块。在此过程结束时,我们拥有所有数据和工具来开始分块和嵌入。对于离线批量嵌入作业,我们利用了 Ray 的并行化框架。Ray 易于设置,效果良好,并且具有可靠的支持。它使我们能够在 15 分钟内分块和嵌入超过 2000 万个嵌入。

最后,我们将生成的嵌入推送到向量数据库中。我们使用 HNSW 进行向量索引,BM25 进行文本索引,这对于这些数据类型来说是相当标准的。一个值得注意的观察是,一些向量数据库执行同步写入和索引操作,导致写入吞吐量显着下降。为了解决这个问题,我们强烈建议过渡到增量索引。

优化检索

检索不仅仅是对您的向量数据库进行默认调用。我们可以做很多事情来减少候选集并更好地对块进行排序。在这个组件中,我们的目标是使检索过程尽可能准确和高效。

首先,我们构建了自己的由 LLM 驱动的查询意图分类器 (QIC)。给定一个查询,它会提取所有可以帮助我们在元数据上过滤块或为我们提供一些新信息以验证混合搜索的实体。这就是我们强制 LLM 进行结构化输出的地方(致敬 Instructor)。 我们还使用字符串匹配库对最终响应进行健全性检查,以避免遗漏可能存在于我们的元数据中的实体,例如 nike 和 nike inc.。事实证明,对每个元数据进行规范化本身就是一项巨大的内部工作,需要做好。

除了分类器之外,我们还开始生成幻觉搜索查询以进行检索,并对最相关的答案进行投票。虽然这会产生延迟成本,但这是一个持续进行的实验,旨在了解这如何提高准确性。

在获得一系列搜索查询以及相关过滤器后,我们通过使用这些过滤器缩小潜在候选范围来启动检索过程。接下来,我们根据 QIC 识别出的任何需要关键词搜索的重要实体的存在情况,在向量搜索和混合搜索之间动态选择。对于向量搜索,我们使用默认的余弦距离。

一旦我们获得了前 k 个检索到的块,我们就应用 Cohere 的 Re-rank 并记录上下文相关性得分的对数。这些分数帮助我们设置人工评估任务,以了解用户如何直观地理解这些分数。在此期间,我们将继续进行实验,以不断改进上下文相关性得分的分布。

资源和后续步骤

RAG 显然是一个不断发展的过程,需要持续致力于优化。我们分享我们如何处理这个技术栈的动机是为了提高透明度,分享我们的学习成果,并欢迎反馈,以便我们能够继续改进公共数据集的检索。我们使用的策略并非一成不变,我们很乐意您尝试我们的 SEC retriever 并分享您的想法。欢迎在 cal.com/kaydotai/chat 上聊天和交流心得。

以下是一些深入了解的资源

另外,温馨提示:LangChain 用户在未来 3 个月内可获得 10,000 次免费 Kay 请求 ⚡️