Aproveche Llama 2 LLM de código abierto para crear un chatbot personalizado con Python.
Llama 2 es un modelo de lenguaje grande (LLM) de código abierto desarrollado por Meta. Es un modelo de lenguaje grande de código abierto competente, posiblemente mejor que algunos modelos cerrados como GPT-3.5 y PaLM 2. Consta de tres tamaños de modelos de texto generativo previamente entrenados y ajustados, incluidos los modelos de parámetros de 7 mil millones, 13 mil millones y 70 mil millones.
Explorarás las capacidades conversacionales de Llama 2 creando un chatbot usando Streamlit y Llama 2.
Comprender Llama 2: características y beneficios
¿Qué tan diferente es Llama 2 de su predecesor? modelo de lenguaje grande, Llama 1?
- Tamaño de modelo más grande: El modelo es más grande, con hasta 70 mil millones de parámetros. Esto le permite aprender asociaciones más complejas entre palabras y oraciones.
- Habilidades de conversación mejoradas.: El aprendizaje por refuerzo a partir de la retroalimentación humana (RLHF) mejora las capacidades de aplicación conversacional. Esto permite que el modelo genere contenido similar al humano incluso en interacciones complicadas.
- Inferencia más rápida: Introduce un método novedoso llamado atención de consultas agrupadas para acelerar la inferencia. Esto se traduce en su capacidad para crear aplicaciones más útiles como chatbots y asistentes virtuales.
- Más eficiente: Es más eficiente en memoria y recursos computacionales que su predecesor.
- Licencia de código abierto y no comercial: Es de código abierto. Los investigadores y desarrolladores pueden utilizar y modificar Llama 2 sin restricciones.
Llama 2 supera significativamente a su predecesor en todos los aspectos. Estas características lo convierten en una herramienta potente para muchas aplicaciones, como chatbots, asistentes virtuales y comprensión del lenguaje natural.
Configuración de un entorno optimizado para el desarrollo de chatbots
Para comenzar a construir su aplicación, debe configurar un entorno de desarrollo. Esto es para aislar su proyecto de los proyectos existentes en su máquina.
Primero, comience por creando un entorno virtual utilizando el pipenv biblioteca de la siguiente manera:
pipenv shell
A continuación, instale las bibliotecas necesarias para crear el chatbot.
pipenv install streamlit replicate
iluminado: Es un marco de aplicación web de código abierto que genera rápidamente aplicaciones de ciencia de datos y aprendizaje automático.
Reproducir exactamente: Es una plataforma en la nube que brinda acceso a grandes modelos de aprendizaje automático de código abierto para su implementación.
Obtenga su token API Llama 2 de Replicate
Para obtener una clave de token replicada, primero debe registrar una cuenta en Reproducir exactamente usando su cuenta de GitHub.
Replicate solo permite iniciar sesión a través de un cuenta GitHub.
Una vez que haya accedido al panel, navegue hasta el Explorar y busque el chat de Llama 2 para ver el llama-2–70b-chat modelo.
Clickea en el llama-2–70b-chat modelo para ver los puntos finales de la API de Llama 2. Haga clic en el API botón en el llama-2–70b-chat barra de navegación del modelo. En el lado derecho de la página, haga clic en el Pitón botón. Esto le proporcionará acceso al token API para aplicaciones Python.
Copia el REPLICATE_API_TOKEN y guárdelo en un lugar seguro para uso futuro.
El código fuente completo está disponible en este repositorio de GitHub.
Construyendo el chatbot
Primero, cree un archivo Python llamado llama_chatbot.py y un archivo env (.env). Escribirá su código en llama_chatbot.py y almacenará sus claves secretas y tokens API en el archivo .env.
En el archivo llama_chatbot.py, importe las bibliotecas de la siguiente manera.
import streamlit as st
import os
import replicate
A continuación, establezca las variables globales del llama-2–70b-chat modelo.
# Global variables
REPLICATE_API_TOKEN = os.environ.get('REPLICATE_API_TOKEN', default='')
# Define model endpoints as independent variables
LLaMA2_7B_ENDPOINT = os.environ.get('MODEL_ENDPOINT7B', default='')
LLaMA2_13B_ENDPOINT = os.environ.get('MODEL_ENDPOINT13B', default='')
LLaMA2_70B_ENDPOINT = os.environ.get('MODEL_ENDPOINT70B', default='')
En el archivo .env, agregue el token replicado y los puntos finales del modelo en el siguiente formato:
REPLICATE_API_TOKEN='Paste_Your_Replicate_Token'
MODEL_ENDPOINT7B='a16z-infra/llama7b-v2-chat: 4f0a4744c7295c024a1de15e1a63c880d3da035fa1f49bfd344fe076074c8eea'
MODEL_ENDPOINT13B='a16z-infra/llama13b-v2-chat: df7690f1994d94e96ad9d568eac121aecf50684a0b0963b25a41cc40061269e5'
MODEL_ENDPOINT70B='replicate/llama70b-v2-chat: e951f18578850b652510200860fc4ea62b3b16fac280f83ff32282f87bbd2e48'
Pegue su token de réplica y guarde el archivo .env.
Diseño del flujo conversacional del Chatbot
Cree un mensaje previo para iniciar el modelo Llama 2 según la tarea que desee que realice. En este caso, desea que el modelo actúe como asistente.
# Set Pre-propmt
PRE_PROMPT = "You are a helpful assistant. You do not respond as " \
"'User' or pretend to be 'User'." \
" You only respond once as Assistant."
Configure la configuración de la página para su chatbot de la siguiente manera:
# Set initial page configuration
st.set_page_config(
page_title="LLaMA2Chat",
page_icon=":volleyball:",
layout="wide"
)
Escriba una función que inicialice y configure variables de estado de sesión.
# Constants
LLaMA2_MODELS = {
'LLaMA2-7B': LLaMA2_7B_ENDPOINT,
'LLaMA2-13B': LLaMA2_13B_ENDPOINT,
'LLaMA2-70B': LLaMA2_70B_ENDPOINT,
}# Session State Variables
DEFAULT_TEMPERATURE = 0.1
DEFAULT_TOP_P = 0.9
DEFAULT_MAX_SEQ_LEN = 512
DEFAULT_PRE_PROMPT = PRE_PROMPT
defsetup_session_state():
st.session_state.setdefault('chat_dialogue', [])
selected_model = st.sidebar.selectbox(
'Choose a LLaMA2 model:', list(LLaMA2_MODELS.keys()), key='model')
st.session_state.setdefault(
'llm', LLaMA2_MODELS.get(selected_model, LLaMA2_70B_ENDPOINT))
st.session_state.setdefault('temperature', DEFAULT_TEMPERATURE)
st.session_state.setdefault('top_p', DEFAULT_TOP_P)
st.session_state.setdefault('max_seq_len', DEFAULT_MAX_SEQ_LEN)
st.session_state.setdefault('pre_prompt', DEFAULT_PRE_PROMPT)
La función establece las variables esenciales como chat_diálogo, aviso previo, llm, arriba_p, max_seq_len, y temperatura en el estado de sesión. También maneja la selección del modelo Llama 2 según la elección del usuario.
Escriba una función para representar el contenido de la barra lateral de la aplicación Streamlit.
defrender_sidebar():
st.sidebar.header("LLaMA2 Chatbot")
st.session_state['temperature'] = st.sidebar.slider('Temperature:',
min_value=0.01, max_value=5.0, value=DEFAULT_TEMPERATURE, step=0.01)
st.session_state['top_p'] = st.sidebar.slider('Top P:', min_value=0.01,
max_value=1.0, value=DEFAULT_TOP_P, step=0.01)
st.session_state['max_seq_len'] = st.sidebar.slider('Max Sequence Length:',
min_value=64, max_value=4096, value=DEFAULT_MAX_SEQ_LEN, step=8)
new_prompt = st.sidebar.text_area(
'Prompt before the chat starts. Edit here if desired:',
DEFAULT_PRE_PROMPT, height=60)
if new_prompt != DEFAULT_PRE_PROMPT and new_prompt != ""and
new_prompt isnotNone:
st.session_state['pre_prompt'] = new_prompt + "\n"
else:
st.session_state['pre_prompt'] = DEFAULT_PRE_PROMPT
La función muestra el encabezado y las variables de configuración del chatbot Llama 2 para realizar ajustes.
Escriba la función que muestra el historial de chat en el área de contenido principal de la aplicación Streamlit.
defrender_chat_history():
response_container = st.container()
for message in st.session_state.chat_dialogue:
with st.chat_message(message["role"]):
st.markdown(message["content"])
La función itera a través del chat_dialogue guardado en el estado de la sesión, mostrando cada mensaje con el rol correspondiente (usuario o asistente).
Maneje la entrada del usuario usando la siguiente función.
defhandle_user_input():
user_input = st.chat_input(
"Type your question here to talk to LLaMA2"
)
if user_input:
st.session_state.chat_dialogue.append(
{"role": "user", "content": user_input}
)
with st.chat_message("user"):
st.markdown(user_input)
Esta función presenta la usuario con un campo de entrada donde pueden ingresar sus mensajes y preguntas. El mensaje se añade al chat_diálogo en el estado de sesión con el usuario rol una vez que el usuario envía el mensaje.
Escribe una función que genere respuestas del modelo Llama 2 y las muestre en el área de chat.
defgenerate_assistant_response():
message_placeholder = st.empty()
full_response = ""
string_dialogue = st.session_state['pre_prompt']
for dict_message in st.session_state.chat_dialogue:
speaker = "User"if dict_message["role"] == "user"else"Assistant"
string_dialogue += f"{speaker}: {dict_message['content']}\n"
output = debounce_replicate_run(
st.session_state['llm'],
string_dialogue + "Assistant: ",
st.session_state['max_seq_len'],
st.session_state['temperature'],
st.session_state['top_p'],
REPLICATE_API_TOKEN
)
for item in output:
full_response += item
message_placeholder.markdown(full_response + "▌")
message_placeholder.markdown(full_response)
st.session_state.chat_dialogue.append({"role": "assistant",
"content": full_response})
La función crea una cadena de historial de conversación que incluye mensajes del usuario y del asistente antes de llamar al debounce_replicate_run función para obtener la respuesta del asistente. Modifica continuamente la respuesta en la interfaz de usuario para brindar una experiencia de chat en tiempo real.
Escribe la función principal responsable de renderizar toda la aplicación Streamlit.
defrender_app():
setup_session_state()
render_sidebar()
render_chat_history()
handle_user_input()
generate_assistant_response()
Llama a todas las funciones definidas para configurar el estado de la sesión, representar la barra lateral, el historial de chat, manejar la entrada del usuario y generar respuestas del asistente en un orden lógico.
Escribe una función para invocar el render_app funcionar e iniciar la aplicación cuando se ejecuta el script.
defmain():
render_app()
if __name__ == "__main__":
main()
Ahora su aplicación debería estar lista para su ejecución.
Manejo de solicitudes de API
Crear un utils.py archivo en el directorio de su proyecto y agregue la siguiente función:
import replicate
import time# Initialize debounce variables
last_call_time = 0
debounce_interval = 2# Set the debounce interval (in seconds)defdebounce_replicate_run(llm, prompt, max_len, temperature, top_p,
API_TOKEN):
global last_call_time
print("last call time: ", last_call_time)current_time = time.time()
elapsed_time = current_time - last_call_timeif elapsed_time < debounce_interval:
print("Debouncing")
return"Hello! Your requests are too fast. Please wait a few" \
" seconds before sending another request."last_call_time = time.time()
output = replicate.run(llm, input={"prompt": prompt + "Assistant: ",
"max_length": max_len, "temperature":
temperature, "top_p": top_p,
"repetition_penalty": 1}, api_token=API_TOKEN)
return output
La función realiza un mecanismo antirrebote para evitar consultas API frecuentes y excesivas a partir de la entrada de un usuario.
A continuación, importe la función de respuesta antirrebote a su llama_chatbot.py archivo de la siguiente manera:
from utils import debounce_replicate_run
Ahora ejecuta la aplicación:
streamlit run llama_chatbot.py
Rendimiento esperado:
El resultado muestra una conversación entre el modelo y un humano.
Aplicaciones del mundo real de los chatbots Streamlit y Llama 2
Algunos ejemplos del mundo real de aplicaciones de Llama 2 incluyen:
- Chatbots: Su uso se aplica a la creación chatbots de respuesta humana que puede mantener conversaciones en tiempo real sobre varios temas.
- asistentes virtuales: Su uso se aplica a la creación de asistentes virtuales que comprendan y respondan consultas del lenguaje humano.
- Traducción de idiomas: Su uso aplica para tareas de traducción de idiomas.
- Resumen de texto: Su uso es aplicable para resumir textos grandes en textos cortos para una fácil comprensión.
- Investigación: Puede aplicar Llama 2 con fines de investigación respondiendo preguntas sobre una variedad de temas.
El futuro de la IA
Con modelos cerrados como GPT-3.5 y GPT-4, es bastante difícil para los pequeños jugadores construir algo sustancial usando LLM, ya que acceder a la API del modelo GPT puede ser bastante costoso.
Abrir modelos avanzados de lenguajes grandes como Llama 2 a la comunidad de desarrolladores es solo el comienzo de una nueva era de IA. Conducirá a una implementación más creativa e innovadora de los modelos en aplicaciones del mundo real, lo que conducirá a una carrera acelerada hacia el logro de la Superinteligencia Artificial (ASI).