CoolFace
Apppublic

jperezgon/LargeLanguageModel

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
streamlit_app.py169 linesDownload Raw Back to src
1import streamlit as st2from langchain_core.messages import AIMessage, HumanMessage3from langchain_core.prompts import MessagesPlaceholder4from langchain_ollama import ChatOllama5from langchain_openai import ChatOpenAI6from langchain_huggingface import HuggingFaceEndpoint7from langchain_core.output_parsers import StrOutputParser8from langchain_core.prompts import ChatPromptTemplate9from langdetect import detect10from dotenv import load_dotenv11import httpx12import os13 14 15# Cargar variables de entorno16load_dotenv()17os.environ["STREAMLIT_CONFIG_DIR"] = "./.streamlit"18 19# Configuración de la página de Streamlit20st.set_page_config(page_title="Mi asistente personal de IA (By Jorge Pérez) 🤖", page_icon="🤖")21st.title("Mi asistente personal de IA (By Jorge Pérez) 🤖")22 23# Selección de modelo24model_class = st.selectbox(25    "Selecciona el modelo:",26    options=["ollama", "openai", "hf_hub"],27    index=0,  # Por defecto, Ollama28    format_func=lambda x: {"ollama": "Ollama", "openai": "OpenAI", "hf_hub": "HuggingFace"}[x]29)30 31# Configuración de sliders para temperatura y longitud de respuesta32st.sidebar.header("Configuración del modelo")33temperature = st.sidebar.slider(34    "Creatividad (Temperature):",35    min_value=0.0,36    max_value=1.0,37    value=0.1,38    step=0.0539)40max_tokens = st.sidebar.slider(41    "Límite de tokens de respuesta:",42    min_value=16,43    max_value=512,44    value=64,45    step=1646)47 48# Funciones para cargar los modelos (actualizadas con sliders)49def model_hf_hub(model="meta-llama/Meta-Llama-3-8B-Instruct", temperature=0.1, max_tokens=64):50    hf_api_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")51    llm = HuggingFaceEndpoint(52        repo_id=model,53        temperature=temperature,54        max_new_tokens=max_tokens,55        return_full_text=False,56        api_token=hf_api_token,57        model_kwargs={58            "stop": ["<|endoftext|>", "<|eot_id|>"],  # Tokens de parada59        }60    )61    return llm62 63def model_openai(model="gpt-4o-mini", temperature=0.1, max_tokens=64):64    llm = ChatOpenAI(65        model=model,66        temperature=temperature,67        max_tokens=max_tokens68    )69    return llm70 71def model_ollama(model="llama3.1:latest", temperature=0.1, max_tokens=64):72    llm = ChatOllama(73        model=model,74        temperature=temperature,75        max_tokens=max_tokens,76        base_url="http://127.0.0.1:11434"77    )78    return llm79 80# Función para obtener la respuesta del modelo (actualizada con detección dinámica de idioma)81def model_response(user_query, model_class):82    try:83        # Detectar el idioma del usuario84        detected_language = detect(user_query)85        language_map = {86            "es": "spanish",87            "en": "english",88            "fr": "french",89            "de": "german",90        }91        language = language_map.get(detected_language, "english")  # Por defecto, inglés si no se detecta92 93        # Seleccionar el modelo según la clase94        if model_class == "hf_hub":95            llm = model_hf_hub(temperature=temperature, max_tokens=max_tokens)96        elif model_class == "openai":97            llm = model_openai(temperature=temperature, max_tokens=max_tokens)98        elif model_class == "ollama":99            llm = model_ollama(temperature=temperature, max_tokens=max_tokens)100        else:101            raise ValueError(f"Clase de modelo desconocida: {model_class}")102 103        # Definición del prompt con el idioma detectado104        system_prompt = f"""105        You are a helpful assistant. Respond only in {language} without providing translations or explanations in other languages.106        """107        user_prompt = "{input}"108 109        # Crear el prompt template110        prompt_template = ChatPromptTemplate.from_messages([111            ("system", system_prompt),112            ("user", user_prompt)113        ])114 115        # Crear la cadena116        chain = prompt_template | llm | StrOutputParser()117 118        # Respuesta del modelo119        return chain.stream({120            "input": user_query,121            "language": language122        })123    except httpx.ConnectError as e:124        st.error("No se pudo conectar al servidor Ollama. Asegúrate de que está en ejecución y accesible.")125        return iter([])  # Devuelve un iterador vacío para evitar fallos126    127# Inicializar el historial de chat en el estado de la sesión128if "chat_history" not in st.session_state:129    st.session_state.chat_history = [130        AIMessage(content="Hola, soy tu asistente virtual. ¿En qué puedo ayudarte hoy?")131    ]132 133# Mostrar el historial de chat134for message in st.session_state.chat_history:135    if isinstance(message, HumanMessage):136        with st.chat_message("Human"):137            st.write(message.content)138    elif isinstance(message, AIMessage):139        with st.chat_message("AI"):140            st.write(message.content)141 142# Capturar la consulta del usuario143user_query = st.chat_input("Introduce mensaje...")144 145if user_query:146    # Añadir el mensaje del usuario al historial147    st.session_state.chat_history.append(HumanMessage(content=user_query))148 149    # Mostrar el mensaje del usuario en la interfaz150    with st.chat_message("Human"):151        st.write(user_query)152 153    # Obtener la respuesta del modelo154    with st.chat_message("AI"):155        response_placeholder = st.empty()156        final_response = ""157 158        try:159            # Obtener la respuesta del modelo como un flujo160            response_stream = model_response(user_query, model_class)161            for chunk in response_stream:162                final_response += chunk163                response_placeholder.markdown(final_response + "▌")  # Mostrar respuesta en tiempo real164            response_placeholder.markdown(final_response)  # Mostrar respuesta final165        except Exception as e:166            response_placeholder.markdown(f"⚠️ Error al obtener la respuesta: {e}")167 168        # Añadir la respuesta del asistente al historial169        st.session_state.chat_history.append(AIMessage(content=final_response))