From c4d153ecfebb63bf5176ba080257bd1f44e6c3e4 Mon Sep 17 00:00:00 2001 From: dtinth on MBP M1 Date: Wed, 23 Oct 2024 23:11:15 +0700 Subject: [PATCH] add metadata for mongo0924 --- data/videos/mongo0924/mongo8.jpg | Bin 0 -> 114434 bytes data/videos/mongo0924/mongo8.md | 39 + data/videos/mongo0924/mongo8_th.vtt | 2469 +++++++++++++++++++++++ data/videos/mongo0924/multimodal.jpg | Bin 0 -> 122843 bytes data/videos/mongo0924/multimodal.md | 31 + data/videos/mongo0924/multimodal_th.vtt | 1999 ++++++++++++++++++ data/videos/mongo0924/rag.jpg | Bin 0 -> 122516 bytes data/videos/mongo0924/rag.md | 29 + data/videos/mongo0924/rag_th.vtt | 2146 ++++++++++++++++++++ src/Event.ts | 8 + 10 files changed, 6721 insertions(+) create mode 100644 data/videos/mongo0924/mongo8.jpg create mode 100644 data/videos/mongo0924/mongo8.md create mode 100644 data/videos/mongo0924/mongo8_th.vtt create mode 100644 data/videos/mongo0924/multimodal.jpg create mode 100644 data/videos/mongo0924/multimodal.md create mode 100644 data/videos/mongo0924/multimodal_th.vtt create mode 100644 data/videos/mongo0924/rag.jpg create mode 100644 data/videos/mongo0924/rag.md create mode 100644 data/videos/mongo0924/rag_th.vtt diff --git a/data/videos/mongo0924/mongo8.jpg b/data/videos/mongo0924/mongo8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7539bb425f9f86f4bfd8de689acd200fd87c89a6 GIT binary patch literal 114434 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ⓈUnPi74%K{MJYaXnnDCmf= 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

;gZXYA;H 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 00:00:02.633 +ทำไมเปิดยิ่งใหญ่จัง + +00:00:05.400 --> 00:00:08.433 +โอเค ก็ขออนุญาต แนะนำตัวทุกคนนิดนึงนะครับ + +00:00:08.500 --> 00:00:09.733 +ผมก็ ผมโร่นะครับ + +00:00:09.800 --> 00:00:12.933 +ผมก็มาจาก เอ่อ Botnoi Group นะครับผม + +00:00:13.700 --> 00:00:16.833 +ปัจจุบันทำทำในส่วนของ AI engineer นะครับ + +00:00:17.200 --> 00:00:21.333 +เนื่องจากเนื้อหา วันนี้นะครับ เห็นว่าทุกคน ทุกคนน่าจะสนใจในเรื่องของ + +00:00:21.400 --> 00:00:25.233 +vector search vector database นะครับ + +00:00:25.300 --> 00:00:28.133 +ก็เลยแบบ ถ้าจะเอาเรื่อง LLM แล้ว + +00:00:28.400 --> 00:00:29.633 +ใครๆ ก็พูดเรื่อง LLM กันละ + +00:00:29.700 --> 00:00:32.633 +วันนี้เรา เรา change dimension นิดนึง + +00:00:33.100 --> 00:00:35.333 +LLM ธรรมดา มัน มันกระจอกไป + +00:00:35.400 --> 00:00:37.333 +วันนี้เรามาคุยกันเรื่องของ multi-modal กัน + +00:00:38.100 --> 00:00:42.633 +อ่า ว่า multi-modal คือ เป็นยังไง นะครับ เออ แล้วก็เพื่อความ + +00:00:42.700 --> 00:00:47.533 +อ่า ไม่ ไม่เหนื่อย ไม่น้ำลายยืดกันนิดนึงนะครับ ผมก็เลย + +00:00:47.600 --> 00:00:52.333 +นิดนึง ว่า วันนี้เราจะ เรียนไป เล่นไป อ่า + +00:00:52.400 --> 00:00:57.633 +เรียนยังไงให้รู้สึกไม่เครียดนะครับ โอเค ก่อนอื่นเลย มีใครในห้องนี้ + +00:00:57.700 --> 00:00:59.633 +รู้จัก multimodal ไหมครับ ชูขึ้นหน่อย + +00:01:01.100 --> 00:01:06.933 +โอ้โห เอาแล้ว ความยากเกิดขึ้นแล้ว + +00:01:07.000 --> 00:01:11.333 +โอเค คำถามแรกเลย multimodal คืออะไร ทุกวันนี้ผมเชื่อว่าทุกคน + +00:01:12.200 --> 00:01:17.133 +ใช้แล้วก็รู้จัก multimodal อยู่แล้ว แต่ว่ามันอยู่ในรูปแบบของแอปพลิเคชันครับผม + +00:01:17.200 --> 00:01:20.633 +multimodal จริงๆ อ่ะ มันก็คือ LLM ตัวนึงแหละ + +00:01:21.300 --> 00:01:25.633 +คำถาม คำถามต่อจากนั้นคือ มันคือ LLM จริงไหม + +00:01:26.300 --> 00:01:30.733 +คำตอบคือ ไม่รู้ ไม่รู้ บางทีก็ใช่ บางที + +00:01:30.800 --> 00:01:38.333 +ก็ไม่ใช่ นะครับ ทำไมผมถึงพูดอย่างงี้ นะครับ เราย้อนกลับไปดูนิดนึงว่า ก่อนที่จะมาเราจะมารู้จักกับคำว่า LLM + +00:01:38.800 --> 00:01:44.133 +นะครับ ก่อนหน้านี้มันมีคำคำนึงที่เป็นคำที่ยอดฮิตกันก็คือคำว่า generative AI + +00:01:44.500 --> 00:01:48.133 +นะครับ คือเรามี input ที่เป็น text เข้ามา นะครับผม ผ่าน generative AI + +00:01:48.500 --> 00:01:51.433 +แล้ว generative AI ก็ สร้าง + +00:01:51.700 --> 00:01:57.032 +คำตอบขึ้นมา สร้าง สังเกตมั้ยคำว่า generative AI คือการสร้างขึ้นมา การสร้างสิ่งใหม่สักอย่างนึง + +00:01:57.100 --> 00:02:01.833 +ขึ้นมานะครับผม เนี่ยสิ่งนี้คือเรา input เป็นด้วย text แล้วมันก็สร้างออกมาเป็น + +00:02:01.900 --> 00:02:06.233 +text ได้อย่างนี้เป็น text to text เนาะ ทีนี้ ทีนี้ ทีนี้ ทีนี้ + +00:02:07.100 --> 00:02:12.433 +แบบเนี้ย มันเป็น unimodel ก็คือมี input 1 type + +00:02:12.500 --> 00:02:17.733 +generate ออกมาเป็น input อีก 1 type อันนี้เป็น keyword เลย ก่อนที่จะมากับคำว่า multimodal นะ + +00:02:17.800 --> 00:02:21.833 +ให้เรารู้จักกับคำนี้ก่อน นะครับ ทีนี้ คำถามคือ เอ้า + +00:02:22.100 --> 00:02:26.632 +เติมน้ำ หยิบไม่เป็นไร อะ ทีนี้คำถามว่า LLM อะ + +00:02:27.300 --> 00:02:28.833 +สรุป มันเป็น multimodal ไหม + +00:02:29.900 --> 00:02:35.533 +เราใช้ chat gpt เรา เราเคย เราเคยให้ chat gpt มัน generate รูปมั้ย + +00:02:36.100 --> 00:02:39.533 +เคยถูกมั้ย อะ ถือว่าเป็น unimodal มั้ย + +00:02:39.800 --> 00:02:43.433 +ไม่เป็นใช่มั้ย สุดท้าย LLM เป็น หรือ chat gpt เป็น + +00:02:43.500 --> 00:02:47.233 +เป็น multimodal หรือเป็น unimodal นะครับ + +00:02:47.300 --> 00:02:52.132 +คำตอบก็คือ ไม่รู้แล้วแต่ task บางทีหลังบ้านของ chatGPT มันอาจจะเป็น + +00:02:52.200 --> 00:02:57.132 +มันอาจจะเป็นก็ได้ หรือบางทีมันอาจจะเป็นแค่แบบ เอ๊ย เป็นโมเดลแล้วไปต่อกับ adapter + +00:02:57.200 --> 00:03:02.333 +หรือฟังก์ชัน เหมือนที่เมื่อกี้คุณเจมส์เขาเล่าให้ฟัง ก็จะเป็นได้นะครับผม + +00:03:02.600 --> 00:03:07.233 +งั้นเรามาคุยกันเรื่องของโมเดลกันก่อน เนาะ อะ เราเอาใหม่ เรามี text อยู่ตัวเดียว + +00:03:07.800 --> 00:03:10.533 +อยู่ เมื่อกี้เหมือนเดิมเลย นะครับ เข้า generative AI + +00:03:11.200 --> 00:03:16.433 +ครับ แต่รอบนี้เราไม่ได้ใส่แค่ text อย่างเดียว อ่า เป็นเวลาเรา เรา เราคุยกับ chatGPT + +00:03:16.500 --> 00:03:19.733 +แล้วบอกว่า เฮ้ย ช่วย อธิบายคำนี้ให้หน่อย + +00:03:20.100 --> 00:03:23.533 +หรือช่วยอธิบายรูป รูปภาพรูปนี้ให้หน่อย แล้วใส่รูปเข้าไป แล้วใส่ text เข้าไป + +00:03:23.900 --> 00:03:27.632 +แล้วให้มันอธิบายให้ฟัง นะครับ อะ คำตอบแบบนี้ + +00:03:27.700 --> 00:03:31.632 +นะครับ คำถาม คำถามมี input ตัวที่ 1 เป็น text + +00:03:31.700 --> 00:03:36.333 +input ตัวที่ 2 เป็นรูปภาพ ให้มัน generate เป็น text + +00:03:37.000 --> 00:03:38.733 +นะครับ แบบนี้เรียกว่า multimodal ยัง + +00:03:40.500 --> 00:03:44.132 +ตามคอนเซ็ปต์แล้ว ถือว่าเป็นครับ เพราะว่า มันมีการ input ของ + +00:03:44.400 --> 00:03:47.733 +ข้อมูลมากกว่า 1 type มันอาจจะไม่ได้ generate + +00:03:48.200 --> 00:03:54.632 +output ที่เป็น 2 type ก็ได้ มันอาจจะ generate output แค่ 1 type แต่เราก็ถือว่ามันเป็น multimodal แล้ว + +00:03:54.700 --> 00:03:58.333 +เพราะว่ามัน มันสามารถแบบทำ multi data type ที่เป็น input + +00:03:58.400 --> 00:04:01.433 +ได้นะครับ แต่ถ้าจะให้ดี ถ้าจะตรงคอนเซ็ปต์จริง + +00:04:02.200 --> 00:04:07.533 +นะครับ มันมี keyword อยู่นี่อยู่ คำว่า generate variety of outcomes ก็คือมันสามารถเข้า + +00:04:07.800 --> 00:04:14.333 +สร้างสิ่งใหม่ๆ ออกมาได้มากกว่าแค่ text นะครับ ถ้าเป็นไปได้ multimodal ควรจะสร้าง + +00:04:14.800 --> 00:04:17.933 +output type ได้มากกว่าหนึ่งนะครับผม อย่างเช่นรูปภาพ + +00:04:18.600 --> 00:04:25.332 +ครับผม แบบนี้ก็เป็น เป็นแบบ multimodal เหมือนกัน แต่ถามว่าสุดท้ายแล้ว input image กับรูปกับ text ไป 2 ตัวนี้ แล้วสร้างเป็น + +00:04:25.400 --> 00:04:30.033 +เป็น text แบบนี้ถือเป็น multimodal ไหม เป็นนะครับผม อะ ทีนี้ + +00:04:30.100 --> 00:04:33.332 +มาเข้าสู่นิยามของคำว่า multimodal จริงๆ นะครับผม + +00:04:33.400 --> 00:04:36.533 +อย่าเพิ่งน้ำลายไหลกัน หลังจากเห็นรูปภาพนี้ นะครับ + +00:04:36.600 --> 00:04:40.433 +multimodal ในอุดมคติ คือ เราจะบอกกันว่า นะครับ + +00:04:40.500 --> 00:04:43.933 +เรามี source ไม่ว่าจะเป็น text หรือเป็น object + +00:04:44.000 --> 00:04:47.533 +แต่ใดๆ ก็ตาม นะครับผม เราจะพยายามแปลง source ตัวเนี้ย + +00:04:48.100 --> 00:04:51.533 +ให้เป็น text นะครับผม อย่างเช่นรูปภาพ เนาะ + +00:04:51.800 --> 00:04:54.233 +เรามีรูปภาพ เรามี เรามีเสียง เรามีวีดีโอ + +00:04:54.600 --> 00:04:57.433 +เราอยากจะ change มันนะครับ แล้วทำ projector นะครับผม + +00:04:57.500 --> 00:05:01.233 +ให้เกิด เกิดออกมาเป็น text นะครับ ไปเข้า LLM อ่า สังเกตมั้ย + +00:05:01.600 --> 00:05:04.332 +เรามี LLM อยู่ตัวนึง + +00:05:04.700 --> 00:05:06.733 +LLM ที่เราพยายามจะเข้าใจภาษา + +00:05:07.200 --> 00:05:10.533 +เข้าใจภาษา ความสามารถของ LLM ที่สามารถเข้าใจเรื่องภาษาได้ + +00:05:10.600 --> 00:05:13.233 +เราแปลง image เป็น text เพื่อให้มันเข้าใจภาษา + +00:05:13.500 --> 00:05:15.633 +เราแปลง audio เป็น text เพื่อให้มันเข้าใจเหมือนกัน + +00:05:16.300 --> 00:05:18.133 +ครับ หลังจากมันทำความเข้าใจละ + +00:05:18.400 --> 00:05:21.233 +ทีนี้ มันทำ encode เสร็จละ มัน ทีนี้มันต้องทำ decode + +00:05:21.600 --> 00:05:23.832 +อย่างเช่น เราจะ generate รูปภาพอยู่รูปนึง + +00:05:24.100 --> 00:05:29.332 +นึกถึง นึกถึงคนเรา เราจะ generate รูปภาพ เรา เราเข้าใจคำว่า เออ ช่วย ช่วยสร้างรูปปิกาจูให้ฉันหน่อย + +00:05:29.800 --> 00:05:34.533 +นะครับ มันอาจจะมีแค่ text เป็นคำเดียวเลย ทีนี้ มันจะแปลง text คำเนี้ยให้เป็นรูปภาพยังไง + +00:05:34.800 --> 00:05:37.533 +ถูกมั้ย เราก็ต้องเหมือนเวลาเราทำโมเดล AI สัก + +00:05:37.600 --> 00:05:40.433 +ตัวนึงอ่ะ เราก็ต้องมีการจับคู่กันระหว่างรูปภาพกับ text + +00:05:40.700 --> 00:05:43.633 +นะครับ เราเทรนด้วยการเอารูปภาพไป + +00:05:43.700 --> 00:05:45.933 +แล้วก็แปลงออกมาให้เป็น text + +00:05:46.000 --> 00:05:48.733 +ทีนี้เอาต์พุตเหมือนกันนะครับ เราต้องแปลง text ออก + +00:05:48.800 --> 00:05:53.433 +ไปเป็นรูปภาพอย่างงี้เป็นต้นนะครับ อันนี้เป็นเรื่องเรื่องของ multimodal ในอุดมคติ + +00:05:53.500 --> 00:05:58.433 +นะครับ ถามว่าในปัจจุบันเนี้ย มีโมเดลที่สามารถทำได้ขนาดนี้หรือยัง + +00:05:58.500 --> 00:06:02.733 +นะครับ คำตอบคือเริ่มมีแล้ว แต่ว่ายังไม่ได้เป็น + +00:06:02.800 --> 00:06:05.033 +ยูนิเวอร์แซลขนาดนั้นนะครับผม + +00:06:05.100 --> 00:06:07.633 +เพราะงั้นมันก็ยังเลยยังเป็นเรื่องของงานวิจัยกัน + +00:06:07.700 --> 00:06:12.332 +นะ ถ้าอย่างนั้นทอปปิกในเรื่องของ multimodal อะ มันก็เลยถูกเริ่มพูดกัน + +00:06:12.400 --> 00:06:16.033 +แต่ว่ายังไม่ได้ถูกเอามาใช้จริงหรือว่าทำให้แบบเราเข้าถึงกันได้ + +00:06:16.100 --> 00:06:18.133 +นะครับผม อย่างตัวที่ใกล้เคียงที่สุด + +00:06:18.200 --> 00:06:20.733 +นะครับ อย่างที่เราใช้กันอยู่ทุกวันนี้อย่างเช่น ChatGPT + +00:06:21.100 --> 00:06:25.933 +หรือว่า Gemini หรือว่า Claude พวกนี้ก็เป็น เรียกว่าเป็น multimodal แล้ว + +00:06:26.000 --> 00:06:28.933 +นะครับ เพราะว่ามันเริ่มเข้าใจพวก source พวก + +00:06:29.400 --> 00:06:34.233 +image audio วีดีโอ อะไรพวกนี้ รวมถึงว่ามันจะสามารถแบบแปลงออกมา + +00:06:34.300 --> 00:06:38.933 +เป็นอะไรเป็นรูปภาพ บอกให้มันสร้างรูปภาพได้มั้ย มันบอกให้มันสร้าง audio อะไรพวกนี้ + +00:06:39.000 --> 00:06:41.633 +ได้มั้ย คำตอบคือปัจจุบันมันเริ่มทำได้แล้ว + +00:06:41.700 --> 00:06:43.633 +นะครับผม อ่า เอ่อ + +00:06:45.500 --> 00:06:50.433 +ซึ่ง เอา วันนี้ หลักๆ เลย วันนี้ เนื่องจากว่ามันเป็นเซกชันของ + +00:06:50.500 --> 00:06:54.733 +มันเป็นเซกชันที่ผมมองว่า เออ 30 นาทีเอง เราจะทำยังไงกับ multimodal ตัวนี้ให้ทุกคน + +00:06:54.800 --> 00:06:56.332 +เข้าใจคอนเซ็ปต์ของมันก็คือ + +00:06:56.400 --> 00:06:58.933 +เพราะงั้นเราจะเริ่มจากคำว่า image กับ text + +00:06:59.400 --> 00:07:02.033 +แค่นี้พอ แค่นี้พอ เราจะอินพุต 2 อย่างเนี้ย + +00:07:02.100 --> 00:07:04.533 +แล้วให้มันตอบคำถามออกมาเป็น + +00:07:04.600 --> 00:07:06.933 +text ให้ได้ นะครับ + +00:07:07.000 --> 00:07:09.633 +ความยากความง่ายคืออะไร + +00:07:10.300 --> 00:07:12.933 +ความยากคือ เรามี LLM ตรงกลางอยู่ 1 ตัว + +00:07:13.400 --> 00:07:17.433 +ทีนี้ เราจะ ทำยังไงให้มัน input ทั้ง text ทั้ง image + +00:07:17.900 --> 00:07:21.533 +ได้ อ่า อันนี้คือความยาก อันนี้คือ challenge ของเราในวันนี้ + +00:07:21.600 --> 00:07:23.933 +นะครับผม เมื่อกี้สังเกตจาก class ของพี่เจมส์ + +00:07:24.700 --> 00:07:28.533 +สังเกตจาก พี่เจมส์ พี่เจมส์เค้าใช้ วิธีการ พิมพ์ด้วย ข้อความอย่างเดียว ถูกมั้ย + +00:07:29.100 --> 00:07:31.633 +พิมพ์ด้วยข้อความอย่างเดียว แล้วมันก็ไป search หา similarity + +00:07:31.700 --> 00:07:33.533 +ทีนี้ สิ่งที่มันใกล้เคียงกัน + +00:07:34.000 --> 00:07:36.832 +ทีนี้ เราจะรู้ได้ไงอ่ะ image + +00:07:36.900 --> 00:07:41.633 +กับ text มันใกล้เคียงกัน 2 อย่างเนี้ย มัน มันอยู่กันคนละโดเมนกันเลย + +00:07:42.000 --> 00:07:45.033 +ตัวนึงอยู่โดเมนของ text อีกตัวนึงอยู่ในโดเมนของรูปภาพ + +00:07:45.100 --> 00:07:47.733 +เราทำยังไงให้มันรู้เรื่องตรงนี้ได้นะครับผม + +00:07:47.800 --> 00:07:49.633 +ในที่ step แรกนะครับ + +00:07:49.700 --> 00:07:51.433 +เราจะทำยังไงให้อิมเมจเป็น text ก่อน + +00:07:52.300 --> 00:07:54.233 +step แรกเลย image + +00:07:54.600 --> 00:07:57.332 +เราจะเข้าใจ image เราคนเราเข้าใจ image ว่ายังไง + +00:07:57.400 --> 00:07:59.633 +นะครับผม สมมุติมีภาพมา 1 ภาพ + +00:08:00.700 --> 00:08:06.633 +คนเราเข้าใจ image จาก จากการที่มีคนสอนบอกว่า สิ่งสิ่งนี้คืออะไร สิ่งที่คุณเห็นอยู่คืออะไร + +00:08:06.700 --> 00:08:08.533 +นะครับ ตัดไปที่คอมพิวเตอร์ + +00:08:09.100 --> 00:08:13.133 +มันมีงาน งานนึงที่เราเรียกกันก็คือ เรียกว่า image captioning + +00:08:13.400 --> 00:08:17.433 +คือการพยายามอธิบายภาพภาพนี้ ว่าภาพภาพเนี้ยสื่อถึงอะไร + +00:08:17.900 --> 00:08:22.033 +นะครับผม เราจะพยายามอธิบายมันให้ให้เป็นภาษาภาษาภาษา text เนี่ยแหละ + +00:08:22.100 --> 00:08:25.332 +หรือภาษา language language ทั่วๆ ไปจาก 1 ภาพตรงนี้ + +00:08:25.400 --> 00:08:26.033 +นะครับ + +00:08:26.700 --> 00:08:30.332 +แปลงแบล็กบ็อกซ์ เข้าแบล็กบ็อกซ์ แบล็กบ็อกซ์สักตัวนึงก่อน เป็น AI สักตัวนึง + +00:08:30.400 --> 00:08:32.732 +นะครับ แล้วออกมา นะครับ เป็น + +00:08:33.100 --> 00:08:34.332 +เท็กซ์สักกล่องนึง + +00:08:35.100 --> 00:08:37.033 +นะครับ อันนี้ อันนี้เป็น + +00:08:37.700 --> 00:08:40.232 +มีม ปล่อยมันไป นะครับ + +00:08:40.299 --> 00:08:43.433 +อันนี้หลักๆ ถามว่าทำไมต้องทำ image captioning เพราะว่า + +00:08:43.500 --> 00:08:46.933 +จากฟังติโมเดลเมื่อกี้ เมื่อกี้เราเห็นกันเนาะ เราบอกว่าการที่ + +00:08:47.000 --> 00:08:51.833 +จะให้ ให้ multimodal มันเข้าใจ source อื่นที่ไม่ใช่ text ได้เนี่ย + +00:08:52.100 --> 00:08:55.733 +มันต้องแปลงพวก other source อ่ะ เป็น text ก่อน + +00:08:55.800 --> 00:08:59.433 +แล้วมัน มันถึงจะแปลงเข้า เข้าสู่โมเดล เพราะงั้นกระบวนการแรกเลย + +00:08:59.500 --> 00:09:02.533 +แปลง source อื่นให้เป็น text แปลยังไง อย่าง image + +00:09:03.000 --> 00:09:05.333 +วิธีง่ายที่สุด ทำเป็น image captioning ครับผม + +00:09:05.900 --> 00:09:09.733 +อ่า อ่า ทีนี้ มันก็มีอีก อีกงานวิจัยนึง + +00:09:09.800 --> 00:09:14.533 +นะครับผม เราบอกว่า เมื่อกี้เราทำ image อย่างเดียว image อย่างเดียวมัน + +00:09:14.600 --> 00:09:16.433 +มันก็รู้นี่ image กับ text + +00:09:16.900 --> 00:09:21.233 +image แปลงเป็น text แต่ว่า ถ้าเราจะตั้งคำถามกับ text text นั้นๆ น่ะ + +00:09:22.100 --> 00:09:25.133 +เราจะตั้งคำถามกับ text นั้นๆ เช่น รูปรูปนี้คืออะไร + +00:09:25.400 --> 00:09:28.933 +นะครับ อ่า รูปนี้คืออะไร เราใส่ปิกาจูไป + +00:09:29.500 --> 00:09:33.633 +แล้วเราตั้งคำถามกับมัน คำถามนี้อาจจะเป็นอะไรก็ได้ เป็นคำถามอื่นก็ได้ + +00:09:33.700 --> 00:09:34.833 +แต่คำตอบของมันต้อง + +00:09:35.900 --> 00:09:39.833 +ออกมา นะครับผม ออกมาอาจจะเป็น text ก็ได้ อาจจะเป็น image ก็ได้ + +00:09:39.900 --> 00:09:44.433 +ทีนี้ ความยาก ความยาก หรือความ ความที่มันเกิดขึ้นก็คือ + +00:09:44.500 --> 00:09:47.033 +เราจะแมตชิ่งมันยังไง ระหว่าง text + +00:09:47.300 --> 00:09:50.633 +กับ image งานวิจัยเนี้ย เราเรียกกันว่า + +00:09:50.700 --> 00:09:53.933 +Visual Language Model คือเราใส่ทั้ง image + +00:09:54.000 --> 00:09:56.833 +text เข้าไป เพื่อให้ AI มันเรียนรู้ว่า + +00:09:56.900 --> 00:10:01.433 +สิ่งสิ่งเนี้ย ทั้ง input แล้วก็ ทั้ง input ที่เป็น image แล้วก็ input ที่เป็น + +00:10:01.500 --> 00:10:03.633 +text นะครับผม + +00:10:03.700 --> 00:10:07.133 +สองสิ่งเนี้ย มัน relate กันยังไงเนาะ มันจะแปลง image + +00:10:07.500 --> 00:10:12.033 +เป็นเวกเตอร์นะครับ แล้วก็แปลง text เป็นเวกเตอร์เหมือนที่เมื่อกี้คุณเจมส์บอกเนาะ + +00:10:12.100 --> 00:10:15.933 +แล้วมันก็จะไปเข้าฟังก์ชันหรือกระบวนการทางคณิตศาสตร์ของมันสักตัวนึง + +00:10:16.400 --> 00:10:21.133 +นะครับ แล้วก็ ออกมาบอกว่า โอเค สิ่งสิ่งนี้คืออะไร ก็คืออิงจากคำถาม + +00:10:21.200 --> 00:10:23.833 +กับรูปภาพ 2 อย่างนี้ที่มันจะ relate กัน + +00:10:23.900 --> 00:10:26.933 +นะครับ มันก็จะเป็นเรื่องของการเตรียมโมเดลกับการทำ + +00:10:27.800 --> 00:10:32.833 +การเตรียมดาต้ากับการทำโมเดลเนาะ เรื่องซึ่ง 2 เรื่องเนี้ย ระหว่างการทำ image captioning กับ VLM + +00:10:32.900 --> 00:10:36.833 +เนาะ 2 ตัวนี้มันก็จะทำให้มัน relate กันได้ + +00:10:36.900 --> 00:10:41.033 +แต่ว่า ความยากอีกอย่างนึงของเราก็คือ + +00:10:41.100 --> 00:10:43.233 +มันฮาลูซิเนต ถ้าเราทำอย่างนี้ + +00:10:43.600 --> 00:10:48.633 +ถ้าเราทำอย่างงี้แล้วเดต้าเราไม่ดีอ่ะ แน่นอน 1 เลยคือโมเดลมันฮาลูซิเนตแน่นอนนะครับผม คือ + +00:10:48.700 --> 00:10:52.433 +เรามีดาต้า image แล้วเรามีดาต้า text 2 ตัวที่มัน captioning กัน + +00:10:52.800 --> 00:10:56.233 +แล้วเราเอามาทำ question and answering เนาะ + +00:10:56.900 --> 00:11:00.533 +อ่า อันนี้เป็น leader board นะครับว่าปัจจุบันเนี้ยมีโมเดลตัวไหนที่มัน + +00:11:00.600 --> 00:11:03.333 +มันเก่งมากๆ เนาะ ถ้าเราสังเกตตัว ตัว + +00:11:03.900 --> 00:11:04.633 +อ่า + +00:11:06.500 --> 00:11:06.833 +ได้ไหม + +00:11:08.200 --> 00:11:09.033 +หรือไม่ ไม่ได้ + +00:11:14.000 --> 00:11:16.333 +อ่ะ ขยายไม่ได้ อ่ะ ตัวบนสุดคือ GPT-4o + +00:11:16.400 --> 00:11:22.533 +สังเกตโมเดลที่เราบอกว่า เอ้ย เรา เราจะใช้ เราจะทำโมเดล VLM เนาะ + +00:11:22.600 --> 00:11:27.733 +VLM โมเดลที่ตอน ตอนนี้ที่ดีที่สุดก็คือ GPT-4o เอ๊า ไหนบอก GPT-4o เป็น + +00:11:27.800 --> 00:11:29.933 +เป็น multimodal ใช่ครับ + +00:11:30.400 --> 00:11:31.933 +multimodal ก็คือเป็นโมเดล + +00:11:33.000 --> 00:11:35.533 +เนาะ VLM ก็คือเป็น เป็นงาน + +00:11:35.600 --> 00:11:39.333 +งาน หรือว่าเป็นโจทย์ปัญหาที่เราจะ จะใช้โมเดลสักตัวนึงเข้าไป solve + +00:11:39.700 --> 00:11:44.033 +นะครับ ในปัจจุบันเนี้ยพวก multimodal หลายๆ ตัวมันก็เริ่มแบบ solve ปัญหาเรื่อง + +00:11:44.100 --> 00:11:48.633 +เรื่องวิชัน อ่า พวก visual language modeling ได้แล้ว + +00:11:48.700 --> 00:11:53.733 +เนาะครับผม อย่าง อ่า ทุกวันนี้ตัว Claude มันก็สามารถใส่ทั้ง image + +00:11:53.800 --> 00:11:56.133 +แล้วก็ text ในการถามคำถามมัน มันได้ละ + +00:11:56.400 --> 00:11:59.533 +เนาะ เพราะงั้นไอ้ตัวเนี้ยมันคือเรื่องของโมเดลดิบ + +00:12:00.100 --> 00:12:05.633 +เนาะ อันนี้มี testing score อยู่ ถ้าเกิดว่าใครอยากจะไปเล่นนะครับ ลอง ลองสามารถเข้าไปเล่นใน vision arena ได้ + +00:12:06.100 --> 00:12:08.333 +อ๋อ อ่า ที่นี่เป็นคำถามที่ + +00:12:08.400 --> 00:12:13.633 +ที่ทุกคนน่าจะ น่าจะสน น่าจะสน ให้ความสนใจกันมาก มากในช่วงนี้คือ + +00:12:13.700 --> 00:12:16.133 +ถ้าสมมุติเรามี เรามี choice อยู่ตัวนึง + +00:12:16.500 --> 00:12:20.733 +คือเราจะทำ RAG หรือเราทำ fine tuned model + +00:12:20.800 --> 00:12:22.033 +ครับทำ RAG ทำไมไม่ทำ fine-tune ครับ + +00:12:22.900 --> 00:12:25.133 +แพงครับ โอ้โห คำถามนี้น่าสนใจ + +00:12:25.500 --> 00:12:27.533 +ใช่ RAG + +00:12:28.100 --> 00:12:29.633 +RAG ถูกไหม + +00:12:30.300 --> 00:12:34.333 +ก็ ก็ไม่ถูกมั้ย ก็ไม่ค่อยถูกเท่าไหร่เนาะ + +00:12:34.400 --> 00:12:39.233 +แต่จริงๆ อ่ะ คำ อย่างเราที่เป็น AI engineer 1 คน น่ะครับผม การที่เราจะเลือกว่าเรา แล้ว + +00:12:39.800 --> 00:12:46.233 +ระหว่างเราจะทำ RAG กับการทำ Fine-tune อ่ะ ถ้าเราสมมุติว่าเราทำ Fine-tune เราต้องมีโมเดลอยู่โมเดลนึงเนาะ ที่เมื่อกี้เรา เราไปนั่ง + +00:12:46.300 --> 00:12:51.233 +สรรหามา นั่งดูรีซอร์ทมาว่าโมเดลสักตัวนึงเนี่ยจะเอามา + +00:12:51.300 --> 00:12:54.733 +มาทำ ทำ problem แก้ปัญหาเรื่อง + +00:12:54.800 --> 00:12:58.033 +VQA อะไรพวกเนี้ย เอ่อ โมเดลพวกนั้นน่ะ + +00:12:58.100 --> 00:13:01.833 +ว่าจะทำยังไงให้มันเก่ง เก่งพอที่จะมาทำเรื่องพวกนี้ + +00:13:01.900 --> 00:13:05.733 +เราก็ต้องมาทำไฟน์จูน เราก็ต้องไปเตรียม data set อีกเยอะแยะมากมายเลย + +00:13:05.800 --> 00:13:10.233 +เพราะงั้น ในโซลูชั่นที่ดีที่สุดก็คือ ณ ตอนนี้ก็คือ การทำ RAG + +00:13:10.300 --> 00:13:14.633 +ในสำหรับเคสที่เป็น startup แบบ ทำแบบเร็วๆ บอกว่าฉันมี + +00:13:14.700 --> 00:13:18.733 +vector database นะ ฉันมี document ฉันมี image นะครับ ไม่งั้นทุก + +00:13:18.800 --> 00:13:22.133 +วันนี้ทุกคนก็คงไม่ ทุกคนก็คงคงกระโดดไปทำ + +00:13:22.200 --> 00:13:26.033 +fine-tuning กัน ถ้าอยากทำ RAG ก็ง่ายมาก ก็แค่มี vector database + +00:13:26.300 --> 00:13:28.833 +แต่ถ้าทำ fine-tune คุณต้องมี 1 การ์ดจอ + +00:13:30.400 --> 00:13:31.033 +2 คุณต้องมีเงิน + +00:13:31.900 --> 00:13:35.433 +ต้องมีเงินเยอะมาก ถ้า ถ้าจะทำ fine-tuning model สักตัวนึง นะครับ + +00:13:35.500 --> 00:13:38.333 +ครับ เพราะงั้นเรากลับมาที่ RAG กันนะครับ + +00:13:38.400 --> 00:13:42.533 +ครับ RAG เอ่อ ผมเชื่อว่าคุณเจมส์น่าจะ น่าจะพูดเรื่อง RAG ไป + +00:13:42.600 --> 00:13:47.033 +พอสมควรละ จริงๆ RAG อ่ะ คอนเซ็ปต์มันก็คือว่าเรา เรามี vector database อยู่ + +00:13:47.100 --> 00:13:50.433 +ตัวนะครับผม เรามี source อย่างเมื่อกี้ + +00:13:51.100 --> 00:13:55.433 +เมื่อกี้ตัว source ของ ของ คุณเจมส์เนาะ อาจจะเป็นเรื่องของ document หรือว่าเป็น + +00:13:55.500 --> 00:13:59.733 +เป็นตัวพวกข้อมูล text อะไรพวกนี้เนาะ ส่วนผมอาจจะมองเป็น + +00:14:00.100 --> 00:14:05.433 +เป็น other source สักตัวนึง ก็คือว่า เราอาจจะมีเป็น document เราอาจจะมีเป็นรูปภาพ อาจจะมีเป็นวีดีโอ + +00:14:05.800 --> 00:14:08.433 +เราทำการ embed embed source เหล่าเนี้ย + +00:14:08.800 --> 00:14:13.033 +นะครับผม แล้วก็เข้าไปในเวกเตอร์ดาต้าเบส เป็นเวกเตอร์เวกเตอร์นึงที่ถูกเก็บไว้ว่า + +00:14:13.100 --> 00:14:15.833 +เวกเตอร์ระบุตัวนี้ ระบุว่า มันคือ source ตัวไหน + +00:14:15.900 --> 00:14:19.533 +มันคือ image ตัวไหน มันคือวีดีโอ channel ไหน นะครับผม + +00:14:19.600 --> 00:14:23.733 +แล้วเราก็มี user เนาะครับ 2 ฝั่ง user ทำการทำ + +00:14:23.800 --> 00:14:27.233 +query embedding นะครับผม ไปที่เวกเตอร์ ได้ออกมาเป็น + +00:14:27.600 --> 00:14:30.033 +เป็นข้อมูลที่เราต้องการจะ search นะครับ + +00:14:30.100 --> 00:14:33.233 +หลังจากนั้นก็เอาข้อมูลที่ search ไปผ่าน LLM + +00:14:33.600 --> 00:14:35.933 +นะครับผม เพื่อแปลง แปลงผลออกมา + +00:14:36.000 --> 00:14:41.133 +จะ 2 step นี้เราเรียกว่า collection กับ question and answer นะครับผม + +00:14:41.200 --> 00:14:44.933 +ในส่วนของ collection ก็คือการเตรียม data เราจะเตรียม database สักตัวนึงอะ + +00:14:45.000 --> 00:14:49.333 +อย่างเมื่อกี้ อย่างเมื่อกี้ใน ใน ในแลปเมื่อกี้ เราเห็นละว่าเอ๊ยคุณ + +00:14:49.400 --> 00:14:54.733 +คุณเจมส์มี database ที่ prepare พร้อมแล้ว ที่นี้ถ้าคุณอยากจะเตรียม vector database เอง เราต้องเตรียมยังไง + +00:14:54.800 --> 00:14:57.333 +นะครับผม ใน ใน section นี้มีการพูดถึงกัน + +00:14:57.400 --> 00:15:01.833 +แล้วก็หลังจากเราเตรียม collection database เสร็จละ นะครับ เราได้ vector database มา 1 + +00:15:01.900 --> 00:15:05.633 +ที่นี้เราอยากจะทำ VQA หรือเราจะอยากจะทำ + +00:15:05.700 --> 00:15:10.433 +image searching image image image ใดๆ ก็ตาม นะครับผม แล้วก็ใช้ question answering + +00:15:10.500 --> 00:15:13.433 +มาการทำกัน เนาะ อะ เราเริ่มที่ step แรก + +00:15:13.800 --> 00:15:16.433 +image collection นะครับผม คอนเซ็ปต์ง่ายมาก + +00:15:16.500 --> 00:15:19.633 +เราก็แค่แปลงรูปภาพ นะครับผม เป็นเวกเตอร์ + +00:15:20.200 --> 00:15:22.733 +แล้วก็ไปเข้าในเวกเตอร์ดีบี นะครับ + +00:15:22.800 --> 00:15:24.633 +ง่าย ง่ายนิดเดียว คำถามคือ + +00:15:25.100 --> 00:15:29.733 +ทำยังไง นะครับ สเต็ปแรก อะ สเต็ปแรก เอาเข้าใจง่ายๆ นะครับผม + +00:15:30.000 --> 00:15:32.533 +เรา มี image ใช่ไหม เมื่อกี้เราบอกแล้ว ว่า การที่เราจะทำ + +00:15:32.600 --> 00:15:36.733 +ทำ image หรือเราจะทำ model สักตัวนึงอะ เราต้องแปลง + +00:15:37.000 --> 00:15:41.933 +แปลง other source ให้เป็น text ก่อน แล้ว text อ่ะมันถึงจะไปให้ LLM + +00:15:42.000 --> 00:15:46.533 +ใช้ในการเรียนรู้ นะครับผม เพราะงั้นเราก็จะคงคอนเซ็ปต์นี้คือเราจะแปลง text + +00:15:46.900 --> 00:15:49.933 +แปลง other source อย่างเช่น image เนี่ย มาเป็น text ก่อน + +00:15:50.600 --> 00:15:53.433 +นะครับผม คำถามคือแปลง image เป็น text ยังไง + +00:15:53.800 --> 00:15:57.233 +ครับ เมื่อกี้พูดไปแล้ว นะครับ เราก็ผ่าน image captioning ไง + +00:15:57.500 --> 00:15:59.233 +เรามีรูปภาพ เราแปลง image + +00:16:00.000 --> 00:16:01.133 +นะครับผม เป็น text + +00:16:02.000 --> 00:16:05.033 +หลังจากเราได้เป็น text แล้ว นะครับ อะจริงๆ ง่ายเลย + +00:16:05.100 --> 00:16:08.333 +ง่ายเลย เราจะทำ RAG จากจาก text หรือ LLM ทำยังไง + +00:16:09.200 --> 00:16:12.733 +ไม่ยาก อีก text ก็ไปทำ embedding ไง ไปทำ text embedding + +00:16:13.400 --> 00:16:16.733 +นะครับผม ได้ออกมาเป็นเวกเตอร์ละ เวกเตอร์เราก็แค่ไป + +00:16:17.000 --> 00:16:21.733 +สุดท้ายเราก็ไป insert เข้า vector database นะครับผม vector database วันนี้เดี๋ยวเราโชว์กันใน + +00:16:21.800 --> 00:16:23.833 +ในตัวของ MongoDB เนาะ + +00:16:24.200 --> 00:16:28.533 +อ่ะ คำถามที่น่าสนใจมากๆ เลย ที่ผมเชื่อว่าทุกคนน่าจะตั้งคำถามกัน + +00:16:28.600 --> 00:16:31.633 +นะครับ ทำไมเราไม่แปลง image เป็นเป็นเวกเตอร์เลย + +00:16:33.100 --> 00:16:34.833 +อ่ะ อันนี้เป็นคำถามที่น่าสนใจมาก + +00:16:35.500 --> 00:16:40.933 +ตอบ ตอบหน่อย มีใครตอบมั้ย + +00:16:41.000 --> 00:16:44.033 +แจกของมั้ย เอาแจกอะไรดี + +00:16:45.600 --> 00:16:49.633 +แจกสมุด 1 เล่มครับ แจกสมุด 1 เล่ม อ่า ใคร ใคร ใครตอบได้ ใครตอบได้ ทำไมเราไม่แปลง + +00:16:49.700 --> 00:16:51.833 +แปลง image เป็น เป็นเวกเตอร์เลย + +00:16:56.800 --> 00:16:57.733 +เฮ้ย ทำได้ + +00:16:59.400 --> 00:17:02.033 +ทำได้ คุณ คุณดูถูกพลัง + +00:17:02.100 --> 00:17:03.633 +พลังโมเดลลิ่งเกินไปละ + +00:17:06.900 --> 00:17:09.733 +ละน้ำลายหยดละ โอเคไม่เป็นไร โอเค อะ ฮือ + +00:17:10.400 --> 00:17:10.532 +ห๊ะ + +00:17:12.000 --> 00:17:14.032 +อะไรนะ ใช้ ส + +00:17:14.099 --> 00:17:16.032 +ไม่ไม่เกี่ยวไม่เกี่ยวไม่เกี่ยวไม่เกี่ยว + +00:17:16.599 --> 00:17:20.433 +ห๊ะ อะ โอเคเฉลย ขอบคุณขอบคุณ + +00:17:20.500 --> 00:17:22.333 +เป็น เอาของมั้ย + +00:17:22.900 --> 00:17:27.633 +อ้าว โอเค อะ เราเฉลย เราเฉลย สาเหตุว่าทำไม + +00:17:27.700 --> 00:17:30.433 +นะครับผม เพราะว่า การเราจะทำ RAG + +00:17:30.700 --> 00:17:33.933 +เราอยากจะเสิร์ช เราอยากจะเสิร์ชรูปภาพ 1 รูปภาพ + +00:17:34.200 --> 00:17:38.233 +นะครับผม ถ้าเราจะทำ เราทำเสิร์ชรูปภาพด้วย คำว่า + +00:17:38.300 --> 00:17:41.233 +เฮ้ย ฉันขอเสื้อสีแดงหน่อย + +00:17:42.700 --> 00:17:45.233 +ฉันขอเสื้อสีแดงหน่อย ฉันถาม ถาม + +00:17:45.600 --> 00:17:48.133 +ถาม RAG ไปด้วย ไปด้วย text + +00:17:49.200 --> 00:17:51.033 +แล้วมันจะไปเสิร์ชรูปภาพ + +00:17:52.500 --> 00:17:56.133 +คำถามคือ ในเวกเตอร์ดาตาเบสที่เราเก็บอยู่อ่ะตอนเนี้ย + +00:17:56.500 --> 00:17:59.133 +เราแปลง image เป็นเวกเตอร์ด้วย + +00:17:59.700 --> 00:18:03.533 +image embedding ถูกมะ + +00:18:04.800 --> 00:18:07.833 +มันแปลง มันแปลงหาพฤติกรรมของรูปภาพ + +00:18:07.900 --> 00:18:12.233 +แต่ว่ามันไม่ได้หาพฤติกรรมของ text เพราะงั้นทางที่ดีเราควรจะ + +00:18:12.300 --> 00:18:15.733 +ทำรูปภาพก่อนแล้วค่อยแปลงเป็น image captioning เป็น text + +00:18:16.200 --> 00:18:18.133 +แล้วหลังจากนั้นค่อยแปลงเป็น text เป็นเวกเตอร์ + +00:18:18.600 --> 00:18:20.933 +แล้วถามว่า image embedding อ่ะ ทำไม + +00:18:21.400 --> 00:18:24.833 +มันเหมาะกับเคสไหนนะครับผม use case ที่เรามักจะใช้กัน + +00:18:25.200 --> 00:18:27.633 +นะครับผมไม่ได้บอกว่ามันไม่ดีแต่ + +00:18:27.700 --> 00:18:30.733 +มันเหมาะมันไม่ได้เหมาะกับแอปพลิเคชันที่เราใช้ใน + +00:18:30.800 --> 00:18:36.133 +ใน multimodal RAG เนาะ use case ที่มันน่าสนใจและผมเชื่อว่าทุกคนน่าจะใช้กัน + +00:18:36.200 --> 00:18:40.633 +ก็คือ image similarity สมมุติคุณบอกว่าคุณมีรูปอยู่ 1 รูป + +00:18:40.700 --> 00:18:44.533 +คุณอยากจะ คุณอยากจะแมตชิ่งรูปนี้กับรูปที่ใกล้เคียงที่สุด + +00:18:44.600 --> 00:18:48.933 +เช่น คุณบอกว่า เอ๊ย คุณฉันไป ฉันเข้าไปในแอป + +00:18:49.500 --> 00:18:52.133 +แอป แอปหนึ่ง มีรูปภาพ product product หนึ่ง บอก + +00:18:52.200 --> 00:18:54.433 +มา อยากได้สินค้าประมาณเนี้ย + +00:18:55.000 --> 00:18:59.233 +แล้วก็ส่งรูปเข้าไป แล้วเดี๋ยวมันเสิร์ชแมตช์รูปภาพที่มันใกล้เคียงที่สุด + +00:18:59.300 --> 00:19:02.333 +อันนี้ได้ อันนี้เหมาะ อันนี้เหมาะมาก + +00:19:02.400 --> 00:19:05.433 +นะครับผม ใน image similarity หรือการทำ + +00:19:05.500 --> 00:19:08.733 +identify item เนาะ อันนี้ + +00:19:09.200 --> 00:19:12.833 +การทำ image embedding เหมาะกับเคสนี้ + +00:19:12.900 --> 00:19:15.533 +แต่ถ้าสมมุติเราจะทำ multimodal RAG + +00:19:15.600 --> 00:19:18.933 +use case ที่เรามักจะใช้กันก็คือเรื่องของ VQA + +00:19:19.500 --> 00:19:25.133 +คือเรามีรูปภาพที่อยู่ในเวกเตอร์ดาตาเบส เราบอกว่าฉันอยากจะหา identify ด้วย ด้วย text + +00:19:25.700 --> 00:19:28.333 +ถ้าสมมุติจะบอกว่าหา identify ด้วย text ปั๊บเนี่ย + +00:19:29.300 --> 00:19:31.633 +ไอ้วิธีข้างล่างอ่ะเวิร์กกว่า + +00:19:32.100 --> 00:19:35.833 +เห็นๆ เลยครับ โอเค ทีนี้เมื่อกี้เราตั้งคำถามไปแล้ว + +00:19:36.200 --> 00:19:39.833 +บอกว่า เอ๊ย เราทำคอลเล็กชันกัน เรา เรา เราจะทำ source + +00:19:39.900 --> 00:19:43.133 +แล้วก็เก็บในเวกเตอร์ดาตาเบสนะ อะ เวกเตอร์ดาตาเบสเราพร้อมละ + +00:19:43.200 --> 00:19:46.433 +ถ้า vector database เราไม่พร้อม เราไม่ควรทำ RAG + +00:19:47.100 --> 00:19:50.133 +อ่ะ อันนี้เป็นพอยต์หนึ่งที่อยากจะเตือนทุกคนนะครับผม + +00:19:50.200 --> 00:19:53.133 +กรุณาขอให้เวกเตอร์ดาตาเบสพร้อมก่อนแล้วค่อยทำ RAG นะครับ + +00:19:53.700 --> 00:19:55.733 +ไม่งั้นคุณจะทำ RAG โดยที่ไม่มี + +00:19:56.300 --> 00:19:59.033 +databaseนะครับ ก็จะ query อะไร + +00:19:59.700 --> 00:20:03.833 +ในความว่างเปล่า นิดนึง นะครับ อ่ะ โอเค เป็น + +00:20:03.900 --> 00:20:07.833 +meme joke ไป เนาะ question answering เนาะ concept ง่ายๆ + +00:20:07.900 --> 00:20:14.933 +คนถาม คนถาม คนถามไป คนถามเขาไป มันไป query ในเวกเตอร์ดาตาเบส ได้คำตอบออกมา + +00:20:15.000 --> 00:20:18.033 +generate คำตอบ ไม่มีอะไร นะครับ + +00:20:18.100 --> 00:20:21.933 +เรามาดูคอนเซ็ปต์กัน คอนเซ็ปต์เมื่อกี้ อาจจะขยายความเพิ่มเติมจากของพี่เจมส์ เนาะ + +00:20:22.000 --> 00:20:26.333 +ยึดหลักการเดียวกันกับ LLM คือ เรามี Query User Query ไป + +00:20:26.400 --> 00:20:29.633 +Query เป็น Text หรือถามข้อความเป็น Text ไป นะครับ + +00:20:29.700 --> 00:20:33.533 +ผ่าน Text Embedding นะครับ แปลง Text เป็น เป็นเวกเตอร์ + +00:20:33.800 --> 00:20:37.533 +นะครับ เอาเวกเตอร์ไป Search เสร็จแล้วเนี่ย ทำ Similarity Search + +00:20:38.000 --> 00:20:40.833 +เนี่ย หาความใกล้เคียงใน vector database + +00:20:40.900 --> 00:20:44.333 +นะครับ ได้คำตอบออกมา ทำ Ranking เสร็จปั๊บ + +00:20:44.600 --> 00:20:47.433 +นะครับ ผ่าน Prompt Engineer อ่า + +00:20:48.200 --> 00:20:52.433 +เดี๋ยว เดี๋ยวเรามาคุย เดี๋ยวเรามา มาคุยคอนเซ็ปต์กับ Prompt Engineer ก่อนดีกว่า ว่าทำไมต้องมีสัก + +00:20:52.800 --> 00:20:56.333 +สังเกตมั้ย ทำไมมันต้องมีเส้นจาก Query มาสู่ Prompt Engineer + +00:20:56.900 --> 00:21:01.933 +นะครับผม เพราะว่ามันจะเป็นการ Ranking มันจะเป็นการ Matching กันระหว่าง + +00:21:02.000 --> 00:21:04.433 +คำถาม กับคำตอบ + +00:21:04.800 --> 00:21:07.633 +แล้วเราเอา Prompt Engineer ตรงเนี้ย ไปให้ LLM + +00:21:08.200 --> 00:21:10.433 +มันจะได้คำตอบที่มันดูดีที่สุด + +00:21:10.900 --> 00:21:14.633 +เนาะ ถามว่าทำไมต้องทำแบบนี้ ถ้าสมมุติว่าเรามีแค่คำตอบอย่างเดียว + +00:21:14.700 --> 00:21:20.833 +เราเข้า LLM คำถามคือเรา เราเอาคำตอบเข้า LLM เลย LLM มัน generate อะไรก็ไม่รู้ มันอาจจะ + +00:21:20.900 --> 00:21:25.233 +เจนเนอเรทจากพร้อมสักอย่างหนึ่งแล้วมันก็มั่ว แต่ถ้าเกิดว่าเรามีลู่ทางว่า + +00:21:25.300 --> 00:21:29.933 +user ถามอะไร แล้วคำตอบเป็นอะไร ช่วยสร้างคำตอบออกมาให้มัน + +00:21:30.000 --> 00:21:33.933 +ใกล้เคียงกับคนตอบให้ได้มากที่สุด นี่แหละจะเป็นความสามารถของ prompt engineer + +00:21:34.000 --> 00:21:38.933 +เนี่ย เพราะมันจะแมทชิ่งกันระหว่าง query เป็น question กับ answer ที่มันถูก query ออกมา + +00:21:39.000 --> 00:21:42.333 +นะครับผม แล้วก็ได้เป็นคำตอบตอบกับ user กลับไป + +00:21:42.600 --> 00:21:44.133 +นะครับผม อ่ะ กลับมาที่ VQA + +00:21:45.300 --> 00:21:50.533 +นะครับผม เมื่อกี้เราบอกว่าเราทำ เราทำ RAG โอ้ ง่ายๆ มากเลย LLM ทำ + +00:21:50.600 --> 00:21:54.333 +แล้ว LLM ก็แค่ถาม ถามไป แล้วมันก็แค่ตอบมา + +00:21:55.000 --> 00:21:57.933 +ทีนี้ถ้าเราจะทำ VQA ที่เป็น RAG จริงๆ + +00:21:58.700 --> 00:22:00.733 +คำถามคือทำยังไง นะครับผม + +00:22:01.600 --> 00:22:03.333 +คอนเซ็ปต์แบบเดิม เหมือน LLM เลย + +00:22:04.100 --> 00:22:04.733 +เพียงแต่ + +00:22:06.000 --> 00:22:09.733 +user query เพิ่มขึ้นมาจากเดิมที่ที่มีแค่ text + +00:22:10.100 --> 00:22:16.933 +user ใส่ image ไปด้วย อ่า เหมือนที่เราทำกับ ChatGPT บ่อยๆ ไง เรา crop รูปภาพมาแล้วเราใส่ + +00:22:17.000 --> 00:22:20.533 +ใส่คำถามไปว่า เฮ้ย รูปภาพ รูปภาพนี้คืออะไร หรือช่วย + +00:22:20.600 --> 00:22:22.433 +explain รูปภาพ รูปภาพนี้ให้หน่อย + +00:22:22.800 --> 00:22:26.433 +นะครับผม ถามว่า เอ้ย ถ้าเป็นแบบนี้แก้ปัญหายังไง + +00:22:26.500 --> 00:22:27.133 +โอ้ ง่ายมาก + +00:22:29.500 --> 00:22:31.633 +แปลง image เป็น text นะครับ + +00:22:32.100 --> 00:22:34.433 +ได้เป็น caption ได้เป็น caption เสร็จปุ๊บ + +00:22:35.700 --> 00:22:37.033 +เข้า query ตรงๆ เลย + +00:22:37.500 --> 00:22:39.033 +บอกว่ารูปภาพรูปนี้คืออะไร + +00:22:40.100 --> 00:22:43.633 +วิธีการนี้เป็นวิธีการทำ VQA ที่สิ้นคิด + +00:22:43.900 --> 00:22:45.333 +ที่สุดนะครับผม + +00:22:45.900 --> 00:22:49.933 +แต่ไม่ใช่เบสเคส อันนี้บอกไว้ก่อน ถามว่าทำได้มั้ย ทำได้ + +00:22:50.000 --> 00:22:53.133 +ทำได้เลย คุณไม่ต้องไป optimize model อะไรเยอะ + +00:22:53.700 --> 00:22:56.733 +คุณสามารถทำ ทำ query ด้วย text ตรงนี้ได้เลย + +00:22:57.100 --> 00:23:00.133 +เพียงแต่ ถ้าเกิดว่า + +00:23:00.200 --> 00:23:04.033 +รูปภาพรูปนั้น รูปภาพรูปนั้น ทำ captioning มาไม่ดี + +00:23:05.600 --> 00:23:08.233 +RAG จะวุ่นวายทันที นะครับผม เพราะงั้น + +00:23:08.900 --> 00:23:12.633 +พึงระวังไว้ แล้ววิธีที่มันดีกว่าคือยังไงล่ะ + +00:23:13.000 --> 00:23:16.433 +นะครับ อ่ะ อันนี้เป็น อันนี้เป็น additional + +00:23:16.500 --> 00:23:18.933 +ถ้าใครอยากจะ อยากจะไปต่อ นะครับ + +00:23:19.500 --> 00:23:23.533 +อ่า ถ้าใครไม่ไปต่อ เอ่อ สามารถหยุดตรงนี้ได้เลย นะครับ + +00:23:23.600 --> 00:23:27.833 +โอเค อ่ะ ถ้าไปต่อ นะครับ มี มี solution ไหนบ้าง นะครับ + +00:23:29.800 --> 00:23:32.733 +1 เมื่อกี้เราบอกว่าเรา เรา เราใส่ทั้ง image + +00:23:32.800 --> 00:23:36.133 +ทั้ง text ลงไปละ เราจะต้องแมทชิ่งกับคำตอบ + +00:23:36.700 --> 00:23:41.733 +ครับผม เมื่อกี้เหมือนกัน เราจะทำ text embedding หรือทำ image to text embedding ยังไง + +00:23:41.800 --> 00:23:46.533 +นะครับผม วิธีการง่ายคือ เอ้า เราก็จะไปใช้โมเดลที่มันเหมาะกับ + +00:23:46.900 --> 00:23:51.533 +VQA RAG เลย นะครับ เราไป เราไปใช้ solution นั้นเลย นะครับผม + +00:23:51.600 --> 00:23:55.033 +ที่ VQA ตัวนั้นจะเข้าใจได้ทั้ง image แล้วก็ text + +00:23:55.500 --> 00:23:59.833 +นะครับผม 2 input พร้อมกัน ถ้าโมเดลตัวนั้นมันเข้าใจได้ + +00:23:59.900 --> 00:24:05.033 +แนะนำว่าให้ไปในเวย์นั้นดีกว่า ผมจะไม่ได้ลงรายละเอียดตรงนั้นมากว่าโมเดลมัน มันทำงานยังไงเนาะ + +00:24:05.100 --> 00:24:08.633 +เอ่อ สามารถเข้าไปได้ที่ลิ้งค์ตรงข้างล่าง เดี๋ยวสไลด์เดี๋ยวผมมีแจกให้ + +00:24:08.700 --> 00:24:11.433 +หรือใครอยากจะไปเสิร์ช keyword ก็ได้ นะครับผม + +00:24:11.800 --> 00:24:15.733 +โอเค เนาะ คอนคลูชั่นวันนี้ อยากวันนี้ อยากให้ ให้รู้ อะไร + +00:24:15.800 --> 00:24:20.733 +นะครับผม อยากให้ วันนี้ไม่ได้ ไม่ได้คาดหวังว่าทุกคนจะเข้าใจคำว่า multimodal กับคำว่า + +00:24:21.000 --> 00:24:25.833 +multimodal with RAG เนาะ วันนี้อยากให้ทุกคนมาเข้าเข้าใจแล้วก็มาเปิด + +00:24:25.900 --> 00:24:31.133 +เปิดโลกว่า วันเนี้ย multimodal มันเข้ามาแล้วนะ ที่ทุกวันนี้ที่เราใช้กันอยู่ มัน + +00:24:31.200 --> 00:24:35.133 +multimodal นะ แต่ว่ายังไม่มีใครพูดถึง อย่างวันเนี้ย ผมก็ไปหา + +00:24:35.200 --> 00:24:37.433 +ข้อมูลมาว่า เฮ้ย มีคำว่า multimodal + +00:24:37.500 --> 00:24:40.233 +กับ RAG หรือยัง นะครับ + +00:24:40.300 --> 00:24:42.333 +คำตอบคือถ้าแทบไม่ค่อยมีคนพูดเลย + +00:24:42.800 --> 00:24:47.333 +นะครับ แต่คอนเซ็ปต์พอคอนเซ็ปต์มันง่ายๆ ครับผม เหมือน เหมือนกับ RAG เลย คือเราก็แค่ + +00:24:47.400 --> 00:24:50.333 +มี multi-source + +00:24:50.800 --> 00:24:55.033 +นะครับผม จาก source หลายๆ ที่ image มีรูปภาพ มี text มีวิดีโอ + +00:24:55.500 --> 00:24:58.933 +นะครับผม เราทำการ multi modal encoding + +00:24:59.300 --> 00:25:02.133 +นะครับผม เราจะไม่ใช้คำว่า image encoding ละ + +00:25:02.400 --> 00:25:07.033 +เราจะไม่ใช้ในการทำ captioning ละ text captioning หรือ video extraction + +00:25:07.300 --> 00:25:10.433 +นะครับผม เราจะทำอะไรก็ได้แบ็คบล็อกตัวนึง + +00:25:10.500 --> 00:25:12.933 +ในการแปลง source ตัวเนี้ย ให้มาเป็น text + +00:25:13.500 --> 00:25:16.333 +นะครับ แล้วเราก็แปลง text มาเป็นเวกเตอร์ + +00:25:16.700 --> 00:25:19.033 +นะครับผม เวกเตอร์เราเก็บในเวกเตอร์ดาต้าเบส + +00:25:19.400 --> 00:25:22.433 +แล้วก็สุดท้ายแล้วก็จะเป็นการถามแบบเดียวกัน + +00:25:22.500 --> 00:25:26.033 +มี query ครับ question answer นะครับผม แล้วก็ถามไป + +00:25:26.100 --> 00:25:30.133 +ทำ similarity search นะครับผม ได้ออกมาเป็นคำตอบแล้วก็ถามผ่าน prompt engineer + +00:25:30.500 --> 00:25:33.933 +LLM แล้วก็ดึงออกมาเป็นคำตอบ นั่นเอง นะครับผม + +00:25:34.000 --> 00:25:37.633 +อันนี้เป็น conclusion แบบ วิธีแบบ basic ที่สุด + +00:25:37.700 --> 00:25:39.533 +คือเราถาม + +00:25:39.800 --> 00:25:43.833 +แค่คำถามที่เป็น text แต่ถ้าเราอยากจะถามที่เป็น text + +00:25:44.200 --> 00:25:48.233 +และถามที่เป็นวีดีโอ ถามที่เป็น image ถามที่เป็น audio + +00:25:48.700 --> 00:25:50.933 +นะครับ เราไม่สามารถทำ + +00:25:51.000 --> 00:25:55.333 +query แบบนี้ได้แล้ว เราอาจจะทำ เราอาจจะทำได้เหมือนเมื่อกี้ + +00:25:55.400 --> 00:25:59.533 +เราอาจจะทำได้เหมือนเมื่อกี้ คือเรา เราทำ multi modal encoding เป็น text + +00:25:59.600 --> 00:26:03.433 +แล้วเราก็เอา text อ่ะ มาอัดใน query แบบนั้นทำได้ แต่ + +00:26:03.800 --> 00:26:08.833 +ผลลัพธ์มันอาจจะไม่ดี ในการทำ RAG นะครับผม เพราะงั้นก็ เอ่อ ถ้าใครจะทำ + +00:26:08.900 --> 00:26:12.733 +ก็แนะนำว่า เอ่อ ลองไปศึกษาเพิ่มเติมดูได้ครับผม + +00:26:12.800 --> 00:26:14.933 +เพราะงั้น เดี๋ยวเราจะเข้าสู่ workshop ของ + +00:26:15.700 --> 00:26:18.833 +อ่า section ของ workshop ละ ว่า วันนี้มีอะไรกันบ้าง นะครับผม + +00:26:18.900 --> 00:26:23.733 +หลักๆ วันนี้เราจะเข้าใจคำว่า image captioning นะครับผม แล้วก็การทำ image + +00:26:24.000 --> 00:26:29.133 +collection ในการเตรียม vector database ทั้งหมดแล้วก็การทำ vector search นะครับผม + +00:26:29.200 --> 00:26:36.233 +มา เอ่อ จาก จากฝั่งของ image นะครับ ที่เราเก็บใน vector database แล้วอ่ะ เราจะไป query ข้อมูลยังไง + +00:26:36.300 --> 00:26:38.133 +นะครับ โอเค + +00:26:42.700 --> 00:26:45.833 +โอเค จึดๆ อะ โอเค นะครับผม + +00:26:45.900 --> 00:26:49.533 +อ่ะ ถ้าเขา ทุกคนเข้า เข้าไปแล้ว มันจะ มันจะเข้าไปที่ GitHub เนาะ + +00:26:50.000 --> 00:26:54.033 +เอ่อ ถ้าผมจำไม่ผิดมันจะ มันจะลิงก์กิ้งไปที่ GitHub + +00:26:55.900 --> 00:26:57.833 +มีใคร มีใคร อ๋อ โอเค อะ + +00:26:58.200 --> 00:27:00.833 +อ่ะ ถ่ายไว้ก่อน + +00:27:02.600 --> 00:27:05.733 +ถ่ายไว้ก่อน วันนี้ผมอาจจะไม่รันจริงนะครับ เนื่องจากว่าการรัน + +00:27:06.100 --> 00:27:09.233 +ผมรันไปแล้วเมื่อเช้า มันผ่านเนาะ แต่ถ้าใครไม่ผ่านก็ + +00:27:10.400 --> 00:27:13.333 +ก็ ทักมาในเรโปได้ เดี๋ยวเค้าไปแก้ + +00:27:16.200 --> 00:27:20.833 +อ่า ใช้เวลา Run ทั้งหมดเนี่ย จริงๆ จริงๆ ใน ในโค้ดที่ผมเตรียมไว้ + +00:27:21.300 --> 00:27:25.733 +ในเรโปที่ผมเตรียมไว้อ่ะ มันใช้เวลา Run ประมาณ 2 ชั่วโมง แบบ No GPU + +00:27:26.000 --> 00:27:29.933 +นะครับ เพราะงั้นก็ ก็ถ้าใครอยากจะ Run ก็ผม + +00:27:30.000 --> 00:27:33.033 +เดาว่า Section นี้น่าจะจบประมาณ ประมาณ 5 ทุ่ม เที่ยงคืน + +00:27:33.100 --> 00:27:34.533 +คงไม่ว่ากันเนาะ + +00:27:34.600 --> 00:27:39.633 +อ่า อย่าเลย อะ โอเค ก็เข้าไปก็จะเป็น + +00:27:40.400 --> 00:27:45.533 +อ่า สังเกตนะครับผม เพิ่งอัพเมื่อ 5 ชั่วโมงที่แล้วนะครับผม ตอน 4 โมงเย็นนะครับ แปลว่า + +00:27:45.600 --> 00:27:50.233 +เพราะว่าผมอัปโหลดในเวลาทำงานนะครับผม อ่า เป็นคนดีของสังคม 1 คน + +00:27:50.500 --> 00:27:54.033 +ครับ โอเค เข้าไปก็จะเป็นโคแล็บ มีใครไม่เคยใช้โคแล็บมั้ย + +00:27:56.000 --> 00:27:59.733 +เห้ย โอเค โอเค เป็น section แรกที่ไม่มีใคร + +00:28:00.000 --> 00:28:04.533 +ที่ทุกคนใช้โคแล็บกันได้ โอเค นะครับผม อ่ะ งั้นผม ผมจะไม่อธิบายอะไรเยอะเนาะ + +00:28:04.600 --> 00:28:10.933 +ก็ section มีประมาณนี้ครับผม ของๆ workshop ก็ ถ้าอยากลองไปรันเนาะ ก็ อ่า มีเรื่องของ install + +00:28:11.300 --> 00:28:14.833 +installation มีการ login login hugging face นะครับ + +00:28:15.200 --> 00:28:17.833 +ก็ เอ่อ เข้าไปล็อกอินกันได้เนาะ + +00:28:17.900 --> 00:28:23.733 +อ่า อันนี้ login image data set image data set เราจะใช้ เนื่องจากว่าเรามาเป็นทีมของโปเกมอนนะครับผม + +00:28:23.800 --> 00:28:27.133 +เราก็จะ ใช้โป pokemon blib นะครับ captioning + +00:28:29.300 --> 00:28:32.633 +นะครับ ถามว่าข้อมูล ข้อมูล data เป็นยังไง ข้อมูล data ประมาณนี้ครับ + +00:28:34.200 --> 00:28:38.233 +อ่า ข้อมูล data ก็ ก็จะมีรูปภาพอยู่ เราจะเตรียม เตรียมข้อมูลไว้ก่อน คือมีรูปภาพ 1 + +00:28:38.600 --> 00:28:40.733 +อยู่ในรูป อยู่ แล้วก็ เราก็มี caption + +00:28:41.200 --> 00:28:43.833 +นะครับ caption ว่า เอ้ย text มันเป็นยังไง นะครับ + +00:28:43.900 --> 00:28:48.833 +สังเกตจาก caption ได้เลยว่าน่าจะใช้ LLM อ่า น่าจะใช้ model สักตัวนึง + +00:28:49.100 --> 00:28:51.433 +นะครับ ในการแปลง แปลง image เป็น text นะครับผม + +00:28:51.500 --> 00:28:53.533 +เพราะงั้นไม่ต้องคาดหวังกับผลลัพธ์ว่ามันจะดี ดี + +00:28:53.600 --> 00:28:57.433 +ดีมากน้อยแค่ไหน อันนี้ก็เป็นคอนเซ็ปต์ให้ ให้ดูนะ ว่าทำยัง + +00:28:57.900 --> 00:29:01.033 +นะครับ อ่ะ เราเริ่มกัน เริ่มกับการเตรียม data กัน + +00:29:01.800 --> 00:29:05.933 +นะครับ หลังจากเราได้ data มาเสร็จแล้วเนี่ย เราเอาไปทำ + +00:29:06.000 --> 00:29:09.433 +นะครับ เอ่อ ในเรื่องของ preparation เรื่องของตัว + +00:29:09.800 --> 00:29:15.233 +model image captioning เนาะ ก็ เอ่อ ผมใช้ Google vit base นะครับผม + +00:29:15.500 --> 00:29:20.533 +ก็ เอ่อ vit - Vision Transformer ครับผม ถ้าใครอยากไปดูก็ไปลองดูได้นะครับ + +00:29:20.600 --> 00:29:24.933 +Vision Transformer base patch 16 ก็ เอ่อ จะเป็นโมเดลที่ + +00:29:25.000 --> 00:29:28.733 +เอ่อ เป็นโมเดล Vision Transformer ตัวแรกๆ ที่สามารถแบบทำ + +00:29:28.800 --> 00:29:31.933 +ทำพวก image captioning ได้นะครับ + +00:29:32.400 --> 00:29:37.633 +โอเค ก็ อ่า มีเอาต์พุตออกมา นะครับ เอ่อ เอาไปรันทำโทเคไนซ์ อันนี้ปล่อยไป + +00:29:38.000 --> 00:29:42.533 +ปล่อยไป อันนี้เป็น step ที่ผมเข้าใจว่าหลายๆ คนเป็น dev น่าจะไม่ ไม่ต้องอยากรู้เรื่องนี้ + +00:29:42.600 --> 00:29:47.433 +นะครับ อันนี้เป็นเรื่องของ AI researcher หรือว่าแบบ data scientist ในการ + +00:29:47.500 --> 00:29:51.533 +แปลง image เป็น text นะครับผม แล้วก็เทรนโมเดล ทำ + +00:29:52.000 --> 00:29:58.933 +เทรนโมเดลนะครับผม สำหรับคนที่อยากจะลอง อยากจะลองกลับไปบ้านแล้วบอกว่า เอ้ย ฉันมี custom data ระหว่าง image กับ + +00:29:59.000 --> 00:30:01.833 +caption อยู่ ฉันอยากจะเทรน image captioning เอง + +00:30:01.900 --> 00:30:05.833 +นะครับ เทรนยังไง ก็ เอ่อ มี sequence to sequence train argument นะครับ + +00:30:06.300 --> 00:30:09.033 +ก็เทรนมา อ่าแสดง output เอ่อ ก็ + +00:30:09.600 --> 00:30:13.133 +เอ่อ ผมหยุดเทรนไป เพราะว่าตอนนั้นผมเทรนไปได้ซักประมาณ + +00:30:13.200 --> 00:30:17.833 +ชั่วโมงกว่าๆ มั้ง เอ่อ นั่นแหละ แล้วก็ เอ่อ ผลลัพธ์มันไม่ได้ดีขึ้น + +00:30:17.900 --> 00:30:20.333 +เท่าไหร่ นะครับ ก็เป็นเรื่องที่แย่นิดนึง + +00:30:20.700 --> 00:30:21.733 +ก็ปล่อยไป + +00:30:23.300 --> 00:30:26.233 +อ่ะ โอเค แล้วก็สุดท้ายก็เซฟโมเดลนะครับผม + +00:30:26.300 --> 00:30:28.433 +สำหรับคนที่ไม่ต้องการ + +00:30:28.500 --> 00:30:32.433 +สำหรับคนที่ไม่ต้องการเทรนโมเดลเองนะครับผม เอ่อ ให้กระโดดมาใน + +00:30:32.700 --> 00:30:35.233 +ในหน้าของ load pipeline เลยนะครับผม + +00:30:35.300 --> 00:30:40.733 +ก็ ก็ กระโดดมาเลย จากเดิมทีที่เราจะต้องโหลดพรีเทรนทำโมเดลทำ + +00:30:40.800 --> 00:30:43.233 +ทำ data set เตรียม data set train training model นะครับ + +00:30:43.600 --> 00:30:47.533 +เรากระโดดมาเลย เราไปหยิบโมเดลของคนอื่นเค้ามาใช้ นะครับ แบบง่ายที่สุด + +00:30:48.900 --> 00:30:53.433 +เราไปโหลดโมเดลของคนอื่น ซึ่งผมก็ push โมเดลไปแล้ว ใน Pokemon captioner + +00:30:53.700 --> 00:30:56.733 +ครับ ได้มาเสร็จปั๊บได้เป็น pipeline อ่ะ เรา + +00:30:58.300 --> 00:31:03.633 +เอ่อ ทำการ นะครับผม ทำ หลัง หลังจากเราได้ pipeline เสร็จปุ๊บ อุ๊ย ผมไม่น่ากดรันเลย + +00:31:04.300 --> 00:31:04.733 +ยาวละ + +00:31:06.700 --> 00:31:08.133 +อ่า หลังจากเราได้ pipeline มาเสร็จปุ๊บ + +00:31:08.200 --> 00:31:14.433 +เราเอา image ที่เราต้องการนะครับผม ไปเข้า แล้วก็มันจะ generate รูปออกมา + +00:31:14.500 --> 00:31:16.033 +อ่า นะครับ + +00:31:16.500 --> 00:31:20.233 +อันนี้ก็ เรื่องของ อ่ะ ต่อจากนี้จะเป็นเรื่องของ RAG ละ ก็ + +00:31:20.500 --> 00:31:27.233 +เอ่อ เรามีการเตรียมนะครับ เรื่องของ dataframe ไว้ อ่า หลังจากเรามี dataset รูปภาพมาเสร็จปุ๊บ เรา + +00:31:27.500 --> 00:31:30.433 +เรามีรูปภาพนะครับ แล้วก็มี + +00:31:30.500 --> 00:31:34.333 +text ที่เป็น caption ที่เราเตรียมไว้ แต่เราเราจะไม่ใช้กัน + +00:31:34.400 --> 00:31:36.233 +เราจะใช้ความสามารถของ + +00:31:36.800 --> 00:31:40.233 +ของ เอ่อ image captioning ที่เราเทรนไว้นะครับผม + +00:31:40.300 --> 00:31:45.133 +ถ้าเรานึกถึงสภาพจริงๆ เรา ตอนเราเทรนโมเดลกับตอนเรา เราเราจะแปลงจาก image + +00:31:45.200 --> 00:31:51.533 +image to to text ด้วย image captioning นะครับผม เราก็จะมี เราก็มี data lake ของเราที่เป็นแค่ image อย่างเดียว + +00:31:51.600 --> 00:31:54.433 +นะครับ แล้วเอา image มาทำ image captioning เนาะ + +00:31:54.800 --> 00:31:57.933 +แล้วก็จะได้ caption ออกมา นะครับผม ถ้าสังเกต caption ดีๆ + +00:31:58.500 --> 00:32:04.033 +มันใกล้เคียงกันมากเลยนะครับ เนื่องจากว่ามันน่าจะได้ข้อมูล มันน่าจะได้ข้อมูล + +00:32:04.100 --> 00:32:08.333 +มาแบบเดียวกัน ผมขอผมสันนิษฐานอย่างนี้นะ มันน่าจะ เอ่อ + +00:32:08.400 --> 00:32:10.833 +dataset นี้น่าจะถูกเตรียมมาด้วย ด้วย AI + +00:32:11.700 --> 00:32:15.833 +AI ตัวโมเดลใกล้ๆ กันมันก็เลย generate คำตอบมาใกล้แบบเดียวกันมากเลย เนี่ย + +00:32:16.200 --> 00:32:20.433 +อย่างตัวเนี้ย รูปภาพรูปเนี้ย รูปภาพแต่ละรูป text ก็คือ + +00:32:21.200 --> 00:32:26.633 +อ่า ข้อมูลที่เราตั้งไว้เป็น output เนาะ ส่วน caption ก็คือสิ่งที่โมเดลมันจะ generate ออกมาได้ + +00:32:26.700 --> 00:32:32.233 +นะครับ หลังจากนั้นเราก็ออมามาคอนเวริตรูปภาพนะครับผม + +00:32:32.300 --> 00:32:37.133 +จากเดิมทีที่เป็นฟิว image เนาะ เป็น base64 เพื่อเราจะเก็บไว้ใน MongoDB + +00:32:37.500 --> 00:32:41.933 +เนาะ อ่า โอเค step ต่อไป step ต่อไปหลังจากเราทำเราทำ image captioning + +00:32:42.200 --> 00:32:47.333 +เราก็ได้เป็น caption ออกมาแล้วที่เป็น text นะครับ เราเอามาทำ text embedding + +00:32:47.800 --> 00:32:53.833 +ในการแปลงจาก แปลงจาก text นะครับผมให้ออกมาเป็นเวกเตอร์ อ่า ก็ผ่านโมเดลโมเดลนึงแหละ + +00:32:54.300 --> 00:32:58.233 +ผ่านโมเดลโมเดลหนึ่งไม่ต้องไปสนใจอะไรตรงนี้เยอะนะครับผม + +00:32:58.800 --> 00:33:04.233 +นะครับ อ่า ก็จะได้จาก caption นะครับผม จาก caption ตรงนี้ เราก็จะได้ embedding หน้าตาแบบ + +00:33:04.500 --> 00:33:09.633 +นะครับผม อย่างที่เมื่อกี้ครับ เมื่อกี้ของพี่เจมส์เขาบอกมาว่า เออ embedding มันหน้าตาอย่างไง + +00:33:09.700 --> 00:33:13.633 +image หน้าตาอย่างงี้ครับ เป็นชุดข้อมูลตัวนึงนะครับผม หลังจาก AI + +00:33:14.100 --> 00:33:19.433 +AI มัน learning มาเสร็จแล้ว มันพยายามทำความเข้าใจแล้วเรา เราก็จะได้แบบ base model มาตัวนึงเนาะ + +00:33:19.500 --> 00:33:23.233 +base model ตัวนั้นน่ะ จะบอกมาว่า เอ่อ เวกเตอร์แต่ละตัวของ + +00:33:23.300 --> 00:33:25.733 +ของตัว embedding อ่ะ มันหน้าตา + +00:33:26.100 --> 00:33:28.333 +หรือมีความสัมพันธ์ในเชิง vectorize + +00:33:28.400 --> 00:33:31.233 +ตัวนึงยังไงนะครับ + +00:33:32.900 --> 00:33:37.933 +โอเค อ่ะ หลังจากนั้น หลังจากนั้น หลังจากเราเตรียม data set เสร็จละ + +00:33:38.300 --> 00:33:43.133 +นะครับ เราได้ เราได้ data ทั้งหมด 2 dimension ที่น่าสนใจ + +00:33:43.200 --> 00:33:45.233 +2-3 dimension ที่น่าสนใจคือ + +00:33:45.300 --> 00:33:52.333 +เราได้ dimension ของรูปภาพ นะครับผม เราได้ dimension ของรูปภาพที่ ที่เรา input เตรียมไว้นะครับ เราได้ dimension ของ caption + +00:33:52.700 --> 00:33:57.133 +ที่หลังจากเราเอา image ไปผ่าน image captioning แล้ว เราได้ text + +00:33:57.200 --> 00:34:01.233 +text มาเพื่อที่จะเอาไปเก็บใน RAG ของ LLM นะครับ แล้วก็ + +00:34:01.800 --> 00:34:06.333 +อ่า จาก caption ที่เป็น text เราเอาไปทำทำ text embedding เพื่อออกมาให้ได้เป็น + +00:34:06.400 --> 00:34:09.433 +เป็นเวกเตอร์นะครับผม อยู่ในคอลัมน์ของ embedding + +00:34:10.000 --> 00:34:12.233 +นะครับ โอเค + +00:34:13.400 --> 00:34:19.433 +แล้วก็ทีนี้เราจะมาเตรียมเข้าสู่ MongoDB ละ อ่า เดี๋ยวจะถามว่าไม่ใช่ไม่เป็น section ของ MongoDB + +00:34:19.500 --> 00:34:24.233 +นะครับ ก็ MongoDB นะครับผม เราจะใช้ตัว MongoDB Atlas นะครับ + +00:34:24.300 --> 00:34:30.333 +ผม ถ้าสำหรับใครที่ยังไม่เคยมีโปรเจกต์นะครับผม ให้ให้ไปสร้างอ่า ตัว organization + +00:34:30.400 --> 00:34:33.632 +นะครับผม แล้วก็โปรเจกต์แล้วก็ทำคลัสเตอร์สร้างคลัสเตอร์ออกมา + +00:34:33.699 --> 00:34:36.833 +ครับ อาจจะเลือก Free Tier ก่อนก็ได้นะครับผม สำหรับการทดลอง + +00:34:37.300 --> 00:34:41.632 +ในแลปครั้งนี้นะครับผม อ่า อย่าลืมเซ็ตเน็ตเวิร์คนะครับผม + +00:34:41.699 --> 00:34:45.132 +เป็น 0.0.0.0 เพื่อให้แบบ colab เข้าถึงได้นะครับ + +00:34:45.500 --> 00:34:50.033 +ก็ เอ่อ หลังจากเซ็ตตรงนี้เสร็จปั๊บ ไปเซ็ต Connection Config นะครับ + +00:34:50.699 --> 00:34:55.033 +อ่า ก็ไป connection config clustering แล้วก็ไปอัพเดทนะครับผม + +00:34:55.300 --> 00:34:59.133 +ทำผ่าน connection นะครับเราจะได้ URL มาตัวนึง + +00:34:59.200 --> 00:35:03.133 +นะครับ อย่าลืม อย่าลืมจำพาสเวิร์ดของคุณไว้ + +00:35:03.200 --> 00:35:06.233 +นะครับ เพราะถ้าพาสเวิร์ดหายคุณต้องรีเซ็ตพาสเวิร์ดอย่างเดียว + +00:35:06.700 --> 00:35:09.333 +นะครับแล้วมันจะมีปัญหา กับ production ตัวอื่นๆ อย่างมากมาย + +00:35:09.400 --> 00:35:11.833 +นะครับ อ่า เราได้ URL แล้วเอามาแปะ + +00:35:11.900 --> 00:35:15.433 +แปะใน แปะใน config URL ตัวนี้ โอ้โห ไม่น่ากดเลย + +00:35:16.200 --> 00:35:19.033 +นะครับ แล้วก็ โอ้โหยาวละ + +00:35:20.200 --> 00:35:23.833 +นะครับ แล้วหลังจากนั้นก็ไป get client อ่าอันนี้ get client ไม่มีอะไร + +00:35:24.600 --> 00:35:28.733 +อ่าเราเตรียม data มา 3 3 คอลัมน์เนาะ อย่างที่เมื่อกี้บอกไปมี image + +00:35:29.000 --> 00:35:32.933 +ที่เราแปลงละจากจากเดิมทีที่เป็น image pil เนาะ + +00:35:33.000 --> 00:35:35.333 +image pil มันเป็น object ตัวนึงในใน + +00:35:35.400 --> 00:35:39.233 +ในการเก็บแคชของ image ใน Python เนาะ แต่ถ้าเราจะเอาตัว + +00:35:39.900 --> 00:35:42.533 +ที่ pil image อ่ะไปใส่ใน MongoDB อ่ะ + +00:35:42.600 --> 00:35:48.433 +มันจะใส่ไม่ได้ เราต้องแปลงมันเป็น base มาตรฐานก่อน ก็คือแปลงมันเป็น base64 แหละ วิธีง่ายที่สุดละ + +00:35:48.800 --> 00:35:54.633 +นะครับ แต่ทางความเป็นจริงอย่าไปทำอย่างงั้นเลย เราเอาไปเก็บใน object database ดีกว่าใช่ไหมครับ + +00:35:55.300 --> 00:36:00.333 +ใช่ไหมครับ อย่าทำอย่างงั้นเลย มันเป็นเรื่องที่ไม่ดีหรอก เนาะ แต่เนื่องจากว่าวันนี้เราไม่ได้ขึ้นตรงกับ + +00:36:01.300 --> 00:36:04.233 +cloud เจ้าไหน เพราะงั้นนะครับ เราก็แปลงเป็น base64 + +00:36:05.100 --> 00:36:07.733 +ง่ายๆ เลย นะครับ ได้ image อ่าแปะ + +00:36:08.300 --> 00:36:12.833 +เป็น image64 นะครับ เรามี caption ที่เราทำการทำ + +00:36:12.900 --> 00:36:17.433 +ทำ image captioning แล้วก็ embedding นะครับผม ของ text text embedding นะครับ + +00:36:17.800 --> 00:36:20.933 +อ่า โอเค แล้วหลังจากนั้นเราก็ทำการ + +00:36:21.900 --> 00:36:25.133 +insert มันเข้าไป insert มันเข้าไป อะ ก็จะได้หน้าตา + +00:36:25.200 --> 00:36:29.833 +ข้อมูลประมาณนี้ ในเวกเตอร์ clustering นะครับ ถ้าเราไปดู + +00:36:31.100 --> 00:36:35.533 +ถ้าเขาไปดูใน database ก็จะหน้าตาแบบนี้ + +00:36:36.400 --> 00:36:37.833 +จริงๆ ก็เหมือนกันแหละ ไม่ต่างกัน + +00:36:40.100 --> 00:36:43.333 +ไม่ต่างกัน อ่า นี่ ตึง โหลดแป๊บนึง + +00:36:52.100 --> 00:36:53.233 +อ่ะ โหลดนาน ปล่อยไป + +00:36:54.700 --> 00:37:01.833 +อ่ะ โอเค หลังจากเราเตรียมข้อมูล เรามีข้อมูล เรามีข้อมูลที่ถูกแอปเพนละอยู่ใน ในดาต้าเบสเนาะ + +00:37:01.900 --> 00:37:06.433 +ทีนี้ เราจะทำยังไง นะครับผม เรา จะบอกว่าตรงเนี้ย เป็นเวกเตอร์ดาต้าเบสยัง + +00:37:06.800 --> 00:37:10.433 +ตอบคือ เป็นแล้ว นะครับ เพราะว่ามันมีเวกเตอร์อยู่ในดาต้าเบสไง + +00:37:11.000 --> 00:37:15.133 +อ่า อ่า ทุกคนก็น่าจะ ทุกคนน่า น่าจะ + +00:37:16.100 --> 00:37:21.033 +ไม่ชอบเขา กับความรู้สึกนี้ว่า มันเป็นยังไงอ่ะ นี่ๆๆๆๆ มันเป็น มันมีตรงนี้ มันมีตรงนี้ + +00:37:21.100 --> 00:37:23.233 +มันมี array มันมี embedding array 1,024 + +00:37:24.200 --> 00:37:27.633 +นะครับ จำตัวเลขไว้ จำตัวเลข 1,024 ไว้ แล้วเดี๋ยวเรา เราจะตอบ + +00:37:27.700 --> 00:37:30.833 +เราจะมาถาม ถามกัน ว่าไอ้ 1,024 คืออะไร + +00:37:31.100 --> 00:37:37.533 +ครับผม อ่า นะครับ อะ โอเค หลังจากเราเตรียม database พร้อมแล้ว เราจะไปทำเข้าสู่ + +00:37:37.800 --> 00:37:43.633 +การ search search ละ นะครับ vector search คืออะไร นะครับ vector search ก็คือ เรามี vector อยู่ตัวนึง แล้วเราอยากจะ + +00:37:43.700 --> 00:37:48.733 +ไป search เนาะ เราไป เราอยากจะไป search ใน ในถัง database เนาะ + +00:37:48.800 --> 00:37:52.133 +เพราะงั้นการที่เราจะทำ search อ่ะ เราต้องไปนั่งตั้งค่า search ก่อน + +00:37:52.200 --> 00:37:57.133 +ซึ่งใน mongoDB อ่ะ มี มีสิ่งที่เราเรียกกันว่า Atlas Search นะครับผม ก็คือจะเป็น + +00:37:57.200 --> 00:38:03.233 +เป็นการทำ vector vector searching อย่างนึง เนาะ ซึ่ง อ่า เราสามารถไปเลือกใช้ตรงนี้แล้ว + +00:38:03.500 --> 00:38:07.133 +นะครับ ใน Atlas Search แล้วก็ไปที่ Atlas Vector Search + +00:38:07.500 --> 00:38:09.833 +เลือก JSON Editor เนาะ แล้วมันก็จะมี + +00:38:09.900 --> 00:38:13.733 +มี ตัว JSON ที่เมื่อกี้คุณเจมส์อธิบายไป + +00:38:13.800 --> 00:38:15.833 +ว่า ว่า เอ้ย มัน มันสามารถ + +00:38:16.500 --> 00:38:22.633 +ทำ config อะไรพวกนี้ได้นะ ซึ่ง อ่า คุณจะไป select database ของคุณ ว่าคุณอยากจะทำ + +00:38:23.000 --> 00:38:25.733 +ทำ เอ่อ search ที่ ที่ database ตัวไหน + +00:38:25.800 --> 00:38:29.433 +นะครับผม แล้วก็มี indicator ในการ search แบบไหนบ้าง นะครับผม + +00:38:31.700 --> 00:38:32.533 +คำถาม คำถาม คำถาม คำถาม คำถาม + +00:38:32.800 --> 00:38:38.533 +จากใน JSON ตัวเนี้ยครับผม เราเห็น type เนาะ type เป็น vector นะครับผม path เป็น embedding + +00:38:39.200 --> 00:38:42.033 +นะครับผม num dimensional + +00:38:42.100 --> 00:38:46.733 +เป็น 1,024 แล้วก็มี similarity นะครับผม เป็น + +00:38:46.800 --> 00:38:48.833 +dot product คำถาม + +00:38:50.000 --> 00:38:51.033 +dot product คืออะไรครับ + +00:38:54.100 --> 00:38:55.733 +โอ้ ขอบคุณ + +00:38:58.200 --> 00:38:59.333 +เคว้งคว้างมากเลย + +00:39:00.900 --> 00:39:02.633 +dot product คืออะไร ฮื้อ ตอบหน่อย + +00:39:03.900 --> 00:39:04.833 +โอ้ เคว้งคว้าง + +00:39:09.100 --> 00:39:12.233 +อ่ะ อ่ะ โอเค เฉลย โอ้ เศร้าใจ + +00:39:12.800 --> 00:39:15.233 +dot product คือ คือ เป็น similarity + +00:39:15.700 --> 00:39:20.633 +similarity method ตัวนึง นะครับผม ในการหาความใกล้เคียงกัน ระหว่าง vector a + +00:39:21.000 --> 00:39:25.933 +กับเวกเตอร์ b นะครับผม อ่ะ แบบอธิบายแบบง่ายๆ ง่ายๆ นะครับผม + +00:39:26.000 --> 00:39:31.333 +เพราะงั้น เอ่อ เวลาเราจะใช้ similarity ครับผม เวลาเรา เราเลือก method + +00:39:31.400 --> 00:39:35.233 +แต่ละ method อย่างที่เมื่อกี้ เจมส์เขาบอกเนาะ มี dot product + +00:39:35.300 --> 00:39:39.233 +มี dot product มี cosine แล้วก็มี + +00:39:39.900 --> 00:39:43.633 +Euclidean distance อ่า ใช่ๆ + +00:39:43.700 --> 00:39:50.133 +นะครับผม มี 3 ตัวนี้ เนาะ ซึ่งเราก็สามารถไปเลือกใช้ได้ ซึ่งแต่ละตัวมันก็จะมีวิธีการในการ + +00:39:50.500 --> 00:39:54.933 +ในการเสิร์ชที่ไม่เหมือนกัน คือถามว่ามันคำนวณมั้ย มันคำนวณเหมือนกัน แต่ว่า + +00:39:55.000 --> 00:40:00.833 +ไดเมนชั่น ที่มันจะได้ ออก ได้ออกมา ครับผม มันจะแตกต่างกัน ซึ่งแล้วแต่ + +00:40:00.900 --> 00:40:05.733 +ยูสเคสที่จะเราจะเอาไปใช้งาน เนาะ อ่า เวกเตอร์เสิร์ชชิ่ง ก็ อ่า + +00:40:05.800 --> 00:40:08.533 +ไม่มีอะไร โค้ดอันนี้ก็ใช้แบบเดียวกัน นะครับ + +00:40:08.600 --> 00:40:13.533 +เราจะทำลิมิต นะครับผม ลิมิตไว้ 4 แล้วก็ อ่า เซตแคนดิเดตไว้สัก 150 + +00:40:14.700 --> 00:40:18.233 +นะครับผม เราเซตไว้เลยว่า อ่า เราจะไป เราจะไป + +00:40:18.600 --> 00:40:20.933 +เราจะไปวิ่งไปดูที่ เอ่อ + +00:40:21.200 --> 00:40:26.033 +เราจะวิ่งไปดูที่ฟิวล์ไหน นะครับ ว่า อ่า ฟิวล์ไหนคือ embedding ที่เราเก็บไว้อยู่ หรือ + +00:40:26.100 --> 00:40:31.233 +vector ที่เราเก็บไว้อยู่ นะครับผม หลังจากนั้นเราจะ เราจะเอาอะไรออกมา นะครับผม + +00:40:31.300 --> 00:40:33.933 +สกอริ่งนะครับผม หลังจากเรา เราเช็ก + +00:40:34.300 --> 00:40:40.033 +มีการ searching ไปแล้วเราทำ scoring แล้วก็ sorting มันออกมาว่าเราจะเอาตัวไหน + +00:40:40.100 --> 00:40:43.833 +บ้างนะครับผม อ่า คอลัมน์ที่เราจะออกมา อ่า + +00:40:43.900 --> 00:40:45.533 +ถ้าสมมุติว่า + +00:40:46.500 --> 00:40:50.733 +วาลูเป็น 0 นะครับผม คีย์ของไอดีเป็น 0 ก็คือเราจะไม่เอาตัวนั้นออกมา แต่ถ้าสมมุติ + +00:40:51.100 --> 00:40:55.433 +value เป็น 1 ก็คือเราจะเอาคอลัมน์นั้นออกมาเนาะ image64 โอ้ เราก็จะเอา + +00:40:55.500 --> 00:41:01.233 +image ออกมาว่า สิ่งที่เราเสิร์ชไปอะ image 64 หรือตัวรูปภาพรูปนั้นคืออะไร แล้วก็ caption + +00:41:01.700 --> 00:41:07.433 +ว่าเป็น caption อะไร นะครับผม เช่น เราตั้งคำถามมา query I want to see your your pikachu + +00:41:08.100 --> 00:41:11.133 +โอเค แล้วก็ทำ picture search มา นะครับ + +00:41:11.200 --> 00:41:14.933 +ก็จะได้ผลลัพธ์ออกมา 34 ตัว อย่างงี้ นะครับผม + +00:41:15.000 --> 00:41:18.433 +อ่า มี มี caption ที่ โอเค มี caption ที่โอเค + +00:41:18.500 --> 00:41:22.233 +a very cute looking for Pokemon picture with big eyes + +00:41:22.300 --> 00:41:25.933 +ครับผม อ่า ตัวที่ 2 เหมือนกัน อ่า โปเกมอน อ่า อือ อือ + +00:41:26.000 --> 00:41:29.133 +yellow-black pokemon pikachu with pink eyes นะครับ + +00:41:29.200 --> 00:41:31.433 +ทีนี้เรามาดู response ผลลัพธ์ + +00:41:32.500 --> 00:41:35.033 +หลังจากเราดู response แล้วเราค่อนข้างจะผิดหวังนิดนึง + +00:41:36.000 --> 00:41:37.733 +ตัวไหนเป็นพิคาชู พิคาชูบ้างครับ + +00:41:38.800 --> 00:41:44.433 +มีแค่ตัวขวาสุดเนาะ แล้วถามว่าทำไม ทำไม 3 ตัวที่เหลือมันไม่เป็นพิคาชูอ่ะ + +00:41:44.900 --> 00:41:46.933 +แต่แต่ caption มันดูเป็นพิคาชูมากเลยนะ + +00:41:47.800 --> 00:41:53.633 +เนี่ย เนี่ย เนี่ย เนี่ย เนี่ย caption บอกว่า อ้อ a very cute looking Pokemon Pikachu with big eyes + +00:41:53.700 --> 00:41:54.933 +big eyes with + +00:41:56.700 --> 00:42:02.133 +ทั้ง 2 ตัวเหมือนกันเลย นะครับผม หมายความว่าไง หมายความว่า data ที่เราทำ image generation มันออกมาไม่ได้ ไม่ดี + +00:42:02.200 --> 00:42:06.233 +เวลาเรา searching ออกมา เรา searching image ออกมา มัน มันก็เลยได้ไม่ดีเหมือนกัน + +00:42:06.300 --> 00:42:09.233 +เพราะงั้นการที่เราจะทำ image captioning ให้ + +00:42:09.500 --> 00:42:14.333 +ให้ เอ่อ การที่เราจะทำ ทำตัว multimodal RAG นะครับผม ให้มันดีอะ + +00:42:14.400 --> 00:42:20.133 +อ่า การแปลงจาก image ออกมาเป็น text อ่ะ มันควรจะดีด้วยเหมือนกัน ก็คือหมายความว่า ณ ตอนเนี้ย + +00:42:20.200 --> 00:42:25.433 +เราทำ image captioning ได้ไม่ดีพอ เพราะงั้นเราจะแก้ปัญหานี้ยังไง + +00:42:25.500 --> 00:42:30.433 +เราต้องย้อนกลับไป back กลับไป back กลับไปแล้วแก้ไรได้บ้างนะครับ เราแก้ + +00:42:30.500 --> 00:42:35.133 +เราแก้ dataset ได้มั้ย เราแก้ dataset ไม่ได้ เราแก้ เราแก้ตัว image + +00:42:35.200 --> 00:42:40.633 +captioning ได้มั้ย นะครับผม เนี่ยเราแก้ back prop กลับไปว่า เออ เราจะทำตัวไหนให้มันได้ดีที่สุดอะ + +00:42:41.000 --> 00:42:44.333 +เราก็จะได้ผลลัพธ์ออกมาที่ดี แต่อย่างน้อย อย่างน้อยที่สุดวันนี้ + +00:42:44.400 --> 00:42:48.133 +นะครับผม มันสามารถเอารูปภาพออกมาได้แล้ว + +00:42:48.200 --> 00:42:52.733 +นะครับ มันสามารถเสิร์ชออกมาได้แล้วจากแค่คำว่า text จากคำว่า I want to see your Pikachu + +00:42:52.800 --> 00:42:57.233 +แล้วมันก็เสิร์ชออกมาได้แล้วแต่สิ่งที่มันใกล้เคียงที่สุดนะครับ ผลลัพธ์สุดท้าย + +00:42:57.300 --> 00:43:01.133 +เราสามารถเอา image กับ เราสามารถเอา text + +00:43:01.400 --> 00:43:05.033 +สองตัวเนี้ย ไปผ่าน LLM เพื่อ generate คำตอบออกมาได้ + +00:43:05.400 --> 00:43:10.433 +ต่อเนื่องไปเรื่อยๆ นะครับผม ส่วนในพาร์ทของ generate ผมจะไม่แสดงให้ดูเนาะ เพราะผมเชื่อว่า + +00:43:10.500 --> 00:43:11.633 +ทุกคนน่าจะเขียนพร้อม + +00:43:12.600 --> 00:43:20.533 +ได้กันอยู่แล้วเนาะ เพราะงั้นผลลัพธ์สุดท้ายตรงนี้ก็ขอฝากไปแล้วถ้าเกิดว่าใครมีคำถามอะไรหรือใครสนใจอะไรนะครับผม + +00:43:20.600 --> 00:43:23.533 +ก็อ่าเข้ามาคุยกันได้นะ + +00:43:23.600 --> 00:43:27.433 +ครับผมก็สำหรับวันนี้พิคาชูก็ขอบคุณทุกคนนะครับ + +00:43:27.500 --> 00:43:28.233 +ピカ ピカ + +00:43:28.300 --> 00:43:32.533 +ピカ + +00:43:32.600 --> 00:43:36.933 +กาวสมใจยัง? / ขอบคุณมากครับ ผมตอนแรกไม่คิดว่าจะมาเป็น + +00:43:37.000 --> 00:43:40.033 +ピカチュウ จริงๆ นะฮะ กำลังเซฟอยู่ ทำไมไม่แต่งเต็ม + +00:43:40.100 --> 00:43:40.833 +ทั้งตัวเลย + +00:43:42.600 --> 00:43:45.433 +อ๋อมีแล้วมีแล้วโอเค นะครับผม ก็เดี๋ยว + +00:43:45.700 --> 00:43:48.633 +ก่อนที่เดี๋ยวเราจะมาถ่ายรูปรวมกันนะครับผม + +00:43:48.700 --> 00:43:52.433 +พอดีของที่ระลึกนะฮะ ยังมีอีกเพียบเลยนะครับผม + +00:43:52.500 --> 00:43:56.633 +ก็เดี๋ยวเราจะมาเล่นเกมคาฮูทกันสั้นๆ ประมาณ 15 ข้อแบบไวๆ พี่ฟี่ + +00:43:57.000 --> 00:43:57.533 +ครับผม + +00:43:58.800 --> 00:44:02.633 +สำหรับคนที่ได้อันดับ 1 2 3 4 5 นะครับผม + +00:44:05.800 --> 00:44:07.833 +ก็สามารถเลือกของที่ระลึกได้คนละ + +00:44:08.400 --> 00:44:11.033 +คนละ 3 ชิ้นละกันนะฮะ คนละ 3 ชิ้นไปเลยนะครับผม + +00:44:12.100 --> 00:44:14.333 +เออ สปีคเกอร์เล่นไม่ได้นะ สปีคเกอร์เล่นไม่ได้ diff --git a/data/videos/mongo0924/rag.jpg b/data/videos/mongo0924/rag.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f2a29d3689f8877f3f36e29906ff3d81421858e GIT binary patch literal 122516 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

L5JbYS93IN*Vm?vZ4#E9{6S8iCl*p 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 00:00:05.133 +โอเคนะครับผมก็ขอส่งต่อเวทีนี้กลับให้คุณเจมส์นะครับ + +00:00:06.400 --> 00:00:07.733 +อ่าขอบคุณครับทุกคนครับ + +00:00:08.000 --> 00:00:11.233 +โอเค ถามก่อนครับในนี้ใครรู้จัก + +00:00:12.000 --> 00:00:14.533 +เอ่อ ทุกคนคงน่าจะเคยได้ยิน large language model + +00:00:14.800 --> 00:00:15.533 +กันใช่มั้ยครับ + +00:00:15.600 --> 00:00:20.533 +โอเค ใครในนี้เคยได้ยิน ยังไม่เคยได้ยินคำว่า + +00:00:20.600 --> 00:00:23.633 +vector search บ้างครับ ขอมือหน่อยฮะ จะได้รู้ + +00:00:23.700 --> 00:00:24.533 +background ทุกคนหน่อย + +00:00:24.600 --> 00:00:26.533 +โอเคแปลว่าทุกคนเคยได้ยินหมดแล้ว + +00:00:26.600 --> 00:00:27.433 +โอเคมีข้างหลังนะครับ + +00:00:27.900 --> 00:00:31.833 +ในนี้มีใครยังไม่เคยได้ยินคำว่า semantic search บ้างครับ + +00:00:33.100 --> 00:00:36.133 +ทุกคนเคยได้ยินหมดแล้ว อ๋อๆ โอเคมี 2 ได้ครับ + +00:00:36.200 --> 00:00:38.033 +แปลว่าส่วนใหญ่น่าจะมีพื้นฐานใช่มั้ยครับ + +00:00:38.100 --> 00:00:42.133 +โอเค เอิ่ม บอกก่อนครับว่า เอ่อ เซสชั่นเนี้ยจริงๆ + +00:00:42.200 --> 00:00:44.433 +มันเป็น workshop นะครับ + +00:00:44.500 --> 00:00:48.433 +รันกันประมาณ 3 ชั่วโมงนิดๆ นะครับ + +00:00:48.500 --> 00:00:50.433 +ก็เราพยายามย่อมาให้เหลือเป็น 40 นาทีนะครับ + +00:00:50.500 --> 00:00:53.233 +ก็ดีเทลบางอย่างเราอาจจะข้ามมันไปนะครับ + +00:00:53.300 --> 00:00:55.333 +ก็ในส่วนที่เป็นโค้ดเดี๋ยวผมจะ walk through ให้ดู + +00:00:55.400 --> 00:00:57.733 +แต่ว่าคงไม่ได้ลงลึกขนาดนั้นนะครับ + +00:00:57.800 --> 00:01:00.433 +ก็ เอ่อ แต่ anyway ครับเรามี GitHub + +00:01:00.500 --> 00:01:02.333 +เรามี Google Colab นะครับ + +00:01:02.400 --> 00:01:05.833 +แล้วเราก็มีบทความที่เขียนเอาไว้แล้ว follow up ได้นะครับ + +00:01:05.900 --> 00:01:09.933 +แล้วก็เร็วๆ นี้น่าจะมีเปิดรับลงทะเบียนสำหรับ + +00:01:10.400 --> 00:01:11.933 +ทำ workshop ตัวเนี้ยนะครับ + +00:01:12.000 --> 00:01:14.333 +ก็เดี๋ยวผมกับทีมเนี่ยจะมาสอนด้วยกันนะครับ + +00:01:14.400 --> 00:01:17.933 +สอนฟรีนะครับ ก็ดูในกลุ่มไว้แล้วกันนะครับ + +00:01:18.700 --> 00:01:24.532 +โอเคครับ เอิ่ม จริงๆ วันนี้หัวข้อมันคือ RAG กับ + +00:01:24.600 --> 00:01:26.533 +vector search with MongoDB นะครับ + +00:01:26.900 --> 00:01:33.433 +ก็จริงๆ เนี่ย พอพูดถึงคำว่า large language model เนาะ + +00:01:33.500 --> 00:01:35.233 +นะครับ พูดถึง large language model + +00:01:35.300 --> 00:01:37.033 +เนี่ยมันทำอะไรได้บ้างนะครับ + +00:01:37.100 --> 00:01:41.333 +เราก็จะนึกถึงอะไรที่เราพิมพ์คำถามเข้าไปใช่มั้ยครับ + +00:01:41.600 --> 00:01:42.933 +เราพิมพ์คำถามเข้าไป + +00:01:43.000 --> 00:01:45.933 +แล้วจากนั้นเนี่ย มันก็พยายามที่จะให้คำตอบ + +00:01:46.000 --> 00:01:47.833 +อะไรบางอย่างกับเรากลับมาใช่มั้ยฮะ + +00:01:47.900 --> 00:01:55.433 +อ่ะลองดูนะครับ เอ่อ เห็นมั้ยฮะ + +00:01:55.500 --> 00:01:56.533 +ผมขยายหน่อยแล้วกันนะ + +00:01:58.400 --> 00:02:01.333 +อืม เอ่อ ผมพิมพ์ว่า system ของผมเป็นยังไงบ้างครับวันนี้ฮะ + +00:02:01.400 --> 00:02:02.733 +แล้วผมลองส่ง request นะครับ + +00:02:03.000 --> 00:02:05.433 +โอเคครับ เอ่อ สิ่งนี้ทำอะไรครับ + +00:02:05.500 --> 00:02:10.733 +สิ่งเนี้ยครับ มันจะรับคำสั่งเป็นคำถามแบบ meaning เข้าไปครับ + +00:02:10.800 --> 00:02:14.033 +แล้วมันก็จะพยายามไปเชื่อมต่อกับ 2 อย่างครับ + +00:02:14.100 --> 00:02:17.632 +ก็คือสิ่งที่เป็นตัว AI เองนะครับ + +00:02:17.700 --> 00:02:21.833 +ที่ก็คือเป็นโมเดลแยกเนาะ ของ OpenAI Azure OpenAI นะครับ + +00:02:21.900 --> 00:02:22.333 +ที่ผมใช้ + +00:02:22.700 --> 00:02:27.333 +แล้วก็พยายามที่จะเข้าไป get data บางอย่างจาก MongoDB + +00:02:27.400 --> 00:02:28.933 +นะครับ แล้วก็เอามาแสดงนะครับ + +00:02:29.000 --> 00:02:31.733 +ประเด็นคือคำว่า get data บางอย่างเนี่ยมันทำได้หลายวิธี + +00:02:31.800 --> 00:02:35.433 +เดี๋ยววันนี้เราจะมาพูดถึง 2 วิธีนะครับที่เราจะใช้กันนะครับ + +00:02:36.100 --> 00:02:38.533 +ก็ครับ ซึ่งก็ เอ่อ โดย + +00:02:38.600 --> 00:02:40.833 +อันนี้เป็นข้อมูลที่เก็บมาเป็นข้อมูล logging นะครับ + +00:02:40.900 --> 00:02:44.733 +เป็นข้อมูล logging ของตัว HTTP request in general นะครับ + +00:02:44.800 --> 00:02:47.033 +ผมก็ถามว่า เออ system today ของผมเป็นยังไงนะครับ + +00:02:47.100 --> 00:02:49.533 +มันก็บอกเนาะว่า เออ วันนี้มันเกิดอะไรขึ้นเนาะ + +00:02:49.600 --> 00:02:50.632 +ด้วยอะไรแบบไหนนะครับ + +00:02:50.700 --> 00:02:53.632 +แปลงเป็นคำพูดออกมานะครับ + +00:02:54.000 --> 00:02:58.533 +โอเคครับ นั่นก็คือเดโมพอหอมปากหอมคอนะครับ + +00:02:59.500 --> 00:03:02.933 +โอเค แล้วนี่ก็คือตัวข้างหลังครับ + +00:03:03.000 --> 00:03:04.833 +จริงๆ ค่อนข้าง simple นะครับ + +00:03:04.900 --> 00:03:07.132 +ไม่ได้มีอะไรยิ่งใหญ่มากนะครับ + +00:03:07.200 --> 00:03:11.233 +แต่ว่าเดี๋ยวเราเนี่ย คงจะมาลงลึกเอ่อ นิดนึงนะครับ + +00:03:11.300 --> 00:03:13.933 +แตะนิดนึงในส่วนที่ 2 ที่เป็น query database นะครับ + +00:03:14.000 --> 00:03:15.033 +ที่ใช้ MongoDB เนาะ + +00:03:15.100 --> 00:03:17.733 +เดี๋ยวเรามาดูก่อนว่าเราใช้วิธีไหนได้บ้างนะครับ + +00:03:18.100 --> 00:03:21.533 +โอเคครับ แต่ผมขอปูพื้นนิดนึงแล้วกันครับ + +00:03:21.600 --> 00:03:24.533 +ผมว่าหลายๆ คนคงจะรู้จักกับ LLM แหละนะครับ + +00:03:24.600 --> 00:03:27.533 +เราก็คงจะรู้ว่า LLM มี model knowledge เนาะ ใช่มั้ยครับ + +00:03:27.800 --> 00:03:29.533 +เจ้า model knowledge ตัวเนี้ยครับ + +00:03:29.600 --> 00:03:31.033 +มันเป็น model knowledge แบบ batch + +00:03:31.100 --> 00:03:32.632 +หมายความว่าไงครับ หมายความว่า + +00:03:32.700 --> 00:03:36.933 +รุ่นนี้มันอาจจะถูกมีโมเดลที่ feed เข้าไปเป็น pre-trained + +00:03:37.000 --> 00:03:39.333 +อ่ะนะครับ ตั้งแต่วันนี้จนถึงวันนี้ + +00:03:39.400 --> 00:03:41.132 +จากนั้นก็จบแค่ตรงนั้นใช่มั้ยครับ + +00:03:41.200 --> 00:03:44.333 +อย่างถ้าเกิดว่าบางทีเนี่ยเราถามคำถามให้กับตัว + +00:03:44.400 --> 00:03:45.533 +assistant ของเรานะครับ + +00:03:45.600 --> 00:03:48.933 +แล้วเราถามว่า เออ Queen Elizabeth เนี่ยยังอยู่มั้ยนะครับ + +00:03:49.000 --> 00:03:52.533 +ที่ 2 นะครับ เขาก็จะบอกว่า เออ เขายังอยู่นะครับ ใช่มั้ย + +00:03:52.600 --> 00:03:54.533 +เพราะว่าโมเดลบางตัวเนี่ยมันยัง + +00:03:54.600 --> 00:03:57.933 +มันยังเป็นโมเดลที่ข่าวเนี่ยมันยังอยู่ในช่วงปีก่อนที่ + +00:03:58.000 --> 00:04:00.833 +Queen Elizabeth จะ pass away ใช่มั้ยครับเนาะ + +00:04:00.900 --> 00:04:04.033 +แต่ว่าโมเดลหลังจากนั้นก็อาจจะอัพเดตไปแล้วนะครับ + +00:04:04.100 --> 00:04:06.733 +โอเคนี่ก็เป็นประเด็นนึงนะครับ + +00:04:07.000 --> 00:04:10.632 +แล้วอีกประเด็นนึงครับ บางทีเราอาจจะถามคำถามที่ + +00:04:10.700 --> 00:04:12.433 +เอ่อ มัน general มากนะครับ + +00:04:12.500 --> 00:04:13.433 +อย่างเช่นว่า เอ้ย ไม่ใช่ general แบบ + +00:04:13.800 --> 00:04:16.132 +คำถามที่มัน specific มากขึ้นนะครับ + +00:04:16.200 --> 00:04:18.933 +อย่างเช่น เออ ผมอยากจะได้ waterproof shoes + +00:04:19.200 --> 00:04:20.433 +ที่มันแบบอุ่นๆ หน่อยนะครับ + +00:04:20.500 --> 00:04:22.533 +ถ้าเกิดว่าปั่นๆ อยู่อะไรอย่างเงี้ยนะครับ + +00:04:22.600 --> 00:04:25.533 +เออ assistant ของเราที่เป็นตัว AI อ่ะครับ + +00:04:25.600 --> 00:04:28.332 +ถ้าเกิดว่าเขาไม่ได้มีข้อมูลที่มัน specific เจาะจง + +00:04:28.400 --> 00:04:31.033 +เขาก็จะพยายามดึงข้อมูลที่เป็น batch ของเขาออกมาตอบเราเนาะ + +00:04:31.300 --> 00:04:36.733 +นะครับ ซึ่งตรงเนี้ยครับ เป็นสิ่งที่ เอ่อ เราเนี่ย + +00:04:36.800 --> 00:04:40.733 +ที่เป็นคนที่ทำแอปพลิเคชันบางอย่างที่มันจะต้องมีการต่อกับ + +00:04:40.800 --> 00:04:42.733 +LLM เนี่ยครับ จะต้องพยายามเข้าใจนะว่า + +00:04:42.800 --> 00:04:43.433 +เอ้ย จริงๆ แล้วเนี่ย + +00:04:43.700 --> 00:04:46.633 +แล้วถ้าเกิดว่าเรายังอยากให้เขาตอบให้มัน specific มากขึ้น + +00:04:46.700 --> 00:04:50.233 +หรือว่าให้มันพยายาม lead มาสู่การซื้อสินค้าของเรามากขึ้น + +00:04:50.300 --> 00:04:52.933 +หรืออะไรแบบเนี้ยมันควรจะต้องเป็นยังไงนะครับ + +00:04:53.300 --> 00:04:57.033 +นะครับ ก็ โดยส่วนใหญ่นะครับ + +00:04:57.100 --> 00:04:59.832 +อันนี้เราพูดถึง knowledge ที่เป็นแบบขั้นพื้นฐานก่อน + +00:04:59.900 --> 00:05:01.633 +ก็คือเรา add prompt เข้าไปถูกมั้ยครับ + +00:05:01.900 --> 00:05:03.733 +prompt โดยปกติเลยใช่มั้ยครับ + +00:05:03.800 --> 00:05:06.533 +อย่างเช่นว่า เออ I need warm waterproof + +00:05:06.600 --> 00:05:08.332 +เราอาจจะ add prompt ที่เป็น meta prompt ว่า + +00:05:08.400 --> 00:05:11.832 +เออ จริงๆ แล้วอ่ะ you ควรจะต้องเป็น AI นะที่ตอบคำถาม + +00:05:12.100 --> 00:05:15.933 +เอ่อ เป็น AI นะที่ act ว่าตัวเองเนี่ยเป็น + +00:05:16.000 --> 00:05:17.332 +sales representative เนาะ + +00:05:18.100 --> 00:05:21.633 +เป็นเซลล์ขายของนะครับ ของบริษัทนี้ บริษัทนี้นะครับ + +00:05:21.700 --> 00:05:23.933 +แล้วเราก็ลุ้นนะครับว่า ไอ้บริษัทนี้ บริษัทนี้เนี่ย + +00:05:24.000 --> 00:05:25.733 +มันมี data อยู่ใน batch ที่มันถูก pre-trained + +00:05:25.800 --> 00:05:27.033 +เข้าไปรึเปล่านะครับ + +00:05:28.100 --> 00:05:29.733 +เอ่อ ซึ่งเราไม่ต้องการแบบนั้นครับ + +00:05:29.800 --> 00:05:31.033 +เราไม่ต้องการแบบนั้นนะครับ + +00:05:31.100 --> 00:05:33.533 +สิ่งที่เราพยายามทำเนี่ยคือการที่บอกว่าโอเค + +00:05:33.600 --> 00:05:37.133 +ถึงแม้โมเดลเนี่ย เอ่อ ที่เป็น LLM เนี่ยเขาจะเก่งนะครับ + +00:05:37.200 --> 00:05:41.033 +ในมุมของการพยายามที่จะเข้าใจ semantic meaning + +00:05:41.100 --> 00:05:43.033 +ความหมายอะไรบางอย่างก็ตามนะครับ + +00:05:43.100 --> 00:05:46.633 +แต่เราก็จะต้องมีการ provide ข้อมูลที่เป็นข้อมูลอัพเดต + +00:05:46.700 --> 00:05:48.533 +หรือข้อมูลบางอย่างให้กับเขา + +00:05:48.600 --> 00:05:49.832 +เพื่อให้เขาสามารถเอาตรงเนี้ยครับ + +00:05:49.900 --> 00:05:52.033 +กับตัวความรู้ที่เป็น model knowledge ของเขาเนี่ย + +00:05:52.100 --> 00:05:53.332 +มา compile ซึ่งกันและกัน + +00:05:53.400 --> 00:05:55.332 +แล้วตอบคำถามให้มันเจาะจงมากขึ้นเนาะ + +00:05:55.400 --> 00:05:56.733 +นะครับ สิ่งเนี้ยครับมีชื่อว่า + +00:05:56.800 --> 00:05:58.733 +retrieval augmented generation นะครับ + +00:05:58.800 --> 00:06:00.533 +หรือว่า RAG นั่นแหละนะครับ + +00:06:00.600 --> 00:06:02.033 +มันทำงานยังไงนะครับ + +00:06:02.100 --> 00:06:05.933 +ก็หลักๆ ครับ เวลาที่ user มี เอ่อ question เข้ามานะครับ + +00:06:06.000 --> 00:06:08.933 +เราก็จะพยายามจับ question ตรงนั้นก่อนครับ + +00:06:09.000 --> 00:06:12.733 +แล้วดึง data ที่เกี่ยวข้องนะครับ กับ question ตรงนั้นนะครับ + +00:06:13.100 --> 00:06:15.832 +แล้วจากนั้นเนี่ย เราก็จะพยายาม + +00:06:16.800 --> 00:06:19.133 +เอาไอ้ data ที่เกี่ยวข้องกับ question ตรงนั้นนะครับ + +00:06:20.400 --> 00:06:22.033 +ผสมกับ prompt ของเรานะครับ + +00:06:22.100 --> 00:06:23.832 +แล้วก็ใส่เข้าไปให้กับโมเดลเนาะ + +00:06:23.900 --> 00:06:25.733 +แล้วจากนั้นโมเดลมันก็จะพยายาม analyze นะครับ + +00:06:25.800 --> 00:06:27.832 +แล้วก็พยายาม send result บางอย่างออกมานะครับ + +00:06:27.900 --> 00:06:32.233 +นี่ก็คือท่ามาตรฐานทั่วไปนะครับ ของสิ่งที่มันเป็นนะครับ + +00:06:32.300 --> 00:06:35.633 +โอเคครับ ซึ่ง พอกลับมาตรงนี้ครับ + +00:06:35.700 --> 00:06:36.633 +เดี๋ยวปูพื้นกันนิดนึงครับ + +00:06:36.700 --> 00:06:38.033 +ยังไม่ไป MongoDB เลยนะครับ + +00:06:38.400 --> 00:06:41.433 +เรายังอยู่ที่ เอ่อ Azure OpenAI กันอยู่นะครับ + +00:06:41.500 --> 00:06:43.332 +เออ พอมาถึงตรงนี้ครับ + +00:06:43.900 --> 00:06:45.733 +sequence ในการทำงานของมันนะครับ + +00:06:45.800 --> 00:06:47.433 +โดยปกติเนี่ยมันเป็นยังไงนะครับ + +00:06:47.500 --> 00:06:49.933 +อ่า นี่คือ sequence diagram ในการทำงานของมันนะครับ + +00:06:50.300 --> 00:06:53.733 +ก็หลักๆ ครับมันจะรับตัว query เข้ามานะครับเนาะ + +00:06:53.800 --> 00:06:56.033 +แล้วก็หลังจากนั้นเนี่ย พอมันรับ query เข้ามานะครับ + +00:06:56.100 --> 00:06:58.733 +เสร็จเนี่ย มันก็จะพยายามที่จะเอา query ตัวเนี้ยครับ + +00:06:59.000 --> 00:07:01.933 +ยิงไปหาตัว OpenAI โมเดลก่อนเนาะ + +00:07:02.000 --> 00:07:03.832 +แล้วก็พยายามดูว่า OpenAI โมเดลเนี่ย + +00:07:03.900 --> 00:07:06.033 +มันต้องการข้อมูลอะไรเพิ่มมั้ยนะครับ + +00:07:06.100 --> 00:07:08.633 +ถ้ามันต้องการเพิ่มเดี๋ยวมันจะบอกกลับมาละหาเราครับ + +00:07:09.100 --> 00:07:11.433 +ถ้าเกิดว่า สมมติว่ามันบอกว่า เฮ้ย ชั้นต้องการ + +00:07:11.500 --> 00:07:12.433 +เราต้อง prompt เอาไว้นะว่า + +00:07:12.500 --> 00:07:18.033 +เฮ้ย ชั้นต้องการข้อมูลเกี่ยวกับ log วันนี้ วันนี้นะครับ + +00:07:18.100 --> 00:07:20.033 +เขาก็จะพยายามเรียกกลับมาที่ backend application + +00:07:20.500 --> 00:07:20.933 +ของเราเนาะ + +00:07:21.000 --> 00:07:23.433 +แล้วจากนั้นเราก็ไป fetch ข้อมูลจาก MongoDB นะครับ + +00:07:23.700 --> 00:07:26.332 +แล้วจากนั้นก็ส่งข้อมูลกลับไปให้ LLM นะครับ + +00:07:26.400 --> 00:07:29.033 +พร้อมกับ prompt ของเราเนาะ + +00:07:29.100 --> 00:07:30.533 +แล้วคราวเนี้ย เราก็ return ตัว summary ตรงนั้นนะครับ + +00:07:30.600 --> 00:07:32.133 +กลับไปให้กับ user นะครับ + +00:07:32.200 --> 00:07:33.832 +ซึ่งเราก็จะเห็นนะครับว่า process ตรงเนี้ย + +00:07:33.900 --> 00:07:37.832 +มันจะมีการ involve data ที่เป็น data แบบ data ของเราเอง + +00:07:37.900 --> 00:07:40.933 +กับ pre-trained data ที่มันมีอยู่ในโมเดลอยู่แล้วใช่มั้ยครับ + +00:07:41.600 --> 00:07:46.933 +ครับ ซึ่ง ผมจะ walk through ให้แบบคร่าวๆ แล้วกันนะครับเนาะ + +00:07:47.000 --> 00:07:49.733 +มันเป็นยังไงนะครับ ก็มันเป็นแบบนี้ครับ + +00:07:50.400 --> 00:07:53.633 +เอ่อ จริงๆ อันนี้อยู่ใน GitHub นะครับ มีทุกอย่างเลยครับ + +00:07:54.000 --> 00:07:56.133 +เอ่อ ทั้งสไลด์ สไลด์น่าจะยัง + +00:07:57.100 --> 00:07:58.933 +อ่า เดี๋ยวไม่อัพเดต เดี๋ยวขออัพเดตนิดนึงนะครับ + +00:07:59.000 --> 00:08:00.832 +แล้วก็แต่ที่เหลือมีหมดแล้วนะครับ + +00:08:00.900 --> 00:08:06.233 +โอเค เห็นมั้ย เล็กมากนะฮะ ขอขยายหน่อย นะครับ + +00:08:06.300 --> 00:08:11.033 +โอเคครับ หลักๆ ครับมันจะมี endpoint API อยู่ตรงนี้ครับ + +00:08:11.700 --> 00:08:13.433 +นี่คือ API endpoint ของเราครับ + +00:08:13.800 --> 00:08:18.933 +ก็หลักๆ ครับ พอเราพิมพ์ข้อมูลปุ๊บ กดปุ่ม ask ปุ๊บใช่มั้ยครับ + +00:08:19.000 --> 00:08:20.933 +มันก็จะยิงคำถามเข้ามาในนี้ครับ + +00:08:21.200 --> 00:08:24.933 +จากนั้นก็ simple ครับ เราก็รับคำถามเข้ามาครับ + +00:08:25.000 --> 00:08:26.133 +extract คำถามออกมา + +00:08:26.400 --> 00:08:30.033 +จากนั้นเสร็จปุ๊บครับ เรา เราขั้นแรกเราโยนคำถามเนี้ยกลับ + +00:08:30.100 --> 00:08:32.832 +ไปให้กับ AI โมเดลก่อนนะครับเนาะ + +00:08:32.900 --> 00:08:33.732 +เรายังไม่ retrieve นะครับ + +00:08:34.000 --> 00:08:35.332 +เราพยายามโยนกลับไปก่อนนะครับ + +00:08:35.400 --> 00:08:37.732 +เพราะว่าคำถามที่มาเนี่ยมันเป็นคำถามแบบ semantic + +00:08:37.799 --> 00:08:40.933 +คือมันเป็นคำถามที่มีความหมายเนาะ ใช่มั้ยครับเนาะ + +00:08:41.000 --> 00:08:42.232 +เราก็พยายามที่จะเข้าใจว่า + +00:08:42.299 --> 00:08:45.233 +เอ้ย ความหมายของคำถามเนี้ยคืออะไรนะครับ + +00:08:45.300 --> 00:08:47.833 +นั่นเป็นงานที่ LLM เขาเก่งอยู่แล้วนะครับ + +00:08:48.100 --> 00:08:50.133 +แต่หลังจากที่เราได้คำถามมาแล้วอ่ะครับ + +00:08:50.800 --> 00:08:52.833 +เราอ่ะครับจะพยายาม extract ครับ + +00:08:52.900 --> 00:08:55.333 +อันนี้คือตัวของ response ที่ได้มาจาก LLM นะครับ + +00:08:55.700 --> 00:08:56.333 +เห็นใช่มั้ยฮะ + +00:08:56.400 --> 00:09:00.933 +โอเค ไอ้ response ตัวเนี้ยครับ เราจะพยายามบอกเขาครับ + +00:09:01.000 --> 00:09:02.033 +pre-define บอกเขาว่า + +00:09:02.100 --> 00:09:04.933 +เฮ้ย ถ้ามันในคำถามเนี้ย ในความหมายของมันน่ะ + +00:09:05.000 --> 00:09:09.233 +มันมีอะไรบางอย่างที่มันจะต้องการข้อมูลเพิ่มเติมอ่ะ + +00:09:09.300 --> 00:09:10.233 +นายบอกมาหน่อยซิ + +00:09:10.300 --> 00:09:13.233 +ว่าไอ้ข้อมูลเพิ่มเติมที่นายต้องการน่ะคืออะไรครับเนาะ + +00:09:13.300 --> 00:09:16.133 +ซึ่ง ณ ที่นี้ครับ มันก็คือข้อมูลเพิ่มเติมที่เป็น + +00:09:16.700 --> 00:09:19.133 +ตัว recent log นะครับเนาะ + +00:09:19.200 --> 00:09:21.033 +ซึ่ง เอ่อ ในเชิง technical เลยครับ + +00:09:21.100 --> 00:09:23.233 +ก็คือว่าเรา define ฟังก์ชันให้เขาครับ + +00:09:23.300 --> 00:09:25.933 +เราโยนฟังก์ชันที่เป็น define แต่เราไม่ได้โยนฟังก์ชันเข้าไป + +00:09:26.000 --> 00:09:26.333 +นะครับ + +00:09:26.400 --> 00:09:29.533 +เราโยน definition ของฟังก์ชันเข้าไปให้ LLM นะฮะ + +00:09:29.600 --> 00:09:31.933 +LLM เนี่ยจะพยายามวิเคราะห์แล้วดูว่าฟังก์ชันเนี้ย + +00:09:32.000 --> 00:09:35.033 +เป็นฟังก์ชันที่เขาควรเรียกมั้ยนะครับ กับคำถามที่เกิดขึ้น + +00:09:35.100 --> 00:09:37.533 +ถ้าเขาควรเรียกครับ เขาก็จะโยนกลับมาให้เราบอกว่า + +00:09:37.600 --> 00:09:38.533 +เออ เรียกฟังก์ชันนี้ให้หน่อย + +00:09:39.000 --> 00:09:41.333 +แล้วจากนั้นครับ เราก็พยายามเรียกฟังก์ชันครับ + +00:09:41.800 --> 00:09:43.533 +เรียกฟังก์ชันเสร็จปุ๊บ เราก็พยายาม + +00:09:44.300 --> 00:09:46.333 +เอาไอ้ data ให้ได้จากฟังก์ชันนั้นๆ น่ะครับ + +00:09:46.600 --> 00:09:50.533 +โยนกลับไปใหม่นะครับ ให้กับ LLM อีกรอบนึงนะครับเนาะ + +00:09:50.600 --> 00:09:53.233 +แล้วท่าของมันก็จะเป็นประมาณแบบนี้นะครับ + +00:09:53.300 --> 00:09:58.533 +ซึ่งก็คือ โดยสรุปของสไลด์ตัวนี้นะครับ ก็คือ + +00:09:58.600 --> 00:10:00.333 +ท่าแบบเมื่อกี้เนาะ นะครับ + +00:10:00.800 --> 00:10:03.033 +โอเค ซึ่งอันเนี้ยเป็นท่า RAG มาตรฐานครับ + +00:10:03.100 --> 00:10:04.333 +ผมว่าหลายๆ คนน่าจะพูดกันเยอะใช่มั้ยครับ + +00:10:04.400 --> 00:10:07.733 +ถ้าแบบว่า มันเรียกฟังก์ชัน + +00:10:07.800 --> 00:10:10.933 +ก็มีโอกาสที่ context ที่ได้มาจากฟังก์ชันที่มันมีอยู่ + +00:10:11.000 --> 00:10:15.533 +นะครับ จะเกินตัว context window ของตัวโมเดล + +00:10:16.400 --> 00:10:19.933 +หมายถึงตัวโทเค็นที่จะส่งเข้าไปหรือเปล่าครับ + +00:10:20.000 --> 00:10:26.433 +จริงๆ ตรงนี้ครับ ต้องพูดก่อนว่ามันมีโอกาสมั้ย + +00:10:26.500 --> 00:10:29.333 +มีโอกาสที่ตัวโทเค็นจะเกินครับ แต่ว่าเรามีวิธี handle + +00:10:29.400 --> 00:10:31.733 +ได้หลายแบบนะครับ อย่างแรกคือเราเป็นคน handle + +00:10:31.800 --> 00:10:34.633 +memory เอง โอเค พอพูดถึง memory คนจะสับสนกันมาก + +00:10:34.700 --> 00:10:37.733 +ครับ memory ไม่ได้หมายถึง memory ที่เป็น memory + +00:10:37.800 --> 00:10:40.733 +แบบคอมพิวเตอร์แหละครับ แต่ว่าเรากำลังพูดถึงพวก + +00:10:40.800 --> 00:10:42.833 +ข้อมูลเหล่านี้นะครับ พวก message นะครับ + +00:10:42.900 --> 00:10:45.833 +ถ้าเกิดว่าใครรู้ครับว่า message ที่เราส่งเข้าไป + +00:10:45.900 --> 00:10:47.933 +ให้กับพวก LLM เนี่ย มันจะมี role ถูกมั้ยครับ + +00:10:48.000 --> 00:10:50.133 +role user role system role assistant + +00:10:50.200 --> 00:10:52.833 +อะไรอย่างเงี้ยครับ ตรงนี้เราสามารถ control memory + +00:10:52.900 --> 00:10:54.533 +เองได้นะครับ เพราะฉะนั้นครับ ตอบคำถามเมื่อกี้ + +00:10:54.600 --> 00:10:56.733 +ในแบบแรกก่อนครับ ใช่ครับ มันมีโอกาสครับ + +00:10:56.800 --> 00:10:58.833 +แต่ว่าเราก็จะพยายาม handle ตรงนี้ครับ + +00:10:58.900 --> 00:11:01.033 +ไม่ให้มันเกิน อันนี้คือประเด็นแรกนะครับ + +00:11:02.400 --> 00:11:05.333 +ประเด็นที่ 2 ครับ โดยส่วนใหญ่นะครับ + +00:11:05.400 --> 00:11:10.833 +คำถามที่มันวิ่งเข้ามาหาเราครับ ตัว definition + +00:11:11.100 --> 00:11:13.333 +ของฟังก์ชันที่เรามีนะครับ เดี๋ยวผมเปิดให้ดูนะครับ + +00:11:15.600 --> 00:11:17.933 +definition ของฟังก์ชันที่เรามีครับ + +00:11:18.000 --> 00:11:19.433 +เราจะพยายามบอกอยู่แล้วครับว่า + +00:11:19.500 --> 00:11:22.233 +ฟังก์ชันนี้จะ call ก็ต่อเมื่อมันเป็นอะไรนะครับ + +00:11:22.300 --> 00:11:25.033 +ซึ่งโดย in general นะครับ ถ้าเกิดว่าคนนั้น + +00:11:25.100 --> 00:11:26.633 +ต้องการจะถามคำถามจริงๆ เนี่ยนะครับ + +00:11:26.700 --> 00:11:29.033 +มันก็จะ คือฟังก์ชันมันคงไม่ได้มีแค่ 2 ตัวนะครับ + +00:11:29.100 --> 00:11:32.133 +มันจะมีอื่นๆ นะครับ หรือว่าถ้าเกิดว่ามันมีการถาม + +00:11:32.200 --> 00:11:35.333 +แบบว่า เฮ้ย คุณถามฟังก์ชันนี้มา 3 รอบแล้วนะ + +00:11:35.400 --> 00:11:37.133 +ถ้าเกิดว่ามันเป็นรอบที่ 4 เนี่ย + +00:11:37.200 --> 00:11:38.533 +เราควรจะต้องไปเรียกอีกอันนึงแล้วนะ + +00:11:38.600 --> 00:11:40.833 +แล้วก็ควรจะต้อง reset memory อะไรอย่างเงี้ยครับ + +00:11:40.900 --> 00:11:42.433 +มันก็จะมีวิธีแบบนั้นเหมือนกันในการ handle + +00:11:42.500 --> 00:11:44.533 +หวังว่าตอบคำถาม ครับผม + +00:11:45.400 --> 00:11:49.133 +anyway ครับ มันก็จะมีคนที่พยายามถามเรื่องเดียวย้ำๆ + +00:11:49.200 --> 00:11:51.233 +ครับ อันนี้ก็เป็นหน้าที่ของ engineer + +00:11:51.300 --> 00:11:56.033 +อย่างพวกเราแล้วล่ะครับนะครับ + +00:11:56.100 --> 00:11:59.633 +ซึ่งถึงตรงนี้ครับ เราก็จะเห็นว่าโอเค + +00:11:59.700 --> 00:12:03.133 +เรายังไม่ได้แตะอะไรกับตัวที่เป็น MongoDB เลยนะครับ + +00:12:03.200 --> 00:12:05.533 +คือแตะแหละ เราพยายามไป fetch data นะครับ + +00:12:05.600 --> 00:12:17.833 +ออกมานะครับ โอเค เดี๋ยวผมโชว์ data ให้ดูนิดนึงครับ + +00:12:17.900 --> 00:12:21.033 +นี่คือ data นะครับ รอแป๊บนึงนะ + +00:12:21.100 --> 00:12:25.333 +เป็น system log ครับ มี request header body time + +00:12:25.400 --> 00:12:28.233 +บลาๆ โอเคมั้ยครับ ซึ่งวิธีที่ผมดึง + +00:12:28.300 --> 00:12:30.333 +ผมดึงตรงๆ เลยครับ ใช้ MongoDB ดึงออกมาเลยนะครับ + +00:12:30.400 --> 00:12:33.133 +ไม่ได้ใช้ AI อะไรเลย AI โยนมาปุ๊บ ผมดึงเลย + +00:12:33.200 --> 00:12:36.333 +fetch ตรงๆ นะครับ โอเค อันนี้อันนึงครับ + +00:12:36.800 --> 00:12:42.333 +แล้วคราวนี้ครับ ก็หลังจากได้ลองๆ ทำมาดูครับ + +00:12:42.400 --> 00:12:45.633 +ปรากฏเวลาเราทำ LLM ครับ หรือว่าเวลาที่เราใช้งาน + +00:12:45.700 --> 00:12:48.633 +กับมันนะครับ เราไม่ได้ทำ LLM เองอยู่แล้วถูกมั้ยครับ + +00:12:48.700 --> 00:12:51.533 +ถ้าเกิดว่าใครทุกคนรู้ครับ เราใช้โมเดลที่มันสำเร็จ + +00:12:51.600 --> 00:12:54.533 +แล้วเราก็จ่ายเงินให้กับเค้าผ่านการ usage ผ่าน API + +00:12:54.600 --> 00:12:56.133 +นะครับ หรือถ้าเกิดเราจะ host เองก็ได้ครับ + +00:12:56.200 --> 00:12:57.733 +แต่มันก็จะแพงพอสมควรนะครับ + +00:12:57.800 --> 00:13:00.733 +ซึ่งสิ่งที่ทำให้โมเดลมันแพงครับ หลักๆ ก็คือ + +00:13:00.800 --> 00:13:03.033 +computational power และสิ่งที่ทำให้ computational + +00:13:03.100 --> 00:13:06.333 +power มันสูงก็คือโทเค็นที่เราโยนเข้าไปให้กับเค้า + +00:13:06.400 --> 00:13:07.833 +แล้วเค้า generate มันออกมาถูกมั้ยครับ + +00:13:07.900 --> 00:13:11.033 +โทเค็นคืออะไร ก็พวกตัวที่มันเป็น message + +00:13:11.100 --> 00:13:13.133 +ของเรานั่นแหละครับนะครับ มันจะมีวิธีการนับโทเค็น + +00:13:13.200 --> 00:13:15.133 +ของมันนะครับ text message ยาวแบบนี้ + +00:13:15.200 --> 00:13:17.433 +โยนเข้าไปปุ๊บ เค้าต้อง generate ออกมาเท่านี้ยาวๆ + +00:13:17.700 --> 00:13:19.233 +เนี่ย พวกนี้โทเค็นหมดเลยนะครับ + +00:13:19.300 --> 00:13:22.333 +ซึ่งก็จะ relate สู่เงิน และ computational power + +00:13:22.400 --> 00:13:23.633 +และเวลาถูกมั้ยครับ + +00:13:23.900 --> 00:13:26.433 +โอเค แล้วเราจะทำยังไงได้บ้างครับนะครับ + +00:13:27.800 --> 00:13:31.033 +หลังจาก work กับหลายๆ อย่างครับนะครับ + +00:13:31.100 --> 00:13:33.033 +เราก็เจอกับกระบวนการนึงครับ + +00:13:33.100 --> 00:13:35.133 +ที่เป็นกระบวนการแบบพื้นฐานมากๆ ครับ + +00:13:35.200 --> 00:13:37.333 +ในการทำกับ optimization นะครับ + +00:13:39.900 --> 00:13:42.533 +ก็คือการเพิ่ม cache ครับ simple มากครับ + +00:13:42.600 --> 00:13:45.633 +วิธีการ simple มากๆ ครับ เพิ่ม cache ครับนะครับ + +00:13:45.900 --> 00:13:48.733 +ก็เพิ่ม cache ปุ๊บ แทนที่เราจะต้องไปพยายาม + +00:13:48.800 --> 00:13:51.633 +fetch ตัว LLM ใช่มั้ยครับ + +00:13:51.700 --> 00:13:54.033 +เราก็ไม่จำเป็นจะต้อง fetch LLM แล้วถูกมั้ยครับ + +00:13:54.100 --> 00:13:57.033 +เราก็ยิงเข้ามาปุ๊บ เช็ก cache เช็ก cache เสร็จปุ๊บ + +00:13:57.100 --> 00:14:00.433 +ดึง cache return ออกไป เสร็จสิ้นใช่มั้ยครับ + +00:14:01.300 --> 00:14:04.533 +เป็นวิธีมาตรฐานนะครับ ก็เราจะลด load + +00:14:04.600 --> 00:14:05.633 +ได้ดีขึ้นถูกมั้ยครับ + +00:14:07.000 --> 00:14:11.133 +โอเค นี่คือ basic cache key and value ครับ + +00:14:11.200 --> 00:14:13.633 +โอเค เรามีวิธีอื่นครับ แต่ว่านี่เป็น basic + +00:14:13.700 --> 00:14:16.333 +พื้นฐานนะครับ key value database ครับ มี key + +00:14:16.400 --> 00:14:18.433 +มี value ครับ เรา log เข้าไปครับ จบครับ + +00:14:18.500 --> 00:14:19.533 +ดึง cache ออกมาใช่มั้ยครับ + +00:14:19.600 --> 00:14:22.633 +ถ้าเป็นแบบ request ทั่วๆ ไป เรา cache ยังไงครับ + +00:14:22.700 --> 00:14:26.133 +เราก็เอา user ID เราก็เอาข้อบางอย่างใช่มั้ย + +00:14:26.200 --> 00:14:28.433 +ทำเป็น key ตั้ง value เป็น data ถูกมั้ยครับ + +00:14:28.500 --> 00:14:29.833 +แล้วก็จบใช่มั้ยครับ + +00:14:30.500 --> 00:14:33.733 +แล้วถ้าเราเจอ นี่คือตัวอย่างนะครับ ใช่มั้ย + +00:14:33.800 --> 00:14:41.733 +เรามี ID ครับ เราดึง เราเอา ID มาใส่ cache + +00:14:41.800 --> 00:14:47.333 +ใช่มั้ยครับ แล้วก็ article data ใช่มั้ย จบนะครับ + +00:14:47.400 --> 00:14:49.933 +คำถามคือแล้วถ้ามันเป็นแบบนี้ล่ะนะครับ + +00:14:50.600 --> 00:14:53.233 +คำถามคือถ้าสีเขียวมันคือคำถามล่ะ + +00:14:53.300 --> 00:14:55.433 +แต่ถ้าสีแดงมันคือคำตอบล่ะนะครับ + +00:14:55.500 --> 00:14:56.833 +เราจะ cache มันยังไงครับ + +00:14:57.400 --> 00:14:58.833 +เอาสีเขียวยัดเข้า cache เลยมั้ยครับ + +00:14:58.900 --> 00:15:01.733 +สีเขียวยัดเข้า key เลย สีแดงยัดเป็น response ครับ + +00:15:02.400 --> 00:15:03.533 +ทำได้มั้ย ทำได้นะครับ + +00:15:06.100 --> 00:15:08.133 +แล้วถ้าเกิดว่า 3 อันนี้ล่ะครับ + +00:15:09.000 --> 00:15:11.733 +สมมติว่าเราจะ log 3 อันนี้เป็น cache + +00:15:11.800 --> 00:15:13.833 +เราก็ต้องทำไงครับ เราต้อง log 3 อันเป็น key + +00:15:13.900 --> 00:15:15.633 +ใช่มั้ยครับ แล้ว response เหมือนเดิมใช่มั้ยครับ + +00:15:16.100 --> 00:15:17.733 +หรือเปล่านะครับ + +00:15:18.400 --> 00:15:19.933 +จริงๆ แล้วครับ พอเราอ่านสิ่งนี้ + +00:15:20.000 --> 00:15:22.133 +ถ้าเรารู้สึกเอ๊ะว่าทำไมเราถึงทำแบบนั้นนะครับ + +00:15:22.400 --> 00:15:24.333 +คือไม่แปลกครับ เพราะว่าคอมพิวเตอร์เนี่ย + +00:15:24.800 --> 00:15:26.733 +พอพูดถึง key value เค้าจะเข้าใจเป็นแบบ + +00:15:26.800 --> 00:15:28.733 +exact match นะครับใช่มั้ยครับ pattern matching + +00:15:29.000 --> 00:15:31.433 +ใช่มั้ยครับ การทำ cache โดยปกติคือการหา + +00:15:31.500 --> 00:15:33.833 +pattern matching จาก memory ที่เรามีเพื่อลด + +00:15:33.900 --> 00:15:36.433 +computational power ในการ compute นะครับ + +00:15:36.500 --> 00:15:37.533 +time complexity ใช่มั้ยครับ + +00:15:37.900 --> 00:15:40.633 +แต่สิ่งนี้ครับ มัน pattern matching ไม่ได้ครับ + +00:15:40.700 --> 00:15:43.133 +มันทำได้แหละ แต่มันไม่ efficient เราทำยังไง + +00:15:43.200 --> 00:15:47.333 +ใช่มั้ยครับ สิ่งนี้ ถึงแม้ว่ามันจะไม่เหมือนกัน + +00:15:47.400 --> 00:15:48.833 +ในเทอม pattern matching นะครับ + +00:15:48.900 --> 00:15:51.433 +แต่ว่าสิ่งที่มันเหมือนกันคือมันมี semantic meaning + +00:15:51.500 --> 00:15:53.433 +ที่เหมือนกันนะครับ semantic meaning + +00:15:53.500 --> 00:15:56.933 +ก็คือความหมายของคำที่เมื่อมัน convert เป็น vector + +00:15:57.000 --> 00:15:58.533 +เดี๋ยวอธิบายให้ฟัง vector คืออะไร + +00:15:58.600 --> 00:15:59.833 +เมื่อมัน convert เป็น vector แล้วครับ + +00:15:59.900 --> 00:16:03.833 +มันอยู่ในกลุ่มเดียวกันหรือกลุ่มใกล้ๆ กันนะครับนะครับ + +00:16:04.200 --> 00:16:06.033 +วิธีที่เรา cache ครับ เราจะไม่ได้ cache แบบ + +00:16:06.100 --> 00:16:08.833 +pattern matching แล้ว เราจะพยายามดึงสิ่งที่เป็น + +00:16:08.900 --> 00:16:11.133 +semantic meaning ออกมา แล้วเอาสิ่งนี้ไปเป็น key + +00:16:11.200 --> 00:16:13.433 +ในการ cache แล้วจากนั้นก็เอา response ครับ + +00:16:13.500 --> 00:16:16.333 +ไปเป็นตัว response ของมัน + +00:16:16.400 --> 00:16:22.333 +ลองดูนะ semantic meaning ครับ semantic search ครับ + +00:16:23.600 --> 00:16:25.733 +ถ้าเราสามารถดึง semantic meaning ได้ครับ + +00:16:25.800 --> 00:16:27.533 +เราก็สามารถทำ semantic search ได้ครับ + +00:16:27.600 --> 00:16:28.933 +semantic search ก็คือการ search + +00:16:29.000 --> 00:16:30.933 +ผ่านความหมายของมันนะครับ + +00:16:31.000 --> 00:16:32.233 +ถ้าเราทำ semantic search ได้ + +00:16:32.300 --> 00:16:34.433 +เราก็สามารถ semantic cache หรือว่า cache by + +00:16:34.500 --> 00:16:38.033 +ความหมายได้ครับ นี่คือวิธีการที่เรากำลังจะพูดถึง + +00:16:38.100 --> 00:16:41.033 +ต่อไปนะครับ semantic meaning ก่อนนะครับ + +00:16:43.900 --> 00:16:47.133 +วิธีการที่ AI เข้าใจ data นะครับ + +00:16:47.200 --> 00:16:48.833 +ผมว่าหลายๆ คนน่าจะเคยคุ้นเนาะ + +00:16:48.900 --> 00:16:50.233 +เขาไม่ได้เข้าใจ text นะครับ + +00:16:50.300 --> 00:16:53.433 +เขาจะต้องพยายามแปลง text ให้มันกลายเป็นสิ่งที่ชื่อว่า + +00:16:53.500 --> 00:16:55.033 +สิ่งที่เป็นตัวเลขเนาะ numerical data + +00:16:55.400 --> 00:16:58.833 +แล้วเราก็มักจะมีความหมายของคำนี้ก็คือ vector ถูกไหมครับ + +00:17:00.000 --> 00:17:02.833 +คำว่า embedding, vectorizing, encoding สิ่งเหล่านี้ครับ + +00:17:02.900 --> 00:17:05.032 +คือการพยายามแปลง string ให้มันกลายเป็น vector + +00:17:05.099 --> 00:17:06.133 +แล้วก็อาศัย pre-trained + +00:17:06.200 --> 00:17:08.933 +เพื่อที่จะพยายามหาความหมายให้กับคำเหล่านั้นเนาะ + +00:17:09.000 --> 00:17:11.532 +ใช่ไหมครับ เดี๋ยวลองดูครับ + +00:17:11.900 --> 00:17:16.833 +vector หน้าตาเป็นยังไงครับ หน้าตาเป็นแบบนี้เลยครับ + +00:17:17.300 --> 00:17:19.333 +นะครับ เราโยน text เข้าไปครับ + +00:17:20.300 --> 00:17:24.633 +แล้วเราก็ได้ vector ออกมาจากฝั่งขวานะครับเนาะ + +00:17:24.700 --> 00:17:26.733 +vector เหล่านี้ครับ หน้าตาของมันก็จะเป็น + +00:17:27.900 --> 00:17:30.233 +เห็นเนาะ มันคือตัวเลขแหละครับ + +00:17:30.300 --> 00:17:32.633 +มันคือตัวเลขนั่นแหละครับ มองเป็นตัวเลขตัวนึงนะครับ + +00:17:32.700 --> 00:17:34.833 +ที่เป็น set of ตัวเลขบางอย่างนะครับ + +00:17:35.100 --> 00:17:37.433 +คราวนี้ครับ การจะแปลงให้เป็น vector ได้ครับ + +00:17:37.500 --> 00:17:40.333 +มันจะต้องใช้สิ่งที่ชื่อว่า embedding model เนาะนะครับ + +00:17:40.400 --> 00:17:42.633 +ก็เป็น LLM sub ของ LLM + +00:17:42.700 --> 00:17:46.633 +ที่เอาไว้สำหรับแบบหาความหมายของคำนั้นๆ นะครับ + +00:17:47.500 --> 00:17:49.433 +ผมคงไม่ลงลึกว่ามันถูก train มายังไง + +00:17:49.500 --> 00:17:51.233 +หลักๆ ก็คือว่า มันจะถูก train + +00:17:51.300 --> 00:17:53.533 +มันจะมีการ match คำกับความหมายนะครับ + +00:17:53.800 --> 00:17:55.033 +เป็น vector แบบนี้ + +00:17:55.100 --> 00:17:56.533 +แล้วจากนั้น พอมันได้คำหมายเข้าไป + +00:17:56.600 --> 00:17:59.133 +มันก็จะพยายาม expose หรือว่า return + +00:17:59.200 --> 00:18:02.033 +ตัว vector ออกมาให้เรานะครับเนาะ + +00:18:02.100 --> 00:18:03.833 +มองมันเป็น array of number ก็ได้นะฮะ + +00:18:04.700 --> 00:18:10.833 +โอเค แล้วคราวนี้ vector search คืออะไรนะครับ พอเรามี + +00:18:11.500 --> 00:18:14.633 +อย่างที่บอกเนาะ พยายามที่จะหา semantic search + +00:18:15.000 --> 00:18:16.633 +semantic คือความหมายใช่ไหมครับ + +00:18:16.700 --> 00:18:18.433 +เราจะแบบทำ pattern matching ไม่ได้แล้ว + +00:18:18.500 --> 00:18:20.833 +สิ่งที่มันสามารถทำได้ก็คือ + +00:18:21.200 --> 00:18:23.433 +เราเอา vector เนี่ย ที่มันเป็นตัวเลขเนี่ย + +00:18:23.500 --> 00:18:26.333 +ใช่ไหมครับ ตัวเลขเนี่ยอาจจะเป็น array ใช่ไหมครับ + +00:18:28.500 --> 00:18:32.533 +สมมติว่า array มีตัวเลขอยู่ในนั้นซัก 10 ตัวครับเนาะ + +00:18:32.600 --> 00:18:35.633 +10 ตัวเนี่ยเราก็คือมี array 10 ตัวเนี่ย + +00:18:35.700 --> 00:18:37.033 +เมื่อ plot ออกมาเป็นกราฟครับ + +00:18:37.100 --> 00:18:38.033 +ถ้าเรา plot มาเป็นกราฟเนาะ + +00:18:38.100 --> 00:18:40.033 +เราสามารถ plot เป็นกราฟแบบ 10 มิติได้นะครับ + +00:18:40.300 --> 00:18:43.133 +ซึ่ง 10 มิติเป็นยังไงก็ไม่รู้นะครับ แต่ว่าเราจะสามารถ plot มา + +00:18:43.200 --> 00:18:45.233 +ในการเข้าสมการทางคณิตศาสตร์ตัวนึงนะครับ + +00:18:45.300 --> 00:18:49.133 +ก็คือการหา similarity บางอย่างนะครับ ไอ้จุดตรงนี้ครับ + +00:18:49.700 --> 00:18:52.933 +จุดตรงนี้ครับ มันก็คือ array ที่มีเลขอยู่ข้างในนะครับ + +00:18:53.200 --> 00:18:56.533 +แล้วจากนั้นเนี่ย เมื่อมันเข้าสมการตรงนั้นแล้วมัน plot ออกมาครับ + +00:18:56.600 --> 00:18:58.933 +มันก็จะกลายเป็นจุดที่อยู่บนนี้เนาะ + +00:18:59.000 --> 00:18:59.733 +แล้วจากนั้นนะครับ + +00:18:59.800 --> 00:19:02.333 +เราก็จะเห็นว่าจุดบางจุดอยู่ใกล้กับจุดอื่นๆ นะครับ + +00:19:02.400 --> 00:19:04.433 +ในขณะที่จุดบางจุดอยู่ไกลจังเลยนะครับ + +00:19:05.000 --> 00:19:07.833 +นี่แหละครับ คือการทำสิ่งที่ชื่อว่า semantic search + +00:19:08.800 --> 00:19:12.233 +หรือว่าการหา similarity ความหมายของมันเนาะ + +00:19:12.300 --> 00:19:14.133 +อย่าง 2 จุดนี้ครับ มันมีความหมายที่ใกล้กัน + +00:19:14.200 --> 00:19:16.833 +เพราะฉะนั้นมันจะต้องสามารถถูก group + +00:19:16.900 --> 00:19:19.833 +หรือว่าถูกดึง หรือว่าถูก search แล้วเนี่ย + +00:19:19.900 --> 00:19:21.233 +มันจะต้องมี score ที่สูงกว่า + +00:19:21.300 --> 00:19:24.333 +เมื่อหาความใกล้เคียงกันของ 2 คำนี้ ใช่ไหมครับ + +00:19:25.200 --> 00:19:29.333 +โอเคครับ + +00:19:30.000 --> 00:19:38.533 +MongoDB ครับ มีการทำสิ่งที่ชื่อว่า vector search ครับ + +00:19:38.600 --> 00:19:41.533 +vector search มองมันเป็น index ตัวนึงครับ + +00:19:41.800 --> 00:19:45.533 +มันคือการพยายามที่จะสร้าง index ตัวนึงขึ้นมาครับ + +00:19:45.600 --> 00:19:47.533 +แล้วก็ใช้ machine learning model ครับ + +00:19:47.600 --> 00:19:51.333 +ในการที่จะเอาค่าจาก index ตัวนี้ครับ + +00:19:51.400 --> 00:19:55.733 +ไป operate ในการ search หรือหาอะไรบางอย่างนะครับ + +00:19:55.800 --> 00:20:00.833 +อย่างตรงนี้ครับ ก็เป็นfield ในการสร้างนะครับเนาะ + +00:20:00.900 --> 00:20:03.433 +ก็ function similarity ครับ + +00:20:03.500 --> 00:20:06.133 +หรือว่าก็คือเนี่ย วิธีการที่เราจะหาไอ้จุด 2 จุดนี้ + +00:20:06.200 --> 00:20:08.433 +มันใกล้กันไหมเนี่ย มีหลาย function นะครับ + +00:20:08.900 --> 00:20:10.633 +machine learning model ที่เขาใช้ + +00:20:10.700 --> 00:20:12.433 +ณ ปัจจุบันแล้วก็กำลังจะมีเพิ่มขึ้นเรื่อยๆ + +00:20:12.500 --> 00:20:24.733 +function ที่เราจะสามารถหา similarity + +00:20:24.800 --> 00:20:27.733 +ข้างในได้ปัจจุบันนะครับ มีอยู่ 3 ตัวนะครับเนาะ + +00:20:28.000 --> 00:20:29.733 +ก็คือ similarity function นะครับ + +00:20:29.800 --> 00:20:31.933 +ถ้าใครเรียน math มาเนาะ euclidean, cosine + +00:20:33.400 --> 00:20:36.633 +แล้วก็ตัว dot product ถูกไหมครับเนาะ + +00:20:37.100 --> 00:20:42.933 +เดี๋ยวผมลองเปิดให้ดูนะครับว่าหน้าตาของมันเป็นยังไงเนาะ + +00:20:47.500 --> 00:20:49.733 +โอเค เดี๋ยวเปิดให้ดูนะครับ + +00:20:49.800 --> 00:20:50.933 +แต่ว่ามันเป็นอย่างนี้แหละครับ + +00:20:51.000 --> 00:20:53.833 +หน้าตาตัวนี้คือผมก็แคปออกมาจากตัวนั้นแหละนะครับ + +00:20:53.900 --> 00:20:58.533 +เดี๋ยวเอาไว้เปิดให้ดูตอนเรา walk through code แล้วกันนะครับ + +00:20:59.800 --> 00:21:03.233 +คราวนี้ครับ เราเก็บ data ยังไงนะครับ + +00:21:03.300 --> 00:21:04.733 +เรา cache ยังไงนะครับ + +00:21:04.800 --> 00:21:06.033 +เดี๋ยวลองมา walk through กันครับ + +00:21:08.900 --> 00:21:13.833 +วิธีการที่เรา retrieve cache ก่อนนะครับ + +00:21:14.300 --> 00:21:15.733 +มันน่าจะ simple สุดนะครับ + +00:21:15.800 --> 00:21:17.633 +เดี๋ยวผมจะเปิดให้ดูนะฮะ + +00:21:17.700 --> 00:21:19.933 +retrieve cache จะทำแบบนี้ครับ เรามี question + +00:21:20.500 --> 00:21:22.133 +เราเอา question ที่ได้มาครับ + +00:21:22.200 --> 00:21:24.333 +embed เข้าไปในตัว embedding model + +00:21:24.600 --> 00:21:25.933 +เพื่อ get vector ออกมาเนาะ + +00:21:26.500 --> 00:21:31.433 +เอา vector ที่ได้ครับ ไป search ผ่านกระบวนการที่ 3 ครับ + +00:21:31.500 --> 00:21:34.033 +แล้วจากนั้นเมื่อมันได้ เมื่อมัน search แล้วมันหา similarity ได้ + +00:21:34.100 --> 00:21:35.833 +มันจะ return ออกมาในกระบวนการที่ 4 นะครับ + +00:21:35.900 --> 00:21:38.733 +เดี๋ยวลองดูทำยังไงนะฮะ + +00:21:39.100 --> 00:21:43.833 +ผมมีไฟล์ที่ชื่อว่า app_cache นะครับเนาะ + +00:21:43.900 --> 00:21:46.233 +app_cache ทำอะไรครับ อันเดิมเลยครับ + +00:21:46.900 --> 00:21:48.933 +อันเดิมเลยเนาะ อันเดิมเลยนะครับ + +00:21:49.000 --> 00:21:51.133 +monitoring assistant นะครับ + +00:21:51.700 --> 00:21:54.733 +หน้าที่ของเขาครับ เมื่อเขาได้รับคำสั่งเข้ามาครับ + +00:21:54.800 --> 00:22:01.733 +อย่างเช่น How about my system today เนาะ + +00:22:04.300 --> 00:22:05.033 +มันจะไม่เห็นภาพ + +00:22:05.300 --> 00:22:08.433 +ผมว่าผมลองถามคำถามที่มันแบบต่างกันมากๆ เลยครับ + +00:22:12.200 --> 00:22:15.533 +ไม่น่าจะตอบได้นะ ถ้าผมชื่ออะไรนะ มันจะตอบได้ไหม + +00:22:17.000 --> 00:22:18.033 +Sorry, I don't know ครับ + +00:22:18.100 --> 00:22:19.933 +I have no access to your private information. + +00:22:20.000 --> 00:22:21.733 +That's good นะครับ โอเคนะครับ + +00:22:21.800 --> 00:22:24.033 +หรือว่าถ้าเกิดว่าเราลองถามอะไรที่มันแบบยาวกว่าหน่อย + +00:22:24.100 --> 00:22:24.933 +ที่มันเกี่ยวกับ system เนาะ + +00:22:31.500 --> 00:22:33.633 +ครับ คิดว่าสิ่งที่เราจะเบรกไหมครับ อาทิตย์หน้า + +00:22:37.500 --> 00:22:39.933 +อืม สิ่งที่มันทำก็คือมันพยายามที่จะ get + +00:22:40.000 --> 00:22:44.233 +เอาพวกข้อมูลที่มันเป็นดีนายอะนะครับ + +00:22:44.300 --> 00:22:46.333 +ข้อมูลที่มันแบบแปลกๆ ออกมาเนาะ + +00:22:46.400 --> 00:22:48.233 +แล้วก็พยายามวิเคราะห์ให้เรา ใช่ไหมครับ + +00:22:48.900 --> 00:22:51.633 +โอเค วิธีการที่มัน retrieve คือมันทำแบบนี้ครับเนาะ + +00:22:51.700 --> 00:22:54.533 +มันเอาอันนี้เข้ามา embed เสร็จปุ๊บครับ ครับผม + +00:22:55.700 --> 00:22:59.733 +Q: เรารู้ได้ยังไงครับว่า cache เรามันกว้างเกินไป + +00:23:00.500 --> 00:23:04.333 +อย่างเช่น อย่างเมื่อกี้ถามว่าอาทิตย์หน้าฝนจะตกหรือเปล่า + +00:23:04.900 --> 00:23:08.033 +ครับ มันตอบออกมา มันเอาตอบมาให้อยู่ ครับ + +00:23:08.100 --> 00:23:12.233 +แต่ไม่ใช่สิ่งที่เราอยากได้ + +00:23:12.500 --> 00:23:16.033 +แต่กลายเป็นว่า similarity score มันคล้ายมากเกินไป + +00:23:16.100 --> 00:23:19.833 +อะไรเงี้ยครับ ถ้าเจออย่างงี้จะต้องทำยังไงครับ ครับ + +00:23:19.900 --> 00:23:22.333 +James: โดยส่วนใหญ่นะครับ เวลาที่เรา cache นะครับ + +00:23:22.400 --> 00:23:26.933 +เราจะพยายาม cache จากตัวของเป็นคำที่นะครับ + +00:23:27.000 --> 00:23:31.633 +จากตัวของ meaning ที่เราจะต้องดู 2 ส่วนเนาะ + +00:23:31.700 --> 00:23:33.833 +หลักๆ ที่เคยทำมาครับ meaning ของมันครับ + +00:23:34.100 --> 00:23:36.433 +กับตัว cache ของเราเองด้วยครับ + +00:23:36.700 --> 00:23:41.133 +อย่างเช่นนะครับ อย่างเช่น ถ้ามันถามว่า next week + +00:23:41.200 --> 00:23:42.833 +เนี่ยครับ next week เป็นคำที่กว้างเนาะ + +00:23:42.900 --> 00:23:44.533 +next week เนี่ย จริงๆ แล้ว next week นะครับ + +00:23:44.600 --> 00:23:46.633 +สิ่งที่มันควรจะเป็นจริงๆ ก็คือมันควรจะต้องไม่ได้ + +00:23:46.700 --> 00:23:47.933 +เอาแค่ว่า next week คืออะไร + +00:23:48.000 --> 00:23:50.533 +แต่มันควรจะต้องเอา data ของปัจจุบันมาด้วยถูกไหมฮะ + +00:23:50.600 --> 00:23:52.533 +ว่า today คืออะไรใช่ไหมครับ + +00:23:52.600 --> 00:23:54.833 +แล้วพยายามวิ่งไปหา next week จาก today + +00:23:54.900 --> 00:23:56.233 +วิ่งไปข้างหน้าถูกไหมฮะ + +00:23:56.300 --> 00:23:59.733 +อะ ถ้าเป็นแบบเนี้ยครับ เรา สิ่งที่เราต้องทำก็คือว่า + +00:23:59.800 --> 00:24:02.133 +ไอ้ตอนที่มันไปดึง เราก็ต้องไป define + +00:24:02.200 --> 00:24:04.433 +ตัว pre-define function ของมันอะนะครับเนาะ + +00:24:04.500 --> 00:24:06.033 +ซึ่งอยู่ตรงเนี้ยนะ นะครับ + +00:24:06.100 --> 00:24:07.633 +ให้มันมี function ตัวนึงนะครับ + +00:24:07.700 --> 00:24:10.733 +ที่มันเอาไว้สำหรับว่าถ้ามันมีการถามเกี่ยวกับเวลาครับ + +00:24:10.800 --> 00:24:12.633 +ให้มันเรียก function นี้ก่อนนะครับ + +00:24:12.700 --> 00:24:14.633 +แล้ว function เนี้ย บอกเค้าว่าโอเค + +00:24:14.700 --> 00:24:16.633 +คำว่า next week กับเวลาของมันจริงๆ คือแบบนี้ครับ + +00:24:16.900 --> 00:24:20.033 +แล้วจากนั้นครับ มันก็ เราก็เอาไอ้สิ่งเนี้ยครับ + +00:24:20.700 --> 00:24:24.533 +ไป look up ต่อเนาะว่า เฮ้ย ใน cache ของเราเนี่ยครับ + +00:24:24.600 --> 00:24:25.633 +มันเป็นแบบไหนนะครับ + +00:24:25.700 --> 00:24:27.233 +ซึ่งเราสามารถกดเข้าไปใน embed ได้ + +00:24:27.300 --> 00:24:29.033 +แต่ตอนเนี้ยครับ วิธีที่ผม embed เข้าไปเนี่ย + +00:24:29.100 --> 00:24:31.533 +คือผม embed question อย่างเดียว โอเคไหมฮะ + +00:24:31.600 --> 00:24:33.733 +มันเลย มันเลยใช่ครับ มันเลยกว้างไปนิดนึงครับ + +00:24:33.800 --> 00:24:35.433 +ถ้าเกิดว่าจะ embed ในกรณีแบบเนี้ยครับ + +00:24:35.500 --> 00:24:37.233 +เราควรจะ embed ทั้ง question และ embed + +00:24:37.300 --> 00:24:40.533 +ทั้ง time ซึ่งเป็น specific range ลงไปด้วยครับ + +00:24:40.600 --> 00:24:42.533 +มันก็จะ specific ข้อความมากขึ้น + +00:24:43.300 --> 00:24:47.133 +Q: คือผมจะบอกว่า ถ้าสมมติว่าเราไม่ทำ cache เนี่ย + +00:24:47.700 --> 00:24:49.333 +แล้วถ้าเราถามคำถามเมื่อกี้ไป + +00:24:50.500 --> 00:24:53.333 +มันควรจะตอบว่ามันไม่มีข้อมูล…ถูกต้องไหมครับ + +00:24:55.500 --> 00:25:00.633 +ขอคำถามใหม่ครับ คือ สมมติว่าถ้าไม่ได้ทำ cache + +00:25:00.900 --> 00:25:04.233 +ถ้าไม่ได้ cache ตัว embedding ไว้ + +00:25:04.800 --> 00:25:05.733 +แล้วเราถามคำถามว่า ที่ไม่เกี่ยวข้องกับ function + +00:25:05.800 --> 00:25:07.433 +ที่เรามีให้เนาะ ใช่ปะ ครับ + +00:25:07.600 --> 00:25:10.633 +มันก็ควรจะตอบคล้ายๆ กับที่มันตอบที่ที่เราถามว่า + +00:25:11.000 --> 00:25:11.833 +พ่อเราชื่ออะไร + +00:25:11.900 --> 00:25:14.433 +James: อ๋อ ใช่ครับ ถ้าเรา define function + +00:25:14.500 --> 00:25:16.433 +ที่มันแบบกำหนดเวลาไปแล้วเนาะ ใช่ครับ + +00:25:16.500 --> 00:25:17.233 +มันควรจะตอบแบบนั้น แต่ว่าพอเราทำ cache เสร็จ + +00:25:17.800 --> 00:25:18.333 +ใช่ครับ ครับ + +00:25:18.900 --> 00:25:20.633 +Q: แต่พอเราทำ cache + +00:25:20.700 --> 00:25:23.033 +ปรากฏว่าคำถามที่มันไม่ควรจะเข้า cache + +00:25:23.400 --> 00:25:25.333 +มันก็เลยมีโอกาสที่มันจะเข้า cache ครับ + +00:25:26.100 --> 00:25:28.933 +James: มันจะไม่เข้า cache ครับ เพราะว่าถ้าเกิดว่าเราทำแบบนั้นปุ๊บ + +00:25:29.000 --> 00:25:31.633 +เรา อย่างที่บอกครับ ตอนเนี้ยเราใช้ query + +00:25:31.900 --> 00:25:34.533 +ในการทำ embed เข้าไปถูกไหมครับ + +00:25:34.600 --> 00:25:35.733 +แต่ถ้าเกิดว่าเราทำแบบนั้นปุ๊บ + +00:25:36.100 --> 00:25:37.833 +เราจะไม่ได้ใช้แค่ query ในการ embed + +00:25:37.900 --> 00:25:40.633 +เราจะใช้ query บวกกับเวลา embed เข้าไปเลยครับ + +00:25:40.700 --> 00:25:42.733 +เพราะฉะนั้น meaning ของมันจะไม่ใช่แค่ query แล้ว + +00:25:42.800 --> 00:25:45.033 +มันคือ query บวกเวลาและ เพราะฉะนั้นนะครับ + +00:25:45.100 --> 00:25:46.933 +embedding vector ที่ได้ออกมาเนี่ย + +00:25:47.000 --> 00:25:48.333 +ก็จะไม่เหมือนกัน ครับ + +00:25:48.400 --> 00:25:50.033 +ค่าของ score ก็จะต่ำลงมา + +00:25:50.100 --> 00:25:52.733 +แต่อันนี้ก็ขึ้นอยู่กับว่าเราวัด score ยังไง ครับ + +00:25:54.200 --> 00:25:56.733 +ครับ โอเคครับ เดี๋ยวๆ ให้ดู score ครับ + +00:25:56.800 --> 00:25:58.733 +มันมีวิธีวัด score ของมันอยู่เนาะ นะครับ + +00:26:01.400 --> 00:26:02.833 +กำลังนึกอยู่ว่าถึงไหนแล้วนะฮะ + +00:26:02.900 --> 00:26:08.933 +โอเค วิธีการครับก็คือ พอวิ่งเข้ามาปุ๊บ ใช่ไหมครับ + +00:26:09.000 --> 00:26:13.133 +อะ monitoring ใช่ไหมครับ เสร็จปุ๊บใช่ไหมครับ + +00:26:13.200 --> 00:26:14.633 +วิธีการที่ผมทำก็คือ อะ + +00:26:14.700 --> 00:26:16.833 +ผมลองเข้าไปดูที่ cache handler นะครับ + +00:26:17.200 --> 00:26:19.233 +มันเป็น class ตัวนึงที่ผมสร้างขึ้นมาเองนะฮะ + +00:26:26.000 --> 00:26:28.933 +เออ ผมพึ่งรู้ว่าเค้ามีสิ่งนี้ให้เราแล้วนะฮะ โอเคฮะ + +00:26:31.100 --> 00:26:33.633 +เอิ่ม อะ ลอง find ดูนะครับ จริงๆ อะครับ + +00:26:33.700 --> 00:26:36.733 +ไอ้เจ้าตัว vector index อะครับ มันก็คือ + +00:26:37.300 --> 00:26:39.733 +เราสามารถที่จะ retrieve data ของมันออกมาได้ + +00:26:39.800 --> 00:26:42.433 +จากการทำ aggregation pipeline นะครับ + +00:26:42.500 --> 00:26:44.233 +aggregation pipeline ของผมเนี่ยนะครับ + +00:26:44.300 --> 00:26:47.233 +ก็คือแบบนี้เลยครับ ก็คือเรา วิ่งเข้าไปนะครับ + +00:26:47.300 --> 00:26:49.833 +เอา text มาครับ เอา text ไป get embedding ออกมาครับ + +00:26:49.900 --> 00:26:52.633 +จากนั้นเสร็จปุ๊บ เอาไปใส่ vector search นะครับ + +00:26:52.900 --> 00:26:55.033 +ก็บอกไปครับ อันนี้ก็คือตัวกำหนดแหละว่า + +00:26:55.100 --> 00:26:57.133 +เออ เราใช้ index อะไร path อะไรนะครับ + +00:26:57.200 --> 00:26:59.733 +อะ เดี๋ยวเราลองดูเนาะ นี่คือ cache ของผมนะครับ + +00:27:00.200 --> 00:27:02.233 +cache ผมเนี่ยมีอะไรบ้าง ผมมี query นะครับ + +00:27:02.600 --> 00:27:06.933 +อ่า มี response นะครับ แล้วก็มี embedding นะครับ + +00:27:07.000 --> 00:27:08.433 +วิธีการที่ผมก็คือระบุเข้าไปว่า + +00:27:08.500 --> 00:27:11.833 +เออ path ในการที่จะใช้ embed ข้อมูลอะ มันคือตัวนี้นะ + +00:27:12.100 --> 00:27:15.033 +นะครับ จากนั้นเสร็จปุ๊บครับ ก็โยนเข้าไปครับ + +00:27:15.100 --> 00:27:17.633 +แล้วก็นัมเบอร์ออฟ candidate ก็คือตัว ตัว candidate + +00:27:17.700 --> 00:27:19.533 +อะครับ ที่ ที่เป็น สุด + +00:27:19.600 --> 00:27:21.533 +ถ้าเกิดว่าเรากลับไปดูกราฟอะเนาะ มันจะมีจุดๆๆ + +00:27:21.600 --> 00:27:24.333 +ใช่ไหมครับ ก็ลองดูครับว่าถ้าเกิดข้อมูลนี้วิ่งเข้าไปเนี่ย + +00:27:24.400 --> 00:27:26.933 +แล้วแบบ มันมี candidate ที่อยู่ใกล้กันเนี่ย + +00:27:27.000 --> 00:27:29.833 +จำนวน 20 ตัวเนี่ย ไหมเนี่ย + +00:27:29.900 --> 00:27:32.233 +เมื่อมัน match นะครับ ก็ให้มัน extract ออกมาเนาะ + +00:27:32.300 --> 00:27:35.433 +นะครับ จากนั้นครับ ผมก็ทำการครับ add field + +00:27:35.500 --> 00:27:36.733 +สิ่งที่ชื่อว่า score เข้าไปครับ + +00:27:36.800 --> 00:27:39.633 +โดยการดึงตัว vector search score เข้ามาใส่นะครับ + +00:27:39.700 --> 00:27:41.733 +จากนั้นครับ ผมจะไม่ได้เอามาทั้งหมดเนาะ + +00:27:41.800 --> 00:27:43.033 +เพราะอย่างที่บอกครับ บางทีเนี่ย + +00:27:43.300 --> 00:27:45.533 +ความแม่นของมันเนี่ยก็ขึ้นกับ score นะครับ + +00:27:45.600 --> 00:27:48.033 +แต่ว่า score เนี่ยยิ่งแม่นเท่าไหร่ + +00:27:48.100 --> 00:27:51.833 +ก็จะยิ่ง retrieve ข้อมูลออกมาได้ เจาะจงแหละ yes นะครับ + +00:27:51.900 --> 00:27:55.733 +แต่ก็ถ้าเกิดว่า มันขึ้นกับหลายแบบเนาะ บางทีเนี่ย + +00:27:56.200 --> 00:27:58.333 +model ที่เราใช้อะครับ ในการที่เรา embed + +00:27:58.400 --> 00:28:00.333 +ค่าเข้าไปครับ มันอาจจะเป็น model ที่ pre-train + +00:28:00.400 --> 00:28:03.133 +มาแล้วมันรู้จักคำได้น้อยกว่า model อีกตัวนึง + +00:28:03.200 --> 00:28:06.033 +ที่มีความแม่น แต่ก็แลกมากับความเบาใช่ไหมครับ + +00:28:06.700 --> 00:28:07.733 +ตัว score ตรงเนี้ยครับ + +00:28:07.800 --> 00:28:09.933 +มันก็ต้องปรับให้ตรงกับตรงนั้นนะครับ + +00:28:10.000 --> 00:28:11.133 +อย่างผมเคยใช้อันนี้ + +00:28:11.200 --> 00:28:15.433 +ผมน่าจะใช้เป็น Azure OpenAI แบบ small embedding + +00:28:15.500 --> 00:28:16.433 +model นะครับ + +00:28:16.800 --> 00:28:18.933 +อ่า keyword เดียวกันนะครับ + +00:28:19.000 --> 00:28:21.133 +เมื่อเทียบกับที่มันเป็น large ตัว embedding model + +00:28:21.200 --> 00:28:23.733 +นะครับ score ต่างกันประมาณ 20 0.20 + +00:28:23.800 --> 00:28:24.733 +อะไรอย่างเงี้ยนะครับ + +00:28:25.200 --> 00:28:26.733 +ก็อันนี้ก็ต้องมา fine-tune กันเนาะ + +00:28:26.800 --> 00:28:28.733 +ก็เป็นงาน in general ของเรานะครับ + +00:28:28.800 --> 00:28:32.333 +ก็วัด score ออกมาครับ เสร็จปุ๊บยิงเข้า aggregation ครับ + +00:28:32.800 --> 00:28:34.333 +แล้วก็ return result ออกมาครับ ครับ + +00:28:36.000 --> 00:28:38.533 +เราก็จะได้ result ออกมาว่า เออ มัน มันเจอไหมครับ + +00:28:38.800 --> 00:28:41.533 +ถ้ามันเจอครับ return ออกมาเลยครับเนาะ ใช่ไหม + +00:28:41.900 --> 00:28:45.633 +ถ้ามันไม่เจอ ก็ ก็ตามท่า cache ไปต่อครับ + +00:28:45.700 --> 00:28:49.433 +คำนวณครับ ก็เอาเลยครับ ก็สร้าง prompt ใช่ไหมครับ + +00:28:49.500 --> 00:28:52.633 +ดูซิว่ามันต้องดึง function ไหม ถ้ามันต้องดึงก็ดึงครับ + +00:28:53.200 --> 00:28:57.633 +ดึงอะไรเสร็จปุ๊บ อ่า ผมน่าจะเอาไว้แถวนี้ + +00:28:59.800 --> 00:29:02.633 +อ่า นี่ครับ จริงๆ มันมี 2 ที่นะ มีที่นี่กับที่ข้างล่างนะ + +00:29:02.700 --> 00:29:06.933 +อะ การเซฟครับ ก็ ตรงไปตรงมาครับ + +00:29:07.000 --> 00:29:10.433 +คือการเซฟเนี่ยก็คือว่าเราจะไม่ได้เซฟผ่าน + +00:29:11.800 --> 00:29:14.233 +เราจะไม่ได้เซฟผ่าน pattern matching ใช่ไหมครับ + +00:29:14.300 --> 00:29:15.933 +เราจะเซฟผ่าน path + +00:29:16.000 --> 00:29:19.733 +ตัว embedding ที่เราได้ออกมาก็คือ vector ใช่ไหมครับ + +00:29:19.800 --> 00:29:21.133 +เพื่อให้มันทำ vector search ได้นะครับ + +00:29:21.400 --> 00:29:23.433 +แล้วจากนั้นเนี่ยเราก็ ที่ผมใส่ query + +00:29:23.500 --> 00:29:25.033 +เข้าไปเพื่อให้มันเห็นภาพมากขึ้นเนาะว่า + +00:29:25.100 --> 00:29:27.233 +เออ ไอ้ตรงนี้มันคือ query อะไรนะครับเนาะ + +00:29:27.500 --> 00:29:29.133 +แล้วก็ใส่ embedding เข้าไปนะครับ + +00:29:29.200 --> 00:29:30.533 +ใส่ response เข้าไปนะครับ + +00:29:31.500 --> 00:29:34.033 +จากนั้นปุ๊บพอเซฟก็จะได้ออกมาเป็นแบบนี้ นะฮะ + +00:29:34.100 --> 00:29:40.933 +ก็ ครับ จริงๆ แล้ว ถ้าเกิดว่าเราอยากจะให้มัน + +00:29:41.000 --> 00:29:42.033 +มีความเจาะจงมากขึ้น + +00:29:42.100 --> 00:29:44.333 +อย่างเช่นพี่ท่านเมื่อกี้พูดเป็นคำถามที่ดีนะครับ + +00:29:44.400 --> 00:29:46.233 +หรือว่ามันจะต้องมี scenario บางอย่าง + +00:29:46.300 --> 00:29:47.633 +ที่มันใช้แค่ query ไม่ได้ + +00:29:47.700 --> 00:29:49.233 +เป็น question ไม่ได้เนี่ยนะครับ + +00:29:49.300 --> 00:29:51.033 +เราก็จะต้องเอาตรงนั้นนะครับ เข้าไป embed + +00:29:51.100 --> 00:29:52.633 +กับ model ด้วย เพื่อให้ model มัน + +00:29:52.700 --> 00:29:55.333 +มันสามารถบอกได้ว่าไอ้สิ่งเนี้ยมันเจาะจงมากขึ้นนะ + +00:29:55.400 --> 00:29:56.933 +พอเวลามันวัด score ออกมาครับ + +00:29:57.500 --> 00:29:59.733 +ของคำสั่งตัวเนี้ยเนาะ นะครับ score ของมันเนี่ย + +00:29:59.800 --> 00:30:03.833 +จะได้ไม่ mess กับตัวของ + +00:30:03.900 --> 00:30:06.233 +criteria ที่เราตั้งนะครับ + +00:30:06.300 --> 00:30:10.433 +อันนี้ก็ต้อง fine-tune กันอีกทีนึงนะครับ โอเคนะครับ + +00:30:12.400 --> 00:30:19.233 +โอเคครับ ทั้งหมดทั้งมวลครับ + +00:30:19.800 --> 00:30:21.933 +อันนั้นก็คือกระบวนการในการเซฟครับผม + +00:30:22.000 --> 00:30:24.733 +เอ่อ เซฟก็แบบนี้ครับ มี question ปุ๊บ + +00:30:24.800 --> 00:30:27.233 +fetch answer fetch answer เสร็จปุ๊บครับ เชิญครับผม + +00:30:28.000 --> 00:30:33.433 +Q: แล้วเราจะ define semantic rules ที่ไหนครับ + +00:30:33.500 --> 00:30:35.133 +คือเวลาเราหา semantic meaning เนี่ย + +00:30:36.200 --> 00:30:38.033 +มันก็แบบสามารถ define rules ได้ว่า + +00:30:38.100 --> 00:30:43.333 +ถ้าเกิดว่า query หรือ query ประมาณนี้ให้ตอบอย่างงี้ + +00:30:43.400 --> 00:30:44.433 +เราจะ config ที่ไหน + +00:30:45.200 --> 00:30:47.333 +James: อ๋อ หมายถึง config ให้ MongoDB มัน + +00:30:47.400 --> 00:30:48.833 +มัน search ให้เราอย่างงี้ใช่ไหมครับ + +00:30:48.900 --> 00:30:49.933 +คำถามคือแบบนั้นใช่ไหม + +00:30:50.300 --> 00:30:52.833 +โอเคครับ + +00:30:53.200 --> 00:30:56.833 +Q: ให้มันว่าอย่างเช่นถ้าถามแบบนี้เราจะไม่ cache นะ + +00:30:57.200 --> 00:30:58.433 +มันต้องกดให้มันลืมขึ้น + +00:30:59.600 --> 00:31:05.233 +James: อ๋อ หมายถึงว่าจะ cache ไหมใช่ไหมฮะ ใช่ครับ + +00:31:05.300 --> 00:31:09.733 +จริงๆ อันเนี้ยครับ มันเป็น เป็น logic ที่ + +00:31:10.600 --> 00:31:12.933 +เรา เรา เราทำเพิ่มเองขึ้นมาครับ + +00:31:13.000 --> 00:31:14.733 +คืออันนี้จะไม่ได้เกี่ยวกับ MongoDB และ MongoDB + +00:31:14.800 --> 00:31:17.033 +มีหน้าที่อย่างเดียวก็คือทำ index + +00:31:17.700 --> 00:31:21.233 +แล้วก็ search ผ่านตัว function บางอย่างใช่ไหมครับ + +00:31:21.300 --> 00:31:23.233 +อันเนี้ยครับ มันจะต้องเป็นฝั่ง application layer + +00:31:23.500 --> 00:31:26.033 +ของเราและว่าเราจะ cache มันไหมใช่ไหมครับ + +00:31:26.700 --> 00:31:31.233 +ถ้าที่ผมเคยทำครับ โดยปกติเราจะพยายาม cache + +00:31:31.900 --> 00:31:35.333 +จากก็คือมันก็จะกลับไปที่ตัว Azure อ่า + +00:31:35.400 --> 00:31:36.233 +ตัว OpenAI เลยครับ + +00:31:36.300 --> 00:31:38.133 +เรามี pre-define function ถูกไหมครับ + +00:31:38.200 --> 00:31:40.333 +เราก็พยายามให้มัน get ดูครับว่า + +00:31:40.400 --> 00:31:41.433 +เราก็พยายาม define เข้าไปครับว่า + +00:31:41.700 --> 00:31:43.333 +เออ ถ้ามันเป็นข้อมูลประมาณเนี้ย + +00:31:43.400 --> 00:31:45.733 +หรือมันถามประมาณเนี้ย หรือมันออกมาเป็นประมาณเนี้ย + +00:31:45.800 --> 00:31:47.433 +เฮ้ย เรียก function นี้นะ + +00:31:47.500 --> 00:31:49.233 +แล้ว function นั้นก็จะเป็น function ที่กำหนดครับ + +00:31:49.300 --> 00:31:50.233 +ว่ามันจะ cache หรือไม่ + +00:31:50.700 --> 00:31:53.533 +ให้ตรงเนี้ยครับ เป็นตัว define meaning ของมัน ครับ + +00:31:55.400 --> 00:31:59.333 +โอเค ไม่แน่ใจว่าเหลืออีกประมาณ หมดเวลาแล้ว + +00:31:59.400 --> 00:32:01.133 +โอเค ครับ จริงๆ หมดแล้วครับ + +00:32:02.000 --> 00:32:04.733 +เซฟครับ เร็วๆ แล้วกันฮะ มี question + +00:32:05.100 --> 00:32:06.433 +fetch answer ออกมาครับ + +00:32:06.500 --> 00:32:11.333 +แล้วเราก็ embed ตัว embed ตัวของ question เนาะ + +00:32:11.400 --> 00:32:16.433 +นะครับ แล้วก็เซฟ 3 กับ 2 ลงไปใน database นะฮะ + +00:32:17.700 --> 00:32:21.733 +ครับ เอิ่ม ทั้งหมดทั้งมวลครับ จริงๆ มี article อยู่ครับ + +00:32:21.800 --> 00:32:24.733 +ผมพึ่ง publish กับ MongoDB Developer Center นะครับ + +00:32:24.800 --> 00:32:26.833 +เผื่อว่าอยากลองไปลองทำกันดูนะครับ + +00:32:26.900 --> 00:32:28.233 +ก็สแกนตรงนี้ได้ครับ + +00:32:28.300 --> 00:32:30.233 +เดี๋ยวๆ แชร์อันนี้ให้ในกลุ่มด้วยครับ + +00:32:30.900 --> 00:32:32.933 +เอ่อ สไลด์ทุกอย่างก็แชร์ได้นะครับ ลองเอาไปเล่นดูเนาะ + +00:32:33.000 --> 00:32:37.933 +นะครับ โอเค อันนี้อันนึงครับ อะ ขอโปรโมทนิดนึงครับ + +00:32:38.000 --> 00:32:41.133 +Javascript Bangkok จะจัดวันที่ 18-19 ตุลาคมนะครับ + +00:32:41.700 --> 00:32:42.633 +เดือนหน้านะครับ + +00:32:42.700 --> 00:32:45.933 +ก็เรามี keynote หลักๆ ก็คือเป็นคนที่สร้าง + +00:32:46.000 --> 00:32:47.033 +Elysia framework เนาะ + +00:32:47.100 --> 00:32:48.933 +เป็นคนไทยคนนึงชื่อคุณออมนะครับ + +00:32:49.000 --> 00:32:52.033 +อีกคนนึงก็คือเป็นตัว Svelte core contributor นะครับ + +00:32:52.100 --> 00:32:55.633 +บินตรงมาจากไหนนะริฟฟี่ สิงคโปร์นะครับ + +00:32:55.700 --> 00:32:57.433 +ถ้าบินตรงมาจากพะเยาก็ไม่ได้นะครับ + +00:32:57.500 --> 00:32:59.133 +บินตรงมาจากสิงคโปร์นะครับ + +00:32:59.200 --> 00:33:01.433 +อ่า ก็มาลองดูกันได้นะครับ + +00:33:01.500 --> 00:33:03.233 +แล้วก็มี session อื่นๆ อีกมากมายนะครับ + +00:33:03.300 --> 00:33:05.033 +มี code ลด 10% ให้ตรงนี้ครับ + +00:33:05.100 --> 00:33:08.433 +แล้วก็เราวันนี้เรามี code JetBrains 2 ตัวมาใช่ไหมครับ + +00:33:09.200 --> 00:33:11.133 +อ่า แจกเลยไหม แจกเลยครับ + +00:33:11.200 --> 00:33:14.233 +ใครรู้บ้างครับว่า function ในการหา similarity + +00:33:14.300 --> 00:33:17.733 +ของ MongoDB นี่แหละ ดีกว่า + +00:33:17.800 --> 00:33:20.333 +เพราะว่า คนไม่ได้ลงอะ คือคนต้องเช็กอิน + +00:33:20.400 --> 00:33:22.533 +เออ ได้ๆ ใครยังไม่ได้เช็กอินก็เช็กได้ + +00:33:22.600 --> 00:33:24.933 +อะ เอาสักอันนึงแจกไปก่อนก็ได้ฮะ + +00:33:25.000 --> 00:33:26.133 +เพราะว่าผมอยากถามคำถามเดียวกัน + +00:33:26.200 --> 00:33:30.733 +ผมว่า ผมเคยตกสัมภาษณ์เพราะคำถามนี้นะครับ + +00:33:30.800 --> 00:33:32.833 +ใครจำได้บ้างครับว่า function ในการ search similarity + +00:33:32.900 --> 00:33:37.933 +ของ MongoDB มีอะไรบ้างครับ ใน vector search ครับ + +00:33:38.000 --> 00:33:43.533 +ใครจำได้บ้างครับ อ่า ยกมือครับ อะ อะ ยกมือครับ + +00:33:43.600 --> 00:33:45.233 +เชิญครับ + +00:33:45.300 --> 00:33:47.433 +Euclidean + +00:33:47.500 --> 00:33:49.633 +Cosine similarity + +00:33:49.700 --> 00:33:51.033 +Dot product + +00:33:51.100 --> 00:33:52.133 +อ๋อ ถูกต้องครับ ถูกต้องครับ + +00:33:52.200 --> 00:33:54.433 +นี่สัมภาษณ์ผ่านนะฮะ อันนี้ ไม่ตกแบบผมนะ + +00:33:55.100 --> 00:33:56.333 +นะครับ เชิญครับ เชิญครับ + +00:34:06.000 --> 00:34:09.132 +นะครับ โอเคครับ ก็ เอ่อ ประมาณนี้ครับ + +00:34:09.199 --> 00:34:11.132 +มีคำถามอะไรก็เดี๋ยวมาคุยกันนะครับ + +00:34:11.199 --> 00:34:13.033 +แล้วก็เดี๋ยว เบรกก่อน เอ่อ + +00:34:13.100 --> 00:34:14.233 +เดี๋ยวเบรกก่อนสักแป๊บนึงแล้วกันนะครับ + +00:34:14.300 --> 00:34:15.632 +โอเคครับ ขอบคุณทุกคนมากครับผม diff --git a/src/Event.ts b/src/Event.ts index a5f1536..1499402 100644 --- a/src/Event.ts +++ b/src/Event.ts @@ -114,4 +114,12 @@ const events = [ }, }), new Event('bkkjs21', 'BKK.JS #21'), + new Event('mongo0924', 'MongoDB.local Bangkok After Party', { + urlOverride: + 'https://www.eventpop.me/e/52729/mongodb-local-bangkok-2024-after-party', + externalOrganizer: { + name: 'MongoDB Thailand User Group', + url: 'https://mdb.link/thailand', + }, + }), ]

U?XDC6>oAku9E5$9#OzMD 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 BF;4&h literal 0 HcmV?d00001 diff --git a/data/videos/mongo0924/mongo8.md b/data/videos/mongo0924/mongo8.md new file mode 100644 index 0000000..54c2792 --- /dev/null +++ b/data/videos/mongo0924/mongo8.md @@ -0,0 +1,39 @@ +--- +title: What's new in MongoDB 8.0 +speaker: Piti Champeethong +youtube: wqedcVO_HKw +managed: true +published: false +subtitles: [th] +chapters: + '0:00': "แนะนำวิทยากรและหัวข้อ What's New in MongoDB 8.0" + '0:52': 'MongoDB เวอร์ชั่นต่างๆ และ ความสำคัญของ Community Edition' + '2:51': 'ฟีเจอร์ใหม่ใน MongoDB 8.0: Search และ Vector Search' + '6:19': 'เครื่องมือ Migration: ย้ายข้อมูลจาก Relational Database สู่ MongoDB' + '10:56': 'Modernization: อัพเกรดแอปพลิเคชั่นเก่าด้วย AI' + '12:41': '4 จุดเด่นของ MongoDB 8.0: Optimization, Workload, Scaling, Security' + '13:54': 'Optimization: Performance เร็วขึ้น, ยกตัวอย่างคำสั่งที่ปรับปรุง' + '17:17': 'การทำ Index ใน MongoDB: ESR Rule และ Best Practice' + '19:18': 'มาตรฐานใหม่ของ Performance: เปรียบเทียบ MongoDB 8.0 กับเวอร์ชั่น 7' + '22:11': 'Time Series Collection: จัดเก็บข้อมูล Real-time ได้ดีขึ้น' + '24:50': 'Machine Learning Model ใน MongoDB: ใช้สำหรับ Vector Search' + '25:28': 'Query Execution: ลดความซับซ้อน เพิ่มประสิทธิภาพ' + '28:44': 'Memory Management: การจัดการ RAM และ Data File' + '33:15': 'การเพิ่ม RAM ช่วยแก้ปัญหาความเร็วได้จริงหรือ? + วิธีวิเคราะห์ปัญหา' + '37:28': 'สาเหตุหลักของ Database ช้า + แนะนำเครื่องมือวิเคราะห์ Log' + '39:06': 'Replica Set: ลด Lag Time เพิ่มประสิทธิภาพ HA' + '40:40': 'Acknowledge (Write Concern): การันตีความถูกต้องของข้อมูล' + '41:25': 'Atlas Search: เครื่องมือวิเคราะห์ Query บน Cloud' + '42:30': 'Query Shape: บล็อค Query รูปแบบเฉพาะ ป้องกันปัญหา' + '43:36': 'Timeout: ตั้งค่า Max Time ป้องกัน Query ค้าง' + '44:06': 'Force Index: บังคับ Query ให้ใช้ Index ที่ต้องการ' + '44:48': 'Scaling: ย้าย Collection ใน Sharding ได้ง่ายขึ้น' + '46:41': 'Faster Resharding: ลดเวลา Reshard ลง 10 เท่า' + '47:00': 'ลดค่าใช้จ่าย Server ด้วยการยุบ Config Server' + '47:59': 'Security: เชื่อมต่อ OpenID, Federation ได้ง่ายขึ้น' + '49:01': 'Queryable Encryption: ค้นหาข้อมูลที่เข้ารหัสแบบ Range ได้แล้ว' + '50:26': 'Log Format: รองรับมาตรฐาน Open Cybersecurity' + '50:51': "สรุป What's New in MongoDB 8.0" +description: | + พบกับ คุณปิติ Senior Consulting Engineer จาก MongoDB สิงคโปร์ กับหัวข้อ What is new in MongoDB 8.0 เรียนรู้เกี่ยวกับฟีเจอร์ใหม่ๆ ที่น่าสนใจใน MongoDB เวอร์ชัน 8.0 ไม่ว่าจะเป็นเรื่องประสิทธิภาพการทำงานที่ดีขึ้น เครื่องมือ migration ที่ใช้งานง่ายขึ้น รวมถึงการปรับปรุงด้านความปลอดภัย มาดูกันว่าฟีเจอร์เหล่านี้จะช่วยเพิ่มประสิทธิภาพและความสะดวกสบายในการทำงานกับ MongoDB ได้อย่างไรบ้าง +--- diff --git a/data/videos/mongo0924/mongo8_th.vtt b/data/videos/mongo0924/mongo8_th.vtt new file mode 100644 index 0000000..32a3cd0 --- /dev/null +++ b/data/videos/mongo0924/mongo8_th.vtt @@ -0,0 +1,2469 @@ +WEBVTT + +00:00:00.100 --> 00:00:01.933 +เซสชั่นนี้ครับ เราได้ + +00:00:02.600 --> 00:00:07.032 +คนที่เป็น น่าจะใกล้ชิดกับโปรดักต์ + +00:00:07.100 --> 00:00:09.233 +ของ MongoDB ที่สุดแล้วนะครับ + +00:00:09.300 --> 00:00:11.633 +แล้วก็เป็นพนักงาน MongoDB +คนเดียวในทีมด้วยนะครับ + +00:00:11.700 --> 00:00:12.833 +ที่เหลือไม่ได้เป็น + +00:00:12.900 --> 00:00:18.933 +แล้วก็เดี๋ยวเขาจะมาพูดนะครับ +ในหัวข้อ What is new in MongoDB + +00:00:19.000 --> 00:00:20.133 +8.0 นะครับ + +00:00:20.200 --> 00:00:23.533 +ก็เดี๋ยวมาดูกันครับว่าของใหม่ๆ +ที่กำลังจะออกมาหรือว่าออกมาแล้วเนี่ย + +00:00:23.600 --> 00:00:28.133 +เป็นยังไงนะครับ คนนี้ import ตรงนะครับ +จาก MongoDB สาขาพะเยา + +00:00:28.200 --> 00:00:30.533 +ไม่ใช่นะครับ MongoDB สิงคโปร์ + +00:00:30.600 --> 00:00:36.633 +ขอเสียงปรบมือให้กับพี่ปิตินะครับ +Senior Consulting Engineer จาก MongoDB ครับผม + +00:00:37.400 --> 00:00:41.633 +เดี๋ยวเราเข้าเปลี่ยนสายแป๊บนึงนะครับ + +00:00:44.100 --> 00:00:48.733 +เดี๋ยวลองดูนะครับว่าจะเป็นยังไงนะครับ + +00:00:48.800 --> 00:00:52.833 +7.0 นะฮะ โอเค 8.0 นะฮะ + +00:00:52.900 --> 00:00:57.133 +ทุกคนน่าจะเคยใช้ MongoDB กันอยู่บ้างใช่ไหมครับ + +00:00:57.200 --> 00:01:01.033 +ใครยังใช้ MongoDB รุ่นต่ำกว่า 3 บ้างฮะ + +00:01:01.800 --> 00:01:06.933 +คือมันมีนะ ผมเคยเจอ +ใครใช้รุ่น 4-5 + +00:01:07.600 --> 00:01:09.033 +โอเค 6 ขึ้นไป + +00:01:10.000 --> 00:01:12.532 +โอเค โอเคครับ +ส่วนที่ไม่ยกก็คือรอใช้รุ่น 9 + +00:01:12.600 --> 00:01:16.633 +ซึ่งจะออกในอีก 2 ปีข้างหน้าใช่ไหมครับ +โอเคนะครับ เดี๋ยวรอดูนะครับ + +00:01:16.700 --> 00:01:19.532 +ครับ มาแล้วครับ +ถ้าพี่พร้อมก็เชิญเลยครับ + +00:01:24.700 --> 00:01:32.633 +โอเคนะครับ สวัสดีครับทุกคน +ผมตื่นเต้นนิดหน่อยนะครับ + +00:01:32.700 --> 00:01:37.733 +ในวันนี้นะครับ +เราจะมาพูดถึงตัวที่เป็น MongoDB Version 8 + +00:01:37.800 --> 00:01:43.833 +ซึ่งภายในปีนี้จะออกเป็น GA +ก็คือ General Available + +00:01:43.900 --> 00:01:45.333 +นะครับ + +00:01:47.700 --> 00:01:48.333 +โอเค + +00:01:48.400 --> 00:01:58.933 +อันนี้เป็นสไลด์ที่เรามีการพูดในงาน mongodb.local +ซึ่งผมอาจจะ skip บางอันไปนะครับ เพราะว่ามันอาจจะ + +00:01:59.000 --> 00:02:04.833 +ไม่ได้มีเนื้อหาอะไรที่ดึงดูดความสนใจ +ให้เราสนใจได้มากนะครับ + +00:02:04.900 --> 00:02:08.132 +จะเป็นกล่าวประวัติเนาะ +แล้วก็ปัจจุบันตอนนี้ + +00:02:08.199 --> 00:02:11.833 +มันจะเป็น release candidates เวอร์ชัน 8 นะครับ + +00:02:13.600 --> 00:02:20.733 +โอเค อันนี้เราจะเห็นว่า evaluation ก็คือในแต่ละปี +มันก็จะค่อยๆ เริ่มต้นมีเวอร์ชันมากขึ้นไป + +00:02:20.800 --> 00:02:26.733 +จนถึง ณ ปัจจุบันเนี่ย +จะออกเวอร์ชันทั้งหมดเนี่ย ประมาณ 1 ปี 1 เวอร์ชัน + +00:02:26.800 --> 00:02:31.333 +นะครับ MongoDB จะออก 1 ปี 1 เวอร์ชัน +ซึ่งผมถือว่าค่อนข้างเร็ว + +00:02:32.700 --> 00:02:38.233 +นะครับ อันนี้คือเป็นนโยบายพื้นฐาน +ซึ่งผมก็ยังไม่แน่ใจนะครับว่าเขาจะ + +00:02:38.300 --> 00:02:43.233 +มีการแบบ 2 ปี 1 ครั้งรึเปล่านะครับ +แต่ตอนนี้เขาจะผลักดันให้มันเป็น + +00:02:43.300 --> 00:02:47.233 +นะครับ 1 ปี 1 เวอร์ชันนะครับ ตรงนี้นะครับ + +00:02:47.300 --> 00:02:51.433 +อันนี้จะเป็นตัวเวอร์ชันนะครับ +โอเค ต่อไปนะครับ + +00:02:51.500 --> 00:02:56.933 +ที่จริงแล้วนะครับ สิ่งแรกที่ MongoDB จะมีในเวอร์ชัน 8 เลยนะครับ ก็คือ + +00:02:57.000 --> 00:03:00.433 +ปกติแล้วผมเข้าใจว่าทุกท่านเนี่ยใช้ Community Edition อยู่แล้ว + +00:03:01.100 --> 00:03:01.833 +ผมเชื่อว่าอย่างนั้นนะครับ + +00:03:01.900 --> 00:03:07.033 +เพราะว่าเราเป็น product ที่มีทั้ง open source และตัว commercial นะครับ + +00:03:07.100 --> 00:03:08.033 +เพราะฉะนั้นในตัว + +00:03:08.100 --> 00:03:15.433 +ตัว open source เนี่ยก็จะมี community +ซึ่ง community ต่างกับ EA นะครับ อยู่แค่จุดเดียว + +00:03:15.500 --> 00:03:22.033 +คำว่าจุดเดียวก็คือ อยู่แค่ segment เดียว +ก็คือเรื่องของตัว Security Advance + +00:03:22.100 --> 00:03:24.132 +นะครับ อันนี้ผมพยายามให้ความรู้ไปด้วย + +00:03:24.200 --> 00:03:28.933 +เพราะฉะนั้นเราจะเห็นได้ว่า product ที่เสียเงินกับไม่เสียเงินต่างกันแค่ตรงนี้จุดเดียว + +00:03:29.000 --> 00:03:34.533 +ดังนั้นเมื่อเป็น MongoDB เวอร์ชัน 8 ที่กำลังจะเกิดขึ้นนะครับ + +00:03:34.600 --> 00:03:38.433 +ในประมาณปลายปี อีกไม่กี่เดือนนี้นะครับ เวอร์ชัน 8 ที่จะออกมาเนี่ย + +00:03:38.500 --> 00:03:42.733 +เขาบอกว่า Community Edition เนี่ยครับ +จะมีฟีเจอร์ใหม่ขึ้นมาทันทีนะครับ + +00:03:42.800 --> 00:03:45.433 +ฟีเจอร์หนึ่งชื่อว่า Search กับ Vector Search + +00:03:45.500 --> 00:03:50.033 +ก็คือปกติแล้วนะครับ MongoDB เนี่ย +เป็นเวอร์ชัน Community ใช่ไหมครับ + +00:03:50.100 --> 00:03:53.733 +แล้วก็เป็นเวอร์ชันเสียตังค์และเวอร์ชัน Cloud + +00:03:53.800 --> 00:03:58.132 +นะครับ มีทั้งหมด 3 เวอร์ชันนะครับ +เพราะฉะนั้นในตัวที่เป็น + +00:03:58.200 --> 00:04:02.833 +เวอร์ชัน Cloud เนี่ย ปกติแล้วเราจะเรียกว่าเป็น MongoDB Atlas นะครับ + +00:04:02.900 --> 00:04:05.132 +ซึ่งใน MongoDB Atlas เนี่ย ก็คือเป็น + +00:04:05.200 --> 00:04:09.033 +self-managed นะครับ +ก็คือคุณสามารถที่จะเซ็ต config ต่างๆ + +00:04:09.100 --> 00:04:10.933 +ได้ deploy Mongo ได้นะครับ + +00:04:11.000 --> 00:04:15.533 +ก็จะมีฟีเจอร์หนึ่งที่เราเรียกว่าเป็น Atlas Search นะครับ + +00:04:15.600 --> 00:04:21.433 +ในตัว Atlas Search หมายความว่าอะไร +หมายความว่าเราสามารถจะทำพวก full-text search ได้ + +00:04:21.500 --> 00:04:24.933 +search แบบ string +แทนที่เราจะ search แบบ regular expression + +00:04:25.000 --> 00:04:26.733 +เราอาจจะไม่จำเป็นต้องทำแบบนั้น + +00:04:26.800 --> 00:04:30.533 +มันจะเป็นแบบ full-stream search นะครับ +ซึ่งเบื้องหลังของตัว search เนี่ย + +00:04:30.600 --> 00:04:33.733 +โดยปกติแล้วก็คือใช้ตัว Apache Lucene + +00:04:33.800 --> 00:04:39.033 +ที่เป็นที่นิยมอยู่แล้วนะครับ +เพราะฉะนั้น engine เดียวกับตัว Elastic Search + +00:04:39.100 --> 00:04:42.033 +หรือ OpenSearch นะครับ +engine เดียวกันนะครับ + +00:04:42.100 --> 00:04:44.133 +เพราะฉะนั้นตอนนี้เขาก็จะโยกครับ + +00:04:44.200 --> 00:04:47.733 +ตัว Atlas Search นะครับ มา deploy อยู่บน on-prem + +00:04:47.800 --> 00:04:51.133 +โดยที่เปิดให้ community edition ใช้ก่อน + +00:04:51.200 --> 00:04:54.133 +เวอร์ชันเสียตังค์ตามมาทีหลัง + +00:04:54.200 --> 00:04:55.533 +นี่คือคอนเซ็ปต์แรกนะครับ + +00:04:55.600 --> 00:05:00.433 +เพราะว่าเขาให้เห็นว่านักพัฒนาทุกคนเนี่ย ให้ความสนใจต่อการใช้ Community มากอยู่แล้ว + +00:05:00.500 --> 00:05:00.832 +ดังนั้น + +00:05:00.900 --> 00:05:04.433 +เราอยากให้นักพัฒนาได้ลองใช้ feature + +00:05:04.500 --> 00:05:08.633 +ที่ง่ายขึ้นนะครับ +โดยการโยกตัว Atlas Search นะครับ + +00:05:08.700 --> 00:05:14.433 +มา deploy ลงบน Community Edition นั่นเอง +ซึ่งจะมาอยู่ในเวอร์ชันที่เป็นเวอร์ชัน 8 + +00:05:14.500 --> 00:05:18.733 +แต่ยังคงเป็นลักษณะที่เหมือนเป็น beta + +00:05:18.800 --> 00:05:23.433 +ก็คือมันจะมีการ develop ไปเรื่อยๆ +แต่เราจะเริ่มใช้ได้ทันที + +00:05:23.500 --> 00:05:31.033 +อันนี้ก็คือเป็นสิ่งที่เขา announce นะครับ +เป็น feature ซึ่งถ้าถามตัวผมก็คือผมอ่ะ + +00:05:31.100 --> 00:05:34.133 +ยังไม่ได้มีโอกาสเล่นจริงๆ จังๆ +เพราะ product เขาค่อนข้างเยอะเนาะ + +00:05:34.200 --> 00:05:36.533 +เพราะฉะนั้นในความจริงแล้วผมเล่นแทบ + +00:05:36.600 --> 00:05:37.633 +ไม่ได้เล่นครบทุกตัว + +00:05:37.700 --> 00:05:41.233 +แต่ก็แบบประมาณ 90 กว่าเปอร์เซ็นต์ที่ผมได้เล่นเพราะว่าลูกค้า + +00:05:41.300 --> 00:05:45.733 +จะมีการใช้งานที่หลากหลาย +ดังนั้นเราจำเป็นที่จะต้องเรียนรู้ทุก product ก่อนออก + +00:05:46.400 --> 00:05:48.233 +เลยทุกตัวนะครับ + +00:05:49.000 --> 00:05:53.533 +อันนี้เป็นตัวแรกนะครับที่จะเข้ามาในเวอร์ชั่น 8 นั่นเองนะครับ + +00:05:53.600 --> 00:05:56.133 +เรื่องการใส่ search เข้าไป เพราะฉะนั้น search มี 2 ตัว + +00:05:56.200 --> 00:06:01.433 +ถ้าเห็นทางรูปก็คือ 1 ก็คือเป็นตัวที่เป็น search ปกติ +เราเรียก full text search นะครับ + +00:06:01.500 --> 00:06:04.533 +ตัวที่ 2 เรียกว่า vector search เพราะว่าตามสมัยนิยมแน่นอน + +00:06:04.600 --> 00:06:09.332 +ตอนนี้ทุกคนทำ generative AI ดังนั้นทุกคนต้องการให้ระบบ search เนี่ย + +00:06:09.400 --> 00:06:13.033 +search ได้เร็วขึ้นนะครับ ซึ่งตรง vector search คืออะไรเนี่ยนะครับ + +00:06:13.100 --> 00:06:16.733 +เดี๋ยวเราไปคุยใน section ของน้องเจมส์นั่นเองนะครับ + +00:06:19.100 --> 00:06:25.633 +ต่อไปนะครับ เราก็จะมีส่วนที่เป็นเวอร์ชันที่ release จริงจังแล้วก็คือ + +00:06:26.600 --> 00:06:30.832 +เวลาที่เราต้องการที่อยากจะย้าย database ที่เป็น relational database + +00:06:30.900 --> 00:06:37.832 +ขึ้นมาบน NoSQL หรือ MongoDB นะครับ +MongoDB จะมีเครื่องมือที่เราเรียกว่า migration + +00:06:37.900 --> 00:06:41.332 +เราเรียกว่า migration มี 2 ตัวหลักๆ ที่ + +00:06:41.400 --> 00:06:47.733 +ถือว่าเป็นตัวที่ active อยู่ตลอดเวลา +ชื่อว่า mongosync กับ relational migrator + +00:06:47.800 --> 00:06:53.633 +mongosync ก็คือเป็นเครื่องมือสำหรับย้าย + +00:06:53.700 --> 00:06:57.433 +database ที่เป็น relational database ก็คือ + +00:06:57.500 --> 00:07:01.933 +ก็คือตัว mongosync เนี่ยจะย้ายจากตัวที่เป็นตระกูล NoSQL ด้วยกัน + +00:07:02.000 --> 00:07:03.733 +อย่างเช่น Mongo Community + +00:07:03.800 --> 00:07:07.733 +หรือ database ที่เป็น NoSQL ที่เป็น JSON ตัวอื่นนะครับ +ย้ายขึ้นมาบน + +00:07:07.800 --> 00:07:11.533 +MongoDB หรือบน Atlas เราจะเรียกว่าเป็น mongosync นะครับ + +00:07:11.600 --> 00:07:14.733 +ซึ่ง mongosync เนี่ยปกติแล้วเนี่ย เวลาเราย้าย migration เนี่ย + +00:07:14.800 --> 00:07:20.033 +หลายๆองค์กรจะมองภาพว่า เอ๊ะ ถ้าเราย้ายจาก A ไป B แล้วเกิดล่ม + +00:07:20.100 --> 00:07:23.033 +เราสามารถย้ายย้อนกลับจาก B มา A ได้ไหม + +00:07:23.100 --> 00:07:27.033 +ตัว mongosync สามารถทำที่เรียกว่าเป็น bi-direction + +00:07:27.100 --> 00:07:28.533 +ก็คือ + +00:07:28.600 --> 00:07:34.332 +เพราะว่าทุกธุรกิจจะต้องมีคำถามว่า เอ๊ะ ถ้าผมลองย้ายไปแล้วแล้วเกิดพัง ผม rollback ได้ไหม + +00:07:34.400 --> 00:07:38.832 +โอเคไหมครับ ทุกคนต้องมีคำถามนี้ +เพราะไม่มีใครจะย้ายไปแล้วแบบ เออ พังก็ช่างมัน + +00:07:38.900 --> 00:07:42.533 +ก็ไปทำกันบนนั้นน่ะ คงไม่มีทางถูกไหมครับองค์กรทุกองค์กร ดังนั้น + +00:07:42.600 --> 00:07:47.633 +แปลว่าเราย้ายจาก A ไป B ปุ๊บ เราสามารถย้อนกลับได้ +อันนี้คือตัว mongosync นะครับ + +00:07:47.700 --> 00:07:50.533 +ตัว mongosync เนี่ยมีหน้าที่แค่ย้าย data ครับ + +00:07:50.600 --> 00:07:54.633 +แต่ถ้าเราบอกว่าต้องการที่อยากจะย้ายจาก relational แล้วต้องการแบบ + +00:07:54.700 --> 00:07:58.933 +จะเข้าใจว่า เอ๊ะ ถ้าเราจะย้าย relational ที่เป็นโครงสร้าง table ล่ะ + +00:07:59.000 --> 00:08:02.533 +มีความสัมพันธ์ one-to-many, many-to-many, one-to-one เนี่ย + +00:08:02.600 --> 00:08:05.533 +เราจะย้ายไป Mongo ยังไง เพราะความรู้ของเราอาจจะ + +00:08:05.600 --> 00:08:10.933 +อาจจะยังแบบไม่ได้เต็มที่ที่จะเข้าใจว่าการทำ modeling ของ MongoDB ทำยังไง + +00:08:11.000 --> 00:08:16.433 +relational migrator ก็คือตัวตอบโจทย์ เพราะว่าอะไรครับ +เพราะว่ามันคือเครื่องมือที่ + +00:08:16.500 --> 00:08:21.433 +เป็นหน้าเหมือน diagram ให้มองภาพเหมือนเราทำตัว ER diagram + +00:08:21.500 --> 00:08:23.533 +เพราะฉะนั้นตัว relational migrator + +00:08:23.600 --> 00:08:27.533 +จะเป็นตัวที่ทำการ map relational database ให้เห็นเป็น ER diagram + +00:08:27.600 --> 00:08:32.232 +แล้วก็สามารถ map เป็นโครงสร้างของ relational ที่เป็น MongoDB + +00:08:32.299 --> 00:08:34.133 +เป็น NoSQL diagram + +00:08:34.200 --> 00:08:37.433 +นี่คือสิ่งที่มันสามารถ mapping อัตโนมัติ + +00:08:37.500 --> 00:08:41.832 +by default หลังจากนั้นคุณก็สามารถที่จะปรับแต่งได้ตามต้องการ + +00:08:41.900 --> 00:08:43.533 +แต่สำคัญกว่านั้นก็คือ + +00:08:43.600 --> 00:08:45.233 +เช่น เราต้องการจะย้าย database + +00:08:45.300 --> 00:08:48.933 +จาก MySQL จาก Oracle จาก SQL Server ไปบน + +00:08:49.000 --> 00:08:50.933 +MongoDB เราใช้เครื่องมือนี้ + +00:08:51.000 --> 00:08:54.933 +ข้อดีคือพอคุณสร้าง diagram เสร็จ mapping เรียบร้อยแล้ว + +00:08:55.000 --> 00:08:55.933 +คุณสามารถ run + +00:08:56.000 --> 00:08:57.733 +ย้าย data ได้ทันที + +00:08:57.800 --> 00:09:02.733 +การย้าย data ปกติเรามักจะมี 2 ส่วน +ก็คือย้ายครั้งเดียวจบใช่ไหมครับ + +00:09:02.800 --> 00:09:08.633 +แต่ส่วนใหญ่ผมเข้าใจว่าระบบทุกคนมีขนาดใหญ่ +ดังนั้นเราไม่สามารถจะย้ายครั้งเดียวจบได้ + +00:09:08.700 --> 00:09:10.933 +เราต้องย้ายที่เรียกว่า continuous + +00:09:11.000 --> 00:09:15.333 +ดังนั้นตัว relational migrator ทำการย้ายข้อมูล continuous ไว้ + +00:09:15.400 --> 00:09:19.433 +แล้วสามารถบอกว่า เออ วันนี้ traffic เยอะ หยุด เราสั่ง stop + +00:09:19.500 --> 00:09:23.933 +วันนี้ traffic น้อย อ่า run หมายความว่าอะไร +หมายความว่าสมมุติว่าผมมี + +00:09:24.000 --> 00:09:28.333 +MySQL แล้วผมอยากจะย้ายไปบน MongoDB +ผม map เรียบร้อยแล้ว + +00:09:28.400 --> 00:09:33.533 +ผมบอกว่า วันนี้ตอนตี 1 +ผมต้องการย้ายข้อมูลเฉพาะตี 1 ถึงตี 4 เท่านั้น + +00:09:33.600 --> 00:09:35.133 +ผมสามารถตั้ง schedule + +00:09:35.200 --> 00:09:36.333 +แล้วก็ย้าย + +00:09:36.400 --> 00:09:40.233 +พอย้ายถึงตี 4 ปั๊บ run command API บอกว่า stop + +00:09:40.300 --> 00:09:45.833 +วันถัดไป ย้ายตีหนึ่งถึงตีสี่ ซ้ำ ทำอย่างนี้ไปเรื่อยๆ ได้ +เราเรียกว่า + +00:09:45.900 --> 00:09:47.733 +ตัว continuous sync นะครับ + +00:09:47.800 --> 00:09:51.133 +ซึ่ง relational migrator ถูกออกแบบมาให้เราย้าย + +00:09:51.200 --> 00:09:55.333 +เหตุผลง่ายๆครับ เราต้องการย้ายลูกค้า relational database + +00:09:55.400 --> 00:10:00.933 +ไปอยู่บน Mongo ให้ได้ ดังนั้นเขาจึงสร้างเครื่องมือนี้เป็นเครื่องมือฟรี + +00:10:01.000 --> 00:10:06.733 +ที่เหมาะกับการย้าย ปัญหาหนึ่งของการย้าย data + +00:10:06.800 --> 00:10:09.333 +relational database ไม่ใช่มีแค่ data อย่างเดียวจริงไหมครับ + +00:10:09.400 --> 00:10:12.833 +เขาจะมีตัวข้างในเรียกว่า stored procedure + +00:10:13.400 --> 00:10:19.033 +หรือ query ที่ซับซ้อน +ดังนั้น relational migrator ทำการ + +00:10:19.100 --> 00:10:22.933 +เรียกว่า mapping ก็คือเขาใส่ tool AI เข้าไปทำการ + +00:10:23.000 --> 00:10:28.333 +mapping command ใน function +หรือ stored procedure ที่เป็น relational SQL + +00:10:28.400 --> 00:10:31.733 +ให้แปลงเป็น Mongo Query Language + +00:10:31.800 --> 00:10:36.133 +อันนี้คือความสามารถของเขา +ดังนั้นหมายความว่ามันแปลงก็ไม่ใช่ 100% + +00:10:36.200 --> 00:10:37.433 +เพราะว่าหมายความว่า + +00:10:37.500 --> 00:10:41.633 +พอมันแปลงปุ๊บ แน่นอนคุณต้องเป็นคน adjustment ว่าถูกต้องหรือเปล่า + +00:10:41.700 --> 00:10:46.833 +แต่มากกว่า 80% มันจะแปลงได้อย่างถูกต้อง ทำให้เราลดเวลา + +00:10:46.900 --> 00:10:51.733 +ในการแปลงคำสั่งที่ฝังอยู่ใน stored procedure นั่นเองนะครับ + +00:10:51.800 --> 00:10:55.233 +อันนี้เราเรียกว่าเป็นตัว relational migrator นะครับ + +00:10:56.600 --> 00:11:03.333 +ต่อไปนะครับ ถ้าเรามาพูดถึงในมุมของ modernization +modernization ก็คือว่าลูกค้า + +00:11:03.400 --> 00:11:07.533 +ใช้ MongoDB เวอร์ชันเก่า หรือใช้ relational database อยู่ + +00:11:07.600 --> 00:11:11.533 +แล้วแอปพลิเคชันเป็นเวอร์ชันเก่า +เขาจะมักจะมีปัญหาหนึ่งซึ่งบอกว่า + +00:11:11.600 --> 00:11:14.933 +แล้วถ้าเราย้ายแอปพลิเคชันไป +เราต้องแก้แอปเยอะมาก + +00:11:15.000 --> 00:11:16.933 +แก้แอปเยอะมาก +เราจะย้ายทำไม + +00:11:17.000 --> 00:11:21.633 +ในเมื่อเราย้ายจาก relational ไปอยู่ relational ไม่ง่ายกว่าเหรอ + +00:11:21.700 --> 00:11:26.833 +ดังนั้นในทีมของ MongoDB ก็เลยเกิดทีม + +00:11:26.900 --> 00:11:31.033 +ที่เรียกว่า Modernization Factory + +00:11:31.100 --> 00:11:36.833 +เป็นทีมที่จะช่วยอำนวยความสะดวก +โดยใช้ระบบ AI ในการ convert source code ทั้งหมด + +00:11:36.900 --> 00:11:38.733 +ซึ่งเขาพัฒนาเองอยู่แล้วภายใน + +00:11:38.800 --> 00:11:41.333 +ทำการแปลง source code จากการ mapping + +00:11:41.400 --> 00:11:43.533 +เช่น คุณเขียน Java แล้วคุณ call + +00:11:43.600 --> 00:11:46.233 +ด้วย JDBC ที่เป็น SQL query + +00:11:46.300 --> 00:11:49.833 +คุณแปลง code เนี่ย ให้กลายเป็น MongoDB code ได้เลย + +00:11:49.900 --> 00:11:55.233 +เป็น Java connect MongoDB +พร้อมกับเขียน Aggregation Framework ได้เลย + +00:11:55.300 --> 00:12:02.333 +อันนี้ก็คือฟีเจอร์ที่เราพูดถึงว่าเป็นการทำ AI-enabled application modernization tools + +00:12:02.400 --> 00:12:07.233 +นะครับ ซึ่งตัวนี้ก็จะเป็นทีมที่ช่วยในการย้าย +แปลว่าอะไรครับ แปลว่า + +00:12:07.300 --> 00:12:10.933 +คุณอยากจะย้ายใช้ MongoDB sync relational +ทำด้วยตัวเองได้นะครับ ไม่มีปัญหา + +00:12:11.000 --> 00:12:15.933 +แต่ถ้าคุณไม่มีทีมในการแก้ source code นะครับ +ทาง MongoDB มีทีมและ tool + +00:12:16.000 --> 00:12:18.733 +ในการ convert ซึ่งเขาไม่ได้เอา tool ออกมา public เนาะ + +00:12:18.800 --> 00:12:20.833 +เป็น tool สำหรับใช้ internal แต่เขารู้ว่า + +00:12:20.900 --> 00:12:23.633 +เขาพัฒนามาเพื่อให้ระบบ AI generate code + +00:12:23.700 --> 00:12:26.333 +เพราะเราอยู่ในยุคที่ code มัน generate เองได้ ถูกไหมครับ + +00:12:26.400 --> 00:12:27.733 +แค่พิมพ์ไปใน prompt เนาะ + +00:12:27.800 --> 00:12:31.633 +เพราะฉะนั้นเขาก็สร้าง prompt ด้วยตัวเองขึ้นมานะครับ เพื่อให้ manage + +00:12:31.700 --> 00:12:38.633 +ตรงนี้นะครับ อันนี้คือหนึ่งในความสามารถนะครับ +ที่มีในตัว MongoDB 8 ที่จะมีเข้ามานะครับ + +00:12:41.800 --> 00:12:48.433 +ในระหว่างทาง มีคำถามอะไรก็คือถามได้หมดนะครับผม +เท่าที่ผมสามารถที่จะตอบได้ + +00:12:48.500 --> 00:12:54.333 +ต่อไป ฟีเจอร์หลักๆ แบ่งออกเป็น 4 ส่วน + +00:12:54.400 --> 00:12:59.133 +หนึ่งก็คือ MongoDB 8 เนี่ยจะปรับ optimization +คือ performance จะดีขึ้น แต่เราเห็นภาพนะ + +00:12:59.200 --> 00:13:03.633 +มันจะมีภาพ ฉะนั้นผมเชื่อว่า MongoDB 8 เนี่ย +เราเรียกว่าเป็น + +00:13:03.700 --> 00:13:09.933 +เมเจอร์เชนจ์มากๆ แล้วมีการวัดผลอย่าง 100% +ตามมาตรฐานของสาย database + +00:13:10.000 --> 00:13:14.833 +พวก database เนี่ยจะมีเว็บไซต์สำหรับวัดมาตรฐาน +เขาไม่ได้ใช้แบบ load test ทั่วๆ ไป + +00:13:14.900 --> 00:13:16.133 +เขาจะมีเว็บไซต์สำหรับ + +00:13:16.200 --> 00:13:20.833 +วัดว่า database ยี่ห้อแต่ละยี่ห้อเนี่ย +ถ้าคุณต้องใช้ data set แบบนี้แบบนั้นนะ + +00:13:20.900 --> 00:13:22.733 +คุณถึงจะวัด แล้วทุกคนก็จะไปวัด + +00:13:22.800 --> 00:13:27.733 +ด้วยกันที่ standard ตัวนั้น +เพื่อที่จะวัดว่า โอเค ของฉันใช้ speed แบบ + +00:13:27.800 --> 00:13:33.733 +ได้เร็วเท่าไหร่นะครับ เดี๋ยวเราจะมีภาพให้ดูนะครับ +ซึ่งตัวนี้จะเป็นเว็บไซต์ปกติที่เราเห็นนะครับ + +00:13:33.800 --> 00:13:38.733 +อันนี้เรื่องตัว optimization นะครับ +สองก็คือเรื่องของการ workload นะครับ + +00:13:38.800 --> 00:13:40.533 +workload management นะครับ + +00:13:40.600 --> 00:13:44.633 +ก็คือจะทำการ manage ทำให้การโหลดข้อมูลเนี่ยเร็วขึ้นนะครับ + +00:13:44.700 --> 00:13:47.533 +มันก็จะมีเรื่อง optimize เรื่อง workload + +00:13:47.600 --> 00:13:51.833 +เรื่อง flexible scaling นะครับ แล้วก็ improve ตัว security นะครับ + +00:13:51.900 --> 00:13:54.533 +เดี๋ยวเรามาดูกันนะครับ ทั้ง 4 key นะครับ + +00:13:54.600 --> 00:13:57.433 +เริ่มแรกนะครับ ตัว optimization นะครับ + +00:13:58.000 --> 00:14:00.933 +Optimization เนี่ยนะครับ + +00:14:01.000 --> 00:14:02.833 +ถ้าใครใช้ MongoDB อยู่แล้ว + +00:14:02.900 --> 00:14:04.933 +จะค้นพบว่าการทำ application + +00:14:05.000 --> 00:14:08.533 +framework เนี่ยเป็นเรื่องที่งง + +00:14:08.600 --> 00:14:14.533 +เพราะทุกคนคุ้นเคยต่อการใช้คำสั่ง SQL ในการ select, join, group by + +00:14:14.600 --> 00:14:20.733 +Nested join นะครับ ทำอะไรก็ตามนะครับ ด้วย join +เพราะฉะนั้น เวลาการทำตัว aggregation framework + +00:14:20.800 --> 00:14:24.933 +เป็นเรื่องที่ยาก แต่ว่าเราไม่ต้องกังวลครับ +เพราะว่าถ้าพวกเราใช้ + +00:14:25.000 --> 00:14:30.633 +Compass นะครับ ซึ่งเป็น MongoDB Compass เนี่ย +พวกเราจะเห็นว่ามันจะมี feature ที่เรียกว่า NLP + +00:14:30.700 --> 00:14:31.933 +ก็คือ Gen AI +เราสามารถ + +00:14:32.000 --> 00:14:36.233 +บอกเขาได้เหมือน prompt เลย +ใส่ prompt เข้าไปมันจะ generate query ให้เรา + +00:14:36.300 --> 00:14:40.133 +อันนี้คือสิ่งที่ผมก็ใช้อยู่ทุกวันนะ เพราะว่า + +00:14:40.200 --> 00:14:46.633 +บางอย่างมันเป็นท่าที่ซับซ้อน +ดังนั้นผมก็ไม่สามารถที่จะคิดให้เร็วๆ ได้ ผมก็จะถาม + +00:14:46.700 --> 00:14:51.633 +พอเค้าเอามาปุ๊บ ผมก็จะค่อยๆ แปลงมันให้ถูกต้องต่อผลลัพธ์ + +00:14:51.700 --> 00:14:53.533 +ซึ่งเป็นการพัฒนามันไป + +00:14:53.600 --> 00:14:58.333 +ซึ่งใน performance ของเวอร์ชัน 8 เนี่ยนะครับ +สิ่งหนึ่งที่เราบอกว่า raise the bar + +00:14:58.400 --> 00:15:03.433 +Raise the bar คือพยายามทำให้มันขึ้นแบบ top level +ในส่วนหลักๆ เลยของ performance เมื่อเทียบ + +00:15:03.500 --> 00:15:07.533 +เมื่อเทียบกับเวอร์ชัน 7 นะครับ ก็คือ 1. + +00:15:07.600 --> 00:15:12.333 +Group กับ project นะครับ ปกติแล้ว MongoDB เนี่ยเราจะมีการ group by ถูกไหมครับ + +00:15:12.400 --> 00:15:13.833 +SQL ทุกคนเนี่ยก็ต้องมีการ + +00:15:13.900 --> 00:15:18.033 +group by ผมเชื่อว่าทุกคน group by โปรเจกต์ก็คือการใช้คำสั่ง select + +00:15:18.100 --> 00:15:20.833 +ปกติทุกคนคงไม่ใช้ select star หรอกจริงไหมครับ + +00:15:20.900 --> 00:15:25.533 +ถ้าเวลาเราใช้ relational database +เราจะใช้คำว่า select แล้วก็เลือกคอลัมน์ + +00:15:25.600 --> 00:15:27.733 +มันทำให้การดึงง่ายขึ้น แต่ในมุมของ + +00:15:27.800 --> 00:15:32.733 +ตัวระบบที่เป็น MongoDB เราใช้คำว่า project ก็คือการ select + +00:15:32.800 --> 00:15:38.533 +เพราะฉะนั้นพวกนี้เค้าจะปรับปรุง performance ให้มีประสิทธิภาพดีขึ้น + +00:15:38.600 --> 00:15:44.433 +ต่อไปพูดถึงตัว filter แล้วก็ sort +ปกติเรา filter ถ้า SQL ก็คือใช้คำว่า WHERE + +00:15:44.500 --> 00:15:48.433 +ถ้า MongoDB เราใช้คำว่า $match นะครับ + +00:15:48.500 --> 00:15:52.233 +เพราะฉะนั้นคำว่าตัว $match เนี่ยก็คือจะช่วยทำการ filter + +00:15:52.300 --> 00:15:55.033 +ให้มีศักยภาพในการ query ให้เร็วขึ้นนะครับ + +00:15:55.100 --> 00:15:58.933 +ผมอาจจะไม่ได้ลง detail โดยแบบละเอียดมากนะ +เพราะว่าผมมันมีเอกสาร + +00:15:59.000 --> 00:16:02.633 +อยู่แล้วที่ผมมาเห็นภาพ แต่ผมรู้ว่าเค้าให้เห็นภาพว่า + +00:16:02.700 --> 00:16:06.633 +ตัว operator ตัวไหนบ้าง ที่ performance ดีขึ้น + +00:16:06.700 --> 00:16:10.133 +เป็น operator ที่พวกเราต้องใช้อยู่แล้วในสาย MongoDB + +00:16:10.200 --> 00:16:13.733 +ก็คือ $match นะครับ +ก็คือ $sort นะครับ + +00:16:13.800 --> 00:16:17.633 +แล้วก็ตัวสุดท้าย $lookup ซึ่งปกติแล้วผมแนะนำอยู่แล้วว่า + +00:16:17.700 --> 00:16:20.933 +เราไม่ควรมี lookup +lookup ก็คือการ join + +00:16:21.000 --> 00:16:23.733 +เราไม่ควรมี lookup เกิน 2 lookup + +00:16:23.800 --> 00:16:25.833 +มันก็เหมือนเราเขียน relational database + +00:16:25.900 --> 00:16:29.233 +เราไม่ควร INNER JOIN ๆ ๆ ๆ ถูกไหม + +00:16:29.300 --> 00:16:32.233 +เพราะว่ามันจะทำให้ประสิทธิภาพ… + +00:16:32.300 --> 00:16:36.133 +performance ของการโหลดขึ้น memory เนี่ยมันหนักเกินไป + +00:16:36.200 --> 00:16:39.333 +นี่คือเหตุผลเดียวนะครับ ว่าบอกว่าถ้าเมื่อไหร่ก็ตามคุณใช้ lookup + +00:16:39.400 --> 00:16:42.133 +ทุกครั้งคุณจะใช้ CPU เยอะ + +00:16:42.200 --> 00:16:48.833 +ต่อให้คุณมี index แล้วก็ตาม +ดังนั้นเขาจึงบอกว่าควรมีการ join เพียงแค่ไม่เกิน 2 ครั้ง + +00:16:48.900 --> 00:16:53.333 +ซึ่ง lookup ในท่าของ Excel มันก็คือการทำ left join + +00:16:53.400 --> 00:16:58.033 +อันนี้เป็นข้อมูลเพิ่มเติมนะ +ถ้าใคร search รอบอยู่แล้ว นี่คือการทำ left join นะครับ + +00:16:58.100 --> 00:17:02.533 +เพราะ lookup เขาจะปรับปรุงให้มีประสิทธิภาพมากยิ่งขึ้น + +00:17:03.200 --> 00:17:07.032 +อันนี้คือเป็นส่วนที่เน้น query performance + +00:17:08.599 --> 00:17:12.633 +โอเค ต่อไปเราเซ็ต standard ใหม่ครับ เชิญครับ + +00:17:17.800 --> 00:17:21.933 +โอเคครับ เป็นคำถามที่ดีครับ แน่นอนครับ ปกติแล้วก็คือ + +00:17:22.000 --> 00:17:27.433 +การทำ index มันจะมีทฤษฎีหนึ่งนะครับ +ที่อาจจะดูบนเว็บไซต์ก่อนนะครับ ก็คือเรียกว่า ESR + +00:17:27.500 --> 00:17:30.933 +Equality นะครับ + +00:17:31.000 --> 00:17:33.633 +แล้วก็ sorting นะครับ แล้วก็ range นะครับ + +00:17:33.700 --> 00:17:36.233 +เป็นกฎปกติที่อยู่บนเว็บไซต์นะครับ ซึ่งมันจะมี detail นะครับ + +00:17:36.300 --> 00:17:37.933 +ผมอาจจะบอกไม่ได้ในตอนนี้มันเยอะ + +00:17:38.000 --> 00:17:43.433 +เพราะ ESR rule จะเป็นตัวบอกนะครับ +แล้วปกติแล้วเราควรมี index + +00:17:43.500 --> 00:17:48.833 +เขาบอกว่า best practice +ควรมี index ต่อหนึ่ง collection ไม่ควรเกิน 4 + +00:17:48.900 --> 00:17:51.433 +สถานการณ์จริงผมเห็นสูงสุด 60 + +00:17:52.400 --> 00:17:56.633 +สูงสุดของ index ที่มีได้ 64 ตัว + +00:17:56.700 --> 00:18:01.333 +โอเคไหมครับ ในหนึ่ง collection นะ +แต่ทุกครั้งที่เราทำเวลาโหลดขึ้น RAM + +00:18:01.400 --> 00:18:04.133 +RAM ไม่พอ ลองนึกภาพ 64 ตีไปซะว่า + +00:18:04.200 --> 00:18:09.033 +index หนึ่งใช้สอง GB ก็​เอา 2×64 +แรมเครื่องของคุณก็หมดแล้ว + +00:18:09.100 --> 00:18:13.033 +เพราะฉะนั้น โดยปกติแล้ว +ค่าเฉลี่ยที่ผมเจอก็คือ โดยพื้นฐานประมาณ 10 + +00:18:13.700 --> 00:18:18.133 +เพราะเราควรมี index ไม่เกินประมาณ 10 ให้เต็มที่ +และไม่ควรเกิน 20 + +00:18:18.200 --> 00:18:21.833 +collection เดียวนะครับ คุณนึกภาพนะ +มีอีก 1 collection มี 10 index + +00:18:21.900 --> 00:18:25.033 +index ตัวนึงเนี่ย ใช้ RAM เป็นร้อยๆ MB + +00:18:25.100 --> 00:18:26.633 +คุณมีซัก + +00:18:26.700 --> 00:18:30.333 +20 collection 100 collection คุณก็ไม่ไหว + +00:18:30.400 --> 00:18:34.433 +ปกติแล้ว MongoDB อนุญาตให้เรามี collection ได้ประมาณ + +00:18:34.500 --> 00:18:37.833 +ถ้าผมจำตัวเลขไม่ผิดนะครับ เป็นหลักหมื่นขึ้น + +00:18:39.000 --> 00:18:43.033 +ใน 1 database เลยนะ อนุญาตให้คุณมีเกิน 10,000 collection + +00:18:43.100 --> 00:18:47.433 +เกินกว่านั้นระบบจะยิ่งแบบ very slow มาก คือแบบอาจจะเกิดการพังได้ + +00:18:47.500 --> 00:18:49.333 +แต่อนุญาตได้ถึงขนาดนั้น ซึ่ง + +00:18:49.400 --> 00:18:54.133 +ผมบอกอย่างนี้ได้ เพราะว่าเราเจอลูกค้า + +00:18:54.200 --> 00:18:55.333 +ที่เกินลิมิต + +00:18:56.400 --> 00:19:01.033 +คุณลองนึกภาพว่าออกแบบอย่างไร +ให้มี collection เป็นหมื่นๆ collection + +00:19:01.100 --> 00:19:02.833 +อยู่ใน database ก้อนนั้น + +00:19:03.400 --> 00:19:06.633 +นะครับ อันนี้คือแชร์ให้ฟังเนาะ นะครับ + +00:19:06.700 --> 00:19:09.433 +อ๋อ มันออกไลฟ์ด้วยนี่? + +00:19:09.500 --> 00:19:12.933 +ไม่เป็นไร ไม่ได้พูดถึงใครนะครับ + +00:19:13.000 --> 00:19:16.633 +นั่นคือหมายความว่า +อธิบาย index ว่าเราควรทำยังไงนะครับ + +00:19:16.700 --> 00:19:18.033 +มันจะมี detail นะครับ + +00:19:18.100 --> 00:19:22.733 +ต่อไปก็คือ พอเราพูดถึง set standard นะครับ +เราก็จะมี standard นะครับ เขาก็จะมีการ + +00:19:22.800 --> 00:19:28.233 +improve on industry benchmark +ก็คือเราบอกแล้วครับ เวอร์ชัน 8 เนี่ย เป็นเวอร์ชันที่แบบ + +00:19:28.300 --> 00:19:32.333 +ชูโรงเรื่อง performance มาก +เมื่อเทียบกับ MongoDB เวอร์ชัน 7 เลยนะครับ + +00:19:32.400 --> 00:19:34.033 +เขาจะเทียบกับ + +00:19:34.100 --> 00:19:38.433 +3 เจ้านี้ คุณเสิร์ชดูได้ ว่าเป็นเว็บไซต์ + +00:19:38.500 --> 00:19:42.333 +หรือเป็นเครื่องมือ ที่คน ที่อยู่ในอุตสาหกรรม database + +00:19:42.400 --> 00:19:45.433 +จะต้องใช้เครื่องมือเหล่านี้ วัดประสิทธิภาพ + +00:19:45.500 --> 00:19:49.833 +จะ compare กับใครก็ตาม ไม่รู้ +แต่คุณควรจะใช้อันนี้ + +00:19:49.900 --> 00:19:53.433 +ถ้าคุณพูดถึงเป็น product ประเภท database vendor เนาะนะครับ + +00:19:53.500 --> 00:19:54.333 +เราต้องอ้างอิง + +00:19:54.400 --> 00:20:00.533 +แต่ในที่นี้เราจะ compare กับ version 7 +เรายังไม่ compare กับเจ้าอื่นเนาะนะครับ + +00:20:00.600 --> 00:20:02.033 +เพราะฉะนั้นใน performance นี่ครับ + +00:20:03.200 --> 00:20:08.033 +เราเทียบนะครับ ให้เห็นภาพนะครับ +ว่าเรา bulk load เร็วขึ้น + +00:20:08.100 --> 00:20:12.833 +compare กับ version 7 เราเร็วขึ้น 54% นะครับ + +00:20:12.900 --> 00:20:14.533 +ในขณะที่ตัวนี้ออกเนี่ยมันออก + +00:20:14.600 --> 00:20:17.833 +มันภายในเนี่ยเค้าระบุตัวนี้ออกมาก่อนงานอยู่แล้วตั้งนาน + +00:20:17.900 --> 00:20:22.133 +ซึ่งมีคนเนี่ย อย่างเช่น เราเป็น engineer +ผมเป็น consult engineer ใช่มั้ย + +00:20:22.200 --> 00:20:24.733 +มันจะมี software engineer, consult engineer + +00:20:24.800 --> 00:20:26.933 +หรือตัว product engineer นะครับ + +00:20:27.000 --> 00:20:31.033 +ทุกคนเมื่อรู้ภาพนี้ปุ๊บ ทุกคนมีการทดสอบเลยเพราะว่าลูกค้า + +00:20:31.100 --> 00:20:37.533 +บางกลุ่มจะถูกเรียกมาให้ใช้งาน +ดังนั้นเขาจะวัดกัน ทุกคนก็จะเริ่มวัดทุกตัวเลย + +00:20:37.600 --> 00:20:44.433 +นะครับ ข้อดีของการที่เราวัดก็คือว่า +เราจะรู้ limitation สิ่งหนึ่งที่สำคัญมาก ก็คือผมเชื่อว่า + +00:20:44.500 --> 00:20:51.233 +หลายๆ database ทุกผลิตภัณฑ์นะครับ +จำเป็นที่จะต้องระบุว่าตัวเองมีข้อจำกัดอะไร + +00:20:51.300 --> 00:20:58.133 +ผมเชื่อว่าทุก database เหมาะกับงานแต่ละงาน +ในปริมาณ data ที่แตกต่างกัน + +00:20:58.200 --> 00:21:01.833 +เราสามารถจูนได้ทั้งหมด ให้ครอบคลุมจักรวาลก็ได้แบบ + +00:21:01.900 --> 00:21:05.033 +ทุกธุรกิจเลยสามารถใช้ database ยี่ห้อเดียว แล้วก็สามารถทำได้ ถูกไหมครับ + +00:21:05.100 --> 00:21:06.733 +แต่เราจำเป็นต้องรู้ + +00:21:06.800 --> 00:21:12.933 +ข้อจำกัดของเขา เพื่อรู้ว่า +โอเค ถ้าคุณอยากจะไปใช้แบบนี้ คุณยังจะแบบทู่ซี้ไปใช้ + +00:21:13.000 --> 00:21:17.533 +ธุรกิจแบบเนี้ย คุณจะต้องจูนมันยังไง +limit เป็นแค่ไหน เราจะรู้ นะครับ + +00:21:17.600 --> 00:21:21.333 +นั่นคือสิ่งสำคัญครับ ที่ผมบอกว่าทุก database ต้องเปิดเผย + +00:21:21.400 --> 00:21:26.633 +เราต้องมีการเรียนรู้เพื่อเราจะให้ความรู้แก่คนที่ใช้งาน หรือ developer ให้เข้าใจว่า + +00:21:26.700 --> 00:21:31.533 +ไม่ใช่แบบว่า โอเค คุณใช้เนี่ยเจ๋ง แต่ว่าคุณรู้ไหมว่า limit มันอยู่ตรงไหน + +00:21:31.600 --> 00:21:35.033 +ผมเป็นคนหนึ่งที่รู้ limit ค่อนข้างเยอะ +เพราะว่าลูกค้าถามมาว่า + +00:21:35.100 --> 00:21:39.533 +โอเค ตรงนี้ทำไมมันถึงพัง ตรงนี้มันถึง +มันถึงไม่ผ่าน เราก็จะไปค้นหา + +00:21:39.600 --> 00:21:42.033 +เราก็จะรู้ว่า โอเค มันคือ limitation + +00:21:42.100 --> 00:21:46.733 +เราก็สามารถให้คำแนะนำได้ว่า +โอเค limitation แบบนี้ควรจะแก้ท่าไหน ถ้าคุณอยาก + +00:21:46.800 --> 00:21:52.533 +จะยังคงใช้ MongoDB ของเราอยู่ +เราสามารถจะใช้ท่าซิกแซกแบบไหนได้บ้าง เป็นต้น + +00:21:52.600 --> 00:21:55.533 +เขาจะเห็นภาพว่ามันโหลดเร็วขึ้น มัน read เร็วขึ้น + +00:21:55.600 --> 00:21:59.133 +ภาพเห็นก็คือเป็นการ compare based on version 7 นะครับ + +00:21:59.200 --> 00:22:03.833 +ขอย้ำนะ เป็นการ based version 7 +ไม่ได้เปรียบเทียบ database ยี่ห้อใดๆ + +00:22:03.900 --> 00:22:06.833 +แต่เปรียบเทียบของตัวเองนะครับ + +00:22:08.600 --> 00:22:11.533 +ต่อไปนะครับ เรามาพูดถึงตัว + +00:22:11.600 --> 00:22:15.833 +performance นะครับ เป็นเรื่องของตัว time series + +00:22:15.900 --> 00:22:19.033 +ทุกคนรู้จัก time series ไหมครับ + +00:22:20.300 --> 00:22:25.733 +time series ก็คือมันเป็นโครงสร้างของ collection พิเศษนะครับ + +00:22:25.800 --> 00:22:29.433 +ที่ถูกออกแบบมาให้เก็บข้อมูลเกี่ยวกับเวลา + +00:22:29.500 --> 00:22:34.933 +เรามักจะใช้ time series collection นะครับ +ไว้สำหรับเก็บข้อมูลที่มีการ run แบบ real-time + +00:22:35.000 --> 00:22:39.633 +แล้วก็ดูเป็นเวลา เช่น พวกกราฟต่างๆ พวกที่เป็น crypto + +00:22:39.700 --> 00:22:45.333 +พวกที่เป็น crypto พวกที่เป็นการเงินนะครับ +เรามีธุรกิจลักษณะนั้นนะครับ แล้วเราก็ + +00:22:45.400 --> 00:22:48.233 +ทำการที่จะออกแบบใส่ time series เข้าไป + +00:22:48.300 --> 00:22:52.133 +ซึ่ง time series จะมีปัญหาหนึ่งก็คือเรื่องการ group + +00:22:52.200 --> 00:22:56.633 +เพราะว่าเราต้อง group ถูกไหม +เช่น ข้อมูลที่เป็นประเภท Internet of Things + +00:22:56.700 --> 00:23:00.133 +เซ็นเซอร์ทั้งหมดเนี่ย วิ่งเร็วขนาดไหน +เรารู้อยู่แล้วตามโรงงาน + +00:23:00.200 --> 00:23:03.633 +เซ็นเซอร์จะวิ่งหรือยิง +หรือแบบกระทั่งกล้องวงจรปิดที่เราเห็นอยู่ + +00:23:03.700 --> 00:23:07.133 +มันอาจจะส่งข้อมูลไป +ดังนั้นข้อมูลมันจะวิ่งเร็วมากเป็นระดับวินาที + +00:23:07.200 --> 00:23:12.433 +เพราะฉะนั้นการ grouping ข้อมูลวินาที +แปลว่าข้อมูลอาจจะเป็นแบบล้าน document ขึ้นไป + +00:23:13.500 --> 00:23:18.833 +ดังนั้นการ group นะครับ +เป็นหนึ่งในคำสั่งที่จะเรียกว่า block + +00:23:18.900 --> 00:23:22.433 +บล็อกการทำงาน +แปลว่ามันไม่สามารถจะ run แบบ parallel ได้ + +00:23:22.500 --> 00:23:24.433 +มันจะบล็อกให้หยุดการทำงานก่อน + +00:23:24.500 --> 00:23:30.033 +ดังนั้นเขาก็บอกว่าเราจะเพิ่มประสิทธิภาพในการทำพวก time series ให้ดีขึ้น + +00:23:30.100 --> 00:23:31.233 +ก็ทำให้เร็วขึ้น + +00:23:31.300 --> 00:23:35.633 +เพื่อจะเพิ่มประสิทธิภาพ 60% นะครับ อันนี้ผมก็ + +00:23:35.700 --> 00:23:39.733 +คิดว่าเขามีตัว proof อยู่แล้วนะ +เพียงแต่ว่าผมยังไม่ได้ไปอ่านพวก proof point + +00:23:39.800 --> 00:23:43.633 +แต่นี่คือสิ่งที่ถูกพัฒนาให้ดีขึ้น + +00:23:43.700 --> 00:23:48.933 +ใน time series ซึ่ง time series +จะเป็น collection ที่เหมาะสำหรับข้อมูลที่ + +00:23:49.800 --> 00:23:55.033 +เราต้องการเก็บข้อมูลขนาดใหญ่ที่มีระดับแบบเป็น 10 ล้าน document + +00:23:55.100 --> 00:24:01.833 +ขึ้นไป แล้วข้อมูลมันจะ size ใหญ่ +แล้วเราต้องการที่จะลดขนาด index + +00:24:01.900 --> 00:24:05.533 +และขนาด storage เฉพาะ collection นั้น +เราถึงจะทำเป็น time series + +00:24:05.600 --> 00:24:09.033 +เพราะฉะนั้น time series +ไม่ได้บอกว่าเหมาะสำหรับ time series + +00:24:09.100 --> 00:24:10.733 +หรือเป็น data time อย่างเดียว + +00:24:10.800 --> 00:24:13.233 +หรือเป็น data point ที่จะเหมาะกับข้อมูลใดๆ ก็ตามที่คุณอยากจะเก็บมัน + +00:24:13.300 --> 00:24:17.933 +และคุณอยากจะลด size มัน +แต่คุณต้องรู้ limitation เหมือนเดิมนะ + +00:24:18.000 --> 00:24:19.533 +คุณสามารถเข้าเว็บไซต์แล้วดู limitation + +00:24:19.600 --> 00:24:24.433 +เพราะว่าในเว็บไซต์ MongoDB ค่อนข้างที่จะ provide document ค่อนข้างเยอะละกัน + +00:24:24.500 --> 00:24:29.533 +เพราะฉะนั้นเราต้องถาม Gen AI +ในเว็บไซต์ MongoDB เนี่ย จะมีเมนูที่เป็น Gen AI + +00:24:29.600 --> 00:24:32.133 +เพื่อให้เราสอบถามแล้วมันก็จะวิ่งไปที่หน้าต่างต่างๆ ให้เรา + +00:24:32.200 --> 00:24:35.233 +แทนที่เราต้องไปนั่งคลิกๆ นะครับ เหนื่อยเสียเวลา + +00:24:35.300 --> 00:24:39.233 +เราก็อาจจะใช้วิธีการทำผ่าน Gen AI ของ MongoDB นั่นเองนะครับ + +00:24:42.800 --> 00:24:44.333 +ต่อไปนะครับ + +00:24:50.500 --> 00:24:56.433 +MongoDB ใช้ทุกยี่ห้อ หมายความว่า + +00:24:57.700 --> 00:24:59.333 +ถามเจมส์ เดี๋ยวให้เจมส์ตอบแล้วกัน + +00:25:09.800 --> 00:25:13.833 +AI ที่อยู่ของเราข้างใน มันจะเป็น Machine Learning Model + +00:25:13.900 --> 00:25:16.533 +มันไม่ใช่ Language Model มันใช้ Language Model +เราไม่มี Language Model อย่างนั้นครับ + +00:25:16.600 --> 00:25:18.133 +แต่เราจะมี Machine Learning Model + +00:25:18.200 --> 00:25:20.433 +ที่จะไว้ทำพวก Searching Vector Search อะไรอย่างเงี้ยครับ + +00:25:20.500 --> 00:25:22.533 +ซึ่งเดี๋ยวจะต่อไปจะพูดให้เดียวก่อนนะครับ + +00:25:23.200 --> 00:25:28.133 +ขอบคุณนะครับเจมส์ ก็คือเดี๋ยวรอทางเซคชั่นของคุณเจมส์นะครับ + +00:25:28.200 --> 00:25:34.733 +ต่อไปนะครับ เรามาพูดถึงตัวที่เป็น Query Execution Improvement นะครับ + +00:25:35.300 --> 00:25:42.233 +ก็คือเราก็จะลดการทำงานที่ช้าให้ทำงานได้เร็วขึ้น + +00:25:42.300 --> 00:25:47.033 +แล้วก็ทำการ improve plan cache นะครับ +plan cache คืออะไรนะครับ + +00:25:47.100 --> 00:25:50.733 +ตอนก่อนหน้านั้นเนี่ย ผมมาทำ relational database มาก่อนเนาะ + +00:25:50.800 --> 00:25:54.033 +ผมก็ใช้ plan cache ดู แต่ผมยังไม่เข้าใจมันอย่าง 100% + +00:25:54.100 --> 00:25:55.533 +พอผมมาทำ MongoDB ผมเลยต้องเข้าใจเยอะ + +00:25:55.600 --> 00:26:01.233 +เพราะว่าเรามีสิ่งหนึ่งที่ช่วยกระตุ้นทำให้เราเรียนรู้มากขึ้นในเชิงของ expert + +00:26:01.300 --> 00:26:04.433 +ในมุมของ product ของเขาก็เพราะว่าลูกค้าจะถามว่า + +00:26:04.900 --> 00:26:10.133 +เราทำยังไง +ทำไมเวลาที่เรา query แล้วมันไปเลือก index + +00:26:10.200 --> 00:26:14.733 +สมมุติว่าเราสร้าง index สองตัวมาใช้สำหรับ query ให้เร็ว + +00:26:14.800 --> 00:26:19.133 +index สองตัวเนี้ย query ที่เรารันไปเนี่ย +มันเลือก index ตัวที่ 1 แทนที่จะเลือกตัวที่ 2 + +00:26:19.200 --> 00:26:21.033 +เราสร้างตัวที่ 2 มาเพราะว่าเราบอกว่า + +00:26:21.100 --> 00:26:24.533 +อยากให้ query ของเราเนี่ยไปใช้ index ตัวที่ 2 เพราะว่าประสิทธิภาพ + +00:26:24.600 --> 00:26:29.433 +เร็วขึ้น มันก็จะมีคนพบว่า +โอเค แสดงว่าทุกครั้งที่เรารันมันจะเก็บสถิติครับ + +00:26:29.500 --> 00:26:34.233 +สถิติที่มันเลือกใช้แล้วเหมาะสมมันจะเก็บไว้ที่เรียกว่า plan cache + +00:26:34.300 --> 00:26:39.833 +มันจะเก็บสถิติว่า พอเราเก็บปุ๊บ +แน่นอนครับ มันมีสถิติใหม่ ถูกไหม + +00:26:39.900 --> 00:26:44.333 +แต่มันบางครั้งเนี่ย มันจะไม่ทำการไป overwrite cache เดิม + +00:26:44.400 --> 00:26:48.133 +เราเลยต้องทำการเคลียร์มัน เราถึงรู้ว่ามันมี plan cache อยู่ + +00:26:48.200 --> 00:26:49.733 +และ plan cache เนี่ย + +00:26:49.800 --> 00:26:56.533 +มันจะมี mechanism ในแต่ละ database +ที่เหมาะสมว่าเราควรจะ overwrite มันตอนไหน + +00:26:56.600 --> 00:27:00.233 +แต่เราสามารถจะบังคับมันเคลียร์ cache ได้ + +00:27:00.300 --> 00:27:05.633 +เราจะเรียกตรงนี้ว่าเป็น plan cache +ในตัว plan cache เราก็จะมีการปรับปรุง + +00:27:05.700 --> 00:27:12.433 +ทำการ reduce กระบวนการ scan แล้วก็ fetch +ก็คือการหยิบเอกสารที่ถูกต้อง + +00:27:12.500 --> 00:27:16.233 +ของตัว MongoDB เวลาเรา query ให้ดีขึ้น + +00:27:19.600 --> 00:27:23.633 +อันนี้คือสิ่งที่มันจะเพิ่มนะครับ + +00:27:23.700 --> 00:27:27.433 +ก็คือนอกจากมัน improve ก็คือมันจะ improve เรื่องของ index นะครับ + +00:27:27.500 --> 00:27:31.833 +เรื่องของการเช็ค equality predicate ก็คือ การใช้คำว่าเท่ากับ + +00:27:31.900 --> 00:27:36.133 +การ find ข้อมูลที่แบบ match จริงๆ +เราจะเรียกว่าเป็นตัว equality นะครับ + +00:27:36.200 --> 00:27:40.433 +มันจะเพิ่ม stage หนึ่งเรียกว่า express นะครับ +คำว่า stage คืออะไรนะ + +00:27:40.500 --> 00:27:44.133 +ผมอาจจะบอกคร่าวๆ ว่ามันจะลงลึกไปตรง aggregation framework + +00:27:44.200 --> 00:27:47.933 +เวลาเราเขียน framework ของ MongoDB เนี่ย มันคือการเขียนแบบ + +00:27:48.000 --> 00:27:52.233 +เป็น stage ก็คือมองภาพเป็น data pipeline +แต่ละ data pipeline มีแต่ละฐาน + +00:27:52.300 --> 00:27:53.433 +ผมให้มองเป็นฐานเนาะ + +00:27:53.500 --> 00:27:56.733 +เพราะฉะนั้นเวลาเราล้อยเรียงกันแต่ละฐานเพื่อออก output + +00:27:56.800 --> 00:27:59.533 +คุณก็จะมีขั้นตอนฐานที่ 1 2 3 ทำอะไรถูกไหมครับ + +00:27:59.600 --> 00:28:05.133 +เราจะเรียกตรงเนี้ยว่าเป็น stage ซึ่งแต่ละ stage เนี่ยมันคือการเราเขียนคำสั่งแยกเข้าไป + +00:28:05.200 --> 00:28:10.033 +พอเราเขียนเข้าไปแต่ละฐานเนี่ย +พอเวลามันไป run อยู่บน MongoDB + +00:28:10.100 --> 00:28:16.933 +มันก็จะบอกว่า โอเค ฐานนี้ใช้ stage แปลว่าเรียกว่าอะไร เช่น fetch stage, merge stage + +00:28:17.000 --> 00:28:20.433 +มันก็จะมี stage ใหม่หรือฐานใหม่ที่ชื่อว่า express + +00:28:20.500 --> 00:28:25.433 +เพื่อช่วยทำการปรับปรุง query ที่เราทำ +ให้มีประสิทธิภาพเพิ่มขึ้น + +00:28:25.500 --> 00:28:29.433 +นั่นเองนะครับ อันนี้เป็นแบบบอกคร่าวๆ นะครับ +คือการเพิ่มฐานใหม่ + +00:28:29.500 --> 00:28:32.833 +ในการแปลงคำสั่งเรา ชื่อว่า express นะครับ + +00:28:34.400 --> 00:28:38.833 +ซึ่งนะครับ มันก็จะปรับปรุงตัว latency +latency คือความช้าของแต่ละฐานนะครับ + +00:28:38.900 --> 00:28:42.233 +เขาก็จะปรับปรุงให้มีประสิทธิภาพเร็วขึ้น 17% นะครับ + +00:28:43.800 --> 00:28:49.233 +ต่อไปนะครับ เรามาพูดถึงเรื่องของ memory ครับ + +00:28:49.900 --> 00:28:55.633 +อันนี้ก็จะลงลึกนิดนึงนะครับ ผมว่าจะแบบง่ายๆ เพื่อให้ทุกท่านเข้าใจง่ายๆ ก็คือ + +00:28:55.700 --> 00:29:01.833 +ปกติเวลาเราอ่านเขียนข้อมูล +มันจะอ่านเขียนข้อมูลผ่าน memory + +00:29:01.900 --> 00:29:06.833 +สิ่งหนึ่งที่ทำให้เข้าใจก่อนนะครับ ก็คือ MongoDB เรามี RAM 64 GB + +00:29:06.900 --> 00:29:11.933 +ไม่ว่าคุณไปตั้ง database MongoDB เวอร์ชันอะไรก็ตาม รุ่นอะไรก็ตาม ที่คอมพิวเตอร์คุณ + +00:29:12.000 --> 00:29:16.633 +ถ้าคุณมี RAM 64 GB คุณไม่ได้เซ็ตอะไรเลย +มันจะใช้เพียงแค่ + +00:29:16.700 --> 00:29:20.433 +50% นะครับ แล้วก็ลบไป 1 + +00:29:20.500 --> 00:29:25.033 +50% แล้วก็ลบไป 1 ก็คือหมายความว่ามันจะใช้ประมาณครึ่งนึง + +00:29:25.100 --> 00:29:25.833 +ให้มองภาพ + +00:29:25.900 --> 00:29:28.533 +คุณมี 64 มันใช้แค่ 32 + +00:29:28.600 --> 00:29:33.733 +มันไม่ใช้เกินกว่านั้นที่เป็นตัวหลัก +แต่ว่ามันมีโอกาสไปยืม + +00:29:33.800 --> 00:29:38.733 +ผมเรียกว่ายืม +ยืมส่วนที่เหลือมาใช้ เพราะว่าเราไปยืมบ่อยๆ + +00:29:38.800 --> 00:29:44.633 +ปกติแล้วระบบปฏิบัติการจะมองภาพว่า +ให้มองภาพว่าเรามีระบบ OS กับ database ใช่มั้ยครับ + +00:29:44.700 --> 00:29:48.933 +แล้วถ้า database ขอจองครึ่งหนึ่ง OS บอกว่า +โอเค เอาไปครึ่งหนึ่งพอนะ ขอฉันเป็นอีกครึ่งหนึ่ง + +00:29:49.000 --> 00:29:52.833 +คุณใช้ query run ไปแบบ run มากๆ เลย +บางคนอาจจะใช้ keyword + +00:29:52.900 --> 00:29:55.833 +ที่ผมอาจจะบอกว่าคือ keyword เรียกว่า allow disk use นะ + +00:29:55.900 --> 00:29:59.133 +เวลามันจะมี keyword นี้ ถ้าเราได้ใช้ query เยอะ เราจะเข้าใจ + +00:29:59.200 --> 00:30:03.133 +ก็คืออยากใช้ RAM เกินแบบ + +00:30:03.200 --> 00:30:05.433 +เกินกว่าที่มีอยู่นะครับ ไปขอยืม OS + +00:30:05.500 --> 00:30:08.933 +OS บอกว่า ยืมได้ อ่ะ ฉันให้ ยืมแล้วคืนนะ ยืมแล้วคืน + +00:30:09.000 --> 00:30:12.033 +มันจะมีบางครั้งครับ ที่เรายืม +ยืมไปถึง 90% + +00:30:12.600 --> 00:30:18.033 +พอไปถึง 90 OS บอกว่า +เฮ้ย ยืมเกิน 90 แล้ว ผมต้องการจะ + +00:30:18.100 --> 00:30:22.433 +ไม่ให้คุณยืม ผมจะหยุดคุณเลย +มันก็จะทำการมา stop database ครับ + +00:30:22.500 --> 00:30:27.233 +ให้ database หยุดทำงาน +นั่นคือการที่มันจะเกิดการ kill process ทิ้ง + +00:30:27.300 --> 00:30:31.933 +เพราะฉะนั้นแปลว่า ถ้าเราทำๆ ไปแล้วมัน fail +ไม่ต้องตกใจ มันก็คือแปลว่า + +00:30:32.000 --> 00:30:37.133 +คุณสามารถตรวจสอบกับ log ดูเลยว่ามันเกิดอะไรขึ้น +อันหนึ่งคือคุณใช้ RAM เกิน OS บอกมาห้าม + +00:30:37.200 --> 00:30:37.933 +เกินไปแล้ว + +00:30:38.000 --> 00:30:41.333 +ไม่งั้นเกินไปกว่านี้เกิดอะไรขึ้นครับ เครื่อง restart + +00:30:41.400 --> 00:30:45.233 +ดังนั้น คอมพิวเตอร์ +ตัว OS พยายามไม่อยาก restart + +00:30:45.300 --> 00:30:47.633 +เครื่องตัวเอง เพราะว่า RAM ไม่พอ + +00:30:47.700 --> 00:30:51.733 +ดังนั้นเขาก็เลยตัดปัญหาว่าเกินปุ๊บจัดการ MongoDB ทิ้งเลย + +00:30:51.800 --> 00:30:57.133 +ให้ตัวเองพังไป มันก็จะ restart ขึ้นมาใหม่ +เราสามารถจะ restart ขึ้นมาใหม่ได้ + +00:30:57.200 --> 00:31:01.833 +ตอนนี้คือความหมายของตัว memory ก่อนนะครับ +นำมาสู่เรื่องของการเก็บ + +00:31:01.900 --> 00:31:06.633 +ข้อมูลนะครับ เพราะฉะนั้น +MongoDB จะอ่านเขียนผ่าน memory ก่อนเสมอ + +00:31:07.900 --> 00:31:13.033 +แล้วค่อยในประมาณไม่กี่วินาที +ไม่กี่มิลลิวินาที หรือระดับวินาที + +00:31:13.100 --> 00:31:16.733 +เราจะทำการเซฟจาก memory ลงบนไฟล์ + +00:31:16.800 --> 00:31:20.833 +MongoDB สุดท้ายแล้วต้องเซฟบนไฟล์ +สุดท้ายแล้วผมเชื่อว่า + +00:31:20.900 --> 00:31:24.033 +ผมเห็น database หลายๆ ยี่ห้อที่เคย run อยู่บน memory + +00:31:24.100 --> 00:31:27.633 +สุดท้ายต้องบอกตัวเองว่า ฉันเซฟเป็น memory ไม่ไหวเหมือนกัน + +00:31:27.700 --> 00:31:30.833 +ฉันก็ต้องเซฟบนไฟล์ด้วย +สุดท้ายทุกคนเซฟบนไฟล์ครับ + +00:31:30.900 --> 00:31:34.433 +เพราะไฟล์คือสิ่งที่การันตีได้ว่าข้อมูลของคุณอยู่ถาวร + +00:31:34.500 --> 00:31:36.633 +ถ้า hard disk ไม่พัง ไฟล์ไม่เสียจริงไหม + +00:31:36.700 --> 00:31:41.433 +เพราะฉะนั้น นั่นคือเหตุผลที่ทุกคนจะอ่าน memory เร็วขนาดไหนก็ตาม ทุกคนต้องลงไฟล์ครับ + +00:31:41.500 --> 00:31:46.033 +ดังนั้น MongoDB ก็เหมือนกันครับ +เราอ่านเขียนอยู่บน RAM + +00:31:46.100 --> 00:31:47.833 +สุดท้ายเราก็ต้องเอาลงบนไฟล์ + +00:31:47.900 --> 00:31:51.033 +เพราะฉะนั้นเขาก็จะบอกว่าวิธีการจัดการ data file— + +00:31:51.100 --> 00:31:52.633 +data เนี่ยจะอยู่บน RAM + +00:31:52.700 --> 00:31:56.133 +เขาก็จะบอกว่ามันจะมีช่องว่างนะครับเวลาที่ + +00:31:56.200 --> 00:31:59.333 +เราเก็บข้อมูลเป็นไฟล์ๆ เนี่ย มันก็จะอ่านเขียนไฟล์นะ + +00:31:59.400 --> 00:32:01.733 +เหมือนเราอ่าน Excel ครับ ให้มองภาพว่า + +00:32:01.800 --> 00:32:06.233 +มี Excel 1 Excel แล้วมีประมาณ 10 sheet +แต่ละ sheet เป็น row + +00:32:06.300 --> 00:32:07.133 +โอเคไหมครับ + +00:32:07.200 --> 00:32:09.733 +1 document ก็คือ 1 row เพราะฉะนั้นเราลบข้อมูล + +00:32:09.800 --> 00:32:13.833 +เราอ่านข้อมูลมันก็จะแบบเติม row เข้า row อย่างเงี้ยนะครับ MongoDB ก็จะเป็นแบบนั้นคือ + +00:32:13.900 --> 00:32:19.333 +มันจะทดแทนชดเชย row ที่หายไปสลับไปสลับมา +เราจะเรียกส่วนนั้นว่าเป็นพวก data page นะ + +00:32:19.400 --> 00:32:20.833 +ถ้าเรามองภาพ data page + +00:32:20.900 --> 00:32:24.633 +เพราะฉะนั้นมันจะมี gap นิดนึง +เราพยายามจะลดช่องว่างของ gap ลงนะครับ + +00:32:24.700 --> 00:32:30.733 +เพื่อจะ improve performance นะครับ +ลดช่องว่างตรงนั้นลงประมาณ 18% + +00:32:30.800 --> 00:32:33.333 +เพื่อให้มันง่ายขึ้นนะครับ อันนี้เป็นแบบ + +00:32:33.400 --> 00:32:37.433 +เป็นอธิบายที่ง่ายนะ +มันมี technical ค่อนข้างละเอียดนะครับ + +00:32:37.500 --> 00:32:39.233 +อันนี้คือการ improve นะครับ + +00:32:39.300 --> 00:32:40.633 +ต่อไปนะครับ + +00:32:46.600 --> 00:32:51.333 +…แล้วก็ตัวเซิร์ฟเวอร์ที่มี primary database เนี่ย + +00:32:51.400 --> 00:32:57.833 +ใช้แรมอยู่ประมาณ 500 GB แล้วเราเห็นว่า memory เนี่ยขึ้นไป 50% + +00:32:57.900 --> 00:33:00.833 +เรากำลังคิดว่าเวลาที่มันช้าเป็นบางช่าง +เนื่องจากว่ามันเป็น lag + +00:33:00.900 --> 00:33:03.433 +ที่ตัวฮาร์ดดิสก์ หรือ SSD + +00:33:03.500 --> 00:33:10.433 +ถ้าเราจ่ายเงินเพื่อซื้อแรมเป็น 1TB ไปเลย +เราคิดว่ามันจะเพิ่มความเร็ว + +00:33:10.500 --> 00:33:11.833 +แบบมีนัยยะไหม + +00:33:15.300 --> 00:33:20.733 +ต้องเรียนอย่างนี้ครับ อย่างแรกเลย + +00:33:20.800 --> 00:33:23.533 +สิ่งที่จะต้อง verify เพราะว่าปัญหาเนี่ย + +00:33:23.600 --> 00:33:25.133 +เราจะ verify ได้หลายส่วน + +00:33:25.200 --> 00:33:28.633 +การจ่ายเงินอาจจะไม่สามารถช่วยตรงนั้นได้ + +00:33:28.700 --> 00:33:33.633 +หากเราไม่รู้ตัวคอขวด เพราะฉะนั้นหลักการง่ายๆ +คือเราต้องอ่าน log ก่อน ประเด็นแรกนะครับ + +00:33:33.700 --> 00:33:36.933 +เพราะโดยปกติแล้ว MongoDB +ก็เหมือน database ทั่วไป + +00:33:40.200 --> 00:33:41.733 +ครับ + +00:33:46.700 --> 00:33:48.533 +…ดังนั้นเราจึง… + +00:35:11.800 --> 00:35:12.633 +ทดสอบ ทดสอบ + +00:35:25.000 --> 00:35:29.033 +(…จำนวนของ collection ที่ว่าห้ามเกิน…) + +00:35:29.100 --> 00:35:34.833 +(กี่ collection ต่อ 1 database +ทีนี้ถ้าเกิดในเคสที่ว่าใน 1 node หรือ 1 replica) + +00:35:34.900 --> 00:35:40.833 +(ผมอาจจะมีอยู่ซัก 20,000 database ใน 1 node นะครับ) + +00:35:40.900 --> 00:35:45.533 +(ในแต่ละดาต้าเบสก็จะจะมีคอลเลคชั่นซักประมาณ 1000 กว่าตัว) + +00:35:45.600 --> 00:35:48.233 +(โดยรวมรวมก็เป็นแสน) + +00:35:48.300 --> 00:35:49.833 +(อย่างนี้จะมีปัญหาไหมครับ) + +00:35:49.900 --> 00:35:56.733 +ที่จริงแล้วถ้าถามผมก็คือมันจะมีปัญหาแน่นอน +ในเรื่องที่เราต้องดูว่า + +00:35:56.800 --> 00:36:01.633 +ที่เราต้องดูว่ามันเป็นเรื่องของตัว memory ครับ +ปกติแล้ว data ที่ช้า + +00:36:01.700 --> 00:36:05.233 +นอกจาก collection ที่ใหญ่แล้ว เราต้องมีการคำนวณดูว่า + +00:36:05.300 --> 00:36:08.033 +ปกติแล้วมันจะใช้อัตราการ write ครับ + +00:36:08.300 --> 00:36:13.933 +อัตราการ write ประมาณ 30% ของขนาด sizing ทั้งหมด + +00:36:14.000 --> 00:36:17.433 +หมายความว่าถ้า 1 terabyte ครับ เราจะใช้ RAM อยู่ประมาณ + +00:36:17.500 --> 00:36:19.133 +300 GB เนอะ + +00:36:19.200 --> 00:36:24.133 +300 GB เพื่อให้ประสิทธิภาพเยี่ยมที่สุด ดีที่สุด + +00:36:24.200 --> 00:36:26.433 +ในความเป็นจริงไม่มีทาง ถูกไหม + +00:36:26.500 --> 00:36:30.833 +นั่นจึงเป็นเหตุผลที่ MongoDB ออกแบบให้เรามีการ scale out + +00:36:30.900 --> 00:36:32.133 +ออกไปทำ sharding + +00:36:33.300 --> 00:36:38.033 +อันนี้เป็นเรื่องปกติเลยนะครับ +เพราะว่าลูกค้าทุกคนเนี่ยเวลาที่เขาถามว่า + +00:36:38.100 --> 00:36:39.133 +เออ ผมต้องทำ sharding ผมก็บอกว่า + +00:36:39.200 --> 00:36:43.033 +โอเค คุณต้องดูก่อนนะว่าต้องดูตัวเดียวคือดู collection + +00:36:43.100 --> 00:36:50.133 +ถ้า collection ใหญ่ถึงประมาณเกิน 500 GB แล้วเนี่ย +คุณควรพิจารณาเอา collection นั้นเริ่มทำ sharding + +00:36:50.200 --> 00:36:51.933 +เพราะว่าคุณมองภาพว่า + +00:36:52.000 --> 00:36:55.633 +database ใช้ RAM สำหรับ write และ read + +00:36:55.700 --> 00:37:01.333 +ไม่ใช่แค่ read อย่างเดียวนะ +write และ read เราต้องมี RAM ที่สำรองในการ manage + +00:37:01.400 --> 00:37:04.233 +ของเขาประมาณอย่างต่ำ 30% + +00:37:04.300 --> 00:37:09.233 +นั่นแปลว่าคอมพิวเตอร์เซิร์ฟเวอร์ 1 เครื่อง +คงอัด RAM มากมายขนาดนั้นไม่ได้ จริงไหมครับ + +00:37:09.300 --> 00:37:15.133 +ดังนั้นมันจะมีประสบปัญหาเรื่องความช้า +แล้วก็ช้าทั้ง read และ write โดยปริยายในอนาคต + +00:37:16.100 --> 00:37:17.933 +นะครับ ตรงนี้นะครับ + +00:37:28.200 --> 00:37:32.433 +ที่จริงแล้วมันจะดูด้วย 2 แบบ +ปกติเราสามารถจะดูได้ก็คือ + +00:37:32.500 --> 00:37:34.833 +ปกติแล้วนะครับเวลามันช้าเนี่ย + +00:37:34.900 --> 00:37:37.433 +เหตุผลหลักๆ เลยก็คือ index ไม่มี + +00:37:38.400 --> 00:37:43.533 +ใช้ index ผิด มันจะขึ้นประโยคที่ว่า slow query +เราสามารถอ่านใน log ประเด็นแรกก่อนเลยครับ + +00:37:43.600 --> 00:37:48.733 +เราใช้ใน log เพราะฉะนั้นเราจะมี tool ตัวหนึ่ง +ที่เป็น open source tool ซึ่งเป็น senior + +00:37:48.800 --> 00:37:51.833 +เป็น staff engineer ของ MongoDB สร้างไว้ชื่อว่า + +00:37:51.900 --> 00:37:56.433 +Hatchet H-A-T-C-H-E-T + +00:37:56.500 --> 00:37:59.733 +เป็น tool ที่พัฒนาเป็น open source +พัฒนาด้วยภาษา Go + +00:37:59.800 --> 00:38:02.433 +ฉะนั้น tool ตัวนี้จะเป็นตัว analysis ครับ + +00:38:02.500 --> 00:38:07.133 +และทำให้เราเอา log มา analyze และขึ้นเป็น graph เลย + +00:38:07.200 --> 00:38:10.833 +แล้วก็จะเป็นคำพูดเป็นประโยชน์เหมือน AI พูด + +00:38:10.900 --> 00:38:14.633 +เป็นเหมือนชื่อภาษาอังกฤษผู้หญิงผู้ชายสักตัวหนึ่ง พูดเป็นภาษาอังกฤษว่า + +00:38:14.700 --> 00:38:15.933 +ตอนนี้เครื่องของคุณ + +00:38:16.000 --> 00:38:19.933 +ฉันอ่าน log ของคุณจากวันที่ A เวลานี้ ถึงวันที่ B เวลานี้ + +00:38:20.000 --> 00:38:21.233 +คุณพบว่าช้าขนาดไหน + +00:38:21.300 --> 00:38:23.733 +มี collection นี้ run ให้ยากลำบากแค่ไหน + +00:38:23.800 --> 00:38:29.333 +RAM ของคุณเป็นยังไง driver ของคุณไม่ compatible แล้วหรือยัง + +00:38:29.400 --> 00:38:31.933 +อันนี้จะเป็นส่วนที่ทำให้เรา analyze ได้ + +00:38:33.100 --> 00:38:36.333 +เพราะฉะนั้นในนั้นจะบอก สุดท้ายเราจะเอาพวกนี้ไป proof หมด + +00:38:36.400 --> 00:38:39.733 +เพราะบางคนผมเจอว่าดีเหมือนทุกอย่างเลย +แต่ driver เก่า + +00:38:41.100 --> 00:38:46.033 +แล้วเขาก็ไม่เปลี่ยนหากไม่มีหลักฐานยืนยัน +เราก็ต้องใช้ tool พวกนี้แล้วให้ tool มันบอก + +00:38:46.100 --> 00:38:47.033 +เพราะเราไม่บอกเอง + +00:38:47.100 --> 00:38:52.133 +เราบอกว่า โอเค tool เราพัฒนา เราบอกแล้วว่า +driver ของคุณเก่า ช่วยเปลี่ยนเถอะ + +00:38:52.200 --> 00:38:56.633 +เพื่อมันจะ compatible กับ database ที่คุณเป็นเวอร์ชันใหม่ อย่างนี้เป็นต้น + +00:38:56.700 --> 00:39:02.333 +ทุกอย่างมีหลักฐาน อันนี้น่าจะตอบคำถามด้วยดูใน log + +00:39:03.700 --> 00:39:06.833 +ต่อไปนะครับ เขาก็จะ performance ในเรื่องนะครับ + +00:39:06.900 --> 00:39:10.533 +กลับมาตรงนี้เนอะ ก็คือปกติแล้วทุกคนรู้จัก replica เนาะ + +00:39:10.600 --> 00:39:13.633 +replica จะมีปัญหาหนึ่งก็คือเรื่อง lag time + +00:39:13.700 --> 00:39:17.533 +lag time ก็คือหมายความว่าเวลาเราสร้าง server +เราจะวางบน VM + +00:39:17.600 --> 00:39:19.833 +คุณจะวางไว้ที่ region เดียวกันประเด็นแรก + +00:39:19.900 --> 00:39:26.233 +วางไว้บนตัว AZ ตัวเดียวกันแบบใกล้เคียงกันคือเช่น + +00:39:26.300 --> 00:39:30.933 +คุณวางสิงคโปร์ 1 สิงคโปร์ 2 สิงคโปร์ 3 +โอเค ยังคงมีระยะทางที่ได้ + +00:39:31.000 --> 00:39:35.533 +หรือถ้าคุณไปวางแบบสิงคโปร์ที อเมริกาที นะครับ + +00:39:35.600 --> 00:39:40.933 +ญี่ปุ่นที ซึ่งตรงนี้ก็มีเหตุผลเป็นเรื่องปกติ +ที่มันจะเกิดเรื่อง performance หรือ lag time + +00:39:41.000 --> 00:39:44.633 +คำว่า lag time performance จะเกิดตอนไหน +เกิดตอนที่คุณต้องการจะ + +00:39:44.700 --> 00:39:50.833 +เกิดหนึ่ง เวลาระบบล่ม +เวลาระบบล่มที่สิงคโปร์มันจะ switch + +00:39:50.900 --> 00:39:57.333 +สมมุติว่าไปที่ฮ่องกง +การ switch ไปเนี่ยมันช้าหรือเร็วเพราะตัว latency + +00:39:57.400 --> 00:40:00.533 +กว่ามันจะ switch แอปพลิเคชันคุณต้องแก้ config ให้ถูกต้อง + +00:40:00.600 --> 00:40:06.433 +ในการ run อยู่ภายใน 10 วินาทีนะ มันก็จะทำได้ +ตรงนี้เราจะ improve เรื่อง lag time มากขึ้น + +00:40:06.500 --> 00:40:10.133 +เพื่อให้การันตีได้ว่าเกิด lag น้อยลงนะครับ + +00:40:10.200 --> 00:40:13.233 +อันนี้เป็นเรื่องของการทำ HA ของตัว replica set นะครับ + +00:40:15.500 --> 00:40:16.233 +อ่า นี่นะครับ + +00:40:17.300 --> 00:40:22.433 +เขาก็จะเขียนว่า จะมีเรื่อง decrease replication +การ acknowledge ที่เร็วขึ้นนะครับ + +00:40:22.500 --> 00:40:26.333 +ถ้าบางคนไม่รู้จัก acknowledge ก็คือว่า database ทุกตัวครับ ควรจะมีเรื่องนี้ + +00:40:26.400 --> 00:40:31.033 +ก็คือเรื่อง acknowledge MongoDB ใช้ acknowledge +เราจะเรียก acknowledge หรือว่าเป็นตัว w + +00:40:31.100 --> 00:40:35.733 +เวลามันจะเป็นการ set ที่ connection string ของ application + +00:40:35.800 --> 00:40:40.833 +ที่ใช้ driver official ของ MongoDB ที่อยู่ภายในนั้นนะครับ + +00:40:40.900 --> 00:40:42.533 +w แปลว่า write concern + +00:40:42.600 --> 00:40:46.933 +คำว่า w ก็คือเป็นการบอกว่า +เราจะ acknowledge เร็วแค่ไหน + +00:40:47.000 --> 00:40:50.433 +เช่น สมมุติว่า w เท่ากับ 0 + +00:40:50.500 --> 00:40:53.933 +ก็คือว่าคุณจะ acknowledge แบบเร็วเลยทันที ไม่ต้อง replica set + +00:40:54.000 --> 00:40:56.733 +หรือเราใช้ w เท่ากับ majority แปลว่ามี 3 เครื่อง + +00:40:56.800 --> 00:41:00.033 +จะต้องมี 2 เครื่องที่มี copy data แล้วค่อย acknowledge ไป + +00:41:00.100 --> 00:41:00.933 +นี้เป็นต้นนะครับ + +00:41:01.000 --> 00:41:05.133 +อันนี้คือเป็นเรื่องของตัว acknowledge ที่จะพัฒนาให้เร็วขึ้นนั่นเองนะครับ + +00:41:06.500 --> 00:41:12.433 +โอเค จะเพิ่ม 20% นะครับ ต่อไปนะครับ +นี่คือเป็นการเพิ่ม enhanced performance เนาะนะครับ + +00:41:12.500 --> 00:41:15.133 +อันนี้ก็จะผ่านไปก่อนเนาะ เพราะมันเป็นเรื่องของภายใน + +00:41:15.200 --> 00:41:18.733 +ก็คือพูดง่ายๆ Atlas จะปรับปรุงกับตัว self-manage จะปรับปรุงมากขึ้น + +00:41:18.800 --> 00:41:20.533 +ในเรื่องของ lag ต่างๆ นะครับ + +00:41:21.900 --> 00:41:25.333 +โอเค นะครับ โห เยอะ… + +00:41:25.400 --> 00:41:29.233 +ตัวนี้ก็คือจะเป็นเรื่องของตัวจัดการเรื่องพวก plan cache นะครับ + +00:41:29.300 --> 00:41:32.033 +ตัวนี้ก็ improve ครับ ก็คืออันนี้พูดที่ Atlas + +00:41:32.100 --> 00:41:35.533 +ผมจะไปที่จุดสำคัญ มันอาจจะค่อนข้างเยอะนะครับ + +00:41:35.600 --> 00:41:40.733 +ส่วนที่เป็น Atlas นะ Atlas จะมีหน้าจอหนึ่งบน Atlas ก็คือ cloud service ของ MongoDB + +00:41:40.800 --> 00:41:44.833 +จะมีเรียกว่า query insight จะบอกว่า query ตัวไหน run ช้า run เร็ว + +00:41:46.400 --> 00:41:48.533 +run collection ตัวไหนบ้าง จะละเอียดกว่าเดิม + +00:41:48.600 --> 00:41:51.533 +เมื่อก่อนจะไม่ใช่ตัวนี้ เมื่อก่อนจะเป็นแค่แบบ profiler ธรรมดา + +00:41:51.600 --> 00:41:55.333 +ตอนนี้จะเป็นแบบ query insight เลย +เห็นชัดๆ เลยว่าเป็นตัวไหนนะครับ + +00:41:55.400 --> 00:41:56.633 +เพื่อช่วยลดปัญหานะครับ + +00:41:56.700 --> 00:42:00.533 +เขาจะพัฒนามาเพื่อสุดท้ายแล้ว อยากให้ developer มีความรู้แล้วก็แบบ + +00:42:01.500 --> 00:42:06.833 +อ่านเห็นได้ง่าย เพราะ MongoDB บน cloud เราเรียกว่าเป็น developer data platform + +00:42:06.900 --> 00:42:10.033 +เป็นแพลตฟอร์มสำหรับ developer ทำงานแทน DBA ได้ + +00:42:11.000 --> 00:42:15.433 +พูดตรงๆ ก็คือเขาพยายามให้ developer ทำงานมี skill DBA ได้ด้วยในตัว + +00:42:15.500 --> 00:42:18.833 +เพราะฉะนั้นเขาจะทำเรื่อง monitor ให้ง่ายขึ้นนะครับ + +00:42:19.900 --> 00:42:24.533 +อันนี้เราก็สามารถ compare ได้นะครับ +แล้วก็สามารถดู query trend ได้ด้วยนะครับ + +00:42:24.600 --> 00:42:28.933 +เป็น plot graph เป็น data point นะครับ แล้วก็สามารถดู shape ได้นะครับ + +00:42:29.600 --> 00:42:30.233 +โอเค ต่อไป + +00:42:30.300 --> 00:42:33.833 +มาถึงเรื่องที่ผมคิดว่าน่าสนใจก็คือ query shape นะครับ + +00:42:33.900 --> 00:42:37.833 +query shape ก็คือเวลาเรา query เราดู plan มันจะมี shape นะครับ + +00:42:37.900 --> 00:42:40.333 +shape จะเข้ารหัสแบบนี้ เราสามารถ block + +00:42:41.600 --> 00:42:45.233 +block บอกว่า query เนี้ยหากมี application ยิงมา + +00:42:45.300 --> 00:42:49.433 +ถ้าเป็น query shape นี้นะ คำว่า shape นี้ไม่ใช่แปลว่า query command อะไรนะ + +00:42:49.500 --> 00:42:51.533 +มันจะ detect shape นั้น query อาจจะมีหลาย style + +00:42:51.600 --> 00:42:54.733 +แต่มันตรงกับ shape เนี้ย มันก็ยังคงเป็น shape นี้เสมอ + +00:42:54.800 --> 00:42:56.933 +งั้นพอมันเป็น shape นี้เรา block shape นี้ได้ + +00:42:57.000 --> 00:43:01.733 +ข้อดีก็คือว่า เราไม่ต้องแก้แอปครับ เราแค่ command เข้าไปบอกเค้าว่า block + +00:43:02.800 --> 00:43:07.233 +แอปพลิเคชันที่ยิงเข้ามาด้วย shape เดิมจะเกิด error เข้าไปบอกว่า + +00:43:07.300 --> 00:43:09.133 +เอ้ย คุณโดน block เพราะว่า + +00:43:09.200 --> 00:43:14.133 +คุณโดนบล็อกเพราะว่าคุณ เขาเรียกว่าอะไร +คุณโดนบล็อกเพราะว่า query ของคุณเนี่ยมีปัญหา + +00:43:14.200 --> 00:43:20.033 +มันทำการบล็อกคุณ จะมี error ไป detect ทันที +อันนี้เรียกว่าเป็น query shape + +00:43:20.100 --> 00:43:21.933 +เพราะฉะนั้นอันนี้ก็จะเป็นคำบอกนะ + +00:43:22.000 --> 00:43:23.333 +ผมลงรายละเอียดไปนิดนึง + +00:43:23.400 --> 00:43:25.433 +ก็คือเป็นการบอกว่าเราต้องการ reject + +00:43:25.500 --> 00:43:29.133 +query ที่รันมาแล้วเป็น collection scan เราต้องการบล็อก query นี้ + +00:43:29.200 --> 00:43:30.433 +แล้วก็เข้าไปแก้เลยครับ + +00:43:30.500 --> 00:43:36.833 +พิมพ์ command ปุ๊บ กดทำ +อันนี้ก็คือสิ่งที่สามารถจะบล็อกได้ทันที + +00:43:36.900 --> 00:43:42.433 +ต่อไปก็คือเราจะทำเรื่องของพวก timeout ต่างๆ +เรามักจะมีคนถามปัญหาบ่อยว่า + +00:43:42.500 --> 00:43:45.833 +connect แล้วเกิด timeout +timeout แบบนี้แบบนั้นเราจะทำยังไง + +00:43:45.900 --> 00:43:48.433 +หนึ่งนั้นก็คือเราสามารถ set default max time + +00:43:48.500 --> 00:43:49.633 +time ได้นะครับผม + +00:43:49.700 --> 00:43:54.033 +เพื่อช่วยให้นะครับ การ read เนี่ยมี timeout ได้ด้วยนะครับ + +00:43:54.100 --> 00:43:57.633 +ตรงนี้เป็นสิ่งที่เพิ่มเติมขึ้นมา ตรงนี้นะครับ + +00:43:59.900 --> 00:44:01.033 +อ่า ต่อไปนะครับ + +00:44:01.100 --> 00:44:06.133 +ส่วนนี้คือเป็นส่วนที่เราบอกว่าเราสามารถที่จะเซ็ต query pattern ได้ + +00:44:06.200 --> 00:44:09.833 +ปกติเรามีปัญหาครับ ทุกคนเคย force index ไหมครับ + +00:44:09.900 --> 00:44:12.733 +เวลาเราเขียน query เรามักจะ force ว่า index มี 3 ตัว + +00:44:12.800 --> 00:44:14.533 +แต่เราบอกว่าเราฉากใช้ตัวที่ 3 อ่ะ + +00:44:14.600 --> 00:44:16.733 +เราบอกว่า query เราไม่แตะตัวที่ 3 เลย + +00:44:16.800 --> 00:44:20.233 +เราบอกว่าเราใช้ hint หรือ force ให้มันใช้ index ตัวที่ 3 ตลอด + +00:44:20.300 --> 00:44:23.933 +แต่ตอนนี้เราไม่ต้องทำแบบนั้นนะครับ +ไม่ต้องไปแก้ application + +00:44:24.000 --> 00:44:24.733 +เราบอกเลยว่า + +00:44:24.800 --> 00:44:29.533 +ตอนเนี้ยใช้ shape เนี้ย +ถ้าคุณมา index ตัวนี้ คุณใช้ shape นี้เลย + +00:44:29.600 --> 00:44:33.033 +เป็นข้อดีก็คือหมายความว่า คุณจะถูกใช้อันเนี้ยตลอด + +00:44:33.400 --> 00:44:35.733 +ข้อเสียคือว่า คุณต้องมาเปลี่ยน command เอง + +00:44:36.500 --> 00:44:40.533 +เพราะว่ามันจะจำถาวร ไม่ว่าเครื่องจะ restart ขึ้นไป + +00:44:40.600 --> 00:44:44.833 +มันจะไม่ reset index plan ต่างๆ นะครับ ไม่เซ็ตเลยนะครับ + +00:44:46.600 --> 00:44:47.733 +โอเค นะครับ + +00:44:48.600 --> 00:44:54.033 +ส่วน scaling นะครับ +พูดง่ายๆ ว่า ทำ sharding สามารถ move + +00:44:54.100 --> 00:44:55.933 +collection ที่ไม่ shard ได้ + +00:44:56.000 --> 00:45:00.433 +ด้วย command ของมันเอง อัตโนมัติ แล้วก็ทำงานได้เร็ว มีประสิทธิภาพ + +00:45:00.500 --> 00:45:02.633 +เราจะเรียกตัวนี้ว่าเป็นการ move shard นะครับ + +00:45:02.700 --> 00:45:05.533 +นี่เขาเรียกว่าเป็นการ move collection เนาะ อัตโนมัติ นะครับ + +00:45:07.300 --> 00:45:10.033 +ลักษณะก็คือนะครับ ก็คือเราสามารถ move shard ได้เลยเนาะ + +00:45:10.100 --> 00:45:11.933 +อันนี้ก็คือเป็น + +00:45:12.000 --> 00:45:16.033 +ตัว feature นึงนะครับ เมื่อก่อนเรา move ยากนะ +เดี๋ยวนี้เรา move ง่ายนะครับ + +00:45:16.100 --> 00:45:19.033 +แค่พิมพ์ command ว่า move collection ไปอยู่ shard ไหน + +00:45:19.100 --> 00:45:21.333 +เรา move ได้เลย เพื่อทำให้มัน balance ครับ + +00:45:21.900 --> 00:45:24.733 +ทำให้ เอ่อ ตัว shard แต่ละ shard มีความ balance + +00:45:24.800 --> 00:45:29.333 +ทั้ง collection ที่ shard และ uncollection เอ่อ unsharding collection นะครับ + +00:45:30.800 --> 00:45:34.833 +โอเค ต่อไปก็คือเขาแค่เพิ่มนะครับ ความเร็วในการ + +00:45:34.900 --> 00:45:40.433 +ประสิทธิภาพในการทำ reshard +คำว่า reshard ก็คือ ทำ shard + +00:45:40.500 --> 00:45:42.733 +หมายความว่า อันนี้ลงนิดเดียวนะครับ + +00:45:42.800 --> 00:45:46.333 +การทำ shard ต้องมีการระบุ key ว่าเราจะแบ่ง data ไปแต่ละ + +00:45:46.400 --> 00:45:50.733 +ไปแต่ละ server ใช้อะไรเป็นตัวแบ่ง +พูดง่ายๆ เจ้าตัวแบ่งเนี่ยนะครับ + +00:45:50.800 --> 00:45:54.233 +เวลาเราเลือกผิด เรามักจะต้องสร้างตัวแบ่งนี้ใหม่ + +00:45:54.300 --> 00:45:57.433 +สร้างตัวแบ่งนี้ใหม่ ข้อมูลเป็นระดับ 10 terabyte เนี่ย + +00:45:57.500 --> 00:45:58.333 +ใช้เวลาหลายวัน + +00:45:59.400 --> 00:46:03.133 +เคยทำด้วย key นี้ +10TB เสร็จละ + +00:46:03.200 --> 00:46:07.733 +วันนี้คือ อ้าว ผิด เลือก key ผิดอ่ะ +ขอเปลี่ยน key ใหม่ reshard ใหม่นะครับ + +00:46:07.800 --> 00:46:09.133 +ใช้เวลาอีก 10 กว่าวัน + +00:46:09.200 --> 00:46:11.533 +ในระหว่างทำ +time performance drop อยู่แล้ว + +00:46:12.200 --> 00:46:16.833 +ดังนั้นเขาก็เลยออกแบบให้มีระบบกระบวนการที่เรียกว่า faster resharding + +00:46:16.900 --> 00:46:22.833 +ให้เร็วขึ้น คือการเพิ่ม performance นั่นเองนะครับ +อันนี้คือภาพที่เห็นนะครับ จากเมื่อก่อน + +00:46:22.900 --> 00:46:28.533 +1TB นะครับ มีการใช้ครับ 220 ชั่วโมงนะ เวอร์ชันนี้ + +00:46:28.600 --> 00:46:30.233 +เวอร์ชันนี้ 12 ชั่วโมงนะครับ + +00:46:30.300 --> 00:46:34.233 +เพราะฉะนั้นแปลว่า เวอร์ชันที่เราใช้เนี่ย ตอนนี้เวลาลดลงเห็นไหมครับ + +00:46:34.300 --> 00:46:36.633 +จาก 200 กว่าชั่วโมง เหลือแค่ 12 ชั่วโมง + +00:46:38.300 --> 00:46:42.233 +ทำเร็วขึ้นนะครับ เวอร์ชันนี้ก็คือเป็นเวอร์ชันที่เข้าแล้ว + +00:46:42.300 --> 00:46:45.233 +เป็นเวอร์ชันคั่นกลางระหว่างเมเจอร์ด้วยกัน + +00:46:45.300 --> 00:46:49.433 +แต่เราไม่ค่อยนิยมใช้งานจริงๆ แต่ว่ามันจะถูกนำไปทดสอบ + +00:46:49.500 --> 00:46:52.533 +แล้วก็สุดท้ายนำไปใช้งานจริงบนเวอร์ชัน 8 + +00:46:52.600 --> 00:46:55.633 +ก็คือลดไปประมาณ 10 เท่านะครับ + +00:46:57.400 --> 00:47:00.433 +ต่อไปนะครับ แบบนี้ก็คือเป็นสิ่งที่อำนวยความสะดวก + +00:47:00.500 --> 00:47:04.233 +ปกติแล้วเวลาเราทำ shard จะมีเซิร์ฟเวอร์อย่างน้อยๆ เพิ่มอีก 3 เครื่อง + +00:47:04.300 --> 00:47:07.933 +1 shard ก็คือมี 3 node อยู่แล้ว + +00:47:08.000 --> 00:47:09.733 +แล้วก็มีอีกสามเครื่อง ดังนั้น + +00:47:09.800 --> 00:47:14.933 +การทำเซิร์ฟเวอร์ที่เพิ่มเติมขึ้นมา +มันทำให้เราเสีย cost มากขึ้น + +00:47:15.000 --> 00:47:17.633 +ดังนั้นระบบ shard เลยบอกว่าเราต้องการ + +00:47:17.700 --> 00:47:18.633 +ยุบ + +00:47:18.700 --> 00:47:23.833 +ค่าใช้จ่ายของบาง server ลง เราเรียก server ตัวนั้นว่า config นะครับ + +00:47:23.900 --> 00:47:25.333 +อันนี้อาจจะเป็น detail ไปก่อนนะ + +00:47:25.400 --> 00:47:26.433 +ก็คือมันชื่อว่า config + +00:47:26.500 --> 00:47:28.133 +config จะเป็น server ที่เราต้องตั้ง + +00:47:28.200 --> 00:47:31.733 +ไม่ว่ายังไงเราต้องตั้ง server ไว้ 1 ไว้ 1 set เรียกว่า config + +00:47:31.800 --> 00:47:34.833 +ดังนั้นเค้าบอกว่ามี config เพิ่มก็มีค่าใช้จ่ายเพิ่ม + +00:47:34.900 --> 00:47:40.333 +เค้าเลยบอกว่าเราย้าย config ครับ มาอยู่ภายใต้ shard สักเครื่องนึง + +00:47:40.400 --> 00:47:44.733 +ที่มี performance น้อยลง +แปลว่าแทนที่เราจะต้องสร้างเครื่องคอมพิวเตอร์มา + +00:47:44.800 --> 00:47:47.333 +มาทำ config server +เราไม่ต้องแล้ว เรารวมมา + +00:47:48.300 --> 00:47:54.233 +รวมมาอยู่เป็นส่วนหนึ่งของ shard เลยได้เลยนะครับ +เหมาะกับข้อมูลที่มีขนาดอยู่ประมาณไม่เกิน 4TB + +00:47:55.400 --> 00:47:59.733 +อันนี้ผมสามารถบอกได้เลยนะ ไม่เกิน 4TB นะครับ +ต่อไปนะครับ เรื่อง + +00:47:59.800 --> 00:48:03.833 +น่าจะสุดท้ายนะครับ ก็คือตัว security + +00:48:03.900 --> 00:48:07.633 +เพิ่มฟีเจอร์หนึ่ง ปกติแล้วเวอร์ชัน 7 จะมีฟีเจอร์เรื่องการทำ + +00:48:07.700 --> 00:48:13.233 +OpenID เราสามารถที่จะทำ connect กับ OpenID + +00:48:13.300 --> 00:48:16.733 +ในการทำ เช่น เราต่อ Azure ID นะ + +00:48:16.800 --> 00:48:19.833 +สำหรับทำ single sign-on เราสามารถ manage ตรงนั้นได้ + +00:48:19.900 --> 00:48:22.133 +เพื่อเราระบุว่าแอปพลิเคชันเรา base on + +00:48:22.200 --> 00:48:24.833 +user role อันไหนที่อยู่ใน MongoDB + +00:48:24.900 --> 00:48:27.433 +เราสามารถ manage ในระดับนั้นได้นะครับ + +00:48:27.500 --> 00:48:32.033 +เพราะฉะนั้นนี่คือ นี่คือสิ่งที่ เพิ่มความสามารถตรงนั้นลงไปนะครับผม + +00:48:32.100 --> 00:48:34.833 +ก็คือการทำ workforce หรือ workload นะครับ + +00:48:34.900 --> 00:48:39.533 +ก่อนหน้านี้เราต้องสร้าง user แบบ one by one ปกตินะ +หรือแม้กระทั่งต่อพวก Azure + +00:48:39.600 --> 00:48:41.133 +แต่ตอนนี้เราสามารถจะทำแบบ + +00:48:41.200 --> 00:48:46.233 +link ไปที่พวกตัวที่เป็น OAuth ได้แล้วโดยตรง +หรือพวกที่เป็นตัว service support + +00:48:46.300 --> 00:48:49.733 +ที่เป็นตัว federation ของ Azure หรือของ GCP ได้นะครับ + +00:48:51.600 --> 00:48:56.933 +ส่วนนี้ก็คือเรียกว่าการ query +ผมไม่แน่ใจว่าทุกท่าน + +00:48:57.000 --> 00:49:01.733 +เคยใช้หรือเปล่า ว่าเรามีการ encrypt data ระดับ field ได้ + +00:49:01.800 --> 00:49:05.933 +ซึ่ง encrypt ไม่ใช่เรื่องแปลกนะทุกคน +encrypt database ทุกตัว encrypt ได้ + +00:49:06.000 --> 00:49:08.433 +แต่ encrypt แล้วไม่ต้องแกะ ไม่ต้อง decrypt + +00:49:08.500 --> 00:49:13.133 +แต่ query ได้ +ไม่ decrypt แต่ query ได้ + +00:49:13.200 --> 00:49:17.733 +เบื้องหลังง่ายมากครับ +ก็คือ มันก็คงไม่ง่าย แต่ผมเข้าใจแบบมุมง่ายๆ คือ + +00:49:17.800 --> 00:49:21.233 +มันใช้วิธีการ เอ่อ ใช้ index ไป compare + +00:49:22.400 --> 00:49:26.433 +เพราะฉะนั้นเค้าไม่ถอดรหัสนะ +ข้อมูลที่คุณเห็นจะเป็นดาวๆ นะครับ + +00:49:26.500 --> 00:49:30.333 +ก็คือแสดงผลไม่ได้ +นอกจากคุณมี key ไปถอดให้อ่าน + +00:49:30.400 --> 00:49:33.433 +ดังนั้นไม่มีใครอ่านได้ แต่ query ได้ + +00:49:34.500 --> 00:49:38.533 +เมื่อก่อนมัน query ได้ +คือเช่นผมเก็บเลขบัตรประชาชนว่า 1 2 3 นะครับ + +00:49:38.600 --> 00:49:40.733 +พอผมเข้ารหัสปุ๊บมันจะกลายเป็นดาวๆ ๆ + +00:49:40.800 --> 00:49:45.533 +ผมต้องการ where ว่าต้องการอ่านข้อมูลที่เป็น ID เท่ากับ 1 2 3 ที + +00:49:45.600 --> 00:49:49.333 +มันไม่ได้ไปแกะไอ้ดาวๆ ๆ มาเป็น 1 2 3 นะครับ +มันใช้เทคนิค + +00:49:49.400 --> 00:49:51.033 +อื่นในการจัดการเรื่อง index + +00:49:51.100 --> 00:49:54.933 +แล้วมันก็ไปค้นแบบ record เนี้ยเป็นเลข 1 2 3 4 มาโชว์ให้เราเห็น + +00:49:55.000 --> 00:49:57.133 +โดยที่ไม่ต้องถอดรหัสเลย + +00:49:57.200 --> 00:49:59.833 +เมื่อก่อนมันทำได้แค่ compare แบบเท่ากับ + +00:49:59.900 --> 00:50:03.433 +ตอนนี้ feature เพิ่มขึ้นก็คือ compare แบบ range ครับ + +00:50:03.500 --> 00:50:06.733 +ก็คือสามารถทำได้ก็คือมากกว่าน้อยกว่านี่นะครับ + +00:50:07.400 --> 00:50:10.833 +หรือว่ามากกว่าเท่ากับ หรือว่าน้อยกว่าเท่ากับได้นะครับ + +00:50:10.900 --> 00:50:15.133 +อันนี้เป็น feature แรกที่ MongoDB ชูเมื่อตอนเป็นเวอร์ชัน 7 เนาะ + +00:50:15.200 --> 00:50:15.933 +ตอนเวอร์ชัน + +00:50:16.000 --> 00:50:20.733 +8 ก็เลยเพิ่ม feature ในการทำเรื่อง range นะครับ +อันนี้เราเรียกเป็นตัว + +00:50:20.800 --> 00:50:23.733 +QE เนาะ ก็คือ queryable encryption นะครับ + +00:50:26.100 --> 00:50:29.533 +ต่อไปก็คือ เพิ่มมาตรฐานของเรื่อง log format ครับ + +00:50:29.600 --> 00:50:33.633 +อันนี้ก็เป็นไปตามมาตรฐานนะ +ถ้าใครใช้มาตรฐาน + +00:50:33.700 --> 00:50:37.733 +open cybersecurity ครับ +format เราสามารถจะเซ็ต + +00:50:37.800 --> 00:50:39.533 +ให้ log ที่ run ออกมานะครับ + +00:50:39.600 --> 00:50:43.633 +เข้ามาตรฐานนั้นเพื่อเอาไปใช้งานต่อ หรือไป approve ตามมาตรฐาน + +00:50:43.700 --> 00:50:49.733 +เพราะว่าเรามีหน่วยงานหลายๆ หน่วยงานที่ต้อง comply ตามมาตรฐานนั่นเองนะครับ + +00:50:51.400 --> 00:50:53.633 +โอเค นะครับ + +00:50:53.700 --> 00:51:01.333 +อันนี้ก็คือ สิ่งที่จะเข้ามานะครับ ในเวอร์ชั่น 8 อาจจะเร็วไปนิดนึง + +00:51:01.400 --> 00:51:04.633 +เพราะ content มันค่อนข้างเยอะมาก จะมีอีกหลายส่วนมากนะครับ + +00:51:04.700 --> 00:51:08.333 +ก็จะประมาณนี้นะครับผม มีคำถามไหมครับ + +00:51:12.800 --> 00:51:15.933 +ทำเวลามาก เนื้อหาหนักมากครับ diff --git a/data/videos/mongo0924/multimodal.jpg b/data/videos/mongo0924/multimodal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee03f9a98e066b7e503040950bba7cc5bf72d4b8 GIT binary patch literal 122843 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