Skip to content

Docarray

DocArrayHnswVectorStore #

Bases: DocArrayVectorStore

代表一个DocArray HNSW向量存储的类。

这个类是由Docarray提供的轻量级文档索引实现。它将向量存储在hnswlib中的磁盘上,并将所有其他数据存储在SQLite中。

示例: pip install llama-index-vector-stores-docarray

from llama_index.vector_stores.docarray import DocArrayHnswVectorStore

# 初始化DocArrayHnswVectorStore
vector_store = DocArrayHnswVectorStore(work_dir="hnsw_index", dim=1536)
Source code in llama_index/vector_stores/docarray/hnsw.py
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 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
class DocArrayHnswVectorStore(DocArrayVectorStore):
    """代表一个DocArray HNSW向量存储的类。

这个类是由Docarray提供的轻量级文档索引实现。它将向量存储在hnswlib中的磁盘上,并将所有其他数据存储在SQLite中。

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

```python
from llama_index.vector_stores.docarray import DocArrayHnswVectorStore

# 初始化DocArrayHnswVectorStore
vector_store = DocArrayHnswVectorStore(work_dir="hnsw_index", dim=1536)
```"""

    def __init__(
        self,
        work_dir: str,
        dim: int = 1536,
        dist_metric: Literal["cosine", "ip", "l2"] = "cosine",
        max_elements: int = 1024,
        ef_construction: int = 200,
        ef: int = 10,
        M: int = 16,
        allow_replace_deleted: bool = True,
        num_threads: int = 1,
    ):
        """初始化DocArrayHnswVectorStore。

Args:
    work_dir(str):工作目录。
    dim(int,可选):向量的维度。默认为1536。
    dist_metric(Literal["cosine", "ip", "l2"],可选):要使用的距离度量。默认为"cosine"。
    max_elements(int,可选):定义结构中可以存储的最大元素数量(可以增加/缩小)。
    ef_construction(int,可选):定义构建时间/精度权衡。默认为200。
    ef(int,可选):动态候选列表的大小。默认为10。
    M(int,可选):定义图中的最大出站连接数。默认为16。
    allow_replace_deleted(bool,可选):是否允许替换已删除的元素。默认为True。
    num_threads(int,可选):索引构建的线程数。默认为1。
"""
        import_err_msg = """
                `docarray` package not found. Install the package via pip:
                `pip install docarray[hnswlib]`
        """
        try:
            import docarray  # noqa
        except ImportError:
            raise ImportError(import_err_msg)

        self._work_dir = work_dir
        ref_docs_path = os.path.join(self._work_dir, "ref_docs.json")
        if os.path.exists(ref_docs_path):
            with open(ref_docs_path) as f:
                self._ref_docs = json.load(f)
        else:
            self._ref_docs = {}

        self._index, self._schema = self._init_index(
            dim=dim,
            dist_metric=dist_metric,
            max_elements=max_elements,
            ef_construction=ef_construction,
            ef=ef,
            M=M,
            allow_replace_deleted=allow_replace_deleted,
            num_threads=num_threads,
        )

    def _init_index(self, **kwargs: Any):  # type: ignore[no-untyped-def]
        """初始化HNSW文档索引。

Args:
    **kwargs:HNSW索引的可变长度参数列表。

Returns:
    元组:HNSW文档索引及其模式。
"""
        from docarray.index import HnswDocumentIndex

        schema = self._get_schema(**kwargs)
        index = HnswDocumentIndex[schema]  # type: ignore[valid-type]
        return index(work_dir=self._work_dir), schema

    def _find_docs_to_be_removed(self, doc_id: str) -> List[str]:
        """找到需要从向量存储中移除的文档。

Args:
    doc_id (str): 应该被移除的参考文档ID。

Returns:
    List[str]: 待移除的文档ID列表。
"""
        docs = self._ref_docs.get(doc_id, [])
        del self._ref_docs[doc_id]
        self._save_ref_docs()
        return docs

    def _save_ref_docs(self) -> None:
        """保存参考文档。"""
        with open(os.path.join(self._work_dir, "ref_docs.json"), "w") as f:
            json.dump(self._ref_docs, f)

    def _update_ref_docs(self, docs):  # type: ignore[no-untyped-def]
        """更新参考文档。

Args:
    docs (List): 需要更新的文档列表。
"""
        for doc in docs:
            if doc.metadata["doc_id"] not in self._ref_docs:
                self._ref_docs[doc.metadata["doc_id"]] = []
            self._ref_docs[doc.metadata["doc_id"]].append(doc.id)
        self._save_ref_docs()

DocArrayInMemoryVectorStore #

Bases: DocArrayVectorStore

代表DocArray内存向量存储的类。

这个类是由Docarray提供的文档索引,它将文档存储在内存中。

示例: pip install llama-index-vector-stores-docarray

from llama_index.vector_stores.docarray import DocArrayInMemoryVectorStore

# 创建一个DocArrayInMemoryVectorStore的实例
vector_store = DocArrayInMemoryVectorStore()
Source code in llama_index/vector_stores/docarray/in_memory.py
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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
class DocArrayInMemoryVectorStore(DocArrayVectorStore):
    """代表DocArray内存向量存储的类。

这个类是由Docarray提供的文档索引,它将文档存储在内存中。

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

```python
from llama_index.vector_stores.docarray import DocArrayInMemoryVectorStore

# 创建一个DocArrayInMemoryVectorStore的实例
vector_store = DocArrayInMemoryVectorStore()
```"""

    def __init__(
        self,
        index_path: Optional[str] = None,
        metric: Literal[
            "cosine_sim", "euclidian_dist", "sgeuclidean_dist"
        ] = "cosine_sim",
    ):
        """初始化DocArrayInMemoryVectorStore。

Args:
    index_path(可选[str]):索引文件的路径。
    metric(Literal["cosine_sim", "euclidian_dist", "sgeuclidean_dist"]):
        要使用的距离度量。默认值为"cosine_sim"。
"""
        import_err_msg = """
                `docarray` package not found. Install the package via pip:
                `pip install docarray`
        """
        try:
            import docarray  # noqa
        except ImportError:
            raise ImportError(import_err_msg)

        self._ref_docs = None  # type: ignore[assignment]
        self._index_file_path = index_path
        self._index, self._schema = self._init_index(metric=metric)

    def _init_index(self, **kwargs: Any):  # type: ignore[no-untyped-def]
        """初始化内存中的精确最近邻索引。

Args:
    **kwargs: 可变长度参数列表。

Returns:
    元组:内存中的精确最近邻索引及其模式。
"""
        from docarray.index import InMemoryExactNNIndex

        schema = self._get_schema(**kwargs)
        index = InMemoryExactNNIndex[schema]  # type: ignore[valid-type]
        params = {"index_file_path": self._index_file_path}
        return index(**params), schema  # type: ignore[arg-type]

    def _find_docs_to_be_removed(self, doc_id: str) -> List[str]:
        """找到需要从向量存储中移除的文档。

Args:
    doc_id (str): 应该被移除的参考文档ID。

Returns:
    List[str]: 待移除的文档ID列表。
"""
        query = {"metadata__doc_id": {"$eq": doc_id}}
        docs = self._index.filter(query)
        return [doc.id for doc in docs]

    def persist(
        self, persist_path: str, fs: Optional[fsspec.AbstractFileSystem] = None
    ) -> None:
        """将内存中的向量存储持久化到文件中。

Args:
    persist_path (str): 持久化索引的路径。
    fs (fsspec.AbstractFileSystem, 可选): 要持久化到的文件系统。
        (不适用)
"""
        index_path = persist_path or self._index_file_path
        self._index.persist(index_path)

persist #

persist(
    persist_path: str,
    fs: Optional[AbstractFileSystem] = None,
) -> None

将内存中的向量存储持久化到文件中。

Parameters:

Name Type Description Default
persist_path str

持久化索引的路径。

required
fs (AbstractFileSystem, 可选)

要持久化到的文件系统。 (不适用)

None
Source code in llama_index/vector_stores/docarray/in_memory.py
78
79
80
81
82
83
84
85
86
87
88
89
    def persist(
        self, persist_path: str, fs: Optional[fsspec.AbstractFileSystem] = None
    ) -> None:
        """将内存中的向量存储持久化到文件中。

Args:
    persist_path (str): 持久化索引的路径。
    fs (fsspec.AbstractFileSystem, 可选): 要持久化到的文件系统。
        (不适用)
"""
        index_path = persist_path or self._index_file_path
        self._index.persist(index_path)