EasyLLM: simplifique el procesamiento del modelo de lenguaje y realice un cambio sin problemas entre los clientes OpenAI y Hugging Face

prefacio

En este corto período de menos de un año, se puede decir que los modelos de lenguaje a gran escala (LLM) que han surgido en el país y en el extranjero están en plena floración, y han surgido algunos modelos muy buenos sin importar si son de código abierto o cerrado. Sin embargo, al usar LLM para el desarrollo de aplicaciones, encontrará que hay más o menos diferencias en cada modelo, desde la implementación hasta la capacitación, el ajuste, el desarrollo de la interfaz API, el formato de palabra de solicitud, etc. no es tan conveniente de usar y no es fácil de mantener.

Primero, el proceso de uso e implementación de LLM es relativamente complicado. Existen diferencias entre los diferentes proveedores y marcos de LLM, lo que resulta en un tedioso trabajo de configuración y adaptación para los usuarios. Por ejemplo, puede haber incompatibilidades entre el uso de Completion API, ChatCompletion, Completion e Embedding de OpenAI y las funciones correspondientes que usan Hugging Face, lo que requiere que los usuarios modifiquen manualmente el código para adaptarlo a diferentes modelos.

En segundo lugar, el formato de solicitud del LLM también es un problema. Diferentes LLM pueden usar diferentes formatos de solicitud, lo que requiere una conversión de formato al cambiar entre diferentes modelos. Esto genera una carga de trabajo adicional y costos de aprendizaje para los usuarios.

Además, el tiempo de respuesta del LLM también es una consideración. En algunos escenarios, especialmente aquellos que requieren interacción en tiempo real, esperar a que todo el LLM termine de generar resultados puede causar demoras e inconvenientes.

Para resolver los problemas anteriores, surgió EasyLLM , que puede ayudarnos a resolver estos problemas fácilmente.

1. Introducción a EasyLLM

EasyLLM es un proyecto de código abierto destinado a simplificar y mejorar el proceso de gestión de LLM. Proporciona un cliente compatible que permite a los usuarios cambiar fácilmente entre diferentes LLM modificando una sola línea de código. Además, EasyLLM también proporciona un asistente rápido para ayudar a los usuarios a convertir entre diferentes formatos de LLM. Además, EasyLLM admite la transmisión, los usuarios pueden obtener resultados generados parcialmente de inmediato sin esperar la respuesta completa.

La primera versión de EasyLLM implementa un cliente compatible con la API de finalización de OpenAI. Esto significa que puede reemplazar fácilmente openai.ChatCompletion, openai.Completion, openai.Embeddingcon huggingface.ChatCompletion, huggingface.Completiono huggingface.Embedding. Solo necesita ser reemplazado cambiando una línea de código.

A través de EasyLLM, podemos usar y aplicar diferentes modelos de LLM de manera más conveniente, mejorando la eficiencia y flexibilidad del trabajo. A continuación, profundicemos en las principales características y funciones de EasyLLM y cómo puede brindarnos una mejor experiencia de LLM.

2. Características de EasyLLM

A continuación se muestra una lista de las características actuales

  • Cliente compatible: implementa un cliente compatible con la API de OpenAI ChatCompletion, y . Cambie fácilmente entre diferentes LLM cambiando una sola línea de código.CompletionEmbedding

  • Prompt Helper - Utilidad para ayudar a convertir avisos entre diferentes formatos de LLM. Por ejemplo, pase del formato de mensaje OpenAI a sugerencias para modelos como LLaMA.

  • Soporte de transmisión: transmita los resultados de finalización de su LLM en lugar de esperar la respuesta completa. Genial para cosas como interfaces de chat.

Planes hasta ahora:

  • evol_instruct(en progreso) - es un método para crear instrucciones usando LLM que puede convertir instrucciones simples en complejas.

  • prompt_utils- Los métodos auxiliares pueden convertir fácilmente entre formatos de sugerencias como OpenAI Messages y sugerencias de modelos de código abierto como Llama 2.

  • sagemakerLos clientes pueden interactuar fácilmente con LLM implementado en Amazon SageMaker

3. Primeros pasos con EasyLLM

Instale EasyLLM a través de pip:

pip install easyllm

Luego importe un cliente y comience a usarlo:

from easyllm.clients import huggingface

# D定义要使用的提示
huggingface.prompt_builder = "llama2"
# huggingface.api_key="hf_xxx" # change api key if needed

response = huggingface.ChatCompletion.create(
    model="meta-llama/Llama-2-70b-chat-hf",
    messages=[
        {"role": "system", "content": "\nYou are a helpful assistant speaking like a pirate. argh!"},
        {"role": "user", "content": "What is the sun?"},
    ],
      temperature=0.9,
      top_p=0.6,
      max_tokens=256,
)

print(response)

Resultado de salida:

{
  "id": "hf-lVC2iTMkFJ",
  "object": "chat.completion",
  "created": 1690661144,
  "model": "meta-llama/Llama-2-70b-chat-hf",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": " Arrrr, the sun be a big ol' ball o' fire in the sky, me hearty! It be the source o' light and warmth for our fair planet, and it be a mighty powerful force, savvy? Without the sun, we'd be sailin' through the darkness, lost and cold, so let's give a hearty \"Yarrr!\" for the sun, me hearties! Arrrr!"
      },
      "finish_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 111,
    "completion_tokens": 299,
    "total_tokens": 410
  }
}

Consulte la documentación para obtener más ejemplos e instrucciones de uso detalladas. El código está en GitHub .

4. Cliente EasyLLM

En el contexto de EasyLLM, "cliente" se refiere al código que interactúa con una API LLM específica (como OpenAI). Los clientes soportados actualmente son:

  • ChatCompletion- ChatCompletion se usa para interactuar con LLM que son compatibles con la API de OpenAI ChatCompletion.

  • Completion- Para interactuar con LLM compatibles con OpenAI Completion API.

  • Embedding- Para interactuar con LLM compatibles con OpenAI Embedding API.

5. Compatible con el cliente Hugging Face

EasyLLM proporciona un cliente que interactúa con el modelo HuggingFace. El cliente es compatible con la API de inferencia de HuggingFace , los puntos finales de inferencia de Hugging Face o cualquier servicio web que ejecute inferencias generadoras de texto o puntos finales de API compatibles.

  • huggingface.ChatCompletion- Un cliente para interactuar con el modelo HuggingFace, que es compatible con la API OpenAI ChatCompletion.

  • huggingface.Completion- Cliente para interactuar con modelos HuggingFace compatibles con OpenAI Completion API.

  • huggingface.Embedding- Cliente para interactuar con modelos HuggingFace compatibles con OpenAI Embedding API.

5.1、huggingface.ChatCompletion

Este huggingface.ChatCompletioncliente se usa para interactuar con los modelos HuggingFace que se ejecutan en la inferencia de generación de texto que son compatibles con la API OpenAI ChatCompletion.

from easyllm.clients import huggingface

# hubbingface模块会自动从环境变量HUGGINGFACE_TOKEN或HuggingFace CLI配置文件中加载HuggingFace API密钥。
# huggingface.api_key="hf_xxx"
hubbingface.prompt_builder = "llama2"

response = huggingface.ChatCompletion.create(
    model="meta-llama/Llama-2-70b-chat-hf",
    messages=[
        {"role": "system", "content": "\nYou are a helpful, respectful and honest assistant."},
        {"role": "user", "content": "Knock knock."},
    ],
    temperature=0.9,
    top_p=0.6,
    max_tokens=1024,
)

Los parámetros soportados son:

  • model- El modelo utilizado para generar el resultado final. Si no se proporciona, la URL base se utiliza de forma predeterminada.

  • messages- List[ChatMessage]Lista de mensajes de chat para generar resultados de finalización.

  • temperature- El parámetro de temperatura utilizado para generar el resultado final. El valor predeterminado es 0,9.

  • top_p- El parámetro top_p utilizado para generar resultados de finalización. El valor predeterminado es 0,6.

  • top_k- El parámetro top_k para generar resultados finales. El valor predeterminado es 10.

  • n- El número de resultados completos a generar. El valor predeterminado es 1.

  • max_tokens- El número máximo de tokens a generar. El valor predeterminado es 1024.

  • stop- Una secuencia de parada para generar resultados finales. El valor predeterminado es Ninguno.

  • stream- Ya sea para transmitir los resultados de finalización. El valor predeterminado es falso.

  • frequency_penalty- Parámetro de penalización de frecuencia por generar terminaciones. El valor predeterminado es 1.0.

  • debug- Ya sea para habilitar el registro de depuración. El valor predeterminado es falso.

5.2、huggingface.Finalización

Este huggingface.Completioncliente se utiliza para interactuar con los modelos HuggingFace que se ejecutan en la inferencia de generación de texto, que son compatibles con la API de finalización de OpenAI.

from easyllm.clients import huggingface

# hubbingface模块会自动从环境变量HUGGINGFACE_TOKEN或HuggingFace CLI配置文件中加载HuggingFace API密钥。
# huggingface.api_key="hf_xxx"
hubbingface.prompt_builder = "llama2"

response = huggingface.Completion.create(
    model="meta-llama/Llama-2-70b-chat-hf",
    prompt="What is the meaning of life?",
    temperature=0.9,
    top_p=0.6,
    max_tokens=1024,
)

Los parámetros soportados son:

  • model- El modelo utilizado para generar el resultado final. Si no se proporciona, la URL base se utiliza de forma predeterminada.

  • prompt- Texto que se usará para completar, si se establece prompt_builder, el mensaje se formateará usando prompt_builder.

  • temperature- El parámetro de temperatura utilizado para generar el resultado final. El valor predeterminado es 0,9.

  • top_p- El parámetro top_p utilizado para generar resultados de finalización. El valor predeterminado es 0,6.

  • top_k- El parámetro top_k para generar resultados finales. El valor predeterminado es 10.

  • n- El número de resultados completos a generar. El valor predeterminado es 1.

  • max_tokens- El número máximo de tokens a generar. El valor predeterminado es 1024.

  • stop- Una secuencia de parada para generar resultados finales. El valor predeterminado es Ninguno.

  • stream- Ya sea para transmitir los resultados de finalización. El valor predeterminado es falso.

  • frequency_penalty- Parámetro de penalización de frecuencia por generar terminaciones. El valor predeterminado es 1.0.

  • debug- Ya sea para habilitar el registro de depuración. El valor predeterminado es falso.

  • echo- Si hacer eco del mensaje. El valor predeterminado es falso.

  • logprobs- Si devolver logprobs (probabilidades de registro). El valor predeterminado es Ninguno.

5.3、huggingface.Embedding

Este huggingface.Embeddingcliente se utiliza para interactuar con los modelos HuggingFace que se ejecutan como una API compatible con la API de incrustación de OpenAI.

from easyllm.clients import huggingface

# hubbingface模块会自动从环境变量HUGGINGFACE_TOKEN或HuggingFace CLI配置文件中加载HuggingFace API密钥。
# huggingface.api_key="hf_xxx"

embedding = huggingface.Embedding.create(
    model="sentence-transformers/all-MiniLM-L6-v2",
    text="What is the meaning of life?",
)

len(embedding["data"][0]["embedding"])

Los parámetros soportados son:

  • model- Se utiliza para crear modelos integrados. Si no se proporciona, el valor predeterminado es la URL base.

  • input- Union[str, List[str]]El documento a incrustar.

5.4 Configuración del entorno

El cliente se puede configurar configurando la variable de entorno Hugging Face o anulando el valor predeterminado. Aquí se explica cómo ajustar los generadores de señales, URL y sugerencias de HF.

5.4.1 Establecer token HF

De forma predeterminada, huggingfaceel cliente intentará leer HUGGINGFACE_TOKENlas variables de entorno. Si no está configurado, intentará ~/.huggingfaceleer el token de la carpeta. Si no se establece, no se utilizará ningún token.

Alternativamente, puede configurar manualmente el token a través de la configuración huggingface.api_key.

Configure la clave API manualmente:

from easyllm.clients import huggingface

huggingface.api_key="hf_xxx"

res = huggingface.ChatCompletion.create(...)

Usar variables de entorno:

import os
os.environ["HUGGINGFACE_TOKEN"] = "hf_xxx"

from easyllm.clients import huggingface

5.4.2 Cambiar la dirección URL

De forma predeterminada, Hugging Faceel cliente intentará leer HUGGINGFACE_API_BASElas variables de entorno. Si esta variable no está configurada, utilizará la dirección URL predeterminada:

https://api-inference.huggingface.co/modelos

Esto es útil si desea utilizar una dirección URL diferente (como https://zj5lt7pmzqzbp0d1.us-east-1.aws.endpoints.huggingface.cloud) o una dirección URL local (como http://localhost:8000 ) o el punto final de inferencia Hugging Face muy útil.

Además, puede huggingface.api_baseconfigurar manualmente la dirección URL a través de la configuración. Si establece una dirección URL personalizada, debe dejar modelel parámetro en blanco.

Configure manualmente la base de API:

from easyllm.clients import huggingface

huggingface.api_base="https://my-url"


res = huggingface.ChatCompletion.create(...)

Usar variables de entorno:

import os
os.environ["HUGGINGFACE_API_BASE"] = "https://my-url"

from easyllm.clients import huggingface

5.4.3, Consejos de construcción

De forma predeterminada, huggingfaceel cliente intentará leer HUGGINGFACE_PROMPTlas variables de entorno e intentará asignar valores a PROMPT_MAPPINGlos diccionarios. Si no se establece, utilizará el generador de sugerencias predeterminado. También puede configurarlo manualmente.

Configure manualmente el generador de pistas:

from easyllm.clients import huggingface

huggingface.prompt_builder = "llama2"

res = huggingface.ChatCompletion.create(...)

Usar variables de entorno:

import os
os.environ["HUGGINGFACE_PROMPT"] = "llama2"

from easyllm.clients import huggingface

6. Migración de OpenAI a HuggingFace

Migrar de OpenAI a HuggingFace es fácil. Simplemente cambie la declaración de importación y el cliente para usar y el generador de sugerencias opcional.

- import openai
+ from easyllm.clients import huggingface
+ huggingface.prompt_builder = "llama2"


- response = openai.ChatCompletion.create(
+ response = huggingface.ChatCompletion.create(
-    model="gpt-3.5-turbo",
+    model="meta-llama/Llama-2-70b-chat-hf",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Knock knock."},
    ],
)

Asegúrese de que sus hiperparámetros sigan siendo válidos al cambiar entre diferentes clientes (es decir, al usar diferentes modelos o sistemas). Por ejemplo, el parámetro de temperatura del modelo GPT-3 puede ser diferente del parámetro de temperatura del modelo Llama-2.

Los hiperparámetros son parámetros utilizados en el aprendizaje automático y el aprendizaje profundo para ajustar el comportamiento y el rendimiento del modelo. Uno de los hiperparámetros comunes es la temperatura, que controla la diversidad y la aleatoriedad del texto generado. Diferentes modelos pueden tener diferentes requisitos o valores predeterminados para los parámetros de temperatura, por lo que al cambiar entre diferentes modelos, se debe tener cuidado para garantizar que la configuración de los hiperparámetros coincida con el modelo utilizado para obtener los resultados esperados.

7. Información sobre herramientas

El módulo prompt_utils contiene funciones para convertir un diccionario de mensajes en avisos que se pueden usar con el cliente ChatCompletion.

Los formatos de solicitud admitidos actualmente son:

  • Llama 2

  • Vicuña

  • Abrazando la cara ChatML

  • WizardLM

  • EstableBeluga2

  • Abrir Asistente

Prompt utils también exporta un diccionario de asignación PROMPT_MAPPING que asigna un nombre de modelo a un constructor de solicitudes. El constructor de sugerencias correcto se puede seleccionar a través de una variable de entorno.

PROMPT_MAPPING = {
    "chatml_falcon": build_chatml_falcon_prompt,
    "chatml_starchat": build_chatml_starchat_prompt,
    "llama2": build_llama2_prompt,
    "open_assistant": build_open_assistant_prompt,
    "stablebeluga": build_stablebeluga_prompt,
    "vicuna": build_vicuna_prompt,
    "wizardlm": build_wizardlm_prompt,
}

El siguiente código muestra cómo configurar el generador de sugerencias para el cliente Hugging Face

from easyllm.clients import huggingface

# vicuna, chatml_falcon, chatml_starchat, wizardlm, stablebeluga, open_assistant
huggingface.prompt_builder = "llama2" 

7.1 Generador de chat LLama 2

Consejos para crear sesiones de chat de LLama 2. Se pueden encontrar consejos sobre cómo usar LLama 2 en el blog Hugging Face. Si pasa un mensaje con un rol no admitido, se generará un error.

Modelo de ejemplo:

from easyllm.prompt_utils import build_llama2_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_llama2_prompt(messages)

7.2 Constructor Vicuña Chat

Consejos para crear conversaciones de chat de Vicuña. Si pasa un mensaje con un rol no admitido, se generará un error.

Modelo de ejemplo:

from easyllm.prompt_utils import build_vicuna_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_vicuna_prompt(messages)

7.3 Generador ChatML de cara abrazada

Consejos para crear Hugging Face ChatMLconversaciones de chat. Hugging Face ChatML tiene diferentes sugerencias para diferentes modelos de ejemplo, como StarChato Falcon. Si pasa un mensaje con un rol no admitido, se generará un error.

Modelo de ejemplo:

7.3.1, StarChat

from easyllm.prompt_utils import build_chatml_starchat_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_chatml_starchat_prompt(messages)

7.3.2、Halcón

from easyllm.prompt_utils import build_chatml_falcon_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_chatml_falcon_prompt(messages)

7.4 Creador de chat WizardLM

Sugerencias para crear sesiones de chat de WizardLM. Si pasa un mensaje con un rol no admitido, se generará un error.

Modelo de ejemplo:

from easyllm.prompt_utils import build_wizardlm_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_wizardlm_prompt(messages)

7.5 Creador de chat StableBeluga2

Consejos para crear sesiones de chat StableBeluga2. Si pasa un mensaje con un rol no admitido, se generará un error.

from easyllm.prompt_utils import build_stablebeluga_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_stablebeluga_prompt(messages)

7.6 Abrir Asistente Chat Builder

Cree una plantilla de Open Assistant ChatML. Usa las etiquetas <|prompter|>, </s>y . Si pasa un mensaje con un rol no admitido, se generará un error.<|system|><|assistant|>

Modelo de ejemplo:

from easyllm.prompt_utils import build_open_assistant_prompt

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Explain asynchronous programming in the style of the pirate Blackbeard."},
]
prompt = build_open_assistant_prompt(messages)

8. Casos de aplicación

Aquí hay algunos ejemplos para ayudarlo a comenzar con la biblioteca easyllm:

ejemplo describir
Ejemplo detallado de finalización de chat
https://philschmid.github.io/easyllm/examples/chat-completion-api/
Demuestra cómo usar la API de ChatCompletion para tener un chat conversacional con un modelo.
Ejemplo de cómo transmitir solicitudes de chat
https://philschmid.github.io/easyllm/examples/stream-chat-completions/
Demuestra la transmisión de múltiples solicitudes de chat para chatear de manera eficiente con un modelo.
Ejemplo de cómo transmitir finalizaciones de texto
https://philschmid.github.io/easyllm/examples/stream-text-completions/
Demuestra cómo transmitir varias solicitudes de finalización de texto.
Ejemplo detallado de finalización
https://philschmid.github.io/easyllm/examples/text-completion-api/
Genere texto a partir de un modelo utilizando la API TextCompletion.
Crear incrustaciones
https://philschmid.github.io/easyllm/examples/get-embeddings/
Utilice el modelo para incrustar texto en representaciones vectoriales.
Ejemplo de punto final de inferencia de cara de abrazo
https://philschmid.github.io/easyllm/examples/inference-endpoints-example/
Ejemplos de cómo usar puntos finales personalizados, como puntos finales de inferencia o localhost
Uso de la generación mejorada de recuperación de Llama 2
https://philschmid.github.io/easyllm/examples/llama2-rag-example/
Ejemplo de cómo usar Llama 2 70B para mejorar la recuperación contextual
Ejemplo de uso del agente/herramienta Llama 2 70B
https://philschmid.github.io/easyllm/examples/llama2-agent-example/
Ejemplo de cómo usar Llama 2 70B para interactuar con herramientas y puede usarse como proxy

Estos ejemplos cubren las funciones principales de EasyLLM: chat, finalización de texto e incrustación.

Nueve, Referencias

  • EasyLLM GitHub

    • https://github.com/philschmid/easyllm

  • Llama 2 Prompt

    • https://huggingface.co/blog/llama2#how-to-prompt-llama-2

  • Vicuna Prompt

    • https://github.com/lm-sys/FastChat/blob/main/docs/vicuna_weights_version.md#prompt-template

  • Mensaje de StarChat

    • https://huggingface.co/HuggingFaceH4/starchat-beta

  • Solicitud de WizardLM

    • https://github.com/nlpxucan/WizardLM/blob/main/WizardLM/src/infer_wizardlm13b.py#L79

  • EstableBeluga2

    • https://huggingface.co/stabilityai/StableBeluga2

Supongo que te gusta

Origin blog.csdn.net/FrenzyTechAI/article/details/132270200
Recomendado
Clasificación