Recherche et analyse d'information avec les LLM

Recherche et analyse d’information avec les LLM

Introduction

Les modèles de langage peuvent être utilisés pour créer des systèmes de recherche intelligents et des outils d’analyse d’information sophistiqués. Ce tutoriel explore les différentes façons d’implémenter ces fonctionnalités avec les LLM.

Types de recherche et d’analyse

1. Recherche sémantique

2. Analyse d’information

3. Extraction de connaissances

Implémentation

1. Système de recherche sémantique

from openai import OpenAI
import json
from typing import List, Dict, Any
import numpy as np

class SemanticSearchSystem:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
    
    def search(self, query: str, documents: List[Dict[str, Any]], 
               search_type: str = "semantic") -> List[Dict[str, Any]]:
        prompt = self._create_search_prompt(query, documents, search_type)
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en recherche sémantique."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)
    
    def _create_search_prompt(self, query: str, documents: List[Dict[str, Any]], 
                            search_type: str) -> str:
        return f"""
        Effectue une recherche {search_type} pour la requête suivante :
        
        Requête : {query}
        Documents : {json.dumps(documents, indent=2)}
        
        Pour chaque résultat, fournis :
        1. Le document pertinent
        2. Le score de pertinence
        3. Les raisons de la pertinence
        4. Les extraits pertinents
        
        Réponds au format JSON.
        """

2. Analyseur d’information

class InformationAnalyzer:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
    
    def analyze_information(self, information: Dict[str, Any], 
                          analysis_type: str = "document") -> Dict[str, Any]:
        prompt = self._create_analysis_prompt(information, analysis_type)
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en analyse d'information."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)
    
    def _create_analysis_prompt(self, information: Dict[str, Any], 
                              analysis_type: str) -> str:
        return f"""
        Analyse l'information suivante de type {analysis_type} :
        
        Information : {json.dumps(information, indent=2)}
        
        Fournis :
        1. L'analyse détaillée
        2. Les points clés
        3. Les insights
        4. Les recommandations
        
        Réponds au format JSON.
        """

3. Extracteur de connaissances

class KnowledgeExtractor:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
    
    def extract_knowledge(self, text: str, extraction_type: str = "entities") -> Dict[str, Any]:
        prompt = self._create_extraction_prompt(text, extraction_type)
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en extraction de connaissances."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)
    
    def _create_extraction_prompt(self, text: str, extraction_type: str) -> str:
        return f"""
        Extrais les connaissances de type {extraction_type} du texte suivant :
        
        Texte : {text}
        
        Fournis :
        1. Les éléments extraits
        2. Leur contexte
        3. Leur importance
        4. Leurs relations
        
        Réponds au format JSON.
        """

Applications avancées

1. Moteur de recherche intelligent

class IntelligentSearchEngine:
    def __init__(self, api_key: str):
        self.search_system = SemanticSearchSystem(api_key)
        self.information_analyzer = InformationAnalyzer(api_key)
        self.knowledge_extractor = KnowledgeExtractor(api_key)
    
    def search_and_analyze(self, query: str, documents: List[Dict[str, Any]]) -> Dict[str, Any]:
        # Recherche sémantique
        search_results = self.search_system.search(query, documents)
        
        # Analyse des résultats
        analysis_results = []
        for result in search_results:
            analysis = self.information_analyzer.analyze_information(result)
            analysis_results.append(analysis)
        
        # Extraction de connaissances
        knowledge_results = []
        for result in search_results:
            knowledge = self.knowledge_extractor.extract_knowledge(result["content"])
            knowledge_results.append(knowledge)
        
        return {
            "search_results": search_results,
            "analysis_results": analysis_results,
            "knowledge_results": knowledge_results,
            "insights": self._generate_insights(search_results, analysis_results, knowledge_results)
        }
    
    def _generate_insights(self, search_results: List[Dict[str, Any]], 
                         analysis_results: List[Dict[str, Any]], 
                         knowledge_results: List[Dict[str, Any]]) -> Dict[str, Any]:
        prompt = f"""
        Génère des insights basés sur les résultats de recherche et d'analyse :
        
        Résultats de recherche : {json.dumps(search_results, indent=2)}
        Résultats d'analyse : {json.dumps(analysis_results, indent=2)}
        Résultats d'extraction : {json.dumps(knowledge_results, indent=2)}
        
        Fournis :
        1. Les insights principaux
        2. Les patterns identifiés
        3. Les connexions
        4. Les recommandations
        
        Réponds au format JSON.
        """
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en analyse d'information."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)

2. Analyseur de données avancé

class AdvancedDataAnalyzer:
    def __init__(self, api_key: str):
        self.information_analyzer = InformationAnalyzer(api_key)
        self.knowledge_extractor = KnowledgeExtractor(api_key)
    
    def analyze_data(self, data: Dict[str, Any], analysis_type: str = "comprehensive") -> Dict[str, Any]:
        # Analyse d'information
        information_analysis = self.information_analyzer.analyze_information(
            data,
            "data_analysis"
        )
        
        # Extraction de connaissances
        knowledge_extraction = self.knowledge_extractor.extract_knowledge(
            json.dumps(data),
            "patterns"
        )
        
        return {
            "information_analysis": information_analysis,
            "knowledge_extraction": knowledge_extraction,
            "recommendations": self._generate_recommendations(
                information_analysis,
                knowledge_extraction
            )
        }
    
    def _generate_recommendations(self, information_analysis: Dict[str, Any], 
                                knowledge_extraction: Dict[str, Any]) -> Dict[str, Any]:
        prompt = f"""
        Génère des recommandations basées sur l'analyse d'information et l'extraction de connaissances :
        
        Analyse d'information : {json.dumps(information_analysis, indent=2)}
        Extraction de connaissances : {json.dumps(knowledge_extraction, indent=2)}
        
        Fournis :
        1. Les recommandations principales
        2. Les actions suggérées
        3. Les améliorations possibles
        4. Les priorités
        
        Réponds au format JSON.
        """
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en analyse de données."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)

Optimisation et personnalisation

1. Gestionnaire de contexte

class ContextManager:
    def __init__(self):
        self.context = {}
    
    def update_context(self, context_data: Dict[str, Any]):
        self.context.update(context_data)
    
    def get_context(self) -> Dict[str, Any]:
        return self.context
    
    def clear_context(self):
        self.context = {}
    
    def get_context_report(self) -> Dict[str, Any]:
        return {
            "context": self.context,
            "summary": self._generate_summary(),
            "recommendations": self._generate_recommendations()
        }

2. Optimiseur de résultats

class ResultOptimizer:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
    
    def optimize_results(self, results: List[Dict[str, Any]], 
                        optimization_criteria: Dict[str, Any]) -> List[Dict[str, Any]]:
        prompt = f"""
        Optimise les résultats suivants selon les critères donnés :
        
        Résultats : {json.dumps(results, indent=2)}
        Critères : {json.dumps(optimization_criteria, indent=2)}
        
        Fournis :
        1. Les résultats optimisés
        2. Les améliorations apportées
        3. Les métriques de performance
        4. Les recommandations
        
        Réponds au format JSON.
        """
        
        response = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "Tu es un expert en optimisation de résultats."},
                {"role": "user", "content": prompt}
            ],
            temperature=0.3
        )
        
        return json.loads(response.choices[0].message.content)

Bonnes pratiques

1. Gestion de la qualité

class QualityManager:
    def __init__(self):
        self.quality_metrics = {
            "accuracy": 0,
            "relevance": 0,
            "completeness": 0,
            "consistency": 0
        }
    
    def update_metrics(self, result_data: Dict[str, Any]):
        self.quality_metrics["accuracy"] = self._calculate_accuracy(result_data)
        self.quality_metrics["relevance"] = self._calculate_relevance(result_data)
        self.quality_metrics["completeness"] = self._calculate_completeness(result_data)
        self.quality_metrics["consistency"] = self._calculate_consistency(result_data)
    
    def get_quality_report(self) -> Dict[str, Any]:
        return {
            "metrics": self.quality_metrics,
            "summary": self._generate_summary(),
            "recommendations": self._generate_recommendations()
        }

2. Analytics de recherche

class SearchAnalytics:
    def __init__(self):
        self.metrics = {
            "total_searches": 0,
            "success_rate": 0,
            "average_time": 0,
            "user_satisfaction": 0
        }
    
    def update_metrics(self, search_data: Dict[str, Any]):
        self.metrics["total_searches"] += 1
        self.metrics["success_rate"] = self._calculate_success_rate()
        self.metrics["average_time"] = self._update_average(
            self.metrics["average_time"],
            search_data["time"]
        )
        self.metrics["user_satisfaction"] = self._calculate_satisfaction()
    
    def get_analytics_report(self) -> Dict[str, Any]:
        return {
            "metrics": self.metrics,
            "trends": self._calculate_trends(),
            "recommendations": self._generate_recommendations()
        }

Conclusion

Les LLM offrent des capacités puissantes pour la recherche et l’analyse d’information. En utilisant les techniques présentées dans ce tutoriel, vous pouvez :

Dans le prochain tutoriel, nous explorerons l’utilisation des LLM pour la création d’applications de génération de code et d’assistance au développement.