技术背景介绍
随着人工智能和大数据技术的不断发展,向量搜索引擎在处理文本和实现智能查询中发挥了重要的作用。SAP HANA Cloud Vector Engine 提供了一种高效的方式来存储和查询向量数据。本文将展示如何使用 SAP HANA Cloud Vector Engine 来构建一个自查询检索器,并展示其在实际场景中的应用。
核心原理解析
向量存储是一种将文档转换为高维向量,然后存储在数据库中的技术。通过与预定义的向量进行比较,可以快速检索出与查询语句最相似的文档。在本文中,我们将使用 SAP HANA Cloud Vector Engine 来创建一个自定义表,并结合 OpenAI 的嵌入模型来实现文档的存储和查询。
代码实现演示
环境配置
首先,需要配置连接 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,
)
创建自定义表
在 SAP HANA 数据库中创建一个包含向量数据的自定义表。
# 创建自定义表
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
)"""
)
)
添加文档数据
使用 OpenAI 的嵌入模型创建向量,并将文档数据添加到自定义表中。
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 Cloud Vector Engine 提供了一种高效存储和查询向量数据的方式,非常适用于需要快速响应和高一致性的大数据场景。例如:
- 文本检索和推荐系统
- 客户行为分析
- 智能搜索和问答系统
实践建议
- 确保向量数据的准确性和一致性。
- 定期清理和维护数据库,确保存储空间的优化。
- 结合具体业务场景,调整自查询检索器的参数和规则。
如果遇到问题欢迎在评论区交流。
—END—