semvec/pypi-packages huggingface dataset:
django-vectorstore-indexed-model 0.2.0
基于RedisStack向量数据库的Django数据模型应用。
License: Apache License, Version 2.0
Keywords: django-vectorstore-indexed-model

# django-vectorstore-indexed-model

基于RedisStack向量数据库的Django数据模型应用。

## 安装

```shell
pip install django-vectorstore-indexed-model
```

## 依赖说明

- 数据模型对于向量数据库的操作深度依赖`openai-redis-vectorstore`。相关配置详见该项目文档。

## 使用

*app/models.py*

```python
from typing import List
from django.db import models
from django_vectorstore_indexed_model.models import WithVectorStoreIndex
from django_model_helper.models import WithEnabledStatusFields
from django_model_helper.models import WithDeletedStatusFields


class QA(WithEnabledStatusFields, WithDeletedStatusFields, WithVectorStoreIndex):
    enable_auto_vectorstore_index = False

    kb = models.CharField(max_length=64)
    question = models.CharField(max_length=128)
    answer = models.TextField()

    def get_enable_vectorstore_index_flag(self) -> bool:
        """判断是否需要创建索引"""
        # 一般来说数据记录中应该有enabled或deleted等字段
        # 表示是否启用索引
        if not self.enabled:
            return False
        if self.deleted:
            return False
        return True

    def get_vectorstore_index_names(self):
        # 如果有多个index_name表示：
        # 本数据记录需要在多个向量数据库中建立索引
        return self.kb

    def get_vectorstore_index_contents(self) -> List[str]:
        # 向量数据库有索引长度的限制
        # 所以一般文档内容需要分片后进行索引
        # 这里返回分片列表
        return [f"问题：{self.question}\n参考答案：{self.answer}"]
```

## 可以重载的方法

### 重载以下3个方法可以快速解决contents和metas一致情况下的单索引或多重索引问题

- get_vectorstore_index_names
- get_vectorstore_index_contents
- get_vectorstore_index_meta

### 重载以下方法可以解决contents和metas不一致情况下的多重索引问题

- get_vectorstore_index_segments

*注意：重载本方法后，`get_vectorstore_index_names`、`get_vectorstore_index_contents`及`get_vectorstore_index_meta`三个方法将失效。*

## 版本记录

### v0.1.0

- 版本首发。

### v0.1.1

- 添加`WithVectorStoreIndex.get_vectorstore_index_segments`以解决content和meta各不相同的多重索引问题。
- 修正打包时版本号引用问题。

### v0.2.0

- 优化：保存时不再自动重建索引。
- 优化：使用匹配最新的`openai-redis-vectorstore`，支持字段知识库、文档、类型过滤。
openai-redis-vectorstore 0.2.2
基于RedisStack向量数据库，集成embeddings和rerank模型，支持二阶段召回，支持添加和删除等管理功能。
License: Apache License, Version 2.0
Keywords: openai-redis-vectorstore

# openai-redis-vectorstore

基于RedisStack向量数据库，集成embeddings和rerank模型，支持二阶段召回，支持添加和删除等管理功能。

## 安装

```shell
pip install openai-redis-vectorstore
```

## 依赖说明

- 使用`python-environment-settings`管理配置项。详见该项目的参考文档。
- 深度依赖于`openai-simple-embeddings`和`openai-simple-rerank`。同时也依赖于两者的配置项。详见这两个项目的参考文档。

## 配置项说明

- OPENAI_REDIS_VECTORSTORE_REDIS_STACK_URL: redis-stack服务器地址。如：redis://localhost:6379/0
    - 要使用redis-stack向量功能，必须是0号库（否则会报`redis.exceptions.ResponseError: Cannot create index on db != 0`错误）
    - （配置项别名）
    - REDIS_STACK_URL
    - REDIS_URL
    - REDIS

## 使用

### 将文本插入到向量数据库

*代码：*

```python
from openai_redis_vectorstore import RedisVectorStore

index_name = str(uuid.uuid4())
page_id = str(uuid.uuid4())
rvs = RedisVectorStore(index_name=index_name)
uid = rvs.insert("hello", metadata={"id": 1}, page_id=page_id)
assert uid == f"{index_name}:{page_id}"
```

*说明：*

- id=1表示内容在业务系统中的唯一码。
- uid表示内容在向量数据库中的唯一码。可以根据uid唯一码，从向量数据库中删除相应内容。

### 搜索向量数据库（多索引支持）

*代码：*

```python
from openai_redis_vectorstore.base import RedisVectorStore

index_name1 = str(uuid.uuid4())
index_name2 = str(uuid.uuid4())
rvs = RedisVectorStore()

# 向1号逻辑库中插入3条数据
rvs.insert_many(
    ["开会了", "再见", "你好"],
    metadatas=[
        {"id": 1},
        {"id": 2},
        {"id": 3},
    ],
    index_name=index_name1,
)

# 向2号逻辑库中插入3条数据
rvs.insert_many(
    ["开会去", "好的", "谢谢"],
    metadatas=[
        {"id": 1},
        {"id": 2},
        {"id": 3},
    ],
    index_name=index_name2,
)

# 从1号和2号逻辑库中搜索关键词并汇总
# 并要求匹配度不低于指定阈值
docs = rvs.similarity_search_and_rerank(
    query="开会",
    index_names=[index_name1, index_name2],
    embeddings_score_threshold=0.65,
    rerank_score_threshold=0.85,
)
assert len(docs) == 2
doc1 = docs[0]
doc2 = docs[1]
assert doc1.vs_index_name in [index_name1, index_name2]
assert doc2.vs_index_name in [index_name1, index_name2]
assert doc1.vs_rerank_score > doc2.vs_rerank_score
```

### 搜索向量数据库（kb_id和category过滤条件的支持）

```python
from openai_redis_vectorstore.base import RedisVectorStore

index_name = str(uuid.uuid4())
rvs = RedisVectorStore(index_name=index_name)
rvs.insert("hello", kb_id="k1", category="c1")
rvs.insert("hi", kb_id="k2", category="c2")
docs = rvs.similarity_search_with_relevance_scores(
    "hello",
    kb_ids=["k1", "k2"],
    category="c2",
)
assert len(docs) == 1
assert docs[0].vs_page_content == "hi"
```

## v0.2.x 与 v0.1.x不兼容部分

- v0.2.x使用langchain_redis，不再使用langchain_community。
- 被索引的文本保存到了text字段，原来是content字段。
- 被索引的向量保存到了embedding字段，原来是content_vector字段。
- 由于上述的不兼容性，要求升级后全部重建索引。

## 版本记录

### v0.1.0

- 版本首发。

### v0.1.1

- 修改：搜索一个空向量库时，只在日志中记录WARNING信息并返回空数组。

### v0.1.2

- 修改：`openai_redis_vectorstore.schemas.Document`增加`content`字段。

### v0.1.3

- 修正：查询结果page_content字段没有做反序列化的问题。

### v0.2.0

- 优化：默认配置项与`embeddings/rerank`相关配置项保持一致。
- 优化：允许`embeddings/rerank`使用不同的`base_url`和`api_key`。
- 变更（不兼容）：使用`langchain_redis`取代`langchain_community.vectorstores.redis`。

### v0.2.1

- 新增：支持`kb_id`，`category`过滤条件。

### 0.2.2

- 修正：`flush`没有删除索引的问题。