LLM-Client-SDK est un SDK pour une intégration transparente avec les grands modèles de langage génératifs d'IA (nous prenons actuellement en charge - OpenAI, Google, AI21, HuggingfaceHub, Aleph Alpha, Anthropic, les modèles locaux avec transformateurs - et bien d'autres bientôt).
Notre vision est de fournir un SDK asynchrone natif et prêt pour la production tout en créant une intégration puissante et rapide avec différents LLM sans laisser l'utilisateur perdre toute flexibilité (paramètres API, points de terminaison, etc.). *Nous fournissons également une version de synchronisation, voir plus de détails ci-dessous dans la section Utilisation.
Le package expose deux interfaces simples pour une intégration transparente avec les LLM (à l'avenir, nous étendrons l'interface pour prendre en charge davantage de tâches telles que les modèles de liste, les modifications, etc.) :
from abc import ABC, abstractmethodfrom dataclasses import dataclass, fieldfrom typing import Any, Facultatiffrom enum import Enumfrom dataclasses_json import dataclass_json, configfrom aiohttp import ClientSessionclass BaseLLMClient(ABC):@abstractmethodasync def text_completion(self, prompt: str, **kwargs) -> list [str]:raise NotImplementedError()async def get_tokens_count(self, text: str, **kwargs) -> int:raise NotImplementedError()class Role(Enum):SYSTEM = "system"USER = "user"ASSISTANT = "assistant"@dataclass_json@dataclassclass ChatMessage:role: Role = field(metadata=config(encoder=lambda role: role.value, decoder=Role))content: strname : Facultatif[str] = field(default=None, metadata=config(exclude=lambda name : name is None))exemple : bool = field(default=False, metadata=config(exclude=lambda _: True)) @dataclassclass LLMAPIClientConfig:api_key : strsession : ClientSessionbase_url : Facultatif[str] = Nonedefault_model : Facultatif[str] = Aucunen-têtes : dict[str, Any] = field(default_factory=dict)class BaseLLMAPIClient(BaseLLMClient, ABC):def __init__(self, configuration : LLMAPIClientConfig ): ...@abstractmethodasync def text_completion(self, prompt : str, model : Facultatif[str] = Aucun, max_tokens : int | Aucun = Aucun, température : Facultatif[float] = Aucun, top_p : Facultatif[float] = Aucun, * *kwargs) -> list[str]:raise NotImplementedError()async def chat_completion(self, messages : list[ChatMessage], température : float = 0, max_tokens : int = 16, modèle : Facultatif[str] = Aucun, **kwargs) -> list[str]:raise NotImplementedError()async def embedding(self, text: str , modèle : Facultatif[str] = Aucun, **kwargs) -> list[float]:raise NotImplementedError()async def get_chat_tokens_count(self, messages : list[ChatMessage], **kwargs) -> int:raise NotImplementedError()
Python3.9+
Si vous êtes préoccupé par la taille du package, vous pouvez installer uniquement les clients dont vous avez besoin. Par défaut, nous n'installons aucun client.
Pour tous les clients actuels
$ pip install llm-client[tous]
Pour uniquement l'interface de base et certains clients LLM légers (AI21 et Aleph Alpha)
$ pip installe le client llm
Pour tous les clients API actuels pris en charge
$ pip installe llm-client[api]
Pour le support client local uniquement
$ pip install llm-client[local]
Pour la prise en charge de la synchronisation
$ pip install llm-client[sync]
Uniquement pour la prise en charge d'OpenAI
$ pip install llm-client[openai]
Uniquement pour le support HuggingFace
$ pip installe llm-client[huggingface]
Utiliser OpenAI directement via OpenAIClient - Contrôle maximum et meilleures pratiques en production
import osfrom aiohttp import ClientSessionfrom llm_client import ChatMessage, Role, OpenAIClient, LLMAPIClientConfigOPENAI_API_KEY = os.environ["API_KEY"]OPENAI_ORG_ID = os.getenv("ORG_ID")async def main():async avec ClientSession() as session:llm_client = OpenAIClient(LLMAPIClientConfig(OPENAI_API_KEY, session, default_model="text-davinci-003", headers={"OpenAI-Organization": OPENAI_ORG_ID})) # Les en-têtes sont facultatifstext = "C'est bien un test"messages = [ChatMessage(role =Role.USER, content="Bonjour!"),ChatMessage(role=Role.SYSTEM, content="Bonjour ! Comment puis-je vous aider aujourd'hui ?")]print("nombre de jetons :", wait llm_client.get_tokens_count(text)) # 5print("nombre de jetons pour l'achèvement du chat :", wait llm_client.get_chat_tokens_count (messages, model="gpt-3.5-turbo")) # 23print("chat généré :", attendre llm_client.chat_completion(messages, model="gpt-3.5-turbo")) # ['Bonjour ! Comment puis-je vous aider aujourd'hui ?']print("generated text:", wait llm_client.text_completion(text)) # [' stringnnOui, ceci est une chaîne de test. Les chaînes de test sont utilisées pour']print("generated embedding:", wait llm_client.embedding(text)) # [0.0023064255, -0.009327292, ...]
Utilisation de LLMAPIClientFactory - Parfait si vous souhaitez aller vite et ne pas gérer vous-même la session client
import osfrom llm_client import LLMAPIClientFactory, LLMAPIClientTypeOPENAI_API_KEY = os.environ["API_KEY"]async def main():async avec LLMAPIClientFactory() comme llm_api_client_factory:llm_client = llm_api_client_factory.get_llm_api_client(LLMAPIClientType.OPEN_AI, api_key=OPENAI_API_KEY, default_model="text-davinci-003")await llm_client.text_completion(prompt="C'est bien un test")await llm_client.text_completion(prompt="C'est bien un test", max_tokens=50) # Ou si vous ne souhaitez pas utiliser asyncfrom llm_client import init_sync_llm_api_clientllm_client = init_sync_llm_api_client(LLMAPIClientType.OPEN_AI, api_key=OPENAI_API_KEY, default_model="text-davinci-003")llm_client.text_completion(prompt="C'est bien un test")llm_client.text_completion(prompt="C'est bien un test", max_tokens=50)
Modèle local
importer des transformateurs osfrom importer AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizerfrom llm_client importer LocalClientConfig, LocalClientasync def main():try:model = AutoModelForCausalLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])sauf ValueError:model = AutoModelForSeq2SeqLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])tokenizer = AutoTokenizer.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])llm_client = LocalClient(LocalClientConfig(model, tokenizer, os.environ["TENSORS_TYPE"], os.environ ["APPAREIL"]))attendez llm_client.text_completion(prompt="Ceci est en effet un test")await llm_client.text_completion(prompt="Ceci est en effet un test", max_tokens=50)# Ou si vous ne souhaitez pas utiliser asyncimport async_to_synctry:model = AutoModelForCausalLM. from_pretrained(os.environ["MODEL_NAME_OR_PATH"])sauf ValueError:model = AutoModelForSeq2SeqLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])tokenizer = AutoTokenizer.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])llm_client = LocalClient(LocalClientConfig(model, tokenizer, os.environ["TENSORS_TYPE"] , os.environ["DEVICE"]))llm_client = async_to_sync.methods(llm_client)llm_client.text_completion(prompt="C'est bien un test")llm_client.text_completion(prompt="C'est bien un test", max_tokens=50)
Les contributions sont les bienvenues ! Veuillez consulter les tâches ci-dessous et n'hésitez pas à ouvrir un problème ou une pull request.
La liste n'est pas ordonnée
Ajouter la prise en charge de plus de LLM
Anthropique
Adhérer
Ajouter la prise en charge de plus de fonctions via les LLM
intégrations
chat
liste des modèles
modifications
plus
Ajouter des directives de contribution et du linter
Créez un moyen simple d'exécuter plusieurs LLM en parallèle avec les mêmes invites
Convertir le paramètre de modèles communs
température
max_tokens
top_p
plus
Pour installer le package en mode développement, exécutez la commande suivante :
$ pip install -e ".[all,test]"
Pour exécuter les tests, exécutez la commande suivante :
$tests pytest
Si vous souhaitez ajouter un nouveau LLMClient, vous devez implémenter BaseLLMClient ou BaseLLMAPIClient.
Si vous ajoutez un BaseLLMAPIClient, vous devez également l'ajouter dans LLMAPIClientFactory.
Vous pouvez ajouter des dépendances à votre LLMClient dans pyproject.toml et assurez-vous également d'ajouter un fichier matrix.flavor dans test.yml.