fix: add /think and /no-think added to API to run with ollama

This commit is contained in:
2026-04-20 10:53:58 +02:00
parent 8a0edc3d59
commit 351dd3b608
6 changed files with 27 additions and 13 deletions

View File

@ -103,12 +103,15 @@ func (p *Pipeline) GenerateForUser(ctx context.Context, userID string) (*models.
maxArticles = 50
}
// Passe 1 : filtrage par pertinence sur les titres si trop d'articles
if len(articles) > maxArticles {
// Passe 1 : filtrage par pertinence — seulement si nettement plus d'articles que le max
if len(articles) > maxArticles*2 {
fmt.Printf("[pipeline] Passe 1 — filtrage : %d articles → sélection des %d plus pertinents…\n", len(articles), maxArticles)
t1 := time.Now()
articles = p.filterByRelevance(ctx, provider, symbols, articles, maxArticles)
fmt.Printf("[pipeline] Passe 1 — terminée en %s : %d articles retenus\n", time.Since(t1).Round(time.Second), len(articles))
} else if len(articles) > maxArticles {
articles = articles[:maxArticles]
fmt.Printf("[pipeline] troncature directe à %d articles (pas assez d'excédent pour justifier un appel IA)\n", maxArticles)
}
systemPrompt, _ := p.repo.GetSetting("ai_system_prompt")
@ -122,7 +125,8 @@ func (p *Pipeline) GenerateForUser(ctx context.Context, userID string) (*models.
fmt.Printf("[pipeline] Passe 2 — résumé : génération sur %d articles…\n", len(articles))
t2 := time.Now()
prompt := buildPrompt(systemPrompt, symbols, articles, tz)
summary, err := provider.Summarize(ctx, prompt)
// Passe 2 : think activé pour une meilleure qualité d'analyse
summary, err := provider.Summarize(ctx, prompt, GenOptions{Think: true, NumCtx: 32768})
if err != nil {
return nil, fmt.Errorf("AI summarize: %w", err)
}
@ -135,7 +139,8 @@ func (p *Pipeline) GenerateForUser(ctx context.Context, userID string) (*models.
// en ne lui envoyant que les titres (prompt très court = rapide).
func (p *Pipeline) filterByRelevance(ctx context.Context, provider Provider, symbols []string, articles []models.Article, max int) []models.Article {
prompt := buildFilterPrompt(symbols, articles, max)
response, err := provider.Summarize(ctx, prompt)
// Passe 1 : pas de think, contexte réduit (titres seulement = prompt court)
response, err := provider.Summarize(ctx, prompt, GenOptions{Think: false, NumCtx: 8192})
if err != nil {
fmt.Printf("[pipeline] Passe 1 — échec (%v), repli sur troncature\n", err)
return articles[:max]
@ -159,7 +164,6 @@ func (p *Pipeline) filterByRelevance(ctx context.Context, provider Provider, sym
func buildFilterPrompt(symbols []string, articles []models.Article, max int) string {
var sb strings.Builder
sb.WriteString("/no_think\n")
sb.WriteString("Tu es un assistant de trading financier. ")
sb.WriteString(fmt.Sprintf("Parmi les %d articles ci-dessous, sélectionne les %d plus pertinents pour un trader actif.\n", len(articles), max))
@ -265,7 +269,7 @@ func (p *Pipeline) callProviderForReport(ctx context.Context, excerpt, question
excerpt, question,
)
return provider.Summarize(ctx, prompt)
return provider.Summarize(ctx, prompt, GenOptions{Think: true, NumCtx: 16384})
}
func buildPrompt(systemPrompt string, symbols []string, articles []models.Article, tz string) string {
@ -282,7 +286,6 @@ func buildPrompt(systemPrompt string, symbols []string, articles []models.Articl
loc = time.UTC
}
sb.WriteString(fmt.Sprintf("Date d'analyse : %s\n\n", time.Now().In(loc).Format("02/01/2006 15:04")))
sb.WriteString("/think\n\n")
sb.WriteString("## Actualités\n\n")
for i, a := range articles {