AI
October 26, 2023

RAG 101 : Step by Step Introduction

ยินดีต้อนรับเข้าสู่ RAG 101 : Step by Step Introduction ค่หลังจากที่คราวที่แล้วทาง Vulture Prime ได้นำเสนอ RAG Concept ไป วันนี้จะพาทุกคนมา Walkthrough กันว่า RAG ทำงานยังไงแบบ 101 ไปเลย สำหรับคนที่ยังงง ๆ ว่า RAG ทำงานอะไรยังไงกันแน่ อ่านบทความนี้จบจะเข้าใจ RAG แน่นอน

Why RAG? [อัพเดท 2024]

ก่อนอื่นสำหรับคนที่เริ่มศึกษา LLM (Large Language Model) และได้ลองเล่นโมเดล เช่น GPT-3.5, GPT-4 ก็จะพอรู้กันว่าปัญหาของโมเดลประเภทนี้คือ มันมั่วได้ 5555555 (หรือที่เรียกว่า Hallucination) ถึงแม้คำตอบออกมาสวยงามตามท้องเรื่องจนเหมือนว่ามันจะเป็นคำตอบที่ถูกต้อง แต่ความจริงคือมันอาจจะดึงข้อมูลที่มีมายำรวมกันเป็นคำตอบ เนื่องจากข้อมูลของโมเดลเหล่านี้มีจำกัด อย่าง ChatGPT ก็จะมีข้อมูลถึงแค่เดือนกันยายน ปี 2021 ทำให้ถ้าเราถามอะไรเกี่ยวกับข้อมูลที่เกิดหลังจากนั้นก็มีสิทธิ์ที่ ChatGPT จะให้คำตอบมั่ว ๆ กับเราได้ อีกทั้งยังไม่มีแหล่งที่มาของคำตอบที่ชัดเจน จึงเป็นการยากที่จะใช้ข้อมูลจากโมเดลเหล่านี้เป็นแหล่งอ้างอิงเพื่อไปใช้ในการเรียนหรือการทำงานได้

ลองมาดูตัวอย่างกัน

บทความเพิ่มเติม -> End-to-End RAG ภาษาไทยด้วย LlamaIndex + Weaviate + SeaLLM

ถ้ามีคนถามคุณ ณ ปี 2023 ว่า “ดาวเคราะห์ดวงใดในระบบสุริยะ มีดาวบริวารมากที่สุด” ให้ตอบเองอาจตอบไม่ได้ แต่ถ้าคุณลอง search google ก็จะเจอว่า “ดาวเสาร์” คือดาวเคราะห์ในระบบสุริยะที่มีดาวบริวารมากที่สุด (Link) แต่ถ้าถามกับ ChatGPT ก็จะพบคำตอบนี้

ใช่ค่ะ ChatGPT จะตอบคุณว่า “ดาวพฤหัส” ซึ่งเป็นคำตอบที่ผิด เนื่องจากความรู้ที่มีอยู่อย่างจำกัดนั่นเอง

หรือถ้าคุณอยากสรุปข่าวสงครามอิสราเอล-ปาเลสไตน์ที่ช่วงนี้ทวีความรุนแรงขึ้นมาก ถาม ChatGPT ก็จะได้คำตอบแบบนี้

ก็ได้คำตอบแต่อาจจะไม่ตรงใจเราเท่าไหร่ เพราะเราอยากรู้สถานการณ์สงคราม ณ ขณะนี้ มากกว่าจะเล่าย้อนไปถึงอดีต

RAG ก็เลยเข้ามามีบทบาทช่วยแก้ไขจุดอ่อนตรงนี้ของ LLM เพื่อจะทำให้โมเดลสามารถตอบข้อมูลได้ถูกต้องมากยิ่งขึ้น อัปเดตมากขึ้น(โดยไม่ต้องไปเทรนโมเดลเพิ่ม) และมีแหล่งที่มาที่ชัดเจนนั่นเอง

Step 1 : Query

เริ่มต้นที่การ “Query” ก็คือการถามคำถามที่เราต้องการอยากรู้ไปยังโมเดล LLM ที่เราต้องการ คำถามที่ใส่เข้าไปเราจะเรียกว่า Query ซึ่งถ้าเป็น LLM แบบปกติ โมเดลก็จะทำการประมวลผลในตัวมันเอง และตอบกลับด้วยข้อมูลที่ถูกเทรนมา แต่ถ้าเราทำ RAG คำถามของเราจะไม่ได้ถูกประมวลผลที่โมเดล แต่จะถูกนำไปเข้ากระบวนการต่อ ซึ่งขั้นตอนนี้เราจะเรียกว่าการ “Embedding”

การ Embedding คือการ Embedding Query ของเราให้อยู่ในรูปแบบของ Vector เพราะรูปแบบของข้อมูลที่ถูกจัดเก็บในแหล่งข้อมูลภายนอกของโมเดล ซึ่งก็คือ  Vector Database จะถูกจัดเก็บในรูปแบบของ Vector จึงจำเป็นที่เราจะต้อง Embedding หรือเข้ารหัสตัว Query ของเราเพื่อที่จะสามารถนำ Query ไปค้นหาใน Vector Database อีกทีนึง

การ Embedding ทำได้ทั้งจากการใช้ Word2Vec หรือการให้ GPT Embedding เป็น Vector ให้ได้ค่ะ

จากตัวอย่าง

Query

ดาวเคราะห์ดวงใดในระบบสุริยะ มีดาวบริวารมากที่สุด

ซึ่ง Query นี้ก็จะถูกนำเข้า Embedding Model และแปลงเป็น Vector นั่นเอง

Step 2 : Context

เมื่อเราได้ Query ของเราในรูปแบบของ Vector แล้ว เราจะนำ Query ของเรามาค้นหาหรือถ้าใน Vector Database คือทำการ “เปรียบเทียบ” กับข้อมูลใน Database ว่าข้อมูลอันไหนเหมือนกับ Query ของเรามากที่สุด (กี่อันดับตามที่กำหนดใน RAG อันนี้ต้อง adjust เอาเอง) ซึ่ง Vector Database แต่ละเจ้าก็จะมี Algorithm การจัดเก็บและค้นหาแตกต่างกันออกไป เราอาจต้องลองศึกษาก่อนเริ่มทำ RAG เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด

หลังจากที่เราได้ข้อมูลที่ใกล้เคียงกับ Query ของเรามากที่สุดมาแล้ว เราจะเรียกข้อมูลกลุ่มนี้ว่า “Context” โดย Context จะอ้างอิงถึงแหล่งที่มาว่าข้อมูลดังกล่าวมาจากแหล่งใดด้วย

สมมติว่าได้เก็บข้อมูลจาก Link นี้ไว้ใน Vector Database เมื่อนำ Query เปรียบเทียบก็อาจจะได้ Context ดังตัวอย่าง

“มีการค้นพบดวงจันทร์ของดาวเสาร์เพิ่มอีก 62 ดวง ทำให้รวมแล้วดาวเสาร์มีดวงจันทร์มากถึง 145 ดวง มากที่สุดในระบบสุริยะ
หลังจากที่เมื่อช่วงต้นเดือน ก.พ. ที่ผ่านมา มีการประกาศค้นพบดวงจันทร์บริวารของดาวพฤหัสบดีเพิ่มอีก 12 ดวง รวมเป็น 92 ดวง ทำให้มันกลายเป็นดาวเคราะห์ที่มีดวงจันทร์บริวารมากที่สุดในระบบสุริยะ แซงหน้าแชมป์เก่าอย่างดาวเสาร์ที่มีอยู่ 83 ดวง
แต่พี่ใหญ่ของระบบสุริยะนั่งอยู่บนบัลลงก์แชมป์ได้เพียง 3 เดือนกว่า ๆ ก็ต้องถูกกระชากลงมา ดาวเสาร์กลับมาครองตำแหน่งดาวเคราะห์ที่มีดวงจันทร์มากที่สุดในระบบสุริยะอีกครั้งแล้ว”

ข้อมูลจากสหพันธุ์ดาราศาสตร์นานาชาติ (IAU) ณ วันที่ 13 พ.ค. 2023

Context ดังกล่าวก็จะถูกรวมกับ Query ส่งไปยัง LLM ต่อไป

Step 3 : Prompt

ก่อนจะส่งข้อมูลกลับไปยังโมเดล เราจะนำ Query และ Context รวมกัน โดยเราจะเรียกว่า “Prompt” ซึ่งพอได้ Prompt แล้วก็จะทำการส่งกลับโมเดล LLM เพื่อให้ Generate คำตอบ

เมื่อได้รับ Prompt โมเดล LLM ก็จะทำการ Generate คำตอบออกมาในรูปแบบ text และแสดงผลไปยัง user เป็นการเสร็จสิ้นขั้นตอนการทำงานของ RAG

จากตัวอย่าง Prompt ก็คือ

“มีการค้นพบดวงจันทร์ของดาวเสาร์เพิ่มอีก 62 ดวง ทำให้รวมแล้วดาวเสาร์มีดวงจันทร์มากถึง 145 ดวง มากที่สุดในระบบสุริยะ
หลังจากที่เมื่อช่วงต้นเดือน ก.พ. ที่ผ่านมา มีการประกาศค้นพบดวงจันทร์บริวารของดาวพฤหัสบดีเพิ่มอีก 12 ดวง รวมเป็น 92 ดวง ทำให้มันกลายเป็นดาวเคราะห์ที่มีดวงจันทร์บริวารมากที่สุดในระบบสุริยะ แซงหน้าแชมป์เก่าอย่างดาวเสาร์ที่มีอยู่ 83 ดวง
แต่พี่ใหญ่ของระบบสุริยะนั่งอยู่บนบัลลงก์แชมป์ได้เพียง 3 เดือนกว่า ๆ ก็ต้องถูกกระชากลงมา ดาวเสาร์กลับมาครองตำแหน่งดาวเคราะห์ที่มีดวงจันทร์มากที่สุดในระบบสุริยะอีกครั้งแล้ว”

ข้อมูลจากสหพันธุ์ดาราศาสตร์นานาชาติ (IAU) ณ วันที่ 13 พ.ค. 2023

“ดาวเคราะห์ดวงใดในระบบสุริยะ มีดาวบริวารมากที่สุด”

และคำตอบของคำถามก็คือ

ดาวเคราะห์ในระบบสุริยะที่มีดาวบริวารมากที่สุดคือ “ดาวเสาร์” อ้างอิงจากสหพันธุ์ดาราศาสตร์นานาชาติ (IAU) ณ วันที่ 13 พ.ค. 2023

เห็นมั้ยคะว่าจริง ๆ แล้ว Concept ของ RAG นั้นง่ายมากเลย อ่านถึงตรงนี้ทุกคนน่าจะเข้าใจ RAG ไม่มากก็น้อย สำหรับบทความ RAG 101 : Step by Step Introduction ก็จบลงที่ตรงนี้ ไว้พบกันใหม่บทความหน้า ขอบคุณที่ตั้งใจอ่านจนจบค่ะ 😆

ปล. สำหรับใครที่สนใจบทความสอนการประยุกต์ใช้งาน LLM สามารถติดตาม Facebook Page : Vulture Prime หรือ Facebook Group : Nvidia User Group Thailand ได้ค่ะ

Extra Thanks : IBM สำหรับคนอยากดูวิดีโอ (warning : ภาษาอังกฤษ)

Aa

© 2023, All Rights Reserved, VulturePrime co., ltd.