From 102ee7ae137761068e30bdbf3195b512a418139b Mon Sep 17 00:00:00 2001 From: wangxiaolei Date: Fri, 5 Dec 2025 10:32:53 +0800 Subject: [PATCH] perf: optimize generate conversation name (#29131) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../advanced_chat/generate_task_pipeline.py | 2 +- .../easy_ui_based_generate_task_pipeline.py | 2 +- .../task_pipeline/message_cycle_manager.py | 31 +++++++++++++------ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/api/core/app/apps/advanced_chat/generate_task_pipeline.py b/api/core/app/apps/advanced_chat/generate_task_pipeline.py index c98bc1ffdd..b297f3ff20 100644 --- a/api/core/app/apps/advanced_chat/generate_task_pipeline.py +++ b/api/core/app/apps/advanced_chat/generate_task_pipeline.py @@ -770,7 +770,7 @@ class AdvancedChatAppGenerateTaskPipeline(GraphRuntimeStateSupport): tts_publisher.publish(None) if self._conversation_name_generate_thread: - self._conversation_name_generate_thread.join() + logger.debug("Conversation name generation running as daemon thread") def _save_message( self, diff --git a/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py b/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py index c49db9aad1..98548ddfbb 100644 --- a/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py +++ b/api/core/app/task_pipeline/easy_ui_based_generate_task_pipeline.py @@ -366,7 +366,7 @@ class EasyUIBasedGenerateTaskPipeline(BasedGenerateTaskPipeline): if publisher: publisher.publish(None) if self._conversation_name_generate_thread: - self._conversation_name_generate_thread.join() + logger.debug("Conversation name generation running as daemon thread") def _save_message(self, *, session: Session, trace_manager: TraceQueueManager | None = None): """ diff --git a/api/core/app/task_pipeline/message_cycle_manager.py b/api/core/app/task_pipeline/message_cycle_manager.py index e7daeb4a32..2e6f92efa5 100644 --- a/api/core/app/task_pipeline/message_cycle_manager.py +++ b/api/core/app/task_pipeline/message_cycle_manager.py @@ -1,4 +1,6 @@ +import hashlib import logging +import time from threading import Thread from typing import Union @@ -31,6 +33,7 @@ from core.app.entities.task_entities import ( from core.llm_generator.llm_generator import LLMGenerator from core.tools.signature import sign_tool_file from extensions.ext_database import db +from extensions.ext_redis import redis_client from models.model import AppMode, Conversation, MessageAnnotation, MessageFile from services.annotation_service import AppAnnotationService @@ -68,6 +71,8 @@ class MessageCycleManager: if auto_generate_conversation_name and is_first_message: # start generate thread + # time.sleep not block other logic + time.sleep(1) thread = Thread( target=self._generate_conversation_name_worker, kwargs={ @@ -76,7 +81,7 @@ class MessageCycleManager: "query": query, }, ) - + thread.daemon = True thread.start() return thread @@ -98,15 +103,23 @@ class MessageCycleManager: return # generate conversation name - try: - name = LLMGenerator.generate_conversation_name( - app_model.tenant_id, query, conversation_id, conversation.app_id - ) - conversation.name = name - except Exception: - if dify_config.DEBUG: - logger.exception("generate conversation name failed, conversation_id: %s", conversation_id) + query_hash = hashlib.md5(query.encode()).hexdigest()[:16] + cache_key = f"conv_name:{conversation_id}:{query_hash}" + cached_name = redis_client.get(cache_key) + if cached_name: + name = cached_name.decode("utf-8") + else: + try: + name = LLMGenerator.generate_conversation_name( + app_model.tenant_id, query, conversation_id, conversation.app_id + ) + redis_client.setex(cache_key, 3600, name) + except Exception: + if dify_config.DEBUG: + logger.exception("generate conversation name failed, conversation_id: %s", conversation_id) + name = query[:47] + "..." if len(query) > 50 else query + conversation.name = name db.session.commit() db.session.close()