mirror of
https://github.com/Ladebeze66/ragflow_preprocess.git
synced 2026-02-04 06:00:27 +01:00
141 lines
6.1 KiB
Python
141 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Agent LLM pour la traduction de contenu
|
|
"""
|
|
|
|
import json
|
|
import requests
|
|
from typing import Optional, Dict
|
|
|
|
from .base import LLMBaseAgent
|
|
|
|
class TranslationAgent(LLMBaseAgent):
|
|
"""
|
|
Agent LLM spécialisé dans la traduction de texte
|
|
"""
|
|
|
|
def __init__(self, model_name: str = "mistral", **config):
|
|
"""
|
|
Initialise l'agent de traduction
|
|
|
|
Args:
|
|
model_name (str): Nom du modèle de traduction (défaut: mistral)
|
|
**config: Paramètres de configuration supplémentaires
|
|
"""
|
|
super().__init__(model_name, **config)
|
|
|
|
# Définir les prompts de traduction
|
|
self.prompts = {
|
|
"fr_to_en": "Traduis le texte suivant du français vers l'anglais. "
|
|
"Préserve le formatage, le ton et le style du texte original. "
|
|
"Assure-toi que la traduction est fluide et naturelle.\n\n"
|
|
"Texte français :\n{text}",
|
|
|
|
"en_to_fr": "Traduis le texte suivant de l'anglais vers le français. "
|
|
"Préserve le formatage, le ton et le style du texte original. "
|
|
"Assure-toi que la traduction est fluide et naturelle.\n\n"
|
|
"Texte anglais :\n{text}"
|
|
}
|
|
|
|
def generate(self, text: str, source_lang: str = "fr", target_lang: str = "en") -> str:
|
|
"""
|
|
Traduit un texte d'une langue source vers une langue cible
|
|
|
|
Args:
|
|
text (str): Texte à traduire
|
|
source_lang (str): Langue source (fr ou en)
|
|
target_lang (str): Langue cible (fr ou en)
|
|
|
|
Returns:
|
|
str: La traduction générée par le modèle
|
|
"""
|
|
if not text:
|
|
return ""
|
|
|
|
# Déterminer la direction de traduction
|
|
if source_lang == "fr" and target_lang == "en":
|
|
direction = "fr_to_en"
|
|
elif source_lang == "en" and target_lang == "fr":
|
|
direction = "en_to_fr"
|
|
else:
|
|
return f"Traduction non prise en charge: {source_lang} vers {target_lang}"
|
|
|
|
# Construire le prompt
|
|
prompt = self.prompts[direction].format(text=text)
|
|
|
|
try:
|
|
# Construire la payload pour l'API Ollama
|
|
payload = {
|
|
"model": self.model_name,
|
|
"prompt": prompt,
|
|
"options": {
|
|
"temperature": self.config.get("temperature", 0.1), # Basse pour traduction précise
|
|
"top_p": self.config.get("top_p", 0.95),
|
|
"top_k": self.config.get("top_k", 40),
|
|
"num_predict": self.config.get("max_tokens", 2048)
|
|
}
|
|
}
|
|
|
|
# Dans une implémentation réelle, envoyer la requête à l'API Ollama
|
|
# response = requests.post(f"{self.endpoint}/api/generate", json=payload)
|
|
# json_response = response.json()
|
|
# return json_response.get("response", "")
|
|
|
|
# Pour cette démonstration, retourner une traduction simulée
|
|
if direction == "fr_to_en":
|
|
if "schéma" in text.lower():
|
|
return text.replace("schéma", "diagram").replace("Schéma", "Diagram")
|
|
elif "tableau" in text.lower():
|
|
return text.replace("tableau", "table").replace("Tableau", "Table")
|
|
elif "formule" in text.lower():
|
|
return text.replace("formule", "formula").replace("Formule", "Formula")
|
|
else:
|
|
# Exemple très simplifié de "traduction"
|
|
translations = {
|
|
"Le": "The", "la": "the", "les": "the", "des": "the",
|
|
"et": "and", "ou": "or", "pour": "for", "avec": "with",
|
|
"est": "is", "sont": "are", "contient": "contains",
|
|
"montre": "shows", "représente": "represents",
|
|
"plusieurs": "several", "important": "important",
|
|
"information": "information", "données": "data",
|
|
"processus": "process", "système": "system",
|
|
"analyse": "analysis", "résultat": "result"
|
|
}
|
|
|
|
# Remplacement simple mot à mot
|
|
result = text
|
|
for fr, en in translations.items():
|
|
result = result.replace(f" {fr} ", f" {en} ")
|
|
|
|
return result
|
|
else: # en_to_fr
|
|
if "diagram" in text.lower():
|
|
return text.replace("diagram", "schéma").replace("Diagram", "Schéma")
|
|
elif "table" in text.lower():
|
|
return text.replace("table", "tableau").replace("Table", "Tableau")
|
|
elif "formula" in text.lower():
|
|
return text.replace("formula", "formule").replace("Formula", "Formule")
|
|
else:
|
|
# Exemple très simplifié de "traduction"
|
|
translations = {
|
|
"The": "Le", "the": "le", "and": "et", "or": "ou",
|
|
"for": "pour", "with": "avec", "is": "est",
|
|
"are": "sont", "contains": "contient", "shows": "montre",
|
|
"represents": "représente", "several": "plusieurs",
|
|
"important": "important", "information": "information",
|
|
"data": "données", "process": "processus",
|
|
"system": "système", "analysis": "analyse",
|
|
"result": "résultat"
|
|
}
|
|
|
|
# Remplacement simple mot à mot
|
|
result = text
|
|
for en, fr in translations.items():
|
|
result = result.replace(f" {en} ", f" {fr} ")
|
|
|
|
return result
|
|
|
|
except Exception as e:
|
|
return f"Erreur lors de la traduction: {str(e)}" |