Skip to content

Hologres

HologresVectorStore #

Bases: BasePydanticVectorStore

Hologres矢量存储。

Hologres是一站式实时数据仓库,可以支持高性能OLAP分析和高QPS在线服务。 Hologres支持矢量处理,并允许您使用矢量数据 来展示非结构化数据的特征。 https://www.alibabacloud.com/help/zh/hologres/user-guide/introduction-to-vector-processing

Source code in llama_index/vector_stores/hologres/base.py
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
class HologresVectorStore(BasePydanticVectorStore):
    """Hologres矢量存储。

    Hologres是一站式实时数据仓库,可以支持高性能OLAP分析和高QPS在线服务。
    Hologres支持矢量处理,并允许您使用矢量数据
    来展示非结构化数据的特征。
    https://www.alibabacloud.com/help/zh/hologres/user-guide/introduction-to-vector-processing"""

    # Hologres storage instance
    _storage: HologresVector = PrivateAttr()

    # Hologres vector db stores the document node's text as string.
    stores_text: bool = True

    def __init__(self, hologres_storage: HologresVector):
        """从Hologres存储实例构建。
您可以使用from_connection_string代替。
"""
        super().__init__()
        self._storage = hologres_storage

    @classmethod
    def from_connection_string(
        cls,
        connection_string: str,
        table_name: str,
        table_schema: Dict[str, str] = {"document": "text"},
        embedding_dimension: int = 1536,
        pre_delete_table: bool = False,
    ) -> "HologresVectorStore":
        """从连接字符串创建Hologres向量存储。

Args:
    connection_string:Hologres数据库的连接字符串
    table_name:持久化数据的表名
    table_schema:表列模式
    embedding_dimension:嵌入向量的维度大小
    pre_delete_table:是否在创建时清空表中的数据
"""
        hologres_storage = HologresVector(
            connection_string,
            ndims=embedding_dimension,
            table_name=table_name,
            table_schema=table_schema,
            pre_delete_table=pre_delete_table,
        )
        return cls(hologres_storage=hologres_storage)

    @classmethod
    def from_param(
        cls,
        host: str,
        port: int,
        user: str,
        password: str,
        database: str,
        table_name: str,
        table_schema: Dict[str, str] = {"document": "text"},
        embedding_dimension: int = 1536,
        pre_delete_table: bool = False,
    ) -> "HologresVectorStore":
        """从数据库配置中创建Hologres向量存储。

Args:
    host: 主机
    port: 端口号
    user: Hologres用户
    password: Hologres密码
    database: Hologres数据库
    table_name: Hologres表名
    table_schema: 表列模式
    embedding_dimension: 嵌入向量的维度大小
    pre_delete_table: 是否在创建时清空表中的数据
"""
        connection_string = HologresVector.connection_string_from_db_params(
            host, port, database, user, password
        )
        return cls.from_connection_string(
            connection_string=connection_string,
            table_name=table_name,
            embedding_dimension=embedding_dimension,
            table_schema=table_schema,
            pre_delete_table=pre_delete_table,
        )

    @classmethod
    def class_name(cls) -> str:
        return "HologresVectorStore"

    @property
    def client(self) -> Any:
        return self._storage

    def add(
        self,
        nodes: List[BaseNode],
        **add_kwargs: Any,
    ) -> List[str]:
        """将节点添加到Hologres索引中。

嵌入数据将保存到`vector`列,文本将保存到`document`列。

Args:
    nodes: List[BaseNode]: 带有嵌入的节点列表
"""
        embeddings = []
        node_ids = []
        schema_data_list = []
        meta_data_list = []

        for node in nodes:
            text_embedding = node.get_embedding()
            embeddings.append(text_embedding)
            node_ids.append(node.node_id)
            meta_data_list.append(node.metadata)
            schema_data_list.append(
                {"document": node.get_content(metadata_mode=MetadataMode.NONE)}
            )

        self._storage.upsert_vectors(
            embeddings, node_ids, meta_data_list, schema_data_list
        )
        return node_ids

    def query(
        self,
        query: VectorStoreQuery,
        **kwargs: Any,
    ) -> VectorStoreQueryResult:
        """查询前k个最相似节点的索引。

Args:
    query_embedding(List[float]):查询嵌入
    similarity_top_k(int):前k个最相似节点
"""
        query_embedding = cast(List[float], query.query_embedding)
        top_k = query.similarity_top_k

        query_results: List[dict[str, Any]] = self._storage.search(
            query_embedding,
            k=top_k,
            select_columns=["document", "vector"],
            metadata_filters=query.filters,
        )

        # if empty, then return an empty response
        if len(query_results) == 0:
            return VectorStoreQueryResult(similarities=[], ids=[])

        nodes = []
        similarities = []
        ids = []

        for result in query_results:
            node = TextNode(
                text=result["document"],
                id_=result["id"],
                embedding=result["vector"],
                metadata=result["metadata"],
            )
            nodes.append(node)
            ids.append(result["id"])
            similarities.append(math.exp(-result["distance"]))

        return VectorStoreQueryResult(nodes=nodes, similarities=similarities, ids=ids)

    def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
        """使用ref_doc_id删除节点。

Args:
    ref_doc_id(str):要删除的文档的doc_id。
"""
        self._storage.delete_vectors(metadata_filters={"doc_id": ref_doc_id})

from_connection_string classmethod #

from_connection_string(
    connection_string: str,
    table_name: str,
    table_schema: Dict[str, str] = {"document": "text"},
    embedding_dimension: int = 1536,
    pre_delete_table: bool = False,
) -> HologresVectorStore

从连接字符串创建Hologres向量存储。

Source code in llama_index/vector_stores/hologres/base.py
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    @classmethod
    def from_connection_string(
        cls,
        connection_string: str,
        table_name: str,
        table_schema: Dict[str, str] = {"document": "text"},
        embedding_dimension: int = 1536,
        pre_delete_table: bool = False,
    ) -> "HologresVectorStore":
        """从连接字符串创建Hologres向量存储。

Args:
    connection_string:Hologres数据库的连接字符串
    table_name:持久化数据的表名
    table_schema:表列模式
    embedding_dimension:嵌入向量的维度大小
    pre_delete_table:是否在创建时清空表中的数据
"""
        hologres_storage = HologresVector(
            connection_string,
            ndims=embedding_dimension,
            table_name=table_name,
            table_schema=table_schema,
            pre_delete_table=pre_delete_table,
        )
        return cls(hologres_storage=hologres_storage)

from_param classmethod #

from_param(
    host: str,
    port: int,
    user: str,
    password: str,
    database: str,
    table_name: str,
    table_schema: Dict[str, str] = {"document": "text"},
    embedding_dimension: int = 1536,
    pre_delete_table: bool = False,
) -> HologresVectorStore

从数据库配置中创建Hologres向量存储。

Parameters:

Name Type Description Default
host str

主机

required
port int

端口号

required
user str

Hologres用户

required
password str

Hologres密码

required
database str

Hologres数据库

required
table_name str

Hologres表名

required
table_schema Dict[str, str]

表列模式

{'document': 'text'}
embedding_dimension int

嵌入向量的维度大小

1536
pre_delete_table bool

是否在创建时清空表中的数据

False
Source code in llama_index/vector_stores/hologres/base.py
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
    @classmethod
    def from_param(
        cls,
        host: str,
        port: int,
        user: str,
        password: str,
        database: str,
        table_name: str,
        table_schema: Dict[str, str] = {"document": "text"},
        embedding_dimension: int = 1536,
        pre_delete_table: bool = False,
    ) -> "HologresVectorStore":
        """从数据库配置中创建Hologres向量存储。

Args:
    host: 主机
    port: 端口号
    user: Hologres用户
    password: Hologres密码
    database: Hologres数据库
    table_name: Hologres表名
    table_schema: 表列模式
    embedding_dimension: 嵌入向量的维度大小
    pre_delete_table: 是否在创建时清空表中的数据
"""
        connection_string = HologresVector.connection_string_from_db_params(
            host, port, database, user, password
        )
        return cls.from_connection_string(
            connection_string=connection_string,
            table_name=table_name,
            embedding_dimension=embedding_dimension,
            table_schema=table_schema,
            pre_delete_table=pre_delete_table,
        )

add #

add(nodes: List[BaseNode], **add_kwargs: Any) -> List[str]

将节点添加到Hologres索引中。

嵌入数据将保存到vector列,文本将保存到document列。

Parameters:

Name Type Description Default
nodes List[BaseNode]

List[BaseNode]: 带有嵌入的节点列表

required
Source code in llama_index/vector_stores/hologres/base.py
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
    def add(
        self,
        nodes: List[BaseNode],
        **add_kwargs: Any,
    ) -> List[str]:
        """将节点添加到Hologres索引中。

嵌入数据将保存到`vector`列,文本将保存到`document`列。

Args:
    nodes: List[BaseNode]: 带有嵌入的节点列表
"""
        embeddings = []
        node_ids = []
        schema_data_list = []
        meta_data_list = []

        for node in nodes:
            text_embedding = node.get_embedding()
            embeddings.append(text_embedding)
            node_ids.append(node.node_id)
            meta_data_list.append(node.metadata)
            schema_data_list.append(
                {"document": node.get_content(metadata_mode=MetadataMode.NONE)}
            )

        self._storage.upsert_vectors(
            embeddings, node_ids, meta_data_list, schema_data_list
        )
        return node_ids

query #

query(
    query: VectorStoreQuery, **kwargs: Any
) -> VectorStoreQueryResult

查询前k个最相似节点的索引。

Source code in llama_index/vector_stores/hologres/base.py
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
    def query(
        self,
        query: VectorStoreQuery,
        **kwargs: Any,
    ) -> VectorStoreQueryResult:
        """查询前k个最相似节点的索引。

Args:
    query_embedding(List[float]):查询嵌入
    similarity_top_k(int):前k个最相似节点
"""
        query_embedding = cast(List[float], query.query_embedding)
        top_k = query.similarity_top_k

        query_results: List[dict[str, Any]] = self._storage.search(
            query_embedding,
            k=top_k,
            select_columns=["document", "vector"],
            metadata_filters=query.filters,
        )

        # if empty, then return an empty response
        if len(query_results) == 0:
            return VectorStoreQueryResult(similarities=[], ids=[])

        nodes = []
        similarities = []
        ids = []

        for result in query_results:
            node = TextNode(
                text=result["document"],
                id_=result["id"],
                embedding=result["vector"],
                metadata=result["metadata"],
            )
            nodes.append(node)
            ids.append(result["id"])
            similarities.append(math.exp(-result["distance"]))

        return VectorStoreQueryResult(nodes=nodes, similarities=similarities, ids=ids)

delete #

delete(ref_doc_id: str, **delete_kwargs: Any) -> None

使用ref_doc_id删除节点。

Source code in llama_index/vector_stores/hologres/base.py
187
188
189
190
191
192
193
    def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
        """使用ref_doc_id删除节点。

Args:
    ref_doc_id(str):要删除的文档的doc_id。
"""
        self._storage.delete_vectors(metadata_filters={"doc_id": ref_doc_id})