引言
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 的应用:
参考资料
- SAP HANA Cloud Documentation
- LangChain Community and Core Libraries
- OpenAI Embeddings and LLM Integration Guide
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---