paint-brush
Mi experiencia con LLama2 como desarrollador y hackerpor@morpheuslord
4,836 lecturas
4,836 lecturas

Mi experiencia con LLama2 como desarrollador y hacker

por Morpheuslord18m2023/08/13
Read on Terminal Reader

Demasiado Largo; Para Leer

Desata el poder de LLama2: ¡Eleva tu experiencia de IA con HackBot! 🚀 Sumérgete en un mundo donde la tecnología de vanguardia se encuentra con el análisis de ciberseguridad. Nuestro HackBot, impulsado por LLama2 de Meta, cierra la brecha entre la IA y los desafíos del mundo real. Interactúe sin problemas con LLama2 a través de indicaciones intuitivas, descubriendo vulnerabilidades y analizando código como nunca antes. Con las capacidades avanzadas de LLama2, HackBot ofrece información personalizada, generando respuestas conscientes del contexto que desentrañan tareas complejas. Desde descifrar datos escaneados hasta desentrañar las complejidades del código, HackBot agiliza el análisis de seguridad, poniendo el foco en la precisión y la profundidad. La destreza de LLama2 cobra vida, dando forma a conversaciones que se hacen eco de la comprensión humana. Embárcate en un viaje de empoderamiento de la IA con HackBot, la guía para aprovechar el potencial de LLama2. Experimente la IA que habla su idioma, elevando sus proyectos e ideas con cada interacción.
featured image - Mi experiencia con LLama2 como desarrollador y hacker
Morpheuslord HackerNoon profile picture
0-item
1-item
2-item
3-item

Bienvenido a la publicación de mi blog donde compartiré mi viaje y mis conocimientos sobre cómo trabajar con el modelo LLama2. LLama2 es un fantástico modelo de IA desarrollado por Meta, y es emocionante explorar sus capacidades que recuerdan a GPT-3. En esta publicación, profundizaremos en diferentes facetas de LLama2, incluida su configuración, requisitos previos, aplicaciones, significado e incluso un vistazo a cómo podemos entrenarlo nosotros mismos. Estoy encantado de mostrarles mi experiencia de aprendizaje con LLama2, todo lo que obtuve mientras trabajaba en mi proyecto HackBot .

temas a cubrir

  • ¿Qué es LLama2?
  • ¿Cómo empezar?
  • ¿Cómo lo usé en HackBot?
  • ¿Cómo entrenar al modelo?
  • Capacidades y ventajas.
  • Conferencias finales.

¿Qué es LLama2?

LLama2 es una tecnología de punta creada por Meta que se clasifica como un modelo de IA en su corazón. Piense en él como un asistente muy inteligente que puede comprender el lenguaje humano y producir respuestas significativas, casi humanas. El objetivo de LLama2 es mejorar la facilidad y naturalidad de las interacciones entre personas y ordenadores.


Considere cómo se expresa verbalmente cuando habla con amigos o redacta correos electrónicos; las personas con las que te comunicas entienden y reaccionan. De funcionamiento similar, LLama2 puede procesar enormes volúmenes de datos de texto y aprender de ellos. Esto hace posible que LLama2 ayude con una variedad de tareas, como entregar información y responder consultas, así como escribir contenido y ayudar con la resolución de problemas.


La característica única de LLama2 es que fue creado pensando en la accesibilidad. Es como tener un instrumento flexible que puede ser utilizado por cualquier persona con diferentes niveles de habilidad técnica. LLama2 proporciona un enfoque simple para acceder al potencial de la inteligencia artificial, ya sea que sea un desarrollador, escritor, estudiante o alguien que simplemente esté interesado en ella.


En esencia, LLama2 crea un reino de posibilidades donde las computadoras pueden interactuar más fácil y efectivamente con el lenguaje humano. Tus interacciones con la tecnología se vuelven mucho más productivas y eficientes, ya que es como tener un amigo virtual que está constantemente disponible para ayudarte con las actividades relacionadas con el texto y el lenguaje.

¿Cómo empezar?

Empecemos con los primeros pasos para ponerte en marcha. Las siguientes son las tareas que debe considerar para que el código funcione.


Elegir su idioma:

Python fue mi primera opción como compañero de viaje confiable. Es una gran opción para interactuar con LLama2 debido a su adaptabilidad y amplio uso en la comunidad de programación. Estás en buena forma si ya estás familiarizado con Python.


Configuración de lo esencial:


  • Acceso a la cuenta de HuggingFace y al repositorio de Lama:

    Para comenzar, deberá crear una cuenta en HuggingFace, una plataforma que alberga varios modelos y herramientas de IA. Asegúrese de que su cuenta esté preparada. Adicionalmente, puedes encontrar los componentes para LLama2 adquiriendo acceso al repositorio Lama de Meta.


  • Instalación de C/C++ y Cmake: LLama2 tiene un componente llamado LLama-cpp, que requiere que C/C++ y Cmake estén instalados en su sistema. Estas herramientas son esenciales para construir LLama-cpp, así que asegúrese de que estén configuradas y listas para funcionar.


Iniciar sesión y prepararse:


  • Inicio de sesión con Huggingface-cli: con los detalles de su cuenta de HuggingFace a mano, use la interfaz de línea de comandos de HuggingFace para iniciar sesión. Este paso lo conecta a la plataforma HuggingFace usando el token de su cuenta, lo que le otorga acceso a los recursos de IA que necesita. El token se puede encontrar usando esta URL si no encuentra uno, genere uno.


    Los comandos son:

     $ huggingface-cli login Token: Your_Token


  • Instalación de LLama-cpp: Llama-cpp es un enlace de acceso de bajo nivel para que llama y Python trabajen juntos y nos brinda más flexibilidad.


    La instalación se puede realizar de 2 formas:

    • La instalación directa de Python:

       pip install llama-cpp-python
    • La opción de compilación: para esto, debe consultar el archivo Léame del módulo, es complejo de explicar: LÉAME.md


  • Instalación de Langchain : Langchain es un marco abierto destinado a facilitar el desarrollo de aplicaciones modelo LLM. Usaremos los módulos LLamaCpp , PrompTemplate , CallbackManager y StreamingStdOutCallbackHandler en particular para esta tarea.


    El comando para la instalación es:

     pip install langchain pip install langchainplus-sdk


¿Cómo se usa en el código Python?

Ahora la pregunta principal es ¿cómo se usa?


Para responder que la parte de integración se puede dividir en pasos.


  • Descarga y definición del modelo:

    • Para esto, me referiré al código de HackBot.

    • Después de llamar a todos los módulos esenciales, debemos decidir el nombre del modelo y el repositorio del que queremos descargarlo.

       model_name_or_path = "localmodels/Llama-2-7B-Chat-ggml" model_basename = "llama-2-7b-chat.ggmlv3.q4_0.bin" model_path = hf_hub_download(repo_id=model_name_or_path, filename=model_basename)


    • En el código anterior, el módulo llama utilizado es un modelo de parámetros 7b o 7 mil millones y la versión llama2 de Localmodels.

    • Luego, model_path es referido por la ruta de descarga del modelo por el descargador huggingface que descarga llama-2-7b-chat.ggmlv3.q4_0.bin desde el repositorio al sistema.

    • La ruta es importante ya que LlamaCpp se referirá a la ubicación del modelo para usarla.


  • Defina una persona y una plantilla de solicitud:

     from langchain import PromptTemplate from langchain.callbacks.manager import CallbackManager from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler template = """ persona: {persona} You are a helpful, respectful, and honest cybersecurity analyst. Being a security analyst, you must scrutinize the details provided to ensure they are usable for penetration testing. Please ensure that your responses are socially unbiased and positive. If a question does not make any sense or is not factually coherent. If you don't know the answer to a question, please don't share false information. Keep your answers in English and do not divert from the question. If the answer to the asked question or query is complete, end your answer. Keep the answer accurate and do not skip details related to the query. Give your output in markdown format. """ prompt = PromptTemplate(template=template, input_variables=["persona"]) callback_manager = CallbackManager([StreamingStdOutCallbackHandler()])
    • Tenemos que dar una plantilla base para que una llama la use como sus personajes, como definirla como asistente personal o analista de seguridad cibernética.

    • La plantilla define cómo funcionará el modelo y puede tener un gran efecto en el resultado final, por lo que debe escribirse con sumo cuidado.

    • A continuación, se genera el aviso mediante la persona de plantilla y el módulo PromptTemplate mediante la persona.

    • El administrador de devolución de llamada se utiliza para mostrar la salida de la IA y también administrar los enlaces de entrada y salida.


  • Defina el módulo LlamaCpp:

     llm = LlamaCpp( model_path=model_path, input={"temperature": 0.75, "max_length": 3500, "top_p": 1}, callback_manager=callback_manager, max_tokens=3500, n_batch=3500, n_gpu_layers=60, verbose=False, n_ctx=3500, streaming=False, )
    • El módulo LlamaCpp es el módulo de conexión que vincula el módulo LLM descargado.
    • Para que el módulo funcione, debemos vincularlo con la ruta del modelo que está predefinida cuando iniciamos el descargador.
    • La longitud máxima de entrada debe definirse en la sección de entradas y los tokens máximos deben definirse. Los tokens son el texto que entiende la IA.
    • Luego se definen el lote, las capas de GPU y ctx y la transmisión se establece en False para que no muestre la salida directamente y se pueda almacenar con una variable para mantener limpia la salida final.


Ahora, al implementar esto, hemos creado una columna vertebral de chatbot o un conector y, al usar esto, podemos iniciar una conversación activa con el modelo de IA.

¿Cómo lo usé en HackBot?

HackBot fue mi intento de crear un bot de chat específico de seguridad cibernética y esta herramienta tiene características como escaneo de datos, herramientas de análisis de datos de registro y capacidades de análisis de código.


  • Bucle de interacción de chat:

     while True: try: prompt_in = Prompt.ask('> ') # ... except KeyboardInterrupt: pass


    Este ciclo crea un entorno interactivo donde el usuario puede ingresar comandos o indicaciones. El código espera la entrada del usuario usando Prompt.ask('> ') y maneja excepciones como KeyboardInterrupt (Ctrl+C) sin bloquear el programa. Este bucle garantiza que el chatbot siga respondiendo y pueda interactuar continuamente con el usuario.


  • Comandos de usuario de procesamiento:

     if prompt_in == 'quit_bot': quit() elif prompt_in == 'clear_screen': clearscr() pass elif prompt_in == 'bot_banner': # ... elif prompt_in == 'save_chat': # ... elif prompt_in == 'static_code_analysis': # ... elif prompt_in == 'vuln_analysis': # ... elif prompt_in == 'contact_dev': # ... elif prompt_in == 'help_menu': # ... else: # ...

    Dentro del bucle, la entrada del usuario se compara con diferentes palabras clave de comando. Dependiendo de la entrada, el código ejecuta las acciones correspondientes. Por ejemplo, si el usuario ingresa 'quit_bot', se llama a la función quit() para salir del programa. Si el usuario ingresa 'clear_screen', la función clearscr() borra la pantalla de la consola. Se aplica una lógica similar a otros comandos.


  • Generación de respuestas de IA:

     else: prompt = prompt_in print(Print_AI_out(prompt)) pass

    Si la entrada del usuario no coincide con ninguno de los comandos predefinidos, se trata como un aviso para la IA. La entrada se asigna a la variable prompt y se llama a la función Print_AI_out(prompt) para generar una respuesta AI basada en la solicitud proporcionada. La respuesta generada por IA luego se imprime en la consola.


  • Guardar historial de chat:

     def save_chat(chat_history: list[Any, Any]) -> None: f = open('chat_history.json', 'w+') f.write(json.dumps(chat_history)) f.close

    La función save_chat es responsable de guardar el historial de conversaciones, que incluye indicaciones del usuario y respuestas generadas por IA, en un archivo JSON llamado 'chat_history.json'. Esta función serializa los datos en la lista chat_history en formato JSON y los escribe en el archivo.


  • Análisis de Vulnerabilidad y Análisis de Código Estático:

     elif prompt_in == 'static_code_analysis': print(Markdown('----------')) language_used = Prompt.ask('Language Used> ') file_path = Prompt.ask('File Path> ') print(Markdown('----------')) print(static_analysis(language_used, file_path)) pass elif prompt_in == 'vuln_analysis': print(Markdown('----------')) scan_type = Prompt.ask('Scan Type > ') file_path = Prompt.ask('File Path > ') print(Markdown('----------')) print(vuln_analysis(scan_type, file_path)) pass

    Estas secciones manejan los comandos de usuario para realizar análisis de código estático y análisis de vulnerabilidad. Se solicita al usuario que proporcione información como el idioma utilizado o el tipo de escaneo, y una ruta de archivo. A continuación, se llama a la función de análisis correspondiente ( static_analysis o vuln_analysis ) con los datos proporcionados y la IA genera respuestas que incluyen los resultados del análisis.


  • Análisis de vulnerabilidad: en la sección vuln_analysis , el siguiente código solicita al usuario que ingrese:

     scan_type = Prompt.ask('Scan Type > ') file_path = Prompt.ask('File Path > ')


    Aquí, la función Prompt.ask se utiliza para solicitar información al usuario de forma interactiva. Se solicita al usuario que ingrese el tipo de escaneo y la ruta del archivo para los datos que deben analizarse. Estos insumos son esenciales para el análisis de vulnerabilidad. Una vez que el usuario proporciona estas entradas, el análisis se inicia mediante un aviso que incorpora la entrada del usuario:

     prompt = f""" **Objective:** You are a Universal Vulnerability Analyzer powered by the Llama2 model. Your main objective is to analyze any provided scan data or log data to identify potential vulnerabilities in the target system or network. You can use the scan type or the scanner type to prepare a better report. **Instructions:** # ... (rest of the instructions) **Input Data:** You will receive the scan file data or log file data in the required format as input. Ensure the data is correctly parsed and interpreted for analysis. **Output Format:** The vulnerability analysis report should be organized as mentioned in the "Comprehensive Report" section. Please perform the vulnerability analysis efficiently, considering the security implications and accuracy, and generate a detailed report that helps users understand the potential risks and take appropriate actions. --- Provide the scan type: {scan_type} Provide the scan data or log data that needs to be analyzed: {file_data} """


    En este indicador, los marcadores de posición {scan_type} y {file_data} se reemplazan con los valores reales ingresados por el usuario. Este mensaje dinámico luego se pasa al modelo LLama2 para generar una respuesta de IA que proporciona resultados de análisis basados en el tipo de escaneo y los datos de archivo proporcionados.


  • Análisis de código estático: de manera similar, en la sección static_code_analysis , el código solicita al usuario que ingrese:

     language_used = Prompt.ask('Language Used> ') file_path = Prompt.ask('File Path> ')


    Se solicita al usuario que proporcione el lenguaje de programación utilizado y la ruta del archivo para el código que debe analizarse. Estas entradas son cruciales para realizar análisis de código estático. Al igual que en la sección de análisis de vulnerabilidades, se construye un indicador que incorpora la entrada del usuario para el modelo LLama2:

     prompt = f""" **Objective:** Analyze the given programming file details to identify and report bugs, vulnerabilities, and syntax errors. Additionally, search for potential exposure of sensitive information such as API keys, passwords, and usernames. **File Details:** - Programming Language: {language_used} - File Name: {file_path} - File Data: {file_data} """


    Aquí, los marcadores de posición {language_used} y {file_path} se reemplazan con los valores reales proporcionados por el usuario. Este indicador dinámico se usa luego para generar una respuesta de IA que presenta los resultados del análisis en función del lenguaje de programación y la entrada de datos del archivo por parte del usuario.


    En ambos casos, el uso de avisos dinámicos asegura que las respuestas generadas por LLama2 sean contextualmente relevantes y adaptadas al análisis específico solicitado por el usuario.


  • Información de contacto y menú de ayuda:

     elif prompt_in == 'contact_dev': console.print(Panel( Align.center( Group(Align.center(Markdown(contact_dev))), vertical="middle", ), title= "Dev Contact", border_style="red" ), style="bold green" ) pass elif prompt_in == 'help_menu': console.print(Panel( Align.center( Group(Align.center(Markdown(help_menu))), vertical="middle", ), title= "Help Menu", border_style="red" ), style="bold green" ) pass


    Estas secciones manejan los comandos para mostrar información de contacto para el desarrollador ( contact_dev ) y el menú de ayuda que enumera los comandos disponibles ( help_menu ). Cuando los usuarios ingresan estos comandos, la información correspondiente se muestra en un panel con un formato agradable utilizando la biblioteca enriquecida.


  • Ejecución de la función principal:

     if __name__ == "__main__": main()

    La función main , que abarca toda la interacción del chat y la lógica de manejo, se ejecuta solo si el script se ejecuta directamente (no se importa como módulo). Esta línea garantiza que la funcionalidad principal del chatbot se ejecute cuando se ejecute el script.


Puede ver y probar todo el chatbot desde mi repositorio de Github: Enlace

¿Cómo entrenar al modelo?

Entrenar un modelo de IA es un proceso de transformación que requiere planificación y precisión. Aquí hay una guía paso a paso para completar el proceso.


Requisitos previos :

  • Tensor Power: un sistema sólido con una capacidad considerable de procesamiento de tensores sentará las bases para el éxito. Asegúrese de que su equipo pueda manejar la potencia de procesamiento necesaria para el entrenamiento del modelo de IA.


  • Conjunto de datos: un conjunto de datos que corresponda al formato de entrenamiento de IA acelerará la curva de aprendizaje de su modelo. La capacitación efectiva depende de datos de alta calidad, lo que afecta la precisión y la competencia del modelo.


  • Autotrain Advanced : Date acceso a este recurso de formación imprescindible para la inteligencia artificial. El procedimiento de formación se agiliza con este programa, que automatiza los procedimientos cruciales y aumenta la productividad.


El proceso de formación:

  • Preparación de datos: para garantizar la precisión y la uniformidad, organice y preprocese su conjunto de datos. Tener datos limpios y organizados es la clave para obtener los mejores resultados de entrenamiento.


  • Inicialización del modelo: elija el mejor modelo preentrenado para usarlo como punto de partida. Se acelera la convergencia y se pone en marcha el proceso de formación.


  • Ajuste fino: ajuste los hiperparámetros como la tasa de aprendizaje, el tamaño del lote y la configuración del optimizador para ajustar los parámetros. Para equilibrar el rendimiento del modelo y la velocidad de convergencia, ajuste estos parámetros.


  • Iteraciones de entrenamiento: ejecute el conjunto de datos a través del modelo varias veces (épocas) para comenzar el entrenamiento. El modelo mejora su comprensión con cada iteración, mejorando su propensión a la predicción.


  • Validación y prueba: utilice un conjunto de datos de validación distinto para validar continuamente el desarrollo de su modelo. La capacidad de generalización del modelo se evalúa mediante pruebas con nuevos datos.


  • Análisis y seguimiento: preste mucha atención a las métricas de formación. Indicadores como curvas de pérdida, tendencias de precisión y otras métricas ofrecen información sobre el desarrollo del modelo.


  • Optimización y ajuste: ajuste los hiperparámetros estratégicamente en función de los resultados del seguimiento. Para obtener el rendimiento deseado, refine el modelo iterativamente.


  • Evaluación e implementación: Realice una evaluación exhaustiva del conjunto de datos de prueba del modelo final. Si está satisfecho con los resultados, utilice el modelo entrenado en aplicaciones prácticas.


El conjunto de datos:

El conjunto de datos puede ser uno que esté preconstruido como los disponibles en los conjuntos de datos huggingface en los conjuntos de datos específicos de generación de texto disponibles. Para conjuntos de datos personalizados, asegúrese de seguir estos pasos:


  • El conjunto de datos debe incluir al menos 3 columnas.
  • La primera columna debe ser el Nombre, la segunda puede ser una Descripción y la tercera y última debe mostrar la solicitud y la respuesta de AI.


Aquí hay un formato de conjunto de datos de muestra que puede usar: data.csv

Nombre

Descripción

Inmediato

Saludo

Saludos y respuestas básicos

###HUMANO: Hola.

###Analista: ¡Hola!

Clima

preguntando por el clima

###HUMANO: ¿Cómo está el tiempo hoy?

###Analista: Hace sol y calor.

Restaurante

Preguntar sobre una recomendación de restaurante

###HUMANO: ¿Puedes sugerir un buen restaurante?

###Analista: ¡Claro! Recomiendo probar...

Tecnología

Discutiendo las últimas tendencias tecnológicas

###HUMAN: ¿Cuáles son las tendencias tecnológicas de este año?

###Analista: La IA y la cadena de bloques son tendencias destacadas...

Viajar

Buscando consejos y sugerencias de viaje

###HUMAN: Consejos de viaje para visitar París

###Analista: ¡Absolutamente! Cuando en París...

Este es solo 1 tipo.


Una vez que tenga su conjunto de datos, es hora de entrenar su IA según la cantidad de potencia de GPU que tenga y el tamaño de su conjunto de datos, el tiempo también corresponde en consecuencia. Ahora podemos usar módulos avanzados de autoentrenamiento de huggingface para entrenar la IA.


Podemos instalar autotrain-advanced usando este comando:

 pip install autotrain-advanced


Y este comando para entrenar la IA:

 autotrain llm --train --project_name your_project_name --model TinyPixel/Llama-2-7B-bf16-sharded --data_path your_data_set --use_peft --use_int4 --learning_rate 2e-4 --train_batch_size 2 --num_train_epochs 3 --trainer sft --model_max_length 2048 --push_to_hub --repo_id your_repo_id -


Puede cambiar el nombre_del_proyecto de your_project_name al nombre real de su proyecto, el modelo de TinyPixel/Llama-2-7B-bf16-sharded al modelo de llama que le interesa entrenar y la ruta de datos a . si es un conjunto de datos personalizado o huggingface/dataset el ID del repositorio del conjunto de datos si es de huggingface.


Mi objetivo es entrenar un modelo Llama o cualquier modelo LLM que pueda tener en mis manos para que sea un asistente completo de ciberseguridad para automatizar la mayoría de nuestras tareas como piratas informáticos, lo que sería una bendición tener.

Capacidades y ventajas

Entonces, hablando de capacidades, Meta ha publicado documentos de investigación para Llama con varios puntos de referencia. Según los documentos, los modelos Llama tienen un rango de parámetros de 7B a 65B y tienen un rendimiento competitivo en comparación con otros modelos de lenguaje grande. Por ejemplo, Llama-13B supera a GPT-3 en la mayoría de los puntos de referencia a pesar de ser 10 veces más pequeño. El modelo de parámetros 65B de Llama también es competitivo con otros modelos de lenguaje grande como Chinchilla o PaLM-540B. Los documentos también mencionan que un modelo más pequeño entrenado durante más tiempo puede ser, en última instancia, más barato en la inferencia. Afirma que el rendimiento de un modelo 7B continúa mejorando incluso después de tokens 1T. Sin embargo, el documento no proporciona valores numéricos específicos para las diferencias de rendimiento entre los modelos Llama.


Otras fuentes afirman que los modelos Llama son más versátiles y rápidos en comparación con los modelos GPT y también con los modelos PaLM, lo que lo convierte en uno de los mejores modelos de IA que existen para usar. Pero para la piratería o cualquier tarea específica de seguridad, esto requiere mucha capacitación o aportes personales. No es fácil generar un modelo de capacitación para ello, pero una vez capacitado, esto puede cambiar las reglas del juego.

Conferencias finales

  • Eficiencia sin precedentes: la IA ha transformado los procesos que solían llevar horas y ahora se completan en segundos, aumentando la productividad y liberando tiempo crucial.
  • Toma de decisiones mejorada: los análisis impulsados por IA ofrecen decisiones inteligentes basadas en datos, lo que mejora la precisión y la previsión en una variedad de disciplinas.
  • Experiencias personalizadas: AI crea experiencias que se adaptan a las preferencias de una persona, desde sugerencias personalizadas hasta plataformas para el aprendizaje adaptativo.
  • Automatización de operaciones monótonas: la perfecta integración de la IA libera tiempo para proyectos más innovadores y estratégicos.
  • Soluciones innovadoras: la IA promueve innovaciones en el cuidado de la salud, el medio ambiente y otras áreas, abordando problemas complicados de manera más efectiva.


El viaje al mundo de la inteligencia artificial ha sido increíblemente esclarecedor, demostrando el asombroso impacto de la automatización y la integración. Tengo un profundo aprecio por cómo la IA está cambiando la forma en que trabajamos e interactuamos después de ver sus capacidades en una variedad de industrias. Mi experiencia de aprendizaje ha sido una revelación, desde observar la automatización perfecta de las operaciones regulares hasta experimentar la incorporación de la IA en la vida diaria. Aprendí que la automatización y la integración son más que simples ideas técnicas a medida que aprendo más sobre las complejidades de la IA; más bien, actúan como catalizadores de la innovación. Con esta nueva perspectiva, ahora puedo ver un mundo en el que el potencial de la IA para mejorar la eficiencia y la colaboración es ilimitado.

Fuentes

Contactos

Puedes comunicarte conmigo a través de LinkedIn . Si tiene alguna inquietud, puede comentar a continuación.

Gracias por leer.