1 คะแนน โดย GN⁺ 2024-08-21 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Transformers.rb เป็นไลบรารีที่ทำให้สามารถใช้งาน Transformers ของ Hugging Face ใน Ruby ได้ และมุ่งเน้นไปที่การรันโมเดล transformer สมัยใหม่ด้วยโค้ด Ruby
  • การติดตั้งทำได้โดยติดตั้ง Torch.rb ก่อน แล้วจึงเพิ่ม gem "transformers-rb" ลงใน Gemfile
  • ตัวอย่างที่รองรับประกอบด้วย embedding, sparse embedding และโมเดล reranking พร้อมแสดงวิธีใช้โมเดลตระกูล sentence-transformers, mixedbread-ai, BAAI, Snowflake, OpenSearch
  • pipeline แบ่งเป็นข้อความและวิชัน โดยเรียกใช้งาน NER, การวิเคราะห์อารมณ์, การตอบคำถาม, การจัดหมวดหมู่ภาพ, การสกัดคุณลักษณะของภาพ เป็นต้น ในรูปแบบ Transformers.pipeline
  • API ใช้ตาม Transformers Python API และปัจจุบันรองรับสถาปัตยกรรม BERT, DeBERTa-v2, DistilBERT, MPNet, ViT, XLM-RoBERTa

การใช้ Transformers ใน Ruby

  • Transformers.rb คือไลบรารี transformers สมัยใหม่สำหรับ Ruby
  • หากต้องการการอนุมานที่รวดเร็ว ให้ดู Informers

วิธีติดตั้ง

  • ต้องติดตั้ง Torch.rb ก่อน
  • จากนั้นเพิ่มบรรทัดต่อไปนี้ลงใน Gemfile ของแอปพลิเคชัน
gem "transformers-rb"

ตัวอย่างโมเดลที่รองรับ

  • README แบ่งตัวอย่างการใช้งานโมเดลเป็น Embedding, sparse embedding และ reranking
  • Embedding

    • sentence-transformers/all-MiniLM-L6-v2: รับอาร์เรย์ของประโยคและสร้าง embedding
    • sentence-transformers/multi-qa-MiniLM-L6-cos-v1: มีตัวอย่างที่สร้าง embedding ของคำถามและเอกสาร แล้วจัดเรียงเอกสารด้วยคะแนน dot product
    • sentence-transformers/all-mpnet-base-v2: แปลงอาร์เรย์ของประโยคเป็น embedding
    • sentence-transformers/paraphrase-MiniLM-L6-v2: มีตัวอย่าง embedding ที่รับอาร์เรย์ของประโยคเป็นอินพุต
    • mixedbread-ai/mxbai-embed-large-v1: มีตัวอย่างที่ใช้คำนำหน้า "Represent this sentence for searching relevant passages: " สำหรับการแทนประโยคเพื่อการค้นหา
    • thenlper/gte-small: รับสองประโยคเป็นอินพุตเพื่อสร้าง embedding
    • intfloat/e5-base-v2: มีตัวอย่างที่เติมคำนำหน้า "passage: " ให้เอกสาร และ "query: " ให้คำถาม
    • BAAI/bge-base-en-v1.5: มีตัวอย่างที่ใช้คำนำหน้าสำหรับการแทน passage ที่เกี่ยวข้องกับการค้นหา
    • Snowflake/snowflake-arctic-embed-m-v1.5: มีตัวอย่างที่สร้าง embedding ด้วยตัวเลือก pooling: "cls"
  • Sparse embedding

    • opensearch-project/opensearch-neural-sparse-encoding-v1: โหลด AutoModelForMaskedLM และ AutoTokenizer โดยตรงเพื่อคำนวณ sparse embedding
    • เอาต์พุตของ tokenizer ใช้ padding, truncation, return_tensors: "pt", return_token_type_ids: false
    • นำ attention mask ไปใช้กับค่าที่ได้ แล้วผ่าน Torch.max, Torch.log, Torch.relu เพื่อสร้างอาร์เรย์ embedding
    • ตั้งค่าของตำแหน่ง special token เป็น 0
  • Reranking

    • mixedbread-ai/mxbai-rerank-base-v1: รับคำถามและรายการเอกสารเพื่อสร้างผลลัพธ์ reranking
    • BAAI/bge-reranker-base: มีตัวอย่าง reranking เช่นกัน โดยใช้อาร์เรย์ของคำถามและเอกสารเป็นอินพุต

Pipeline

  • pipeline สำหรับ Text รองรับงานต่อไปนี้
    • embedding: สร้าง text embedding
    • reranking: จัดลำดับใหม่ของคำถามและอาร์เรย์เอกสาร
    • ner: named-entity recognition
    • sentiment-analysis: การวิเคราะห์อารมณ์
    • question-answering: สร้างคำตอบจากคำถามและบริบทที่ป้อนเข้าไป
    • feature-extraction: สกัดคุณลักษณะของข้อความ
  • pipeline สำหรับ Vision รองรับงานต่อไปนี้
    • image-classification: การจัดหมวดหมู่ภาพ
    • image-feature-extraction: การสกัดคุณลักษณะของภาพ

API และสถาปัตยกรรมที่รองรับ

  • ไลบรารีนี้ใช้ตาม Transformers Python API
  • สถาปัตยกรรมโมเดล ที่รองรับในปัจจุบันมีดังนี้
    • BERT
    • DeBERTa-v2
    • DistilBERT
    • MPNet
    • ViT
    • XLM-RoBERTa

การพัฒนาและการมีส่วนร่วม

  • ดูประวัติการเปลี่ยนแปลงได้ที่ changelog
  • แนวทางการมีส่วนร่วมครอบคลุมการรายงานบั๊ก, การแก้บั๊กและส่ง pull request, การเขียน·ทำให้ชัดเจน·แก้ไขเอกสาร, การเสนอหรือเพิ่มฟีเจอร์ใหม่
  • คำสั่งเริ่มต้นสำหรับการพัฒนาคือโคลนรีโพซิทอรี, bundle install, bundle exec rake download:files, bundle exec rake test ตามลำดับ

1 ความคิดเห็น

 
GN⁺ 2024-08-21
ความคิดเห็นจาก Hacker News
  • ONNX Runtime สำหรับ Ruby ของ Ankane ใช้ง่ายมาก จนทำให้งงว่าทำไม repository JavaScript อย่างเป็นทางการถึงเข้าใจยากขนาดนั้น
    สิ่งที่คนคนนี้ทำสำเร็จ ถึงผมจะเพิ่งได้แตะผิวเผิน ก็ยังดูเหมือนฮีโร่แล้ว

  • พูดจริง ๆ นะ คนนี้เป็นมนุษย์แน่เหรอ? ถ้าเป็นบุคคลที่มีพรสวรรค์ขนาดนี้ ผมก็อยากลงทุนให้สัก 1 พันล้านดอลลาร์ เลย

    • ผมมีพรสวรรค์ประมาณหนึ่งในร้อยของเขา ถ้าเป็น เงินลงทุน 10 ล้านดอลลาร์ ผมก็ยินดีรับนะ
  • คงไม่ได้ทำไปเพื่อสิ่งนี้หรอก แต่ถ้ามีใครอยากแสดงความขอบคุณ ผมเสนอชื่อ Ankane สำหรับ Rails 2024 Luminary award ไว้แล้ว
    https://rubyonrails.org/2024/8/2/nominations-open-for-2024-l...

    • เห็นด้วย ปริมาณ งานที่เป็นประโยชน์ ที่ Ankaneส่งมอบให้ชุมชนนั้นแทบไม่น่าเชื่อจริง ๆ
  • การมีส่วนร่วมแบบนี้เป็นสิ่งที่ชุมชน Ruby ต้องการจริง ๆ และโปรเจกต์นี้ก็ดูน่าสนใจด้วย

    • จริงมาก โดยรวมแล้วเพราะการมีส่วนร่วมแบบนี้มีไม่พอ หรือออกมาช้าลง เลยทำให้รู้สึกว่า ชุมชน Ruby กำลังชะลอตัว
      ในกรณีนี้ จู่ ๆ Ruby ก็ได้ไลบรารีที่ยอดเยี่ยมขึ้นมา ซึ่งตัวมันเองเป็นผลงานที่น่าขอบคุณมาก แต่ “ชุมชน” ก็เหมือนเพิ่ง “สร้าง” สิ่งนี้ขึ้นมาหลังจากไลบรารีแบบเดียวกันออกมาใน Python, JavaScript, TypeScript, Rust, Go ฯลฯ ไปแล้วหลายเดือนหรือหลายปี
      ไม่ใช่แค่แมชชีนเลิร์นนิง/ปัญญาประดิษฐ์เท่านั้น เรื่องเดียวกันนี้ก็เกิดกับ gem ซึ่งเป็นไลบรารี Ruby สำหรับเทคโนโลยีใหม่ ๆ ด้วย เมื่อก่อน SaaS หรือสตาร์ทอัพจะมี Rubygem อย่างเป็นทางการให้ตั้งแต่แรก และหลายครั้งก็ให้ก่อนแพลตฟอร์มหรือภาษาอื่นด้วยซ้ำ ทุกวันนี้ถ้าจะเชื่อมต่อกับอย่าง Notion, Slack, Cloudflare ก็มักไม่มีตัวเลือก Ruby หรืออย่างน้อยก็ไม่มีตัวเลือกทางการ
      เรื่องนี้น่าเศร้า Ruby เป็นภาษาที่กว้างกว่า Rails มาก และผมเข้าใจได้ว่าบางคนอาจลังเลหรือมีอคติกับ Rails ถึงอย่างนั้น Ruby ก็เป็นภาษาที่ทำงานด้วยสนุกกว่า Python และแน่นอนว่าสนุกกว่า JavaScript มาก Ruby อาจอยู่ในตำแหน่งของ Python ในวันนี้ได้ และผมมั่นใจว่าถ้าเป็นเช่นนั้น นักพัฒนาหลายหมื่นคนคงมีความสุขกว่านี้สักหน่อย
  • Ankane เพียงคนเดียวก็ตอบแทนอุตสาหกรรมด้วย ผลงานมหาศาล ในหลากหลายทางจริง ๆ สุดยอดมาก

  • สงสัยจริง ๆ ว่าคนคนหนึ่งจะ ผลิตผลงาน ได้มากขนาดนี้ได้อย่างไร ทั้งงาน ครอบครัว และอื่น ๆ ชีวิตก็น่าจะยุ่งพอสมควรอยู่แล้ว

  • ยากจะบรรยายว่าผมรู้สึกขอบคุณ gem ของ Ankane มากแค่ไหน สิ่งที่เขาสร้างเป็น องค์ประกอบสำคัญ ในแอปหลายตัวของผม และผมมองว่ามันช่วยเติมช่องว่างใน ecosystem ได้

  • เครื่องมือที่คนนี้สร้างน่าทึ่งจริง ๆ อยากให้มีออกมาอีกเยอะ ๆ

  • เท่าที่รู้ Andrew Kane ยังเป็นผู้สร้าง pgvector, pgvector-ruby, neighbor ด้วย และทั้งหมดก็ค่อนข้างยอดเยี่ยม
    เขายังสร้างอย่างอื่นไว้อีกมาก
    บางทีเขาอาจแก้โจทย์ปัญญาประดิษฐ์/แมชชีนเลิร์นนิงได้ด้วยตัวคนเดียวตั้งนานแล้ว แล้วใช้มันทำให้ตัวเองผลิตผลงานได้มากขนาดนี้ก็ได้
    [0] https://github.com/pgvector/pgvector
    [1] https://github.com/pgvector/pgvector-ruby
    [2] https://github.com/ankane/neighbor
    [3] https://github.com/ankane/

    • เขายังสร้างอะไรไว้มากมายที่ไม่ใช่สายปัญญาประดิษฐ์ด้วย
      https://github.com/ankane/pretender ช่วยให้การสวมบทเป็นผู้ใช้อื่นในแอป Rails ทำได้ง่ายมาก
      https://github.com/ankane/ahoy เป็นเครื่องมือวิเคราะห์ข้อมูลแบบโฮสต์เองสำหรับ Rails
      https://github.com/ankane/blazer เป็นเครื่องมือ business intelligence ที่อยู่ใน Rails
      https://github.com/ankane/field_test ใช้สำหรับ A/B testing
      สิ่งเหล่านี้ช่วยเพิ่ม ผลิตภาพของ Rails ในเว็บแอปทั่วไปได้ แม้แต่ละอย่างอาจมีผลิตภัณฑ์จาก vendor หรือโซลูชันเฉพาะทางที่ดีกว่า แต่ถ้าใส่ gem แล้วตั้งค่านิดหน่อยเพื่อได้โซลูชันระดับ 80% ก็ช่วยให้ปล่อยของได้เร็วจริง ๆ
    • ยังมี Chartkick, Ahoy, Searchkick ด้วย
      Chartkick เป็นไลบรารีทำกราฟสำหรับ Ruby, Ahoy เป็นไลบรารี analytics สำหรับ Rails, Searchkick เป็นไลบรารีค้นหาสำหรับ Rails
      โปรไฟล์ GitHub ของเขามี repository มากกว่า 370 รายการ
    • ใน repository โปรดักชันของเราเองก็ใช้เครื่องมือของ Andrew Kane เยอะมาก แพ็กเกจของเขาช่วยให้เราสร้าง แอปพลิเคชันปัญญาประดิษฐ์ด้วย Rails ได้
    • ถ้าคุณใช้ Ruby แล้วยังไม่รู้จัก ankane ใน GitHub ของเขามีเครื่องมือที่มีประโยชน์มากมาย
      ตัวอย่างเช่น /disco เป็นการทำ collaborative filtering ที่เรียบง่ายมาก สำหรับเวลาที่อยากใส่ฟีเจอร์แนะนำเข้าไปที่ไหนสักแห่งอย่างรวดเร็ว
      ถ้าคุณกำลังหาอะไรเกี่ยวกับแมชชีนเลิร์นนิงใน Ruby โดยมาก ankane ก็มักจะเคยลองดูไว้แล้ว
    • เป็นหนึ่งในคนที่ สร้างผลงานมากที่สุด เท่าที่ผมรู้จัก
  • ในชุมชน Ruby โดยส่วนตัวผมมองว่า Andrew Kane และ Chris Oliver คือที่สุดของที่สุด แม้จะไม่ได้ใช้ผลงานทุกชิ้นของพวกเขา แต่การมีส่วนร่วมแบบนั้นก็น่ายินดีเสมอ