# 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各不相同的多重索引问题。
- 修正打包时版本号引用问题。
Raw data
{
"_id": null,
"home_page": null,
"name": "django-vectorstore-indexed-model",
"maintainer": "rRR0VrFP",
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "django-vectorstore-indexed-model",
"author": "rRR0VrFP",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/40/0f/ee5536eeb8a5f6ab9419d0ed9ab055282130359bde6ab9ce3ee30e9ae2bc/django-vectorstore-indexed-model-0.1.1.tar.gz",
"platform": null,
"description": "# django-vectorstore-indexed-model\r\n\r\n\u57fa\u4e8eRedisStack\u5411\u91cf\u6570\u636e\u5e93\u7684Django\u6570\u636e\u6a21\u578b\u5e94\u7528\u3002\r\n\r\n## \u5b89\u88c5\r\n\r\n```shell\r\npip install django-vectorstore-indexed-model\r\n```\r\n\r\n## \u4f9d\u8d56\u8bf4\u660e\r\n\r\n- \u6570\u636e\u6a21\u578b\u5bf9\u4e8e\u5411\u91cf\u6570\u636e\u5e93\u7684\u64cd\u4f5c\u6df1\u5ea6\u4f9d\u8d56`openai-redis-vectorstore`\u3002\u76f8\u5173\u914d\u7f6e\u8be6\u89c1\u8be5\u9879\u76ee\u6587\u6863\u3002\r\n\r\n## \u4f7f\u7528\r\n\r\n*app/models.py*\r\n\r\n```python\r\nfrom typing import List\r\nfrom django.db import models\r\nfrom django_vectorstore_indexed_model.models import WithVectorStoreIndex\r\nfrom django_model_helper.models import WithEnabledStatusFields\r\nfrom django_model_helper.models import WithDeletedStatusFields\r\n\r\n\r\nclass QA(WithEnabledStatusFields, WithDeletedStatusFields, WithVectorStoreIndex):\r\n enable_auto_vectorstore_index = False\r\n\r\n kb = models.CharField(max_length=64)\r\n question = models.CharField(max_length=128)\r\n answer = models.TextField()\r\n\r\n def get_enable_vectorstore_index_flag(self) -> bool:\r\n \"\"\"\u5224\u65ad\u662f\u5426\u9700\u8981\u521b\u5efa\u7d22\u5f15\"\"\"\r\n # \u4e00\u822c\u6765\u8bf4\u6570\u636e\u8bb0\u5f55\u4e2d\u5e94\u8be5\u6709enabled\u6216deleted\u7b49\u5b57\u6bb5\r\n # \u8868\u793a\u662f\u5426\u542f\u7528\u7d22\u5f15\r\n if not self.enabled:\r\n return False\r\n if self.deleted:\r\n return False\r\n return True\r\n\r\n def get_vectorstore_index_names(self):\r\n # \u5982\u679c\u6709\u591a\u4e2aindex_name\u8868\u793a\uff1a\r\n # \u672c\u6570\u636e\u8bb0\u5f55\u9700\u8981\u5728\u591a\u4e2a\u5411\u91cf\u6570\u636e\u5e93\u4e2d\u5efa\u7acb\u7d22\u5f15\r\n return self.kb\r\n\r\n def get_vectorstore_index_contents(self) -> List[str]:\r\n # \u5411\u91cf\u6570\u636e\u5e93\u6709\u7d22\u5f15\u957f\u5ea6\u7684\u9650\u5236\r\n # \u6240\u4ee5\u4e00\u822c\u6587\u6863\u5185\u5bb9\u9700\u8981\u5206\u7247\u540e\u8fdb\u884c\u7d22\u5f15\r\n # \u8fd9\u91cc\u8fd4\u56de\u5206\u7247\u5217\u8868\r\n return [f\"\u95ee\u9898\uff1a{self.question}\\n\u53c2\u8003\u7b54\u6848\uff1a{self.answer}\"]\r\n```\r\n\r\n## \u53ef\u4ee5\u91cd\u8f7d\u7684\u65b9\u6cd5\r\n\r\n### \u91cd\u8f7d\u4ee5\u4e0b3\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u5feb\u901f\u89e3\u51b3contents\u548cmetas\u4e00\u81f4\u60c5\u51b5\u4e0b\u7684\u5355\u7d22\u5f15\u6216\u591a\u91cd\u7d22\u5f15\u95ee\u9898\r\n\r\n- get_vectorstore_index_names\r\n- get_vectorstore_index_contents\r\n- get_vectorstore_index_meta\r\n\r\n### \u91cd\u8f7d\u4ee5\u4e0b\u65b9\u6cd5\u53ef\u4ee5\u89e3\u51b3contents\u548cmetas\u4e0d\u4e00\u81f4\u60c5\u51b5\u4e0b\u7684\u591a\u91cd\u7d22\u5f15\u95ee\u9898\r\n\r\n- get_vectorstore_index_segments\r\n\r\n*\u6ce8\u610f\uff1a\u91cd\u8f7d\u672c\u65b9\u6cd5\u540e\uff0c`get_vectorstore_index_names`\u3001`get_vectorstore_index_contents`\u53ca`get_vectorstore_index_meta`\u4e09\u4e2a\u65b9\u6cd5\u5c06\u5931\u6548\u3002*\r\n\r\n## \u7248\u672c\u8bb0\u5f55\r\n\r\n### v0.1.0\r\n\r\n- \u7248\u672c\u9996\u53d1\u3002\r\n\r\n### v0.1.1\r\n\r\n- \u6dfb\u52a0`WithVectorStoreIndex.get_vectorstore_index_segments`\u4ee5\u89e3\u51b3content\u548cmeta\u5404\u4e0d\u76f8\u540c\u7684\u591a\u91cd\u7d22\u5f15\u95ee\u9898\u3002\r\n- \u4fee\u6b63\u6253\u5305\u65f6\u7248\u672c\u53f7\u5f15\u7528\u95ee\u9898\u3002\r\n",
"bugtrack_url": null,
"license": "Apache License, Version 2.0",
"summary": "\u57fa\u4e8eRedisStack\u5411\u91cf\u6570\u636e\u5e93\u7684Django\u6570\u636e\u6a21\u578b\u5e94\u7528\u3002",
"version": "0.1.1",
"project_urls": null,
"split_keywords": [
"django-vectorstore-indexed-model"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "05756806ae500994cfa6f6758b715c94992d8d3b2c5d24c0bbc396116ba59f8c",
"md5": "81e8ec4c972a9d3cc3d43f9fa80f12ad",
"sha256": "bd71b35386ffa29c23a06bf1288b63cbf87feb0f32ce8ad10aa8d3ad9a605d8c"
},
"downloads": -1,
"filename": "django_vectorstore_indexed_model-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "81e8ec4c972a9d3cc3d43f9fa80f12ad",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 10630,
"upload_time": "2024-12-26T05:38:27",
"upload_time_iso_8601": "2024-12-26T05:38:27.807562Z",
"url": "https://files.pythonhosted.org/packages/05/75/6806ae500994cfa6f6758b715c94992d8d3b2c5d24c0bbc396116ba59f8c/django_vectorstore_indexed_model-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "400fee5536eeb8a5f6ab9419d0ed9ab055282130359bde6ab9ce3ee30e9ae2bc",
"md5": "c453f41f8059e4619eb3cc9806706fcb",
"sha256": "1cec59429b965dabc614d63ff0dc6a734648fc0510fe787adfcd2f445c587436"
},
"downloads": -1,
"filename": "django-vectorstore-indexed-model-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "c453f41f8059e4619eb3cc9806706fcb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 9452,
"upload_time": "2024-12-26T05:38:30",
"upload_time_iso_8601": "2024-12-26T05:38:30.208551Z",
"url": "https://files.pythonhosted.org/packages/40/0f/ee5536eeb8a5f6ab9419d0ed9ab055282130359bde6ab9ce3ee30e9ae2bc/django-vectorstore-indexed-model-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-26 05:38:30",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "django-vectorstore-indexed-model"
}