在大数据分析和人工智能的时代,SAP HANA Cloud Vector Engine以其强大的支持向量数据处理能力被越来越多的企业所采纳。本文将深入探讨如何在SAP HANA中创建一个自查询机制,并演示其在处理文档和元数据方面的强大功能。
技术背景介绍
SAP HANA是一个基于内存的数据处理平台,具有高速的数据处理能力。为了适应现代AI应用场景,SAP HANA引入了Vector Engine,使得在数据库中进行复杂的矢量运算和查询变得更加高效。在这篇文章中,我们将展示如何利用SAP HANA Vector Engine通过Python与OpenAI的语言模型进行交互,构建一个可以执行自查询任务的矢量存储系统。
核心原理解析
自查询机制的核心在于将自然语言查询转换为数据库能够理解和处理的结构化查询。通过OpenAI的语言模型,我们能够生成这些结构化查询,并通过SAP HANA的Vector Engine执行这些查询以检索相关的文档。
代码实现演示
下面我们将详细展示如何在SAP HANA上实现一个自查询系统。该系统可以存储文档数据及其元数据,并实现基于自然语言的查询。
连接并设置HANA数据库
首先,我们需要连接到SAP HANA数据库并创建一个用于存储数据的自定义表。
import os
from hdbcli import dbapi
# Use connection settings from the environment
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,
)
# Create custom table with necessary attributes
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()
# Prepare some test documents
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"],
)
# Delete already existing documents from the table
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,
)
# Use the retriever to prepare a (self) query for a person
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)
应用场景分析
这种自查询机制在许多场景中都极具实用性,例如在人力资源管理系统中检索员工数据,或在客户关系管理系统中进行客户信息查询。通过向量处理和自然语言查询,用户能够以更自然的方式进行数据交互,极大提升了系统的使用体验。
实践建议
在实际应用中,确保数据的矢量化处理和元数据的准确性非常重要。建议使用最新的嵌入技术和模型来提高查询精度。同时,良好的数据库维护和安全策略也是系统成功部署与运行的关键。
结束语:如果遇到问题欢迎在评论区交流。
—END—