DataChain — это современная библиотека фреймов данных Pythonic, разработанная для искусственного интеллекта. Он предназначен для организации ваших неструктурированных данных в наборы данных и их обработки в масштабе на вашем локальном компьютере. Цепочка данных не абстрагирует и не скрывает модели ИИ и вызовы API, а помогает интегрировать их в постмодернистский стек данных.
Хранение как источник истины.
Обрабатывайте неструктурированные данные без избыточных копий из S3, GCP, Azure и локальных файловых систем.
Поддержка мультимодальных данных: изображения, видео, текст, PDF-файлы, JSON, CSV, паркет.
Объедините файлы и метаданные в постоянные, версионные, столбчатые наборы данных.
Конвейеры данных, дружественные к Python.
Работайте с объектами Python и полями объектов.
Встроенная возможность распараллеливания и вычислений вне памяти без SQL или Spark.
Обогащение и обработка данных.
Создавайте метаданные, используя локальные модели искусственного интеллекта и API-интерфейсы LLM.
Фильтруйте, объединяйте и группируйте по метаданным. Поиск по векторным вложениям.
Передавайте наборы данных в Pytorch и Tensorflow или экспортируйте их обратно в хранилище.
Эффективность.
Распараллеливание, рабочие нагрузки из-за нехватки памяти и кэширование данных.
Векторизованные операции над полями объектов Python: сумма, количество, среднее и т. д.
Оптимизированный векторный поиск.
$ pip установить цепочку данных
Хранилище состоит из изображений кошек и собак (dog.1048.jpg, cat.1009.jpg), аннотированных исходными данными и выводами модели в формате «json-pairs», где каждое изображение имеет соответствующий файл JSON, например cat. 1009.json:
{"класс": "кот", "id": "1009", "num_annotators": 8, "inference": {"класс": "собака", "доверие": 0,68} }
Пример загрузки только предполагаемых изображений «кота высокой достоверности» с использованием метаданных JSON:
из столбца импорта цепочки данных, DataChainmeta = DataChain.from_json("gs://datachain-demo/dogs-and-cats/*json", object_name="meta")images = DataChain.from_storage("gs://datachain-demo /dogs-and-cats/*jpg")images_id = images.map(id=lambda file: file.path.split('.')[-2])annotated = images_id.merge(meta, on="id", right_on="meta.id")likely_cats = annotated.filter((Column("meta.inference) .уверенность") > 0,93) & (Column("meta.inference.class_") == "cat"))likely_cats.export_files("high-confidence-cats/", signal="file")
Пакетный вывод с помощью простой модели настроений с использованием библиотеки преобразователей:
установка трансформаторов
Код ниже загружает файлы в облако и применяет определяемую пользователем функцию к каждому из них. Все файлы с обнаруженным положительным настроением затем копируются в локальный каталог.
из конвейера импорта трансформаторовиз импорта цепочки данных DataChain, Columnclassifier = конвейер("sentiment-anaанализ", устройство="cpu",model="distilbert/distilbert-base-uncased-finetuned-sst-2-english")def is_positive_dialogue_ending(file) - > bool:dialogue_ending = file.read()[-512:]вернуть классификатор(dialogue_ending)[0]["label"] == "ПОЗИТИВНАЯ" цепочка = ( DataChain.from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file", type="text") .settings(параллель=8, кеш=True) .map(is_positive=is_positive_dialogue_ending) .save("file_response") )positive_chain = Chain.filter(Column("is_positive") == True)positive_chain.export_files("./output")print(f"Файлы {positive_chain.count()} были экспортированы")
13 файлов было экспортировано
$ ls output/datachain-demo/chatbot-KiT/ 15.txt 20.txt 24.txt 27.txt 28.txt 29.txt 33.txt 37.txt 38.txt 43.txt ... $ ls output/datachain-demo/chatbot-KiT/ | туалет -л 13
LLM могут работать как универсальные классификаторы. В приведенном ниже примере мы используем бесплатный API от Mistral для оценки общедоступных диалогов чат-бота. Получите бесплатный ключ API Mistral на https://console.mistral.ai.
$ pip install mistralai (требуется версия >=1.0.0) $ экспорт MISTRAL_API_KEY=_ваш_ключ_
DataChain может распараллеливать вызовы API; бесплатный уровень Mistral поддерживает до 4 запросов одновременно.
from mistralai import Mistralfrom datachain import File, DataChain, ColumnPROMPT = «Был ли этот диалог успешным? Ответьте одним словом: успех или неудача». .complete( model="open-mixtral-8x22b", messages=[{"role": "system", "content": PROMPT}, {"роль": "пользователь", "контент": file.read()}]) result = response.choices[0].message.content return result.lower().startswith("success")chain = ( DataChain .from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file") .settings(параллель=4, кеш=True) .map(is_success=eval_dialogue) .save("mistral_files") )successful_chain = Chain.filter(Column("is_success") == True)successful_chain.export_files("./output_mistral")print(f"Файлы {successful_chain.count()} были экспортированы")
По приведенной выше инструкции модель Мистраля считает файлы 31/50 для проведения успешных диалогов:
$ ls output_mistral/datachain-demo/chatbot-KiT/ 1.txt 15.txt 18.txt 2.txt 22.txt 25.txt 28.txt 33.txt 37.txt 4.txt 41.txt ... $ ls output_mistral/datachain-demo/chatbot-KiT/ | туалет -л 31
Ответы LLM могут содержать ценную информацию для аналитики, например количество используемых токенов или параметры производительности модели.
Вместо извлечения этой информации из структуры данных ответа Mistral (класс ChatCompletionResponse), DataChain может сериализовать весь ответ LLM во внутреннюю БД:
from mistralai import Mistralfrom mistralai.models import ChatCompletionResponsefrom datachain import File, DataChain, ColumnPROMPT = «Был ли этот диалог успешным? Ответьте одним словом: успех или неудача».def eval_dialog(file: File) -> ChatCompletionResponse: client = MistralClient() return client.chat( model="open-mixtral-8x22b", messages=[{"role": "system", "содержание": PROMPT}, {"роль": "пользователь", "контент": file.read()}])chain = ( DataChain.from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file") .settings(параллель=4, кеш=True) .map(ответ=eval_dialog) .map(status=лямбда-ответ: response.choices[0].message.content.lower()[:7]) .save("ответ") )chain.select("file.name", "status", "response.usage").show(5)success_rate = Chain.filter(Column("status") == "success").count() / Chain .count()print(f"{100*success_rate:.1f}% диалогов были успешными")
Выход:
ответ на статус файла ответ ответ использование имени использование использование Prompt_tokens total_tokens завершение_токенов 0 1.txt успех 547 548 1 1 Ошибка 10.txt 3576 3578 2 2 Ошибка 11.txt 626 628 2 3 Ошибка 12.txt 1144 1182 38 4 13.txt успех 1100 1101 1 [Ограничено 5 строками] 64,0% диалогов были успешными
В предыдущих примерах наборы данных сохранялись во встроенной базе данных (SQLite в папке .datachain рабочего каталога). Версии этих наборов данных были автоматически определены, и доступ к ним можно получить с помощью DataChain.from_dataset("dataset_name").
Вот как получить сохраненный набор данных и перебрать объекты:
Chain = DataChain.from_dataset("response")# Итерация один за другим: поддержка рабочего процесса при нехватке памяти для файла, ответ в Chain.limit(5).collect("file", "response"):# проверьте собранные объекты Pythonassert isinstance(response, ChatCompletionResponse)status = response.choices[0].message.content[:7]tokens = response.usage.total_tokensprint(f"{file.get_uri()}: {status}, размер файла: {file.size}, токены: {tokens}")
Выход:
gs://datachain-demo/chatbot-KiT/1.txt: Успех, размер файла: 1776, токенов: 548 gs://datachain-demo/chatbot-KiT/10.txt: Ошибка, размер файла: 11576, токены: 3578 gs://datachain-demo/chatbot-KiT/11.txt: Ошибка, размер файла: 2045, токены: 628 gs://datachain-demo/chatbot-KiT/12.txt: Ошибка, размер файла: 3833, токены: 1207 gs://datachain-demo/chatbot-KiT/13.txt: Успех, размер файла: 3657, токены: 1101
Некоторые операции могут выполняться внутри БД без десериализации. Например, давайте рассчитаем общую стоимость использования API-интерфейсов LLM, предполагая, что вызов Mixtral стоит 2 доллара США за 1 миллион входных токенов и 6 долларов США за 1 миллион выходных токенов:
цепочка = DataChain.from_dataset("mistral_dataset")cost = Chain.sum("response.usage.prompt_tokens")*0,000002 + Chain.sum("response.usage.completion_tokens")*0.000006print(f"Потрачено ${cost:.2f} на вызовы {chain.count()}")
Выход:
Потратил 0,08 доллара США на 50 звонков.
Результаты цепочки можно экспортировать или передать непосредственно в загрузчик данных PyTorch. Например, если нас интересует передача изображения и метки на основе суффикса имени файла, это сделает следующий код:
из torch.utils.data импортировать DataLoaderиз трансформаторов импортировать CLIPProcessorиз datachain import C, DataChainprocessor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")chain = (DataChain.from_storage("gs://datachain-demo/dogs) -and-cats/", type="image") .map(label=лямбда-имя: name.split(".")[0], params=["file.name"]) .select("файл", "метка").to_pytorch(transform=processor.image_processor,tokenizer=processor.tokenizer, ) )loader = DataLoader(цепочка, пакет_размер=1)
Начиная
Мультимодальный (попробуйте в Colab)
Оценки LLM (попробуйте в Colab)
Чтение метаданных JSON (попробуйте в Colab)
Взносы очень приветствуются. Дополнительную информацию см. в Руководстве для участников.
Документы
Сообщите о проблеме, если у вас возникнут какие-либо проблемы
Дискорд-чат
Электронная почта
Твиттер