DataChain は、人工知能用に設計された最新の Python データ フレーム ライブラリです。これは、非構造化データをデータセットに編成し、ローカル マシン上で大規模にラングリングするために作成されています。データチェーンは AI モデルと API 呼び出しを抽象化したり隠蔽したりしませんが、それらをポストモダン データ スタックに統合するのに役立ちます。
真実の情報源としてのストレージ。
S3、GCP、Azure、ローカル ファイル システムからの冗長コピーを使用せずに非構造化データを処理します。
マルチモーダル データのサポート: 画像、ビデオ、テキスト、PDF、JSON、CSV、寄木細工。
ファイルとメタデータを統合して、永続的なバージョン管理された列形式のデータセットを作成します。
Python に適したデータ パイプライン。
Python オブジェクトとオブジェクト フィールドを操作します。
SQL や Spark を使用しない、組み込みの並列化とメモリ不足コンピューティング。
データの強化と処理。
ローカル AI モデルと LLM API を使用してメタデータを生成します。
メタデータによるフィルター、結合、およびグループ化。ベクトル埋め込みによる検索。
データセットを Pytorch と Tensorflow に渡すか、ストレージにエクスポートして戻します。
効率。
並列化、メモリ不足のワークロード、データ キャッシュ。
Python オブジェクト フィールドに対するベクトル化された操作: sum、count、avg など。
最適化されたベクトル検索。
$ pip インストール データチェーン
ストレージは猫と犬の画像 (dog.1048.jpg、cat.1009.jpg) で構成され、「json-pairs」形式でグラウンド トゥルースとモデル推論の注釈が付けられます。各画像には猫のような一致する JSON ファイルがあります。 1009.json:
{"クラス": "猫", "id": "1009", "num_annotators": 8,"推論": {"クラス": "犬", "信頼度": 0.68} }
JSON メタデータを使用して「信頼性の高い猫」の推定画像のみをダウンロードする例:
from datachain import Column、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 = image.map(id=lambda ファイル: file.path.split('.')[-2])annotated = image_id.merge(meta, on="id", right_on="meta.id")likely_cats = annotated.filter((Column("meta.inference .confidence") > 0.93) & (Column("meta.inference.class_") == "cat"))likely_cats.export_files("high-confidence-cats/", signal="file")
トランスフォーマー ライブラリを使用した単純なセンチメント モデルによるバッチ推論:
pip インストール変圧器
以下のコードは、ファイルをクラウドにダウンロードし、それぞれのファイルにユーザー定義関数を適用します。肯定的な感情が検出されたすべてのファイルは、ローカル ディレクトリにコピーされます。
トランスフォーマーからインポートパイプラインデータチェーンからインポートデータチェーン、列分類子 = パイプライン("センチメント分析"、デバイス= "cpu"、モデル= = "distilbert/distilbert-base-uncased-finetuned-sst-2-english")def is_positive_dialogue_ending(file) - > bool:dialogue_ending = file.read()[-512:]return classifier(dialogue_ending)[0]["label"] == "POSITIVE"chain = ( DataChain.from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file", type="text" ) .settings(Parallel=8、キャッシュ=True) .map(is_positive=is_positive_dialogue_ending) .save("ファイル_応答") )positive_chain =chain.filter(Column("is_positive") == True)positive_chain.export_files("./output")print(f"{positive_chain.count()} 個のファイルがエクスポートされました")
13個のファイルがエクスポートされました
$ ls 出力/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 出力/datachain-demo/chatbot-KiT/ |トイレ -l 13
LLM は汎用分類子として機能します。以下の例では、Mistral の無料 API を使用して、公開されているチャットボット ダイアログを判断します。 https://console.mistral.ai で無料の Mistral API キーを取得してください。
$ pip install misstralai (バージョン >=1.0.0 が必要) $export MISTRAL_API_KEY=_your_key_
DataChain は API 呼び出しを並列化できます。無料の Mistral レベルでは、同時に最大 4 つのリクエストがサポートされます。
from misstralai import Mistralfrom datachain import File, DataChain, ColumnPROMPT = 「このダイアログは成功しましたか? 一言で答えてください: 成功または失敗。」def eval_dialogue(file: File) -> bool: client = Mistral() response = client.chat .complete(model="open-mixtral-8x22b",messages=[{"role": "system", "content": PROMPT}, {"role": "user", "content": file.read()}]) result = response.choices[0].message.content return result. lower().startswith("success")chain = ( DataChain .from_storage("gs://datachain-demo/chatbot-KiT/", object_name="ファイル") .settings(Parallel=4、キャッシュ=True) .map(is_success=eval_dialogue) .save("mistral_files") ) success_chain =chain.filter(Column("is_success") == True) success_chain.export_files("./output_mistral")print(f"{ success_chain.count()} 個のファイルがエクスポートされました")
上記の命令により、Mistral モデルは 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 出力_mistral/datachain-demo/chatbot-KiT/ |トイレ -l 31
LLM 応答には、使用されたトークンの数やモデルのパフォーマンス パラメーターなど、分析に役立つ情報が含まれる場合があります。
Mistral 応答データ構造 (ChatCompletionResponse クラス) からこの情報を抽出する代わりに、DataChain は LLM 応答全体を内部 DB にシリアル化できます。
from misstralai import Mistralfrom misstralai.models import ChatCompletionResponsefrom datachain import File, DataChain, ColumnPROMPT = "このダイアログは成功しましたか? 一言で答えてください: 成功または失敗。"def eval_dialog(file: File) -> ChatCompletionResponse: client = MistralClient() return client.chat(model="open-mixtral-8x22b",メッセージ=[{"役割": "システム", "コンテンツ": プロンプト}, {"ロール": "ユーザー", "コンテンツ": file.read()}])chain = ( DataChain.from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file") .settings(Parallel=4、キャッシュ=True) .map(response=eval_dialog) .map(status=lambda 応答: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}% のダイアログが成功しました")
出力:
ファイルステータス 応答 応答 応答 名前の使用法使用法 プロンプトトークン合計トークン完了トークン 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% のダイアログが成功しました
前の例では、データセットは組み込みデータベース (作業ディレクトリの .datachain フォルダー内の SQLite) に保存されました。これらのデータセットは自動的にバージョン管理され、DataChain.from_dataset("dataset_name") を使用してアクセスできます。
保存されたデータセットを取得し、オブジェクトを反復処理する方法は次のとおりです。
chain = DataChain.from_dataset("response")# 1 つずつ反復します。ファイルのメモリ不足ワークフローをサポートし、chain.limit(5) で応答します。collect("file", "response"):# を確認します。収集された Python オブジェクトassert 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
一部の操作は逆シリアル化せずに DB 内で実行できます。たとえば、Mixtral 呼び出しのコストが 100 万の入力トークンあたり 2 ドル、100 万の出力トークンあたり 6 ドルであると仮定して、LLM API の使用にかかる総コストを計算してみましょう。
chain = DataChain.from_dataset("mistral_dataset")cost =chain.sum("response.usage.prompt_tokens")*0.000002 +chain.sum("response.usage.completion_tokens")*0.000006print(f"{chain.count()} 呼び出しで ${cost:.2f} を費やしました")
出力:
50 回の通話で $0.08 を費やしました
チェーンの結果はエクスポートしたり、PyTorch データローダーに直接渡すことができます。たとえば、ファイル名の接尾辞に基づいて画像とラベルを渡したい場合は、次のコードでそれを実行します。
torch.utils.data からインポート DataLoader トランスフォーマーからインポート CLIPProcessor データチェーンからインポート C、DataChainprocessor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")chain = (DataChain.from_storage("gs://datachain-demo/dogs -and-cats/", type="画像") .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 で試してください)
貢献は大歓迎です。詳細については、「寄稿者ガイド」を参照してください。
ドキュメント
問題が発生した場合は問題を報告してください
Discord チャット
電子メール
ツイッター