|
"""Auto-metadatos v铆a LLM HuggingFace.""" |
|
from transformers import pipeline |
|
import os |
|
|
|
|
|
LLM_MODEL = os.getenv("LLM_METADATA_MODEL", "google/gemma-1.1-2b-it") |
|
|
|
|
|
_llm = None |
|
|
|
def get_llm(): |
|
global _llm |
|
if _llm is None: |
|
_llm = pipeline( |
|
"text-generation", |
|
model=LLM_MODEL, |
|
device_map="auto", |
|
max_new_tokens=256, |
|
trust_remote_code=True |
|
) |
|
return _llm |
|
|
|
def build_prompt(text: str) -> str: |
|
|
|
return ( |
|
"Analiza el siguiente texto y responde en JSON con las claves:\n" |
|
"\"summary\": resumen en una frase;\n" |
|
"\"topics\": lista de hasta 5 palabras clave o temas principales;\n" |
|
"\"language\": idioma detectado ('es', 'en', etc.);\n" |
|
"\"vertical\": vertical tem谩tica (SEO-LLM, eCommerce, etc).\n\n" |
|
"TEXTO:\n" + text.strip() + "\n\nJSON:" |
|
) |
|
|
|
def extract_metadata(text: str) -> dict: |
|
llm = get_llm() |
|
prompt = build_prompt(text) |
|
output = llm(prompt)[0]['generated_text'] |
|
|
|
import re, json |
|
m = re.search(r'\\{.*\\}', output, re.DOTALL) |
|
if not m: |
|
return {} |
|
try: |
|
result = json.loads(m.group(0)) |
|
return result |
|
except Exception: |
|
return {} |
|
|
|
|
|
if __name__ == "__main__": |
|
chunk = "El SEO para LLMs consiste en optimizar contenido pensando en c贸mo los grandes modelos de lenguaje recuperan informaci贸n relevante, mejorando la estructura, claridad y contexto del texto para aumentar la calidad de las respuestas generadas por IA." |
|
meta = extract_metadata(chunk) |
|
print(meta) |
|
|