LLM-Client-SDK — это SDK для плавной интеграции с большими языковыми моделями генеративного ИИ (в настоящее время мы поддерживаем — OpenAI, Google, AI21, HuggingfaceHub, Aleph Alpha, Anthropic, локальные модели с преобразователями — и многие другие в ближайшее время).
Наше видение состоит в том, чтобы предоставить асинхронный собственный и готовый к использованию SDK, одновременно создавая мощную и быструю интеграцию с различными LLM, не позволяя пользователю терять гибкость (параметры API, конечные точки и т. д.). *Мы также предоставляем версию для синхронизации, более подробную информацию см. ниже в разделе «Использование».
Пакет предоставляет два простых интерфейса для плавной интеграции с LLM (в будущем мы расширим интерфейс для поддержки большего количества задач, таких как модели списков, редактирование и т. д.):
из abc импортировать ABC, абстрактный методиз классов данных импортировать класс данных, поле от ввода импорта Любой, Необязательный из перечисления импортировать Enumfrom dataclasses_json импортировать dataclass_json, configfrom aiohttp import ClientSessionclass BaseLLMClient(ABC):@abstractmethodasync def text_completion(self, Prompt: str, **kwargs) -> list [str]: поднять 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 = поле (метаданные = конфигурация (кодер = лямбда-роль: роль.значение, декодер = роль)) содержимое: имя строки: Необязательный[str] = поле(по умолчанию=Нет, метаданные=конфигурация(исключить=лямбда-имя: имя — Нет))пример: bool = поле(по умолчанию=False, метаданные=конфигурация(исключить=лямбда _: Истина)) @dataclassclass LLMAPIClientConfig:api_key: strsession: ClientSessionbase_url: Необязательный[str] = Nonedefault_model: Необязательный[str] = Noneheaders: dict[str, Any] = поле(default_factory=dict)class BaseLLMAPIClient(BaseLLMClient, ABC):def __init__(self, конфигурация: LMAPIClientConfig): ...@abstractmethodasync def text_completion(self, подсказка: str, модель: Необязательно[str] = Нет, max_tokens: int | Нет = Нет, температура: Необязательно[float] = Нет, top_p: Необязательно[float] = Нет, * *kwargs) -> list[str]:raise NotImplementedError()async defchat_completion(self, messages: list[ChatMessage], температура: float = 0, max_tokens: int = 16, модель: Необязательный[str] = Нет, **kwargs) -> list[str]:raise NotImplementedError()async def embedding(self, text: str, model: Необязательный[str] = Нет, * *kwargs) -> list[float]:raise NotImplementedError()async def get_chat_tokens_count(self, messages: list[ChatMessage], **kwargs) -> int:raise NotImplementedError()
Питон 3.9+
Если вас беспокоит размер пакета, вы можете установить только те клиенты, которые вам нужны, по умолчанию мы не устанавливаем ни одного клиента.
Для всех текущих клиентов поддержка
$ pip install llm-client[все]
Только для базового интерфейса и некоторых легких клиентов LLM (AI21 и Aleph Alpha).
$ pip установить llm-клиент
Поддержка всех текущих клиентов API
$ pip install llm-client[api]
Только для поддержки местных клиентов
$ pip install llm-client[local]
Для поддержки синхронизации
$ pip install llm-client[sync]
Только для поддержки OpenAI
$ pip install llm-client[openai]
Только для поддержки HuggingFace
$ pip install llm-client[huggingface]
Использование OpenAI напрямую через OpenAIClient — максимальный контроль и лучшие практики в производстве
import os from 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})) # Заголовки являются необязательнымиtext = "Это действительно тест"messages = [ChatMessage(role) =Роль.ПОЛЬЗОВАТЕЛЬ, content="Привет!"),ChatMessage(role=Role.SYSTEM, content="Привет! Чем я могу вам помочь сегодня?")]print("количество токенов:", await llm_client.get_tokens_count(text)) # 5print("количество токенов для завершения чата:", await llm_client.get_chat_tokens_count(messages, model="gpt-3.5-turbo")) # 23print("сгенерированный чат:", await llm_client.chat_completion(messages, model="gpt-3.5-turbo")) # ['Привет! Чем я могу вам помочь сегодня?']print("сгенерированный текст:", await llm_client.text_completion(text)) # [' stringnnДа, это тестовая строка. Тестовые строки используются для']print("сгенерированного внедрения:", await llm_client.embedding(text)) # [0.0023064255, -0.009327292, ...]
Использование LLMAPIClientFactory — идеально, если вы хотите двигаться быстро и не обрабатывать клиентский сеанс самостоятельно.
import osfrom llm_client import LLMAPIClientFactory, LLMAPIClientTypeOPENAI_API_KEY = os.environ["API_KEY"]async def main():async с LLMAPIClientFactory() как 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="Это действительно тест")await llm_client.text_completion(prompt="Это действительно тест) ", max_tokens=50) # Или, если вы не хотите использовать 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="Это действительно test")llm_client.text_completion(prompt="Это действительно тест", max_tokens=50)
Локальная модель
импортировать osfrom трансформаторы import AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizerfrom llm_client import LocalClientConfig, LocalClientasync def main():try:model = AutoModelForCausalLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"]), кроме 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="Это действительно тест")await llm_client.text_completion(prompt="Это действительно тест", max_tokens=50)# Или если вы этого не сделаете Я не хочу использовать asyncimport async_to_synctry:model = AutoModelForCausalLM.from_pretrained(os.environ["MODEL_NAME_OR_PATH"]), кроме 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="Это действительно тест")llm_client .text_completion(prompt="Это действительно тест", max_tokens=50)
Вклады приветствуются! Пожалуйста, ознакомьтесь с задачами ниже и не стесняйтесь открывать проблему или запрос на вытягивание.
Список неупорядочен
Добавить поддержку большего количества LLM
антропный
Согласовать
Добавьте поддержку дополнительных функций через LLM.
вложения
чат
список моделей
правки
более
Добавьте рекомендации по участию и линтер
Создайте простой способ параллельного запуска нескольких LLM с использованием одних и тех же подсказок.
Преобразование общих параметров моделей
температура
max_tokens
top_p
более
Чтобы установить пакет в режиме разработки, выполните следующую команду:
$ pip install -e ".[all,test]"
Чтобы запустить тесты, выполните следующую команду:
$ pytest тесты
Если вы хотите добавить новый LLMClient, вам необходимо реализовать BaseLLMClient или BaseLLMAPIClient.
Если вы добавляете BaseLLMAPIClient, вам также необходимо добавить его в LLMAPIClientFactory.
Вы можете добавить зависимости к вашему LLMClient в pyproject.toml, а также убедитесь, что вы добавляете array.flavor в test.yml.