Natural Language Delete¶
NLQueryDeleterExecutor deletes records matching natural language descriptions. It includes a preview step to avoid accidental deletions.
Basic Usage¶
from amsdal_ml.ml_models.openai_model import OpenAIModel
from amsdal_ml.ml_retrievers.query_deleter import NLQueryDeleterExecutor
llm = OpenAIModel()
llm.setup()
deleter = NLQueryDeleterExecutor(llm=llm, queryset=Customer.objects.all())
analysis = await deleter.analyze('Delete inactive customers from 2023')
print(analysis.total) # number of records to delete
deleted = await deleter.execute(analysis)
How It Works¶
The delete operation follows a 2-phase pipeline:
Phase 1: Split¶
The LLM derives a filter query from the delete instruction (e.g., "Delete inactive customers from 2023" → filter by is_active=False and created_at in 2023).
Phase 2: Analysis & Execution¶
The executor:
- Runs the filter query to find matching records
- Returns a preview of affected records
- Executes deletion within a transaction
Preview Before Delete¶
Use analyze() to preview which records will be deleted:
deleter = NLQueryDeleterExecutor(llm=llm, queryset=Customer.objects.all())
analysis = await deleter.analyze('Delete all test customers')
print(f'Records to delete: {analysis.total}')
for record in analysis.records:
print(f' {record}')
# Only execute if confirmed
if confirmed:
deleted = await deleter.execute(analysis)
Authorization¶
Pass a callback to check permissions before deleting:
deleter = NLQueryDeleterExecutor(
llm=llm,
queryset=Customer.objects.all(),
on_before_delete=my_auth_callback,
)
Document-Oriented Facade¶
from amsdal_ml.ml_retrievers.query_deleter import NLQueryDeleter
deleter = NLQueryDeleter(llm=llm, queryset=Customer.objects.all())
analysis = await deleter.analyze('Remove archived customers')
documents = await deleter.invoke(analysis)