|
@@ -15,7 +15,7 @@ from libs.rsa import generate_key_pair
|
|
|
from models.account import Tenant
|
|
|
from models.dataset import Dataset, DatasetCollectionBinding, DocumentSegment
|
|
|
from models.dataset import Document as DatasetDocument
|
|
|
-from models.model import Account
|
|
|
+from models.model import Account, App, AppAnnotationSetting, MessageAnnotation
|
|
|
from models.provider import Provider, ProviderModel
|
|
|
|
|
|
|
|
@@ -125,7 +125,114 @@ def reset_encrypt_key_pair():
|
|
|
|
|
|
|
|
|
@click.command('vdb-migrate', help='migrate vector db.')
|
|
|
-def vdb_migrate():
|
|
|
+@click.option('--scope', default='all', prompt=False, help='The scope of vector database to migrate, Default is All.')
|
|
|
+def vdb_migrate(scope: str):
|
|
|
+ if scope in ['knowledge', 'all']:
|
|
|
+ migrate_knowledge_vector_database()
|
|
|
+ if scope in ['annotation', 'all']:
|
|
|
+ migrate_annotation_vector_database()
|
|
|
+
|
|
|
+
|
|
|
+def migrate_annotation_vector_database():
|
|
|
+ """
|
|
|
+ Migrate annotation datas to target vector database .
|
|
|
+ """
|
|
|
+ click.echo(click.style('Start migrate annotation data.', fg='green'))
|
|
|
+ create_count = 0
|
|
|
+ skipped_count = 0
|
|
|
+ total_count = 0
|
|
|
+ page = 1
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+
|
|
|
+ apps = db.session.query(App).filter(
|
|
|
+ App.status == 'normal'
|
|
|
+ ).order_by(App.created_at.desc()).paginate(page=page, per_page=50)
|
|
|
+ except NotFound:
|
|
|
+ break
|
|
|
+
|
|
|
+ page += 1
|
|
|
+ for app in apps:
|
|
|
+ total_count = total_count + 1
|
|
|
+ click.echo(f'Processing the {total_count} app {app.id}. '
|
|
|
+ + f'{create_count} created, {skipped_count} skipped.')
|
|
|
+ try:
|
|
|
+ click.echo('Create app annotation index: {}'.format(app.id))
|
|
|
+ app_annotation_setting = db.session.query(AppAnnotationSetting).filter(
|
|
|
+ AppAnnotationSetting.app_id == app.id
|
|
|
+ ).first()
|
|
|
+
|
|
|
+ if not app_annotation_setting:
|
|
|
+ skipped_count = skipped_count + 1
|
|
|
+ click.echo('App annotation setting is disabled: {}'.format(app.id))
|
|
|
+ continue
|
|
|
+
|
|
|
+ dataset_collection_binding = db.session.query(DatasetCollectionBinding).filter(
|
|
|
+ DatasetCollectionBinding.id == app_annotation_setting.collection_binding_id
|
|
|
+ ).first()
|
|
|
+ if not dataset_collection_binding:
|
|
|
+ click.echo('App annotation collection binding is not exist: {}'.format(app.id))
|
|
|
+ continue
|
|
|
+ annotations = db.session.query(MessageAnnotation).filter(MessageAnnotation.app_id == app.id).all()
|
|
|
+ dataset = Dataset(
|
|
|
+ id=app.id,
|
|
|
+ tenant_id=app.tenant_id,
|
|
|
+ indexing_technique='high_quality',
|
|
|
+ embedding_model_provider=dataset_collection_binding.provider_name,
|
|
|
+ embedding_model=dataset_collection_binding.model_name,
|
|
|
+ collection_binding_id=dataset_collection_binding.id
|
|
|
+ )
|
|
|
+ documents = []
|
|
|
+ if annotations:
|
|
|
+ for annotation in annotations:
|
|
|
+ document = Document(
|
|
|
+ page_content=annotation.question,
|
|
|
+ metadata={
|
|
|
+ "annotation_id": annotation.id,
|
|
|
+ "app_id": app.id,
|
|
|
+ "doc_id": annotation.id
|
|
|
+ }
|
|
|
+ )
|
|
|
+ documents.append(document)
|
|
|
+
|
|
|
+ vector = Vector(dataset, attributes=['doc_id', 'annotation_id', 'app_id'])
|
|
|
+ click.echo(f"Start to migrate annotation, app_id: {app.id}.")
|
|
|
+
|
|
|
+ try:
|
|
|
+ vector.delete()
|
|
|
+ click.echo(
|
|
|
+ click.style(f'Successfully delete vector index for app: {app.id}.',
|
|
|
+ fg='green'))
|
|
|
+ except Exception as e:
|
|
|
+ click.echo(
|
|
|
+ click.style(f'Failed to delete vector index for app {app.id}.',
|
|
|
+ fg='red'))
|
|
|
+ raise e
|
|
|
+ if documents:
|
|
|
+ try:
|
|
|
+ click.echo(click.style(
|
|
|
+ f'Start to created vector index with {len(documents)} annotations for app {app.id}.',
|
|
|
+ fg='green'))
|
|
|
+ vector.create(documents)
|
|
|
+ click.echo(
|
|
|
+ click.style(f'Successfully created vector index for app {app.id}.', fg='green'))
|
|
|
+ except Exception as e:
|
|
|
+ click.echo(click.style(f'Failed to created vector index for app {app.id}.', fg='red'))
|
|
|
+ raise e
|
|
|
+ click.echo(f'Successfully migrated app annotation {app.id}.')
|
|
|
+ create_count += 1
|
|
|
+ except Exception as e:
|
|
|
+ click.echo(
|
|
|
+ click.style('Create app annotation index error: {} {}'.format(e.__class__.__name__, str(e)),
|
|
|
+ fg='red'))
|
|
|
+ continue
|
|
|
+
|
|
|
+ click.echo(
|
|
|
+ click.style(f'Congratulations! Create {create_count} app annotation indexes, and skipped {skipped_count} apps.',
|
|
|
+ fg='green'))
|
|
|
+
|
|
|
+
|
|
|
+def migrate_knowledge_vector_database():
|
|
|
"""
|
|
|
Migrate vector database datas to target vector database .
|
|
|
"""
|