从头开始的特征存储:最小的工作实现

构建每个功能商店所需的五个组件,然后看看人工智能在哪里改变了设计。

来源:KDnuggets

简介

大多数团队都经历了一番艰难才发现他们需要一个特征存储。欺诈模型在笔记本中发挥作用,并在生产中悄然中断。支持代理给出通用答案,因为它不知道用户是谁。推荐管道在三个作业中重复相同的“30 天支出”计算,其中两个作业不一致。

特征存储是解决这些问题的基础设施。它定义一次特征,将它们存储为两种形状(一种用于训练,一种用于服务),并保持两者同步。我们将使用 DuckDB、Parquet、Redis 和 FastAPI 使用 Python 从头开始​​构建一个最小的数据库。然后我们将看看人工智能应用程序如何改变我们实际使用它的用途。

完整的代码足够短,我们将逐步介绍每个组件。

特征存储实际解决了什么问题

经典的观点是训练-服务偏差:构建训练集的 SQL 与推理时运行的代码路径不同,因此值会发生漂移。这个问题是真实存在的,离线加在线拆分是标准解决方案。

现代音调更广泛。大型语言模型 (LLM) 代理和检索增强生成 (RAG) 管道需要在推理时针对每个请求在 10 毫秒内获得结构化用户上下文。法学硕士不记得用户是谁。如果我们想要个性化的输出,我们必须将用户的计划层、最近的活动和帐户状态注入到提示中,并且我们需要一个能够快速且一致地返回这些值的系统。这正是特征商店的在线商店和检索 API 为我们提供的功能。

所以我们为两者构建。相同的五个组件处理预测机器学习用例和 LLM 上下文用例。

五个组成部分

  • 将功能定义为代码的功能注册表。
  • Parquet 上的离线存储,使用 DuckDB 进行查询,用于训练和回填。
  • Redis 上的在线商店,用于推理时的低延迟查找。
  • 将最新值从离线推送到在线的物化管道。
  • 1. 定义功能注册表

    结论