Skip to content

Upstash

UpstashVectorStore #

Bases: BasePydanticVectorStore

Upstash向量存储。

示例

pip install llama-index-vector-stores-upstash

from llama_index.vector_stores.upstash import UpstashVectorStore

# 创建Upstash向量存储
upstash_vector_store = UpstashVectorStore(
    url="your_upstash_vector_url",
    token="your_upstash_vector_token",
)
Source code in llama_index/vector_stores/upstash/base.py
 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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
class UpstashVectorStore(BasePydanticVectorStore):
    """Upstash向量存储。

    示例:
        `pip install llama-index-vector-stores-upstash`

        ```python
        from llama_index.vector_stores.upstash import UpstashVectorStore

        # 创建Upstash向量存储
        upstash_vector_store = UpstashVectorStore(
            url="your_upstash_vector_url",
            token="your_upstash_vector_token",
        )
        ```"""

    stores_text: bool = True
    flat_metadata: bool = False

    batch_size: int
    _index: Index = PrivateAttr()

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

    @property
    def client(self) -> Any:
        """返回Upstash客户端。"""
        return self._index

    def __init__(
        self, url: str, token: str, batch_size: int = DEFAULT_BATCH_SIZE
    ) -> None:
        """创建一个UpstashVectorStore。可以使用Upstash控制台创建索引。

Args:
    url(字符串):Upstash Vector实例的URL,在Upstash控制台中找到。
    token(字符串):Upstash Vector索引的令牌,在Upstash控制台中找到。
    batch_size(可选[int]):添加节点到向量存储的批处理大小。

抛出:
    ImportError:如果upstash-vector python包未安装。
"""
        super().__init__(batch_size=batch_size)
        self._index = Index(url=url, token=token)

    def add(self, nodes: List[BaseNode], **add_kwargs: Any) -> List[str]:
        """将节点添加到向量存储中。

Args:
    节点:要添加到向量存储中的节点列表。
    add_kwargs:传递给添加方法的额外参数。

Returns:
    已添加节点的ID列表。
"""
        ids = []
        vectors = []
        for node_batch in iter_batch(nodes, self.batch_size):
            for node in node_batch:
                metadata_dict = node_to_metadata_dict(node)
                ids.append(node.node_id)
                vectors.append((node.node_id, node.embedding, metadata_dict))

            self.client.upsert(vectors=vectors)

        return ids

    def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
        """从向量存储中删除节点。

Args:
    ref_doc_id:要删除的节点的引用文档ID。
    delete_kwargs:传递给删除方法的附加参数。
"""
        raise NotImplementedError(
            "Delete is not currently supported, but will be in the future."
        )

    def query(self, query: VectorStoreQuery, **kwargs: Any) -> VectorStoreQueryResult:
        """查询向量存储。

Args:
    query: 要针对向量存储运行的查询。
    kwargs: 传递给查询方法的额外参数。

Returns:
    查询结果。
"""
        if query.mode != VectorStoreQueryMode.DEFAULT:
            raise ValueError(f"Query mode {query.mode} not supported")

        # if query.filters:
        #     raise ValueError("Metadata filtering not supported")

        res = self.client.query(
            vector=query.query_embedding,
            top_k=query.similarity_top_k,
            include_vectors=True,
            include_metadata=True,
            filter=_to_upstash_filters(query.filters),
        )

        top_k_nodes = []
        top_k_ids = []
        top_k_scores = []
        for vector in res:
            node = metadata_dict_to_node(vector.metadata)
            node.embedding = vector.vector
            top_k_nodes.append(node)
            top_k_ids.append(vector.id)
            top_k_scores.append(vector.score)

        return VectorStoreQueryResult(
            nodes=top_k_nodes, similarities=top_k_scores, ids=top_k_ids
        )

client property #

client: Any

返回Upstash客户端。

add #

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

将节点添加到向量存储中。

Returns:

Type Description
List[str]

已添加节点的ID列表。

Source code in llama_index/vector_stores/upstash/base.py
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
    def add(self, nodes: List[BaseNode], **add_kwargs: Any) -> List[str]:
        """将节点添加到向量存储中。

Args:
    节点:要添加到向量存储中的节点列表。
    add_kwargs:传递给添加方法的额外参数。

Returns:
    已添加节点的ID列表。
"""
        ids = []
        vectors = []
        for node_batch in iter_batch(nodes, self.batch_size):
            for node in node_batch:
                metadata_dict = node_to_metadata_dict(node)
                ids.append(node.node_id)
                vectors.append((node.node_id, node.embedding, metadata_dict))

            self.client.upsert(vectors=vectors)

        return ids

delete #

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

从向量存储中删除节点。

Source code in llama_index/vector_stores/upstash/base.py
160
161
162
163
164
165
166
167
168
169
    def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
        """从向量存储中删除节点。

Args:
    ref_doc_id:要删除的节点的引用文档ID。
    delete_kwargs:传递给删除方法的附加参数。
"""
        raise NotImplementedError(
            "Delete is not currently supported, but will be in the future."
        )

query #

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

查询向量存储。

Parameters:

Name Type Description Default
query VectorStoreQuery

要针对向量存储运行的查询。

required
kwargs Any

传递给查询方法的额外参数。

{}

Returns:

Type Description
VectorStoreQueryResult

查询结果。

Source code in llama_index/vector_stores/upstash/base.py
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
    def query(self, query: VectorStoreQuery, **kwargs: Any) -> VectorStoreQueryResult:
        """查询向量存储。

Args:
    query: 要针对向量存储运行的查询。
    kwargs: 传递给查询方法的额外参数。

Returns:
    查询结果。
"""
        if query.mode != VectorStoreQueryMode.DEFAULT:
            raise ValueError(f"Query mode {query.mode} not supported")

        # if query.filters:
        #     raise ValueError("Metadata filtering not supported")

        res = self.client.query(
            vector=query.query_embedding,
            top_k=query.similarity_top_k,
            include_vectors=True,
            include_metadata=True,
            filter=_to_upstash_filters(query.filters),
        )

        top_k_nodes = []
        top_k_ids = []
        top_k_scores = []
        for vector in res:
            node = metadata_dict_to_node(vector.metadata)
            node.embedding = vector.vector
            top_k_nodes.append(node)
            top_k_ids.append(vector.id)
            top_k_scores.append(vector.score)

        return VectorStoreQueryResult(
            nodes=top_k_nodes, similarities=top_k_scores, ids=top_k_ids
        )