Ateliers : reecriture de la question en question autonome avant recherche

Sur une relance conversationnelle (et ses faiblesses ?), l embedding du
dernier message seul ne contient pas le sujet -> retrieval aveugle. Un appel
LLM leger (temperature 0, uniquement a partir du 2e tour) resout les
references implicites depuis l historique ; la question autonome sert a la
RECHERCHE (chat RAG + phase MAP de l analyse approfondie), la reponse finale
voit toujours l historique complet. Best-effort : tout echec retombe sur la
question brute (comportement historique).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 15:37:56 +02:00
parent 092898e379
commit 0e4820a2f8
3 changed files with 78 additions and 3 deletions

View File

@@ -20,6 +20,7 @@ from typing import AsyncIterator
import tiktoken
from app.application.llm_retry import generate_with_retry
from app.application.query_rewrite import standalone_question
from app.domain.models import ChatMessage
from app.domain.ports import LLMChatProvider, LLMProvider, LLMProviderError
from app.infrastructure import vector_store
@@ -85,7 +86,10 @@ class NotebookDeepUseCase:
SYNTHÈSE (reduce) reçoit les `history_limit` derniers messages → les relances
conversationnelles (« et pour les autres ? ») fonctionnent aussi en approfondi.
"""
question = next((m.content for m in reversed(messages) if m.role == "user"), "")
# Question autonome : la phase MAP lit chaque lot avec LA question — sur
# une relance conversationnelle, il faut y résoudre les références
# implicites, sinon les lots sont filtrés sur un texte sans sujet.
question = await standalone_question(self._llm, messages)
chunks: list[dict] = []
for sid in source_ids:
chunks.extend(vector_store.all_chunks(sid))