วิธีการสร้าง RAG ด้วย Langchain + Deployment

สวัสดีครับ วันนี้จะมาย่อยรายละเอียดของการใช้งาน Langchain ในการสร้าง RAG อย่างง่ายนะครับ

Concept ของ 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 ทั้งหมดของวันนี้

https://github.com/vultureprime/deploy-ai-model/tree/main/paperspace-example/openai-langchain-basic-RAG

ซึ่งวันนี้เราจะแบ่ง endpoint ออกเป็น 5 endpoint ได้แก่  

  1. loadAndStore
  2. peekDocument
  3. search
  4. queryWithRetrieval
  5. queryWithoutRetrieval

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 ไว้เจอกันบทความหน้าครับ

Aa

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