สวัสดีครับ วันนี้จะมาย่อยรายละเอียดของการใช้งาน Langchain ในการสร้าง RAG อย่างง่ายนะครับ
RAG ย่อมาจาก Retrieval Augmented Generation
RAG เป็นวิธีการรวบรวมข้อมูลที่เกี่ยวกับคำถามที่ถามเข้ามา ตัวอย่าง เช่น “Who is the president of the US“ จากนั้นคำถามดังกล่าวจะถูกนำไปใช้ 2 ส่วนหลัก ได้แก่ Retriever และ Prompt (LLM)
ส่วนแรกของกระบวนการเป็นการนำคำถามมาใช้ในการค้นหาข้อมูลที่มีความเกี่ยวเนื่องกันมากที่สุด n ลำดับ หลังจากได้ข้อมูลจากการ Retrieval เสร็จแล้ว จะนำข้อมูลดังกล่าว รวมเข้ากับ Query Prompt เพื่อประกอบกันเป็น Final Prompt ก่อนที่จะส่ง Final Promopt ไปยัง LLM เพื่อให้สร้างคำตอบกลับมา
ตัวอย่าง Code ทั้งหมดของวันนี้
ซึ่งวันนี้เราจะแบ่ง endpoint ออกเป็น 5 endpoint ได้แก่
Endpoint ที่ 1 loadAndStore
Endpoint นี้จะเป็นการนำข้อมูล Text ที่ได้จาก Dataloader นำมาแบ่งออกโดยกำหนดเงื่อนไขการแบ่งตามที่เราต้องการ ตามตัวอย่างแล้ว เราอยากได้ Text ที่มีขนาดไม่เกิน 1024 ตัวอักษร (Token ใช้ TokenTextSplitter) โดยมีการซ้อนทับอยู่ที่ 0 ตัวอักษร
บรรทัดที่ 7 เป็นการนำ Text Array ที่ได้มาจากขั้นตอนก่อนหน้า นำมา Embedding โดยใช้ Embedding ของ OpenAI (Ada v2) หลังจากนั้นเราจะได้ Vector จากการ Embedding Text
ซึ่งเราจะทำการจัดเก็บ Vector ให้อยู่ใน Chroma (VectorDatabase) โดยที่กำหนดให้พื้นที่จัดเก็บข้อมูล Vector อยู่ที่ Disk (chroma_db)
Endpoint ที่ 2 peekDocument
Endpoint นี้เป็นการ Verify ว่าข้อมูลที่เราได้ทำการบันทึกลงไปใน Chroma ครบถ้วนรึเปล่า โดยเป็นการดูข้อมูลล่าสุด 10 อันดับ
Endpoint ที่ 3 search
Endpoint นี้เป็นการค้นหาข้อมูลที่ภายใน Chroma โดยหาข้อมูลที่มีความเกี่ยวข้องกันมากที่สุดกับ query ที่ส่งเข้าไป โดย query ที่ส่งเข้าไปนั้นจะถูกแปลงเป็น Vector ในบรรทัดที่ 4 และทำการเปรียบเทียบกับ Vector ภายใน Chroma และส่งผลลัพธ์กลับมา 1 ผลลัพธ์ที่ใกล้เคียงกับ query มากที่สุด (k=1)
Endpoint ที่ 4 queryWithRetrieval
Endpoint นี้เป็นการใช้งาน RAG แบบ End-to-End โดยเริ่มต้นจากการโหลดข้อมูล VectorDatabase จาก Disk (chroma_db)
จากนั้นทำการสร้างเริ่มใช้งาน LLM โดยเรียกใช้งานผ่าน OpenAI (gpt-3.5-turbo)
ถัดมาคือการสร้าง Chain โดยกำหนดให้ Chain ใช้งาน OpenAI (gpt-3.5-turbo) และ VectorDatabase (chroma_db)
ขั้นตอนสุดท้ายคือการโยน query เข้าไปเป็นคำถามของ Chain
กระบวนการ RAG ทั้งหมดเกิดขึ้นได้จากการสร้าง Chain ซึ่งทาง Langchain จะจัดการเบื้องหลังการค้นหา Vector ที่ใกล้เคียงและนำข้อมูลดังกล่าวประกอบกับ query เพื่อให้ได้มาซึ่งผลลัพธ์ ซึ่งเป็นการทำงานเบื้องหลัง ณ บรรทัดที่ 5
Endpoint ที่ 5 queryWithoutRetrieval
Endpoint นี้เป็นการทดสอบผลลัพธ์การ query โดยไม่ใช้ RAG เพื่อให้สามารถเปรียบเทียบผลลัพธ์ความแม่นยำและความถูกต้องระหว่างการใช้งาน RAG และไม่ใช้งาน RAG
สำหรับใครที่สนใจบทความสอนการประยุกต์ใช้งาน LLM ในลักษณะนี้ สามารถติดตามได้จาก Facebook Page : VulturePrime หรือ Facebook Group : Nvidia User Group Thailand ไว้เจอกันบทความหน้าครับ