มาต่อ Open AI ผ่าน Line ด้วย Golang ให้บอทมันฉลาดและคุยต่อเนื่องแบบง่ายๆกัน PartII(จบ)

จากบทความเดิมตอนที่แล้ว บทความ PartI พูดเกี่ยวกับการต่อ Bot เข้ากับ Open AI ให้บอทฉลาดขึ้นและและให้บอทรู้ว่ากำลังคุยกับใครอยู่และเคยคุยกันอะไรมาบ้าง วันนี้จะมาทำให้บอทตอบคำถามให้แม่นยำมากขึ้นตามข้อมูลที่เรามีโดยจะพูดถึง Embedding และ Vector

Embedding คือวิธีการแปลงข้อมูลต่างๆ ไม่ว่าจะเป็นคำ, ประโยค, รูปภาพ, หรืออื่นๆ ให้กลายเป็นตัวเลข เพื่อทำให้คอมพิวเตอร์เข้าใจได้ง่ายขึ้น และลดขนาดข้อมูลลง โดยเฉพาะอย่างยิ่งในรูปแบบของ Vector ซึ่งเป็นชุดของตัวเลขที่มีลำดับและขนาดที่กำหนด

ตัวอย่างเช่น:

สมมติว่าคุณมีคำสามคำคือ แมว, หมา, และ ปลา. การใช้ Embedding จะทำการแปลงคำเหล่านี้ให้เป็น Vector ตัวเลข เช่น:

  • แมว -> [0.1, 0.3]
  • หมา -> [0.2, 0.3]
  • ปลา -> [0.5, 0.7]

จะเห็นได้ว่า แมว และ หมา มี Vector ที่ใกล้เคียงกัน เนื่องจากคำเหล่านี้มีความหมายใกล้เคียงกัน ในขณะที่ ปลา มี Vector ที่ห่างออกไป เพราะความหมายของมันต่างออกไป

ทำไม Embedding ถึงสำคัญ?

  • ลดขนาดข้อมูล: แทนที่จะใช้คำหรือรูปภาพขนาดใหญ่ เราใช้ Vector ที่มีขนาดเล็กกว่า
  • ความเข้าใจเชิงความหมาย: Vector ที่ได้จาก Embedding สามารถจับความหมายเชิงความสัมพันธ์ระหว่างข้อมูลได้ เช่น คำที่มีความหมายใกล้เคียงกันจะมี Vector ที่ใกล้เคียงกัน
  • การประมวลผลใน Machine Learning: ทำให้สามารถใช้ข้อมูลเหล่านี้ในแบบจำลองการเรียนรู้ของเครื่องได้ง่ายขึ้น เช่น การวิเคราะห์ข้อความ, การแนะนำสินค้า, หรือการรู้จำภาพ

ดังนั้น เมื่อเราใส่ชุดคำถามเข้าไปในระบบที่ใช้ Embedding ระบบจะสามารถเลือกคำตอบที่มีความสัมพันธ์ใกล้เคียงกับคำถามได้ดีขึ้น ทำให้การตอบคำถามของ Bot แม่นยำมากขึ้น

สิ่งที่จะทำจะให้ออกมาอยู่ในรูปนี้ จะคล้ายๆ PartI แต่เพิ่มเรื่อง Vector เข้ามา

0.Training ให้ข้อมูลที่เรามีทั้งหมดไปอยู่ในรูปแบบของ Vector

1.LINE: ผู้ใช้ส่งข้อความผ่าน LINE

2.Webhook: ข้อความจาก LINE จะถูกส่งไปยัง Webhook ที่คุณกำหนดในโค้ด

3.handleTextEvent: Webhook รับข้อความและเรียกฟังก์ชัน handleTextEvent เพื่อประมวลผลข้อความ

  • ฟังก์ชันนี้จะดึงข้อมูลจาก tempMessagesถ้ามีข้อมูลก่อนหน้า
  • ถ้าไม่มีข้อมูลก่อนหน้า จะเพิ่มข้อความเริ่มต้นลงใน tempMessages และให้รู้จักชื่อเล่นในไลน์ของเราด้วย
  • ฟังก์ชันจะเพิ่มข้อความใหม่จากผู้ใช้ลงใน tempMessages
  • เพิ่มในส่วนเอาข้อมูลไป Embeding และ เปรียบเทียบ Vector ว่าคล้ายอันไหนที่สุดเพื่อให้บอทตอบได้แม่นยำหรือตามข้อมูลที่เราให้ไปเพิ่มเติ่ม

4.OpenAI Completions: ข้อความทั้งหมดที่เก็บใน tempMessages จะถูกส่งไปยัง OpenAI เพื่อสร้างการตอบกลับ

5.Reply Message: ผลลัพธ์จาก OpenAI จะถูกส่งกลับไปยังผู้ใช้ผ่าน LINE

มาทำกันเลยดีกว่าส่วนแรกเป็นชุดข้อมูล .txt

ชุดข้อมูลราคาสัตว์ต่างๆเพื่อจะให้บอทรู้ราคาสินค้า

ด้านล่างเป็น Source Code ทั้งหมดคล้ายๆของเดิมเมื่อตอนที่แล้วมีเพิ่มส่วน ของ Embedding และ Vector ขึ้นมา

Souce Code ทั้งหมด
อันนี้มีการแปลงข้อมูลเป็น embeddings โดยจะใช้ API จากทาง Open AI โดยผมเลือกเป็น Medel text-embedding-ada-002
CosineSimilarity เป็น Fuctions สำหรับคำนวณเปรียบเทียบ Vector 2 Vector เทียบกันว่าคล้ายกันขนาดไหน โดยจะ Loop หาจาก FindMost Similar แล้วหาจากคะแนนสูงสุด อันนี้ผมเอามาแค่ 1 นะเพราะหาราคา แต่ถ้าใครหาสินค้าใกล้เคียงอาจจะเอาออกมาทีละ 5 หรือกี่อันก็แล้วแต่อีกที
เป็น Code สำหรับ Train Data ที่เราเตรียมไว้ผมเตรียมเป็น data.txt และทำการอ่าน และทำการ embedding และ เพิ่มเข้าไปใน Vector โดยทั้งหมดนี้ทำงานขนานกันด้วย Goroutines เพื่อให้เสร็จเร็วๆ
ส่วน handleText ผมเพิ่มส่วนนี้มาก็คือเอาข้อความที่คนส่งมา Get embedding ก่อนแล้วค่อยไปค้นหาใน FindMostSimilar ว่าเหมือนอันไหนมาที่สุด โดยผมจะเอาสิ่งที่ได้คืนผมไม่ต่อบอท Open AI เราอีกที
โดยผมจะปั้นข้อความประมาณว่า ข้อความที่คล้ายคืออะไรได้กี่คะแนน และ ตามด้วยข้อความที่คนพิมพ์เข้ามา แล้วให้ตัว Open AI ตอบเรากลับมา

มารับชม Video กันครับ

เป็นยังไงบ้างครับจบไปแล้วกับเรื่องทำให้บอทมันตอบข้อมูลได้แม่นยำมากขึ้น แค่นี้เราก็มีระบบที่ตอบคำถามเกี่ยวสินค้าเราได้แล้ว เรายังเอาไปประยุกต์ได้อีกเยอะมากๆ และข้อมูลพวกนี้ควรเก็บไว้ในฐานข้อมูลนะครับไม่ควรประมวลผลใหม่ทุกรอบผมยกมาเป็นแค่ตัวอย่างสั้นๆของความว้าว แค่นี้ก็มีระบบสุดเท่ๆไว้ใช้เองแล้วครับ Good Luck แล้วรอติดตามผลงานใหม่ๆของผมได้นะครับ

--

--

No responses yet