DataChain เป็นไลบรารีเฟรมข้อมูล Pythonic สมัยใหม่ที่ออกแบบมาสำหรับปัญญาประดิษฐ์ จัดทำขึ้นเพื่อจัดระเบียบข้อมูลที่ไม่มีโครงสร้างของคุณลงในชุดข้อมูลและถกเถียงกันในวงกว้างบนเครื่องท้องถิ่นของคุณ ดาต้าเชนไม่ได้สรุปหรือซ่อนโมเดล AI และการเรียก API แต่ช่วยในการรวมเข้ากับสแต็กข้อมูลหลังสมัยใหม่
การจัดเก็บเป็นแหล่งความจริง
ประมวลผลข้อมูลที่ไม่มีโครงสร้างโดยไม่มีสำเนาซ้ำซ้อนจาก S3, GCP, Azure และระบบไฟล์ในเครื่อง
รองรับข้อมูลต่อเนื่องหลายรูปแบบ: รูปภาพ, วิดีโอ, ข้อความ, PDF, JSON, CSV, ปาร์เก้
รวมไฟล์และข้อมูลเมตาเข้าด้วยกันเป็นชุดข้อมูลแบบเรียงเป็นแนวต่อเนื่องตามเวอร์ชัน
ไปป์ไลน์ข้อมูลที่เป็นมิตรกับ Python
ดำเนินการกับวัตถุ Python และฟิลด์วัตถุ
การประมวลผลแบบขนานในตัวและการคำนวณนอกหน่วยความจำโดยไม่ต้องใช้ SQL หรือ Spark
การเพิ่มคุณค่าและการประมวลผลข้อมูล
สร้างข้อมูลเมตาโดยใช้โมเดล AI ในพื้นที่และ LLM API
กรอง เข้าร่วม และจัดกลุ่มตามข้อมูลเมตา ค้นหาโดยการฝังเวกเตอร์
ส่งชุดข้อมูลไปยัง Pytorch และ Tensorflow หรือส่งออกกลับไปยังพื้นที่จัดเก็บข้อมูล
ประสิทธิภาพ.
การทำงานแบบขนาน ปริมาณงานหน่วยความจำไม่เพียงพอ และการแคชข้อมูล
การดำเนินการแบบเวกเตอร์บนฟิลด์อ็อบเจ็กต์ Python: ผลรวม การนับ ค่าเฉลี่ย ฯลฯ
การค้นหาเวกเตอร์ที่ปรับให้เหมาะสม
$ pip ติดตั้งดาต้าเชน
พื้นที่จัดเก็บประกอบด้วยรูปภาพแมวและสุนัข (dog.1048.jpg, cat.1009.jpg) พร้อมคำอธิบายประกอบด้วยความจริงภาคพื้นดินและการอนุมานแบบจำลองในรูปแบบ 'json-pairs' โดยแต่ละรูปภาพมีไฟล์ JSON ที่ตรงกัน เช่น cat 1009.json:
{"class": "cat", "id": "1009", "num_annotators": 8,"inference": {"class": "dog", "confidence": 0.68} -
ตัวอย่างการดาวน์โหลดเฉพาะรูปภาพที่อนุมาน "high-confidence cat" โดยใช้ข้อมูลเมตา 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((คอลัมน์("meta.inference .ความมั่นใจ") > 0.93) & (คอลัมน์("meta.inference.class_") == "cat"))likely_cats.export_files("high-confidence-cats/", signal="file")
การอนุมานแบบกลุ่มด้วยแบบจำลองความรู้สึกอย่างง่ายโดยใช้ไลบรารี Transformers:
pip ติดตั้งหม้อแปลง
โค้ดด้านล่างดาวน์โหลดไฟล์บนคลาวด์ และใช้ฟังก์ชันที่ผู้ใช้กำหนดกับแต่ละไฟล์ ไฟล์ทั้งหมดที่มีทัศนคติเชิงบวกที่ตรวจพบจะถูกคัดลอกไปยังไดเร็กทอรีในเครื่อง
จากไปป์ไลน์นำเข้าหม้อแปลงจากดาต้าเชนนำเข้า DataChain, Columnclassifier = ไปป์ไลน์ ("ความรู้สึกวิเคราะห์", อุปกรณ์ = "ซีพียู", รุ่น = "distilbert/distilbert-base-uncased-finetuned-sst-2-english") def is_positive_dialogue_ending (ไฟล์) - > 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 (ขนาน = 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 เอาต์พุต/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/ | สุขา-ล 13
LLM สามารถทำงานเป็นตัวแยกประเภทสากลได้ ในตัวอย่างด้านล่าง เราใช้ API ฟรีจาก Mistral เพื่อตัดสินกล่องโต้ตอบแชทบอทที่เปิดเผยต่อสาธารณะ โปรดรับคีย์ Mistral API ฟรีที่ https://console.mistral.ai
$ pip ติดตั้ง Mistralai (ต้องใช้เวอร์ชัน >=1.0.0) $ ส่งออก MISTRAL_API_KEY=_your_key_
DataChain สามารถขนานการเรียก API ได้ ระดับ Mistral ฟรีรองรับคำขอได้สูงสุด 4 รายการในเวลาเดียวกัน
จาก missralai import Mistralfrom datachain import File, DataChain, ColumnPROMPT = "กล่องโต้ตอบนี้สำเร็จหรือไม่ ตอบในคำเดียว: Success or Failure"def eval_dialogue(file: File) -> bool: client = Mistral() response = client.chat .complete( model="open-mixtral-8x22b", message=[{"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="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()} ไฟล์ถูกส่งออก")
ด้วยคำแนะนำข้างต้น โมเดล 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 output_mistral/datachain-demo/chatbot-KiT/ | สุขา-ล 31
การตอบสนองของ LLM อาจมีข้อมูลที่เป็นประโยชน์สำหรับการวิเคราะห์ เช่น จำนวนโทเค็นที่ใช้ หรือพารามิเตอร์ประสิทธิภาพของโมเดล
แทนที่จะแยกข้อมูลนี้ออกจากโครงสร้างข้อมูลการตอบสนอง Mistral (คลาส ChatCompletionResponse) DataChain สามารถซีเรียลไลซ์การตอบสนอง LLM ทั้งหมดไปยังฐานข้อมูลภายใน:
จาก misstralai import Mistralfrom missralai.models import ChatCompletionResponsefrom datachain import File, DataChain, ColumnPROMPT = "กล่องโต้ตอบนี้สำเร็จหรือไม่ ตอบในคำเดียว: Success หรือ Failure"def eval_dialog(file: File) -> ChatCompletionResponse: client = MistralClient() กลับ client.chat ( model = "open-mixtral-8x22b", ข้อความ = [{"role": "system", "เนื้อหา": พรอมต์}, {"role": "user", "content": file.read()}])chain = ( DataChain.from_storage("gs://datachain-demo/chatbot-KiT/", object_name="file") .settings (ขนาน = 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(คอลัมน์("สถานะ") == "success").count() / chain .count()print(f"{100*success_rate:.1f}% โต้ตอบสำเร็จ")
เอาท์พุท:
การตอบสนองสถานะไฟล์ การตอบสนอง การตอบสนอง การใช้ชื่อ การใช้ การใช้ prompt_tokens Total_tokens เสร็จสิ้น_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"):# ตรวจสอบ Python objectassert ที่รวบรวมไว้ 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 ได้โดยไม่ต้องดีซีเรียลไลซ์ ตัวอย่างเช่น ลองคำนวณต้นทุนรวมของการใช้ LLM API โดยสมมติว่าการโทร Mixtral มีค่าใช้จ่าย 2 ดอลลาร์ต่อโทเค็นอินพุต 1M และ 6 ดอลลาร์ต่อโทเค็นเอาต์พุต 1M:
chain = DataChain.from_dataset("mistral_dataset")ต้นทุน = 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 dataloader ตัวอย่างเช่น หากเราสนใจที่จะส่งรูปภาพและป้ายกำกับตามส่วนต่อท้ายชื่อไฟล์ โค้ดต่อไปนี้จะดำเนินการ:
จาก torch.utils.data นำเข้า DataLoader จากหม้อแปลงนำเข้า CLIPProcessor จาก datachain นำเข้า C, DataChainprocessor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")chain = (DataChain.from_storage("gs://datachain-demo/dogs -และแมว/", type="image") .map(label=lambda name: name.split(".")[0], params=["file.name"]) .select("file", "label").to_pytorch(transform=processor.image_processor,tokenizer=processor.tokenizer, - )loader = DataLoader(เชน, ชุด_ขนาด=1)
เริ่มต้นใช้งาน
ต่อเนื่องหลายรูปแบบ (ลองใช้ Colab)
การประเมิน LLM (ลองใช้ Colab)
กำลังอ่านข้อมูลเมตา JSON (ลองใช้ Colab)
ยินดีเป็นอย่างยิ่ง หากต้องการเรียนรู้เพิ่มเติม โปรดดูคู่มือผู้ร่วมให้ข้อมูล
เอกสาร
แจ้งปัญหาหากคุณพบปัญหาใดๆ
แชทไม่ลงรอยกัน
อีเมล
ทวิตเตอร์