Enhancement: AI LLM chunk size and context window config (#12891)

This commit is contained in:
shamoon
2026-06-01 17:56:21 +00:00
committed by GitHub
parent bb860a5834
commit f6c865bf47
15 changed files with 318 additions and 36 deletions
+6
View File
@@ -195,6 +195,8 @@ class AIConfig(BaseConfig):
llm_embedding_backend: str = dataclasses.field(init=False)
llm_embedding_model: str = dataclasses.field(init=False)
llm_embedding_endpoint: str = dataclasses.field(init=False)
llm_embedding_chunk_size: int = dataclasses.field(init=False)
llm_context_size: int = dataclasses.field(init=False)
llm_backend: str = dataclasses.field(init=False)
llm_model: str = dataclasses.field(init=False)
llm_api_key: str = dataclasses.field(init=False)
@@ -214,6 +216,10 @@ class AIConfig(BaseConfig):
self.llm_embedding_endpoint = (
app_config.llm_embedding_endpoint or settings.LLM_EMBEDDING_ENDPOINT
)
self.llm_embedding_chunk_size = (
app_config.llm_embedding_chunk_size or settings.LLM_EMBEDDING_CHUNK_SIZE
)
self.llm_context_size = app_config.llm_context_size or settings.LLM_CONTEXT_SIZE
self.llm_backend = app_config.llm_backend or settings.LLM_BACKEND
self.llm_model = app_config.llm_model or settings.LLM_MODEL
self.llm_api_key = app_config.llm_api_key or settings.LLM_API_KEY
@@ -0,0 +1,32 @@
# Generated by Django 5.2.6 on 2026-05-31
from django.core.validators import MinValueValidator
from django.db import migrations
from django.db import models
class Migration(migrations.Migration):
dependencies = [
("paperless", "0010_alter_applicationconfiguration_llm_embedding_backend"),
]
operations = [
migrations.AddField(
model_name="applicationconfiguration",
name="llm_embedding_chunk_size",
field=models.PositiveSmallIntegerField(
null=True,
validators=[MinValueValidator(1)],
verbose_name="Sets the LLM embedding chunk size",
),
),
migrations.AddField(
model_name="applicationconfiguration",
name="llm_context_size",
field=models.PositiveIntegerField(
null=True,
validators=[MinValueValidator(1)],
verbose_name="Sets the LLM context size",
),
),
]
+12
View File
@@ -318,6 +318,18 @@ class ApplicationConfiguration(AbstractSingletonModel):
max_length=256,
)
llm_embedding_chunk_size = models.PositiveSmallIntegerField(
verbose_name=_("Sets the LLM embedding chunk size"),
null=True,
validators=[MinValueValidator(1)],
)
llm_context_size = models.PositiveIntegerField(
verbose_name=_("Sets the LLM context size"),
null=True,
validators=[MinValueValidator(1)],
)
llm_backend = models.CharField(
verbose_name=_("Sets the LLM backend"),
blank=True,
+9
View File
@@ -1187,6 +1187,15 @@ LLM_EMBEDDING_BACKEND = os.getenv(
) # "huggingface", "openai-like", or "ollama"
LLM_EMBEDDING_MODEL = os.getenv("PAPERLESS_AI_LLM_EMBEDDING_MODEL")
LLM_EMBEDDING_ENDPOINT = os.getenv("PAPERLESS_AI_LLM_EMBEDDING_ENDPOINT")
LLM_EMBEDDING_CHUNK_SIZE = get_int_from_env(
"PAPERLESS_AI_LLM_EMBEDDING_CHUNK_SIZE",
1024,
)
if LLM_EMBEDDING_CHUNK_SIZE < 1:
raise ImproperlyConfigured("PAPERLESS_AI_LLM_EMBEDDING_CHUNK_SIZE must be >= 1")
LLM_CONTEXT_SIZE = get_int_from_env("PAPERLESS_AI_LLM_CONTEXT_SIZE", 8192)
if LLM_CONTEXT_SIZE < 1:
raise ImproperlyConfigured("PAPERLESS_AI_LLM_CONTEXT_SIZE must be >= 1")
LLM_BACKEND = os.getenv("PAPERLESS_AI_LLM_BACKEND") # "ollama" or "openai-like"
LLM_MODEL = os.getenv("PAPERLESS_AI_LLM_MODEL")
LLM_API_KEY = os.getenv("PAPERLESS_AI_LLM_API_KEY")
+43 -10
View File
@@ -423,21 +423,54 @@ class ApplicationConfigurationViewSet(ModelViewSet[ApplicationConfiguration]):
def perform_update(self, serializer):
old_instance = ApplicationConfiguration.objects.all().first()
old_ai_index_enabled = (
old_instance.ai_enabled and old_instance.llm_embedding_backend
old_llm_embedding_backend = (
old_instance.llm_embedding_backend or settings.LLM_EMBEDDING_BACKEND
)
old_llm_embedding_chunk_size = (
old_instance.llm_embedding_chunk_size or settings.LLM_EMBEDDING_CHUNK_SIZE
)
old_llm_embedding_endpoint = (
old_instance.llm_embedding_endpoint or settings.LLM_EMBEDDING_ENDPOINT
)
old_llm_embedding_model = (
old_instance.llm_embedding_model or settings.LLM_EMBEDDING_MODEL
)
old_llm_context_size = (
old_instance.llm_context_size or settings.LLM_CONTEXT_SIZE
)
new_instance: ApplicationConfiguration = serializer.save()
new_ai_index_enabled = (
new_instance.ai_enabled and new_instance.llm_embedding_backend
new_llm_embedding_backend = (
new_instance.llm_embedding_backend or settings.LLM_EMBEDDING_BACKEND
)
new_ai_index_enabled = bool(
new_instance.ai_enabled and new_llm_embedding_backend,
)
new_llm_embedding_chunk_size = (
new_instance.llm_embedding_chunk_size or settings.LLM_EMBEDDING_CHUNK_SIZE
)
new_llm_embedding_endpoint = (
new_instance.llm_embedding_endpoint or settings.LLM_EMBEDDING_ENDPOINT
)
new_llm_embedding_model = (
new_instance.llm_embedding_model or settings.LLM_EMBEDDING_MODEL
)
new_llm_context_size = (
new_instance.llm_context_size or settings.LLM_CONTEXT_SIZE
)
if (
not old_ai_index_enabled
and new_ai_index_enabled
and not vector_store_file_exists()
):
# AI index was just enabled and vector store file does not exist
embedding_config_changed = (
old_llm_embedding_backend != new_llm_embedding_backend
or old_llm_embedding_chunk_size != new_llm_embedding_chunk_size
or old_llm_embedding_endpoint != new_llm_embedding_endpoint
or old_llm_embedding_model != new_llm_embedding_model
or old_llm_context_size != new_llm_context_size
)
rebuild_needed = new_ai_index_enabled and (
not vector_store_file_exists() or embedding_config_changed
)
if rebuild_needed:
llmindex_index.apply_async(
kwargs={"rebuild": True},
headers={"trigger_source": PaperlessTask.TriggerSource.SYSTEM},