ragflow_preprocess/agents/translation.py
2025-03-27 14:08:10 +01:00

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)}"