[`SAP HANA Cloud Vector Engine` 探索:在云中构建高效的向量数据库]

68 阅读3分钟

引言

SAP HANA Cloud Vector Engine 是一个强大且灵活的工具,用于在云环境中处理和存储向量数据。它结合了 SAP HANA 的快速处理能力与现代向量数据库需求,是构建复杂 AI 应用程序的理想选择。本篇文章将介绍如何在 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
        )"""
    )
)

添加文档到向量数据库

使用 OpenAIEmbeddings 将文档添加到我们的向量数据库中,并准备进行后续的自查询。

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)

查看构建的查询

查看如何构建查询并将其翻译为符合 HANA 向量存储的查询格式。

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))

常见问题和解决方案

  • 连接问题: 确保所有的环境变量设置正确,并且网络允许访问 SAP HANA 服务器。某些地区可能需要使用 API 代理服务来提高访问稳定性。

  • 性能问题: 自查询机制可能会在复杂查询下出现性能问题,建议在开发和调试时优化表结构和查询策略。

总结和进一步学习资源

在这篇文章中,我们探索了如何在 SAP HANA 中设置向量存储,并使用自查询机制来提高数据检索的效率。这仅仅是向量存储功能的入门,您可以进一步探索以下资源以扩展您对 SAP HANA 的应用:

参考资料

  1. SAP HANA Cloud Documentation
  2. LangChain Community and Core Libraries
  3. OpenAI Embeddings and LLM Integration Guide

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

---END---