跳到内容

Upstash

UpstashVectorStore #

基类: BasePydanticVectorStore

Upstash 向量存储。

示例

pip install llama-index-vector-stores-upstash

from llama_index.vector_stores.upstash import UpstashVectorStore

# Create Upstash vector store
upstash_vector_store = UpstashVectorStore(
    url="your_upstash_vector_url",
    token="your_upstash_vector_token",
)
源代码位于 llama-index-integrations/vector_stores/llama-index-vector-stores-upstash/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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
class UpstashVectorStore(BasePydanticVectorStore):
    """
    Upstash Vector Store.

    Examples:
        `pip install llama-index-vector-stores-upstash`

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

        # Create Upstash vector store
        upstash_vector_store = UpstashVectorStore(
            url="your_upstash_vector_url",
            token="your_upstash_vector_token",
        )
        ```

    """

    stores_text: bool = True
    flat_metadata: bool = False

    namespace: str = ""

    batch_size: int
    _index: Index = PrivateAttr()

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

    @property
    def client(self) -> Any:
        """Return the Upstash client."""
        return self._index

    def __init__(
        self,
        url: str,
        token: str,
        batch_size: int = DEFAULT_BATCH_SIZE,
        # Upstash uses ("") as the default namespace, if not provided
        namespace: str = "",
    ) -> None:
        """
        Create a UpstashVectorStore. The index can be created using the Upstash console.

        Args:
            url (String): URL of the Upstash Vector instance, found in the Upstash console.
            token (String): Token for the Upstash Vector Index, found in the Upstash console.
            batch_size (Optional[int]): Batch size for adding nodes to the vector store.

        Raises:
            ImportError: If the upstash-vector python package is not installed.

        """
        super().__init__(batch_size=batch_size, namespace=namespace)
        self._index = Index(url=url, token=token)

    def add(self, nodes: List[BaseNode], **add_kwargs: Any) -> List[str]:
        """
        Add nodes to the vector store.

        Args:
            nodes: List of nodes to add to the vector store.
            add_kwargs: Additional arguments to pass to the add method.

        Returns:
            List of ids of the added nodes.

        """
        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, namespace=self.namespace)

        return ids

    def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
        """
        Delete node from the vector store.

        Args:
            ref_doc_id: Reference doc id of the node to delete.
            delete_kwargs: Additional arguments to pass to the delete method.

        """
        raise NotImplementedError(
            "Delete is not currently supported, but will be in the future."
        )

    def query(self, query: VectorStoreQuery, **kwargs: Any) -> VectorStoreQueryResult:
        """
        Query the vector store.

        Args:
            query: Query to run against the vector store.
            kwargs: Additional arguments to pass to the query method.

        Returns:
            Query result.

        """
        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),
            namespace=self.namespace,
        )

        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
        )

客户端 property #

client: Any

返回 Upstash 客户端。

添加 #

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

将节点添加到向量存储。

参数

名称 类型 描述 默认值
nodes List[BaseNode]

要添加到向量存储的节点列表。

必需
add_kwargs Any

要传递给 add 方法的额外参数。

{}

返回值

类型 描述
List[str]

添加的节点的 ID 列表。

源代码位于 llama-index-integrations/vector_stores/llama-index-vector-stores-upstash/llama_index/vector_stores/upstash/base.py
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
def add(self, nodes: List[BaseNode], **add_kwargs: Any) -> List[str]:
    """
    Add nodes to the vector store.

    Args:
        nodes: List of nodes to add to the vector store.
        add_kwargs: Additional arguments to pass to the add method.

    Returns:
        List of ids of the added nodes.

    """
    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, namespace=self.namespace)

    return ids

删除 #

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

从向量存储中删除节点。

参数

名称 类型 描述 默认值
ref_doc_id str

要删除节点的引用文档 ID。

必需
delete_kwargs Any

要传递给 delete 方法的额外参数。

{}
源代码位于 llama-index-integrations/vector_stores/llama-index-vector-stores-upstash/llama_index/vector_stores/upstash/base.py
174
175
176
177
178
179
180
181
182
183
184
185
def delete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:
    """
    Delete node from the vector store.

    Args:
        ref_doc_id: Reference doc id of the node to delete.
        delete_kwargs: Additional arguments to pass to the delete method.

    """
    raise NotImplementedError(
        "Delete is not currently supported, but will be in the future."
    )

查询 #

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

查询向量存储。

参数

名称 类型 描述 默认值
查询 VectorStoreQuery

对向量存储运行的查询。

必需
kwargs Any

要传递给 query 方法的额外参数。

{}

返回值

类型 描述
VectorStoreQueryResult

查询结果。

源代码位于 llama-index-integrations/vector_stores/llama-index-vector-stores-upstash/llama_index/vector_stores/upstash/base.py
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
def query(self, query: VectorStoreQuery, **kwargs: Any) -> VectorStoreQueryResult:
    """
    Query the vector store.

    Args:
        query: Query to run against the vector store.
        kwargs: Additional arguments to pass to the query method.

    Returns:
        Query result.

    """
    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),
        namespace=self.namespace,
    )

    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
    )