Skip to main content
SAP HANA Cloud Vector Engine 是一个完全集成到 SAP HANA Cloud 数据库中的向量存储。

安装

安装 @sap/hana-langchain 外部集成包,以及本笔记本中使用的其他包。

凭证

确保您的 SAP HANA 实例正在运行。从环境变量加载凭证,并使用您首选的 HANA 客户端创建连接。
了解更多关于 SAP HANA 的信息,请参阅 什么是 SAP HANA?。

初始化

要初始化一个 HanaDB 向量存储,您需要一个数据库连接和一个嵌入实例。SAP HANA Cloud Vector Engine 支持外部和内部嵌入。

使用外部嵌入

使用内部嵌入

或者,您可以直接在 SAP HANA 中使用其原生 VECTOR_EMBEDDING() 函数计算嵌入。如果您在 TypeScript 环境中提供内部嵌入支持,可以像传递 HanaDB 一样初始化并传递它。有关内部嵌入的更多信息,请参阅 SAP HANA VECTOR_EMBEDDING 函数。
注意:确保您的 SAP HANA Cloud 实例中启用了 NLP。
一旦您有了连接和嵌入实例,可以通过将它们传递给 HanaDB 并提供用于存储向量的表名来创建向量存储:

管理向量存储

创建向量存储后,我们可以通过添加和删除不同的项目来与之交互。

向向量存储添加项目

我们可以通过使用 addDocuments 函数向我们的向量存储添加项目。
添加带元数据的文档
使用 map merge 插入添加文档
注意 useMapMerge 仅允许用于 HanaInternalEmbeddings 实例。

从向量存储删除项目

查询向量存储

直接查询

相似度搜索

执行简单的相似度搜索并在元数据上过滤,可以按如下方式完成:

MMR 搜索

执行最大边际相关性(MMR)并在元数据上过滤的搜索,可以按如下方式完成:

将向量存储转换为检索器

您还可以将向量存储转换为检索器,以便在您的链中更轻松地使用。

距离相似度算法

HanaDB 支持以下距离相似度算法:
  • 余弦相似度(默认)
  • 欧几里得距离(L2)
您可以通过使用 distanceStrategy 参数在初始化 HanaDB 实例时指定距离策略。

创建 HNSW 索引

向量索引可以显著加快向量的 top-k 最近邻查询。用户可以使用 createHnswIndex 函数创建分层可导航小世界(HNSW)向量索引。 有关在数据库级别创建索引的更多信息,请参阅 官方文档。
如果未指定其他参数,将使用默认值 默认值:m=64, ef_construction=128, ef_search=200 默认索引名称将是:“<TABLE_NAME>_idx”

高级过滤

除了基本的基于值的过滤功能外,还可以使用更高级的过滤。下表显示了可用的过滤运算符。
使用 $ne, $gt, $gte, $lt, $lte 进行过滤
使用 $between, $in, $nin 进行过滤
使用 $like 进行文本过滤
使用 $contains 进行文本过滤
使用 $and, $or 进行组合过滤

重新排序结果

相似度搜索的结果可以通过将 rerank_config 字典传递给 similaritySearch 方法来进行重新排序。重新排序使用 SAP HANA 的 CROSS_ENCODE 函数和交叉编码模型执行。 rerank_config 字典支持以下字段:
  • query (string, 必填) — 用于重新排序的查询文本。如果未提供,将使用原始相似度搜索查询。
  • modelId (string, 必填) — 用于重新排序的交叉编码模型 ID。
  • topN (number, 可选) — 重新排序后返回的顶部结果数量。默认为 3。
  • rankFields (string[], 可选) — 要包含在重新排序中的元数据字段列表。指定时,这些字段将与内容连接起来进行评分。
注意: 确保您的 SAP HANA Cloud 实例中启用了 NLP,以使用重新排序功能。更多详情,请参阅 SAP HANA 数据库附加功能。

基本重新排序

使用 rerankConfig 参数执行带重新排序的相似度搜索:

带元数据字段的重新排序

使用 rankFields 在重新排序过程中包含元数据。当元数据包含应影响排名的相关信息时,这很有用:

带分数的重新排序

使用 similaritySearchWithScore 获取与文档一起的重新排序分数:

独立的 HanaReranker 重新排序

为了对重新排序过程有更多控制,您可以直接使用 HanaReranker 类作为文档压缩器。当您需要从任何来源重新排序文档,而不仅仅是相似性搜索结果时,这很有用:

用于检索增强生成

有关如何使用此向量存储进行检索增强生成(RAG)的指南,请参阅以下章节:

标准表与包含向量数据的自定义表

默认情况下,嵌入表包含三列:
  • VEC_TEXT:文档文本
  • VEC_META:文档元数据
  • VEC_VECTOR:嵌入向量
自定义表必须至少有三列,这些列与标准表的语义相匹配:
  • 用于文本/上下文的 NCLOB/NVARCHAR 列
  • 用于元数据的 NCLOB/NVARCHAR 列
  • 用于嵌入向量的 REAL_VECTOR 列
允许添加额外的列;确保它们接受新文档插入时的 NULL 值。
显示表 “LANGCHAIN_DEMO_NEW_TABLE” 中的列
显示插入文档在三个列中的值 由于 HANA 的 dbapi 驱动程序默认将向量列输出为 Buffer 对象,我们将创建一个辅助函数将函数转换为数字列表。
自定义表必须至少有三列,这些列与标准表的语义相匹配
  • 用于嵌入的文本/上下文的 NCLOB 或 NVARCHAR 类型列
  • 用于元数据的 NCLOB 或 NVARCHAR 类型列
  • 用于嵌入向量的 REAL_VECTOR 或 HALF_VECTOR 类型列
该表可以包含额外的列。当新 Documents 插入到表中时,这些额外的列必须允许 NULL 值。
向自定义表添加另一个文档,并对自定义表执行相似性搜索。

使用自定义列进行过滤性能优化

为了允许灵活的元数据值,所有元数据默认都存储为 JSON 格式在元数据列中。如果已知一些使用的元数据键和值类型,可以通过创建目标表时将键名作为列名,并通过 specificMetadataColumns 列表将它们传递给 HanaDB 构造函数来将它们存储在额外的列中。在插入期间,与这些值匹配的元数据键会被复制到特殊列中。过滤器会使用特殊列而不是元数据 JSON 列来处理 specificMetadataColumns 列表中的键。
特殊列对 langchain 接口的其余部分完全透明。一切如常,只是性能更高。

简单示例

加载示例文档 “state_of_the_union.txt” 并从中创建片段。 首先,安装 @langchain/textsplitters 包:
将加载的文档片段添加到表中。对于此示例,我们删除表中可能存在的任何先前内容,这些内容可能来自之前的运行。
执行查询以获取前两段最匹配的文档片段,这些片段是在上一步中添加的。 默认情况下,搜索使用 “Cosine Similarity”。
使用 “Euclidean Distance” 查询相同内容。结果应与 “Cosine Similarity” 相同。

最大边际相关性搜索 (MMR)

Maximal marginal relevance 优化查询的相似性以及选定文档之间的多样性。前 20 个(fetch_k)项目将从数据库中检索。然后 MMR 算法将找到最佳的 2 个(k)匹配项。

创建 HNSW 向量索引

向量索引可以显著加快向量的 top-k 最近邻查询。用户可以使用 createHnswIndex 函数创建分层可导航小世界(HNSW)向量索引。 有关在数据库级别创建索引的更多信息,请参阅 官方文档。
要点:
  • 相似性函数:索引的相似性函数默认为 余弦相似性。如果您想使用不同的相似性函数(例如,L2 距离),您需要在初始化 HanaDB 实例时指定它。
  • 默认参数:在 createHnswIndex 函数中,如果用户没有为 m、efConstruction 或 efSearch 等参数提供自定义值,将自动使用默认值(例如,m=64、efConstruction=128、efSearch=200)。这些值确保索引以合理的性能创建,而无需用户干预。

官方原文:src/oss/javascript/integrations/vectorstores/sap_hanavector.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026