探索SAP HANA Cloud中的Vector Engine:从设置到自查询

83 阅读3分钟

引言

SAP HANA Cloud的Vector Engine为处理高维数据和执行复杂查询提供了强大能力。在本文中,我们将探讨如何在SAP HANA中设置向量存储,并利用其自查询能力实现智能数据检索。无论您是初学者还是有经验的开发者,这篇文章将为您提供实用知识和代码示例,帮助您更好地掌握HANA的向量功能。

主要内容

1. 设置SAP HANA Vector Store

首先,确保您已正确设置HANA数据库的连接环境变量。这些变量包括HANA_DB_ADDRESSHANA_DB_PORTHANA_DB_USERHANA_DB_PASSWORD

from hdbcli import dbapi

# 创建与HANA数据库的连接
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,
)

2. 创建自定义表

在数据库中创建一个自定义表,以存储我们的文档及其向量表示。

# 创建自定义表
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
    )
    """
)

3. 添加文档

使用langchain库将文档添加到HANA向量存储中。

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

# 创建HanaDB实例并添加文档
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)

4. 实现自查询功能

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

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)

5. 查询构建过程

深入了解查询是如何构建的,以提高自定义查询的能力。

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

常见问题和解决方案

  1. API访问限制:在某些地区使用API时可能会遇到网络限制。建议使用API代理服务以提高访问稳定性。

  2. 数据库连接问题:确保所有环境变量正确设置。如果问题仍然存在,请检查数据库的网络配置。

  3. 自查询不准确:确保SelfQueryRetriever的元数据字段信息和文档描述准确无误,以提高查询结果的准确性。

总结和进一步学习资源

通过本文,我们了解了如何在SAP HANA Cloud中设置和使用向量存储,以及如何利用自查询功能简化数据获取过程。想要深入学习,可以参考以下资源:

参考资料

  1. SAP HANA Cloud Official Documentation
  2. Langchain Library GitHub Repository

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

---END---