jperezgon/LargeLanguageModel
0
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))