LLM-Client-SDK ist ein SDK für die nahtlose Integration mit großen generativen KI-Sprachmodellen (wir unterstützen derzeit – OpenAI, Google, AI21, HuggingfaceHub, Aleph Alpha, Anthropic, lokale Modelle mit Transformatoren – und viele weitere in Kürze).
Unsere Vision ist es, ein asynchrones, natives und produktionsbereites SDK bereitzustellen und gleichzeitig eine leistungsstarke und schnelle Integration mit verschiedenen LLM zu schaffen, ohne dass der Benutzer jegliche Flexibilität verliert (API-Parameter, Endpunkte usw.). *Wir bieten auch eine Synchronisierungsversion an. Weitere Einzelheiten finden Sie weiter unten im Abschnitt „Nutzung“.
Das Paket stellt zwei einfache Schnittstellen für die nahtlose Integration mit LLMs bereit (In Zukunft werden wir die Schnittstelle erweitern, um weitere Aufgaben wie Listenmodelle, Bearbeitungen usw. zu unterstützen):
from abc import ABC, abstractmethodfrom dataclasses import dataclass, fieldfrom typing import Any, Optionalfrom 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: Rolle = field(metadata=config(encoder=lambda Role: role.value, decoder=Role))content: strname: Optional[str] = field(default=None, metadata=config(exclude=lambda name: name is None))Beispiel: bool = field(default=False, metadata=config(exclude=lambda _: True)) @dataclassclass LLMAPIClientConfig:api_key: strsession: ClientSessionbase_url: Optional[str] = Nonedefault_model: Optional[str] = Noneheaders: dict[str, Any] = field(default_factory=dict)class BaseLLMAPIClient(BaseLLMClient, ABC):def __init__(self, config: LLMAPIClientConfig): ...@abstractmethodasync def text_completion(self, prompt: str, model: Optional[str] = None, max_tokens: int | None = None, Temperature: Optional[float] = None, top_p: Optional[float] = None, * *kwargs) -> list[str]:raise NotImplementedError()async def chat_completion(self, messages: list[ChatMessage], Temperatur: float = 0, max_tokens: int = 16, Modell: Optional[str] = None, **kwargs) -> list[str]:raise NotImplementedError()async def embedding(self, text: str, model: Optional[ str] = None, **kwargs) -> list[float]:raise NotImplementedError()async def get_chat_tokens_count(self, Nachrichten: list[ChatMessage], **kwargs) -> int:raise NotImplementedError()
Python 3.9+
Wenn Sie Bedenken hinsichtlich der Größe des Pakets haben, können Sie nur die Clients installieren, die Sie benötigen. Standardmäßig installieren wir keinen der Clients.
Für die Unterstützung aller aktuellen Kunden
$ pip install llm-client[all]
Nur für die Basisschnittstelle und einige Light-LLMs-Clients (AI21 und Aleph Alpha)
$ pip llm-client installieren
Für die Unterstützung aller aktuellen API-Clients
$ pip install llm-client[api]
Nur für lokalen Kundensupport
$ pip install llm-client[local]
Für Synchronisierungsunterstützung
$ pip install llm-client[sync]
Nur für OpenAI-Unterstützung
$ pip install llm-client[openai]
Nur für HuggingFace-Unterstützung
$ pip install llm-client[huggingface]
OpenAI direkt über OpenAIClient nutzen – Maximale Kontrolle und Best Practice in der Produktion
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 with ClientSession() as session:llm_client = OpenAIClient(LLMAPIClientConfig(OPENAI_API_KEY, session, default_model="text-davinci-003", headers={"OpenAI-Organization": OPENAI_ORG_ID})) # Die Header sind optionaltext = "Dies ist tatsächlich ein Test"messages = [ChatMessage(role =Role.USER, content="Hallo!"),ChatMessage(role=Role.SYSTEM, content="Hallo! Wie kann ich Ihnen helfen? heute?")]print("Anzahl der Tokens:", Warten auf llm_client.get_tokens_count(text)) # 5print("Anzahl der Tokens für den Chat-Abschluss:", Warten auf llm_client.get_chat_tokens_count(messages, model="gpt-3.5-turbo ")) # 23print("generierter Chat:", waiting llm_client.chat_completion(messages, model="gpt-3.5-turbo")) # ['Hallo! Wie kann ich Ihnen heute helfen?']print("generated text:", waiting llm_client.text_completion(text)) # [' stringnnJa, das ist eine Testzeichenfolge. Testzeichenfolgen werden verwendet, um']print("generated embedding:", waiting llm_client.embedding(text)) # [0.0023064255, -0.009327292, ...]
Verwendung von LLMAPIClientFactory – Perfekt, wenn Sie schnell vorankommen und die Client-Sitzung nicht selbst verwalten möchten
import osfrom llm_client import LLMAPIClientFactory, LLMAPIClientTypeOPENAI_API_KEY = os.environ["API_KEY"]async def main():async with LLMAPIClientFactory() as 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="Dies ist tatsächlich ein Test")await llm_client.text_completion(prompt="Dies ist tatsächlich ein Test", max_tokens=50) # Oder wenn Sie asyncfrom llm_client nicht verwenden möchten, importieren Sie 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="Das ist tatsächlich ein test")llm_client.text_completion(prompt="Dies ist tatsächlich ein Test", max_tokens=50)
Lokales Modell
import osfrom Transformers import AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizerfrom llm_client import LocalClientConfig, LocalClientasync def main():try:model = AutoModelForCausalLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])exclusive 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"]))await llm_client.text_completion(prompt="Dies ist tatsächlich ein Test")await llm_client.text_completion(prompt="Dies ist tatsächlich ein Test", max_tokens=50)# Oder wenn Sie nicht Ich möchte asyncimport async_to_synctry:model = nicht verwenden AutoModelForCausalLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"])exclusive 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="Dies ist tatsächlich ein Test")llm_client .text_completion(prompt="Dies ist tatsächlich ein Test", max_tokens=50)
Beiträge sind willkommen! Bitte schauen Sie sich die Aufgaben unten an und eröffnen Sie gerne ein Issue oder eine Pull-Anfrage.
Die Liste ist ungeordnet
Fügen Sie Unterstützung für weitere LLMs hinzu
Anthropisch
Zusammenhängen
Fügen Sie Unterstützung für weitere Funktionen über LLMs hinzu
Einbettungen
chatten
Modelle auflisten
Änderungen
mehr
Fügen Sie beitragende Richtlinien und Linter hinzu
Erstellen Sie eine einfache Möglichkeit, mehrere LLMs parallel mit denselben Eingabeaufforderungen auszuführen
Konvertieren Sie gängige Modellparameter
Temperatur
max_tokens
top_p
mehr
Um das Paket im Entwicklungsmodus zu installieren, führen Sie den folgenden Befehl aus:
$ pip install -e ".[all,test]"
Um die Tests auszuführen, führen Sie den folgenden Befehl aus:
$ Pytest-Tests
Wenn Sie einen neuen LLMClient hinzufügen möchten, müssen Sie BaseLLMClient oder BaseLLMAPIClient implementieren.
Wenn Sie einen BaseLLMAPIClient hinzufügen, müssen Sie ihn auch in LLMAPIClientFactory hinzufügen.
Sie können Abhängigkeiten zu Ihrem LLMClient in pyproject.toml hinzufügen. Stellen Sie außerdem sicher, dass Sie in test.yml eine Matrix.flavor hinzufügen.