คู่มือการสรุป LLM สำหรับเว็บ

LLM Inference API ช่วยให้คุณเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) บนอุปกรณ์ได้ทั้งหมดสําหรับเว็บแอปพลิเคชัน ซึ่งคุณใช้ทํางานได้หลากหลาย เช่น การสร้างข้อความ ดึงข้อมูลในรูปแบบภาษาธรรมชาติ และสรุปเอกสาร งานนี้รองรับโมเดลภาษาขนาดใหญ่แบบข้อความเป็นข้อความหลายรายการในตัว คุณจึงใช้โมเดล Generative AI เวอร์ชันล่าสุดในอุปกรณ์กับเว็บแอปได้

หากต้องการเพิ่ม LLM Inference API ลงในเว็บแอปอย่างรวดเร็ว ให้ทําตามการเริ่มต้นใช้งานอย่างรวดเร็ว ดูตัวอย่างพื้นฐานของเว็บแอปพลิเคชันที่เรียกใช้ LLM Inference API ได้ที่ตัวอย่างแอปพลิเคชัน หากต้องการทําความเข้าใจวิธีการทํางานของ LLM Inference API อย่างละเอียดยิ่งขึ้น โปรดดูส่วนตัวเลือกการกําหนดค่า การเปลี่ยนรูปแบบ และการปรับ LoRA

คุณดูการทำงานของงานนี้ได้จากการสาธิต MediaPipe Studio ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม

คู่มือเริ่มใช้งานฉบับย่อ

ทําตามขั้นตอนต่อไปนี้เพื่อเพิ่ม LLM Inference API ลงในเว็บแอปพลิเคชัน LLM Inference API ต้องใช้เว็บเบราว์เซอร์ที่เข้ากันได้กับ WebGPU ดูรายการเบราว์เซอร์ทั้งหมดที่เข้ากันได้ได้ที่ความเข้ากันได้ของเบราว์เซอร์กับ GPU

เพิ่มการพึ่งพา

LLM Inference API ใช้แพ็กเกจ @mediapipe/tasks-genai

ติดตั้งแพ็กเกจที่จําเป็นสําหรับการจัดเตรียมเวอร์ชันที่ใช้งานจริงในเครื่อง

npm install @mediapipe/tasks-genai

หากต้องการติดตั้งใช้งานในเซิร์ฟเวอร์ ให้ใช้บริการเครือข่ายนำส่งข้อมูล (CDN) เช่น jsDelivr เพื่อเพิ่มโค้ดลงในหน้า HTML โดยตรง ดังนี้

<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
    crossorigin="anonymous"></script>
</head>

ดาวน์โหลดโมเดล

ดาวน์โหลด Gemma-2 2B ในรูปแบบ 8 บิตจาก Kaggle Models ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบที่ใช้ได้ได้ที่เอกสารประกอบเกี่ยวกับรูปแบบ

จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์

<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin

ระบุเส้นทางของโมเดลด้วยพารามิเตอร์baseOptionsออบเจ็กต์ modelAssetPath ดังนี้

baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}

เริ่มต้นใช้งาน Tasks

เริ่มต้นใช้งานงานด้วยตัวเลือกการกําหนดค่าพื้นฐาน

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
    baseOptions: {
        modelAssetPath: '/assets/gemma-2b-it-gpu-int8.bin'
    },
    maxTokens: 1000,
    topK: 40,
    temperature: 0.8,
    randomSeed: 101
});

เรียกใช้งาน

ใช้ฟังก์ชัน generateResponse() เพื่อทริกเกอร์การอนุมาน

const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;

หากต้องการสตรีมคำตอบ ให้ใช้สิ่งต่อไปนี้

llmInference.generateResponse(
  inputPrompt,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});

แอปพลิเคชันตัวอย่าง

แอปพลิเคชันตัวอย่างนี้เป็นตัวอย่างแอปการสร้างข้อความพื้นฐานสําหรับเว็บที่ใช้ LLM Inference API คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับเว็บแอปของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างจะโฮสต์อยู่ใน GitHub

โคลนที่เก็บ Git โดยใช้คําสั่งต่อไปนี้

git clone https://github.com/google-ai-edge/mediapipe-samples

โปรดดูข้อมูลเพิ่มเติมที่คู่มือการตั้งค่าสําหรับเว็บ

ตัวเลือกการกำหนดค่า

ใช้ตัวเลือกการกําหนดค่าต่อไปนี้เพื่อตั้งค่าเว็บแอป

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
modelPath เส้นทางไปยังตำแหน่งที่จัดเก็บโมเดลภายในไดเรกทอรีโปรเจ็กต์ PATH ไม่มี
maxTokens จํานวนโทเค็นสูงสุด (โทเค็นอินพุต + โทเค็นเอาต์พุต) ที่โมเดลจัดการได้ จำนวนเต็ม 512
topK จำนวนโทเค็นที่โมเดลพิจารณาในแต่ละขั้นตอนของการสร้าง จำกัดการคาดการณ์ไว้ที่โทเค็นที่เป็นไปได้มากที่สุด k รายการแรก จำนวนเต็ม 40
temperature ระดับความสุ่มที่เกิดขึ้นระหว่างการสร้าง อุณหภูมิที่สูงขึ้นจะทำให้ข้อความที่สร้างขึ้นมีความสร้างสรรค์มากขึ้น ขณะที่อุณหภูมิที่ต่ำลงจะทำให้ระบบสร้างข้อความที่คาดการณ์ได้มากขึ้น ทศนิยม 0.8
randomSeed เมล็ดพันธุ์แบบสุ่มที่ใช้ระหว่างการสร้างข้อความ จำนวนเต็ม 0
loraRanks อันดับ LoRA ที่โมเดล LoRA จะใช้ระหว่างรันไทม์ หมายเหตุ: ใช้ได้กับ GPU บางรุ่นเท่านั้น อาร์เรย์จำนวนเต็ม ไม่มี

การแปลงโมเดล

LLM Inference API ใช้ได้กับโมเดลประเภทต่อไปนี้ ซึ่งบางประเภทต้องแปลงโมเดล ใช้ตารางเพื่อระบุขั้นตอนและวิธีการที่จำเป็นสำหรับโมเดลของคุณ

โมเดล วิธีการแปลง แพลตฟอร์มที่เข้ากันได้ ประเภทไฟล์
Gemma-3 1B ไม่ต้องแปลง Android, เว็บ .task
Gemma 2B, Gemma 7B, Gemma-2 2B ไม่ต้องแปลง Android, iOS, เว็บ .bin
Phi-2, StableLM, Falcon สคริปต์การเปลี่ยนรูปแบบของ MediaPipe Android, iOS, เว็บ .bin
โมเดล LLM ของ PyTorch ทั้งหมด คลัง Generative ของ AI Edge Torch Android, iOS .task

ดูวิธีแปลงรูปแบบอื่นๆ ได้ที่ส่วน รูปแบบ Conversion

การปรับแต่ง LoRA

LLM Inference API รองรับการปรับ LoRA (Low-Rank Adaptation) โดยใช้ไลบรารี PEFT (Parameter-Efficient Fine-Tuning) การปรับ LoRA จะปรับแต่งลักษณะการทํางานของ LLM ผ่านกระบวนการฝึกที่ประหยัดค่าใช้จ่าย โดยสร้างชุดน้ำหนักที่ฝึกได้จำนวนน้อยๆ โดยอิงตามข้อมูลการฝึกใหม่แทนที่จะฝึกโมเดลทั้งชุดใหม่

LLM Inference API รองรับการเพิ่มน้ำหนัก LoRA ไปยังเลเยอร์ Attention ของโมเดล Gemma-2 2B, Gemma 2B และ Phi-2 ดาวน์โหลดโมเดลในรูปแบบ safetensors

โมเดลพื้นฐานต้องอยู่ในรูปแบบ safetensors จึงจะสร้างน้ำหนัก LoRA ได้ หลังจากการฝึก LoRA แล้ว คุณสามารถแปลงโมเดลเป็นรูปแบบ FlatBuffers เพื่อใช้งานใน MediaPipe

เตรียมน้ำหนัก LoRA

ใช้คำแนะนำวิธีการ LoRA จาก PEFT เพื่อฝึกโมเดล LoRA ที่ปรับแต่งอย่างละเอียดในชุดข้อมูลของคุณเอง

LLM Inference API รองรับ LoRA ในเลเยอร์ Attention เท่านั้น ดังนั้นโปรดระบุเฉพาะเลเยอร์ Attention ใน LoraConfig

# For Gemma
from peft import LoraConfig
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)

# For Phi-2
config = LoraConfig(
    r=LORA_RANK,
    target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)

หลังจากฝึกชุดข้อมูลที่เตรียมไว้และบันทึกโมเดลแล้ว น้ำหนักโมเดล LoRA ที่ปรับแต่งอย่างละเอียดจะพร้อมใช้งานใน adapter_model.safetensors ไฟล์ safetensors คือจุดตรวจสอบ LoRA ที่ใช้ในการแปลงโมเดล

การแปลงโมเดล

ใช้แพ็กเกจ MediaPipe Python เพื่อแปลงน้ำหนักโมเดลเป็นรูปแบบ Flatbuffer ConversionConfig จะระบุตัวเลือกโมเดลพื้นฐานพร้อมกับตัวเลือก LoRA เพิ่มเติม

import mediapipe as mp
from mediapipe.tasks.python.genai import converter

config = converter.ConversionConfig(
  # Other params related to base model
  ...
  # Must use gpu backend for LoRA conversion
  backend='gpu',
  # LoRA related params
  lora_ckpt=LORA_CKPT,
  lora_rank=LORA_RANK,
  lora_output_tflite_file=LORA_OUTPUT_FILE,
)

converter.convert_checkpoint(config)

ตัวแปลงจะสร้างไฟล์ที่เข้ากันได้กับ MediaPipe 2 ไฟล์ ไฟล์หนึ่งสำหรับโมเดลฐานและอีกไฟล์สำหรับโมเดล LoRA

การอนุมานโมเดล LoRA

เว็บรองรับ LoRA แบบไดนามิกระหว่างรันไทม์ ซึ่งหมายความว่าผู้ใช้จะประกาศลําดับ LoRA ในระหว่างการเริ่มต้น ซึ่งหมายความว่าคุณสามารถเปลี่ยน LoRA รุ่นต่างๆ ในระหว่างรันไทม์ได้

const genai = await FilesetResolver.forGenAiTasks(
    // path/to/wasm/root
    "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
    // options for the base model
    ...
    // LoRA ranks to be used by the LoRA models during runtime
    loraRanks: [4, 8, 16]
});

โหลดโมเดล LoRA ในระหว่างรันไทม์หลังจากเริ่มต้นโมเดลพื้นฐาน ทริกเกอร์รูปแบบ LoRA ด้วยการส่งการอ้างอิงรูปแบบเมื่อสร้างคำตอบ LLM

// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);

// Specify LoRA model to be used during inference
llmInference.generateResponse(
  inputPrompt,
  loraModelRank4,
  (partialResult, done) => {
        document.getElementById('output').textContent += partialResult;
});