วิธีการใช้ Vector Database: Pinecone กับ Langchain
ใครที่กำลังค้นหาข้อมูลเรื่องนี้แสดงว่าคุณกำลังเดินทางมายังปากธรณีประตูของการเข้าสู่ขอบเขตเซียนเอไอ ถ้าจะพูดภาษากำลังภายในหน่อยต้องเรียกว่าเป็นวิชาไหมฟ้าขั้นที่ 7 ก่อนจะขยับขึ้นไปเป็นวิชาไหมฟ้าขั้นที่ 8 คือการสร้างพวก automated AI agent อย่างพวก AutoGPT หรือ BabyAGI รวมไปถึง GPT Engineer ด้วย ซึ่งพวกนี้ล้วนต้องอาศัยพื้นฐานจากขั้น 7 คือฐานข้อมูลแบบเว็คเตอร์ (Vector Database) นี้ทั้งนั้น ส่วนคนที่ดิ้นรนมาจนถึงขั้น 8 ก็มักจะต่อยอดไปอีกสายคือการริอ่านสร้าง AI ของตัวเองขึ้นมาจาก scratch แบบว่าครั้งหนึ่งจะได้คุยอวดว่าเอไอแบบ ChatGPT น่ะหรือ ไม่เท่าไหร่นักหรอก เพราะฉันก็สร้างมาเองกับมือแล้ว (แบบเดียวกับการสร้างระบบปฏิบัติการลีนุกซ์จาก scratch เหมือนกัน) พวกที่ผ่านขั้นตอนนี้ไปได้จะเปรียบเสมือนย่างก้าวเซียนหรือพวกไหมฟ้าขั้น 9 ที่เป็นขั้นสุดยอดคือการทำ “ควอนตัมเอไอ” ซึ่งไม่กี่วันนี้ผมก็เห็นแล็ป ลอส อลาโมส ซึ่งเป็นแหล่งสิงสถิตของบรรดาเทพแต่ไหนแต่ไรเพิ่งออกเปเปอร์เรื่องนี้ที่ทำ breakthrough (อีกแล้วครับท่าน) มาหมาด ๆ เมื่อสี่วันก่อนนี้เอง
ผมเพิ่งผ่านสมรภูมิ Hackathon ของ Pinecone มาสด ๆ ร้อน ๆ เรียกว่าแทบปางตาย Learning curve ของฐานข้อมูลแบบเว็คเตอร์นี่เรียกว่า “อย่างชัน” แต่ใครที่ผ่านขั้นตอนการเรียนรู้นี้มาแล้วจะเห็นประโยชน์ของเรื่องนี้อย่างมาก ตอนส่งงานเขาไปซึ่งก็ยังไม่รู้ผลว่าหมู่หรือจ่า ซึ่งก็ไม่รู้ว่าทำไปได้ยังไง พอมาทบทวนอีกครั้งก็ต้องทำให้ความคิดเรื่องนี้กระจ่างชัดเผื่อนำมาใช้ประโยชน์ภายหลัง หรือเป็นประโยชน์กับคนอื่นไม่มากก็น้อย ที่สำคัญข้อมูลเรื่องนี้ยังไม่มีใครที่ไหนตีพิมพ์เป็นหนังสือให้เราหาอ่านได้ง่าย ๆ โดยทั่วไปก็ต้องตามหาอ่านตามเว็บไซต์ต่าง ๆ แต่ก็จะมีความยุ่งยากในการทำความเข้าใจอยู่พอสมควร ซึ่งเรื่องนี้ก็นับเป็นเรื่องแปลกอย่างหนึ่งในวงการ Machine Learning Operations (MLOps) เพราะเจ้าฐานข้อมูลเว็คเตอร์นี้ถือเป็นเรื่องยอดนิยมอันหนึ่งในหมู่ stack MLOps แบบ Gen AI นี้เหมือนกัน
ทำไปทำไม
เป้าหมายหลักในการใช้ฐานข้อมูลแบบเว็คเตอร์มีสองเรื่องใหญ่ ประการแรกคือต้องการใช้ขยายหน่วยความจำของเอไอพวกโมเดลภาษาขนาดใหญ่ (Large Language Model: LLM) ซึ่งเป็นแขนงหนึ่งของพวกเอไอ “ปัญญาประดิษฐ์รู้สร้าง” (Generative AI หรือ Gen AI) เอไอแบบ LLM อย่างแชทจีพีทีนี้เป็นที่รู้กันว่ามีความจำสั้นแบบ “ความจำปลาทอง” นี่ส่วนหนึ่งเป็นเพราะวิธีการออกแบบให้เน้นการสนใจสิ่งที่ต้องการแก้ปัญหา เรียกว่า Long-short Term Memory (LSTM) ซึ่งฐานข้อมูลเว็คเตอร์จะมาขยายส่วนความจำนี้ให้เป็นความจำถาวรให้กับเอไอ (Long Memory)
หมายเหตุ: LSTM นี้เป็นเทคนิคการทำให้หน่วยความจำสามารถใช้ “จดจำ” ได้ยาวนานขึ้นข้าม stage ในการประมวลผล เมื่อเทียบกับ Short-term Memory (STM) ที่ใช้กันในระบบเอไอแบบ Recurrent Neural Networks (RNNs) ทั่วไป ความจำทั้งสองประเภทนี้จัดเป็นความจำภายในระบบ (internal memory) ไม่ใช่ความจำภายนอกระบบ (external memory) ที่เก็บไว้ในฮาร์ดดิสก์หรือคลาวด์ทั่วไป แต่ปัญหาของ LSTM นี้คือจะมีต้นทุนแพงกว่า STM และมีความเสี่ยงในการเพิ่มการ “ตัดให้เข้ากันพอดี” (overfitting) ของโมเดลมากเกินไป และงานส่วนใหญ่การใช้ STM ก็เหมาะสมกับการใช้งานทั่วไปของระบบเอไอแล้ว นอกจากนี้การใช้ LSTM ยังเสี่ยงต่อการเสียรายละเอียดเล็กน้อย (แต่อาจมีความสำคัญ) ในการเรียนรู้แบบป้อนย้อนกลับ (backpropagation) ของโมเดล เรียกเป็นศัพท์เทคนิคว่า vanishing gradient problem หรือปัญหาการเลือนของเฉดรายละเอียด ลองนึกถึงภาพว่าใน STM จะเก็บข้อมูลได้น้อย ดังนั้นความแตกต่างของข้อมูลที่น้อยนั้นจึงสำคัญ แต่ในขณะที่ LSTM มีขนาดการเก็บข้อมูลที่มากกว่าดังนั้น ข้อมูลส่วนใหญ่ที่เกิดจากการเรียนรู้นั้นมักจะคงตัวจึงไปครอบงำข้อมูลเล็กน้อยที่ยังมีการเปลี่ยนแปลงได้ (แต่ยังอาจสำคัญอยู่)
ปกติเอไอแบบ LLM ทุกตัวจะมีขีดจำกัดในเรื่องฐานข้อมูลที่ว่ารู้ข้อมูลเท่าที่เราใส่ข้อมูลเทรนให้ (มีสองแบบเรียกว่า pre-trained และ fine-tuning) โดยทั่วไปกระบวนการทำ pre-trained หรือจะเรียกอีกอย่างว่าสร้างเอไอจาก scratch นี่มักเกี่ยวข้องกับการต้องป้อนข้อมูลขนาดใหญ่มาก ๆ ให้กับเอไอ และใช้เวลาในการทำ training ยาวนาน (ผมเข้าใจว่าแชทจีพีที หรือ จีพีที-4 นี่ใช้เวลาราว 6 เดือน ไม่นับว่าใช้ทรัพยากรจีพียูอีกหลักพัน แซม อัลท์แมนเคยตอบคำถามเป็นนัย ๆ ว่าเงินทุนที่ใช้แค่ในการเทรนเอไอนี้มากกว่า $100 ล้านเหรียญขึ้นไป) พวกเอไอที่ทำ pre-trained นี้มีความรู้แล้วสามารถพูดเป็นคำเป็นประโยคที่สื่อสารรู้เรื่องได้ แต่ไม่ใช่ว่ามันจะตอบคำถามได้ตรงกับความต้องการเสมอไป อย่างเราถามว่า “วันนี้อากาศดีไหม” มันอาจจะตอบมาว่า “หนังสือเล่มนี้สนุกจังเลย” เรียกว่าถามช้างตอบม้า ดังนั้นเราจะต้องทำ fine-tuning ให้มันถามตอบเป็นผู้คนเป็นคนและเข้าใจประเด็นที่เจรจากันมากขึ้น
ทีนี้ไม่ว่าจะเป็นการทำ pre-trained หรือ fine-tuning ต่างก็ใช้เวลาและทรัพยากรพอสมควรในการ “อัพเดต” ความรู้ให้กับเอไอแบบ LLM ในแต่ละรอบ เลยมีคนหัวใสคิดขึ้นมาว่าเอาล่ะถ้างั้นทำไมเราไม่ทำฐานข้อมูลเว็คเตอร์ ให้มันค้นความรู้ที่เราอัพเดตให้สิ การค้นข้อมูล (querying) ฐานข้อมูลแบบนี้ไม่ใช่วิธีการแบบ SQL แต่มีลักษณะการเทียบคำค้นโดยหาคำใกล้เคียงที่สุดแล้วดึงเอาชุดข้อมูลที่เกี่ยวข้องขึ้นมา (เรียกว่าเทคนิค Nearest Neighbor Indexes for Similarities Search) จึงมีธรรมชาติของการค้นข้อมูลใกล้เคียงกับการประมวลผลของเอไอหรือโปรแกรม machine learning อื่น ๆ วิธีการนี้เอาไปประยุกต์กับเอเจนท์เอไออัตโนมัติ แบบ AutoGPT หรือ BabyAGI ได้โดยเป็นที่พักและอัพเดตข้อมูลชั่วคราวเพื่อทำงานอัตโนมัติ
โดยการแตกเป้าประสงค์คำสั่งจากผู้ใช้ให้เป็นงานย่อย ๆ แล้วค่อย ๆ ทริกเกอร์คำสั่งหรือการตัดสินใจทำตามงานย่อย ๆ เหล่านั้นไปตามลำดับจนจบ (ที่พูดนี้เป็นการพูดย่อให้เข้าใจอย่างง่าย ๆ มีรายละเอียดเกี่ยวกับเรื่องการแตกคำสั่ง และการตรวจคำสั่งอย่างซับซ้อนอีกมากมาย แต่การทำงานของ AutoGPT และ BabyAGI พวกนี้ยังคงถูกวิจารณ์อยู่มาก ว่ายังห่างไกลจากความคาดหวังในทางปฏิบัติ)
เป้าหมายหลักเรื่องที่สอง ของการใช้ฐานข้อมูลแบบเว็คเตอร์อีกเรื่องก็สำคัญไม่น้อยเลย คือการลด “ความหลอน” (Hallucination) ของเอไอ อย่างที่คนใช้แชทจีพีทีบ่อย ๆ จะทราบกันดีคือ การที่เราป้อนคำถามไป คำตอบที่ได้มาจากเอไอใช่ว่าจะถูกต้องหรือมีหลักฐานหรือแหล่งข้อมูลรองรับเสมอไป บางทีมันอาจจะมั่วได้ง่าย ๆ ด้วยความมั่นใจอีกต่างหาก ดังนั้นคนที่ใช้เอไอได้คล่องมือจึงต้อง “จิตแข็ง” พอสมควร ผมกำหนดมาตรฐานของผู้เชี่ยวชาญที่ “รู้ทัน” เรื่อง “ความหลอน” ของเอไอนี้ ว่าอย่างน้อยต้องศึกษาในระดับปริญญาเอกขึ้นไป เรื่องนี้ไม่ใช่อะไร ถ้าคนที่เรียนอยู่ในระดับนี้เราจะรู้ว่าการแลกเปลี่ยนในชั้นสัมมนา หรือการอภิปรายในการนำเสนองานวิชาการแบบมาตรฐาน โดยส่วนใหญ่จะมีการซักถามคู่สนทนาแบบเข้มข้นดุเดือด ที่มักจะหาทางรื้อถอนความรู้คู่สนทนาจากฐานรากในระดับปรัชญาสไตล์ปริญญาเอกอยู่อย่างเป็นปกติและอย่างสม่ำเสมอ คนที่เรียนในระดับนี้จึงจะมีพื้นฐานไม่เชื่ออะไรใครง่าย ๆ และมีวิธีการแสวงหาความรู้และทดสอบความรู้ที่เข้มข้นจริงจัง แต่การสงสัยอะไรไปหมดทุกเรื่องนี้พื้นฐานความรู้ของเราเองจะต้องมีความหนักแน่นเข้มแข็งไม่คลอนแคลน เรียกว่ากว่าจะตกผลึกและเลือกมั่นคงกับความรู้ของเราเองต้องผ่านการวิวาทะ (หรือวิวาท) ทดสอบลองผิดลองถูกกับตนเองมานับครั้งไม่ถ้วน
ประเด็นเรื่องการเลือกมั่นคงกับความรู้ของเราเอง ในด้านหนึ่งก็หมายถึงไม่ได้ตรวจสอบวิพากษ์ความรู้ของตัวเราเองที่มีการยึดมั่นอย่างแข็งแรงนี้ ให้เท่าเทียมเหมือนกับการตรวจสอบความรู้จากผู้อื่นหรือคู่สนทนาซึ่งบางทีก็นำมาสู่ปัญหาอีกด้านเหมือนกัน เรื่องนี้อิมเร ลาคาทอส อธิบายไว้ในบท “Falsification and the Methodology of Scientific Research Programmes” ของหนังสือ “Criticism and the Growth of Knowledge, the Proceedings” โดยเฉพาะอย่างยิ่งแนวคิดเรื่อง “แนวป้องกันความรู้” (protective belt) และ “โปรแกรมการวิจัย” (research program) ได้อย่างจะแจ้งกว่าแนวคิดเรื่องกระบวนทัศน์ของโทมัส คูห์น มากนัก ถ้าสนใจเรื่องนี้โปรดอ่านในบทความที่ผมเขียนได้ที่ Academia
เอาล่ะ แล้วถ้างั้นฐานข้อมูลแบบเว็คเตอร์จะช่วยลดความหลอนได้อย่างไร โดยปกติเอไอแบบ LLM จะมีแนวโน้มเบี่ยงเบนไปตาม “ความรู้” ที่ป้อนเข้าไปใหม่ โดยเฉพาะความรู้ที่ป้อนเข้าไปใหม่นี้แล้ว หากมีขนาดความยาวของเนื้อหาพอสมควร มีการเรียบเรียงอย่างเป็นระบบ และมีการอ้างอิงหลักฐานประกอบ มีเนื้อหาเป็นตรรกะที่สอดคล้องต้องกันโดยบริบูรณ์ โดยเฉพาะถ้าเป็นข้อมูลที่เรียบเรียงจากวรรณกรรมในโลกวิชาการ ก็จะได้รับความเชื่อถือจากเอไออย่างมากจนสามารถคัดง้างหรืออย่างน้อยก็โต้แย้งกับฐานข้อมูลเก่าที่เอไอถืออยู่ เราสามารถใช้กลไกนี้ในการสร้างฐานข้อมูลใหม่ที่เอไอยังไม่มีแล้วนำไปเก็บไว้ในฐานข้อมูลเว็คเตอร์ แล้วกำหนดให้เอไอทำการค้นความรู้นี้ออกมาจากฐานข้อมูล นี่เป็นวิธีการหนึ่งในการ: 1) ทั้งลดช่องว่างความรู้ที่ยังไม่ได้อัพเดตใหม่ (แชทจีพีทีอัพเดตความรู้สุดท้ายเมื่อปี 2021), และ 2) การใช้เป็นฐานข้อมูลอ้างอิงไม่ให้เอไอเกิดอาการ “หลอน”
ขั้นตอนการทำงานกับฐานข้อมูลเว็คเตอร์
ความจริงฐานข้อมูลเว็คเตอร์นี้มีหลายยี่ห้อ มีตั้งแต่ฐานข้อมูลฟรีที่เก็บไว้ในเครื่องของเราเองอย่างตัวของเฟสบุ๊คที่ชื่อว่า Facebook AI Similarity Search (Faiss) ก็มีคนนิยมใช้มาก ไปจนถึงตัวที่ผมจะใช้อ้างอิงหลักในบทความนี้คือ Pinecone ซึ่งเป็น cloud vector database ยอดนิยมอีกตัวหนึ่ง
ขั้นตอนแรกคือเราจำเป็นจะต้องเตรียมชุดข้อมูล (dataset) ที่เราจะอัพโหลดขึ้น Pinecone ให้พร้อมเสียก่อน โดยทั่วไปฐานข้อมูลเหล่านี้มักจะมีผู้บริจาคให้สาธารณะอยู่โดยเก็บไว้ที่เว็บ hugging face เป็นส่วนใหญ่ ชุดข้อมูลที่เราจะใช้นี้เรียกว่า 2022 wiki dataset คือเป็นชุดข้อมูลวิกิพีเดียเมื่อปี 2022 ซึ่งเป็นปีที่ใหม่กว่าปี cutoff ของแชทจีพีที
เมื่อเราดาวน์โหลดชุดข้อมูลนี้มาได้แล้ว ขั้นต่อไปคือการแตกชุดข้อมูลนี้ให้เป็นเว็คเตอร์ (vectorized) เพื่อให้เหมาะสมกับการเก็บขึ้นสู่ฐานข้อมูลเว็คเตอร์ (จะเรียกว่าการ “upsert”) ใน pinecone ที่ลงทะเบียนแบบไม่มีค่าใช้จ่ายเราจะใช้ฐานข้อมูลได้ 1 ชุดข้อมูล (pod) หรืออ้างด้วย index ที่เราตั้งชื่อในการสร้างฐานข้อมูลนั้น ตัว pinecone จะเก็บข้อมูลให้เราระยะหนึ่ง ถ้าไม่มีการเรียกใช้งานจะมีการลบฐานข้อมูลนี้ไปโดยอัตโนมัติ ดังนั้นถ้าเราไม่ต้องการให้ฐานข้อมูลถูกลบไปก็ควรจะหมั่นเรียกใช้งานหรือเข้าไปตรวจสอบฐานข้อมูลนี้อย่างสม่ำเสมอ การ upsert ข้อมูลขึ้นไปยังฐานข้อมูลนี้ใช้เวลาประมาณ 1 ชั่วโมง
Langchain
ปกติการทำงานกับเอไอแบบ LLMs จะมีคลังโปรแกรมหรือไลบรารีสำเร็จรูปสารพัดประโยชน์ที่เป็นโอเพนซอร์ส มาให้ใช้งานคือ Langchain โดยทั่วไป Langchain จะเตรียมเครื่องมือและไลบรารีสำหรับฐานข้อมูลเว็คเตอร์สารพัดยี่ห้อซึ่งก็รวมทั้ง Pinecone นี้มาให้ด้วย วิธีการเรียกใช้งานก็เป็นไปตามรูปข้างล่างนี้
เทคนิคการ “ประสาน” ความจำภายนอกจาก pinecone กับความรู้อื่นที่มีอยู่ภายในตัวเอไอเอง โดยทั่วไปเราจะใช้เทคนิคในการทำงานผ่านพื้นที่แชร์ร่วมกันของ prompt อย่างที่แสดงให้เห็นในโค้ดข้างต้น เทคนิคการทำงานนี้ยังมีข้อจำกัดอยู่ เพราะ gpt-3.5 / 4 ยังตั้งข้อจำกัด token ไว้ที่ 4,096 tokensในขณะที่ gpt-3.5-turbo-16k จะกำหนดให้ใช้ได้ถึง 16,384 tokens ตัวที่สามารถใช้จำนวน token มากกว่านี้ เช่น gpt-4–32k ซึ่งสามารถใช้ได้ที่ 32,768 tokens (มีปริมาณตัวอักษรคร่าว ๆ เทียบเท่ากับราว 30–50 หน้ากระดาษ A4) ยังไม่ถูกปล่อยออกให้ใช้งาน ดังนั้นจึงจำเป็นที่จะต้องมีเทคนิคพิเศษอื่นมาใช้งานร่วมเพิ่มเติม จึงจะสามารถทำให้การประสานความจำนี้เป็นไปอย่างมีประสิทธิภาพสูงสุด
ข้อมูลอ้างอิง
- ข้อมูลเบื้องต้นของ Pinecone Vector Database หาอ่านได้จากบทความนี้: What is Vector Database
- ข้อมูลเปรียบเทียบฐานข้อมูลเว็คเตอร์แบบต่าง ๆ ที่มีอยู่ในท้องตลาดสามารถหาอ่านได้จากบทความนี้: Optimize Data Processing with Vector Database
- การใช้งาน pinecone กับ langchain ในบทความนี้จะอ้างอิงตามเอกสารชุดนี้: Langchain Retrieval Augmentation
- บทความนี้จะอธิบายให้เราฟังว่าทำไมเวลาใช้ OpenAI API กับ Pinecone แล้วตอนสร้าง index จึงต้องกำหนดค่ามาตรฐานเป็น Cosine metric และใช้ตัวเลข dimension ที่ 1536 ซึ่งถือเป็นเลขกล (magic number): Pinecone and OpenAI magic: A guide to finding your long lost blog posts with vectorized search and ChatGPT
- ดูตัวอย่างบทความที่พูดถึงสถาปัตยกรรมในการประยุกต์ใช้โมเดลภาษาเพื่อทำงานร่วมกับฐานข้อมูล: best practices for data-informed language model applications
- บทความนี้พูดถึงวิธีการติดตั้ง AutoGPT เบื้องต้นและข้อมูลต่าง ๆ ที่เกี่ยวข้อง: Auto-GPT tutorial: How to set up Auto-GPT
- บทความนี้พูดถึงวิธีการสร้างเอเจนท์เอไอที่ทำงานอัตโนมัติในลักษณะเดียวกับ AutoGPT ด้วย GPT-4, Langchain และ Pinecone: ask-driven Autonomous Agent Utilizing GPT-4, Pinecone, and LangChain for Diverse Applications
- ดูรายชื่อเอเจนท์เอไออัตโนมัติอื่น ๆ ที่ปรับปรุงมาจาก BabyAGI ได้จาก source
- นอกจากชุดข้อมูลที่ hugging face แล้วยังมีชุดข้อมูลที่เก็บไว้ที่แหล่งเก็บจากเว็บไซต์หรือแหล่งข้อมูลอื่นอีกมาก โปรดดูข้อมูลเพิ่มเติมได้จาก: Top 10 Platforms for Thousands of ML and AI Datasets You Need to Know
- การฝึกสอนเอไอแบบ LLM ให้สามารถสนทนากับมนุษย์เป็นผู้เป็นคนมักต้องใช้ข้อมูลพร้อมพท์ที่ใช้งานจริงในการฝึกสอน มีการเก็บข้อมูลพร้อมพท์ที่ใช้งานได้จริงแล้วนำมาแบ่งปันกันที่ ShareGPT (ส่วนใหญ่มักเป็นพร้อมพท์ที่ใช้งานกับ ChatGPT) ซึ่งผมไม่แน่ใจว่าเจ้าของเกี่ยวข้องอะไรกับ dub.sh หรือไม่เพราะมีแนวคิดคล้ายกัน มีผู้นำชุดข้อมูลของ ShareGPT มาแบ่งปันกับสาธารณะ และสคริปต์ที่ใช้ทำความสะอาดชุดข้อมูล รวมไปถึงชุดข้อมูลที่มีการทำความสะอาดไว้แล้วที่ [source] อนึ่งกูเกิ้ลออกมาปฏิเสธข่าวว่าตนเองไม่ได้ใช้ชุดข้อมูลจาก ShareGPT มาฝึกสอน Bard
- ดูรายชื่อและข้อมูลของ Gen AI แบบ LLM ที่มีในท้องตลาดเบื้องต้นได้ที่: The Generative AI Revolution: Exploring the Current Landscape