Files
LangBot/plugins/misc/AgenticRAG/readme/README_th_TH.md
T

23 KiB

AgenticRAG

AgenticRAG จะเปิดเผยฐานความรู้ (knowledge bases) ที่กำหนดค่าไว้สำหรับไปป์ไลน์ปัจจุบันให้เป็นเครื่องมือ LLM (LLM Tool) เพื่อให้เอเจนต์สามารถตรวจสอบฐานความรู้ที่มีอยู่และเรียกค้นข้อมูล (retrieve) ส่วนที่เกี่ยวข้องได้ตามต้องการ

คุณสมบัติหลัก

  • ให้บริการเครื่องมือเดียวคือ query_knowledge
  • รองรับการดำเนินการสองอย่าง:
    • list: รายการฐานความรู้ที่พร้อมใช้งานสำหรับไปป์ไลน์ปัจจุบัน
    • query: เรียกคืนเอกสารที่เกี่ยวข้องจากฐานความรู้ที่เลือกอย่างน้อยหนึ่งรายการ
  • ส่งคืนผลลัพธ์การเรียกคืนข้อมูลเป็นรูปแบบ JSON เพื่อให้เอเจนต์สามารถใช้ในการให้เหตุผลต่อไปได้

การออกแบบโดยรวม

AgenticRAG ไม่ได้ถูกออกแบบมาให้เป็นแบ็กเอนด์ RAG ใหม่ แต่เป็นปลั๊กอินในระดับการควบคุม (control-layer) ที่เปลี่ยน ผู้ที่ตัดสินใจว่าการเรียกค้นข้อมูลควรเกิดขึ้นเมื่อใด

แทนที่จะให้ระบบเรียกค้นข้อมูลโดยอัตโนมัติเสมอก่อนที่โมเดลจะตอบสนอง AgenticRAG ย้ายการเรียกค้นข้อมูลเข้าไปอยู่ในลูปของเอเจนต์:

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

การออกแบบนี้มีขึ้นเพื่อแก้ปัญหาเฉพาะ: การเรียกค้นข้อมูลอัตโนมัติตลอดเวลา (naive always-on retrieval) นั้นง่าย แต่ก็นำมาซึ่งสัญญาณรบกวน การสิ้นเปลืองบริบท และข้อมูลที่ไม่เกี่ยวข้องในหลายๆ รอบการสนทนา

รายละเอียดการออกแบบ

ปลั๊กอินนี้ออกแบบมาให้มีความซับซ้อนน้อย โดยไม่ได้ใช้แบ็กเอนด์ RAG ใหม่ แต่เป็นการห่อหุ้ม (wrap) API การเรียกค้นความรู้ในระดับคิวรี (query-scoped) ที่มีอยู่ภายในของ LangBot:

  • list_pipeline_knowledge_bases() สำหรับการระบุฐานความรู้ที่สามารถมองเห็นได้ในคิวรีปัจจุบัน
  • retrieve_knowledge() สำหรับการเรียกค้นข้อมูล top-k รายการจากฐานความรู้ที่เลือกอย่างน้อยหนึ่งรายการ

query_id จะถูกใส่เข้ามาโดยระบบรันไทม์เมื่อมีการเรียกใช้เครื่องมือ และจะถูกเก็บไว้ใน QueryBasedAPIProxy ด้วยเหตุนี้ โค้ดของเครื่องมือจึงเพียงแค่ส่งพารามิเตอร์ทางธุรกิจ เช่น kb_id หรือ kb_ids, query_text และ top_k

แม้ว่ารันไทม์เบื้องหลังจะรองรับการกรองเมทาดาตา (metadata filters) แต่ปลั๊กอินนี้ไม่ได้เปิดเผยตัวกรองดิบให้กับเอเจนต์ในขั้นตอนการใช้เครื่องมือของเอเจนต์ปัจจุบัน เนื่องจากกลไกความรู้และแบ็กเอนด์เวกเตอร์ที่แตกต่างกันอาจใช้ฟิลด์เมทาดาตา รูปแบบค่า และความหมายของตัวกรองที่แตกต่างกัน และเอเจนต์ในปัจจุบันยังไม่มีแหล่งที่มาของสคีมา (schema) ที่เชื่อถือได้สำหรับฟิลด์เหล่านั้น

เวอร์ชันในอนาคตอาจเปิดเผยการกรองเมทาดาตาหลังจากที่ระบบนิเวศมีวิธีที่เป็นเอกภาพมากขึ้นในการอธิบายฟิลด์และตัวดำเนินการที่กรองได้สำหรับแต่ละฐานความรู้

ขั้นตอนการทำงาน

คำขอ AgenticRAG มีสี่ขั้นตอนหลัก:

1. ปิดการเรียกค้นข้อมูลแบบเดิม (naive retrieval)

ในระหว่างขั้นตอน PromptPreProcessing ปลั๊กอินจะตรวจสอบว่า LLM ที่ใช้งานอยู่รองรับการเรียกใช้เครื่องมือ (tool calling) หรือไม่

  • หากรองรับการเรียกใช้เครื่องมือ จะมีการล้างค่า _knowledge_base_uuids ของระบบรันไทม์ เพื่อข้ามขั้นตอนการเรียกค้นข้อมูลอัตโนมัติแบบเดิม
  • หากไม่รองรับการเรียกใช้เครื่องมือ จะยังคงเปิดใช้งาน RAG แบบเดิมไว้เพื่อเป็นทางเลือกสำรอง เพื่อไม่ให้การเรียกค้นฐานความรู้หายไปทั้งหมด

2. ใส่กลยุทธ์การเรียกค้นข้อมูลลงใน system prompt

ในเวลาเดียวกัน AgenticRAG จะใส่ system prompt เพิ่มเติมเพื่อบอกโมเดลว่า:

  • ฐานความรู้ที่กำหนดค่าไว้เป็นแหล่งข้อมูลหลักสำหรับข้อเท็จจริงที่อยู่ในขอบเขต
  • ไม่มีการเรียกค้นข้อมูลอัตโนมัติสำรอง
  • สำหรับคำถามเกี่ยวกับข้อเท็จจริง นโยบาย ขั้นตอน ผลิตภัณฑ์ และคำถามเฉพาะโดเมน โมเดลควรเลือกใช้ query_knowledge

สิ่งนี้สำคัญเนื่องจากคำอธิบายเครื่องมือเพียงอย่างเดียวมักจะไม่แข็งแรงพอที่จะเปลี่ยนพฤติกรรมของโมเดลได้อย่างน่าเชื่อถือ

3. ให้โมเดลตรวจสอบและสอบถามฐานความรู้

เอเจนต์สามารถใช้ query_knowledge ในสองขั้นตอน:

  • action="list" เพื่อดูว่ามีฐานความรู้ใดบ้างที่พร้อมใช้งาน
  • action="query" เพื่อค้นหาในฐานความรู้เดียวหรือหลายรายการพร้อมกัน

สำหรับการเรียกค้นข้อมูลจากฐานความรู้เดียว พารามิเตอร์ที่แนะนำคือ kb_id สำหรับการเรียกค้นข้อมูลจากหลายฐานความรู้ ให้ใช้ kb_ids

4. ส่งคืนผลลัพธ์การเรียกคืนข้อมูลในรูปแบบ JSON ที่มีโครงสร้าง

เครื่องมือจะรวมผลลัพธ์ กำกับด้วย knowledge_base_id และส่งคืนรูปแบบ JSON เพื่อให้โมเดลสามารถดำเนินการให้เหตุผล ใช้เครื่องมือ หรือให้คำตอบสุดท้ายต่อไปได้

พฤติกรรมการเรียกค้นข้อมูล

เมื่อเปิดใช้งาน AgenticRAG ระบบจะปิดการประมวลผล RAG อัตโนมัติแบบเดิมสำหรับไปป์ไลน์ปัจจุบัน

  • การเรียกค้นข้อมูลจะไม่เกิดขึ้นโดยอัตโนมัติก่อนที่โมเดลจะตอบอีกต่อไป
  • การสอบถามฐานความรู้ตอนนี้เป็นการตัดสินใจที่รอบคอบของโมเดลผ่าน query_knowledge
  • หากโมเดลไม่เรียกใช้เครื่องมือ จะไม่มีเนื้อหาจากฐานความรู้ถูกใส่เข้าไปในบริบท

มีข้อยกเว้นที่สำคัญประการหนึ่ง:

  • หาก LLM ที่ใช้งานอยู่ไม่รองรับการเรียกใช้เครื่องมือ AgenticRAG จะยังคงเปิดใช้งาน RAG แบบเดิมแทนที่จะปิดใช้งาน

สิ่งนี้ช่วยลดสัญญาณรบกวนจากการเรียกค้นข้อมูลโดยไม่มีเงื่อนไข แต่ก็หมายความว่าการเขียนพรอมต์ (prompting) มีความสำคัญ การใช้งานปัจจุบันจึงใช้ทั้งคู่:

  • พรอมต์เครื่องมือใน query_knowledge
  • system prompt ที่ใส่เข้ามาในระหว่างขั้นตอน PromptPreProcessing

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

ทำไมจึงต้องออกแบบเช่นนี้

ปลั๊กอินนี้ได้รับการปรับให้เหมาะสมสำหรับข้อแลกเปลี่ยน (tradeoff) ที่เฉพาะเจาะจง:

  • รักษาโครงสร้างพื้นฐานฐานความรู้และการเรียกค้นข้อมูลเดิมของ LangBot ไว้
  • ลบการเรียกค้นข้อมูลแบบเปิดตลอดเวลาที่ไม่จำเป็นออก
  • ให้โมเดลตัดสินใจเรียกค้นข้อมูลอย่างชัดเจน
  • ยังคงจำกัดพฤติกรรมการเรียกค้นข้อมูลไว้ที่ไปป์ไลน์ปัจจุบัน

เมื่อเปรียบเทียบกับ RAG แบบเดิม การออกแบบนี้จะช่วยให้คุณ:

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

ข้อเสียคือ หากโมเดลไม่เคยเรียกใช้เครื่องมือ จะไม่มีเนื้อหาฐานความรู้ปรากฏขึ้น นี่คือเหตุผลที่ปลั๊กอินมีการเพิ่มการเขียนพรอมต์ที่เน้นการเรียกค้นข้อมูลอย่างชัดเจน แทนที่จะสมมติว่าโมเดลจะเลือกเรียกค้นข้อมูลบ่อยพอโดยธรรมชาติ

นี่เป็นเหตุผลที่ปลั๊กอินตรวจสอบความสามารถในการเรียกใช้เครื่องมือก่อนที่จะปิดใช้งาน RAG แบบเดิม หากไม่มีระบบป้องกันนี้ การเปิดใช้งาน AgenticRAG บนโมเดลที่ไม่รองรับเครื่องมือจะทำลายการเรียกค้นฐานความรู้ทั้งหมดโดยไม่ได้ตั้งใจ

ขอบเขตความปลอดภัย

เครื่องมือนี้ถูกจำกัดขอบเขตไว้ที่ไปป์ไลน์ปัจจุบัน

  • ระบบรันไทม์ของ LangBot จะตรวจสอบด้วยว่า kb_id ที่ร้องขอเป็นของไปป์ไลน์ปัจจุบันก่อนที่จะดำเนินการเรียกค้นข้อมูล

ซึ่งหมายความว่าการทำ prompt injection เพียงอย่างเดียวไม่ควรอนุญาตให้เอเจนต์สอบถามฐานความรู้ใดๆ ภายนอกการกำหนดค่าไปป์ไลน์ได้

วิธีใช้

  1. ติดตั้งและเปิดใช้งานปลั๊กอิน
  2. กำหนดค่าฐานความรู้อย่างน้อยหนึ่งรายการในการตั้งค่าเอเจนต์ท้องถิ่นของไปป์ไลน์ปัจจุบัน
  3. ให้เอเจนต์เรียกใช้ query_knowledge:
    • เริ่มต้นด้วย action="list" เพื่อตรวจสอบฐานความรู้ที่มีอยู่
    • จากนั้นเรียกใช้ action="query" พร้อม kb_id สำหรับฐานความรู้เดียว หรือ kb_ids สำหรับหลายฐานความรู้ที่สอบถามพร้อมกัน
    • ระบุ query_text และระบุ top_k (ตัวเลือกเสริม) สำหรับจำนวนผลลัพธ์ที่รวมกัน

พารามิเตอร์

สำหรับ action="query" ในปัจจุบันเครื่องมือรับค่า:

  • kb_id: UUID ของฐานความรู้เป้าหมายสำหรับการเรียกค้นข้อมูลเดียว แนะนำให้ใช้เมื่อสอบถามเพียงฐานความรู้เดียว
  • kb_ids: อาร์เรย์ UUID ของฐานความรู้เป้าหมายสำหรับการเรียกค้นข้อมูลหลายรายการพร้อมกัน ใช้เฉพาะเมื่อสอบถามหลายฐานความรู้
  • query_text: ข้อความคิวรีสำหรับการเรียกค้นข้อมูล
  • top_k: จำนวนเต็มบวก (ตัวเลือกเสริม) ค่าเริ่มต้นคือ 5 ซึ่งใช้กับชุดผลลัพธ์ที่รวมกัน

หากคิวรีฐานความรู้หนึ่งล้มเหลวในขณะที่รายการอื่นสำเร็จ เครื่องมือจะส่งคืนอ็อบเจกต์ JSON พร้อม results และ failed_kbs เพื่อให้เอเจนต์สามารถดำเนินการต่อด้วยผลลัพธ์บางส่วนได้

ลำดับขั้นตอนทั่วไป

  1. เอเจนต์แสดงรายการฐานความรู้ที่มีอยู่
  2. เอเจนต์เลือกฐานความรู้เดียวหรือชุดเล็กๆ โดยพิจารณาจากชื่อและคำอธิบาย
  3. เอเจนต์ส่งคิวรีการเรียกค้นข้อมูลที่มุ่งเน้น
  4. เอเจนต์ใช้ข้อมูลที่ได้รับมาเพื่อตอบคำถามหรือใช้เครื่องมือต่อไป

เจตนาของการเขียนพรอมต์

เลเยอร์การเขียนพรอมต์ได้รับการออกแบบเพื่อสื่อสารสองสิ่งกับโมเดล:

  • ฐานความรู้เหล่านี้เป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับข้อมูลที่อยู่ในขอบเขต
  • ไม่มีการเรียกค้นข้อมูลอัตโนมัติสำรองเมื่อเปิดใช้งาน AgenticRAG แล้ว

หากไม่มีคำแนะนำนั้น LLM อาจเชื่อมั่นในความรู้ที่ได้รับการฝึกฝนมาล่วงหน้ามากเกินไปและใช้การเรียกค้นข้อมูลน้อยเกินไป การใช้งานปัจจุบันจึงตอกย้ำนโยบายเดียวกันทั้งที่เลเยอร์ system-prompt และเลเยอร์ tool-prompt

การบันทึกข้อมูล (Logging)

ตอนนี้ปลั๊กอินจะแสดงบันทึกข้อมูลในระหว่างการดำเนินการเครื่องมือเพื่อให้คุณสามารถสังเกตว่า LLM ใช้ AgenticRAG อย่างไรในทางปฏิบัติ

คุณจะเห็นบันทึกข้อมูลสำหรับ:

  • การเริ่มเรียกใช้เครื่องมือ รวมถึง query_id, action และคีย์พารามิเตอร์
  • การเริ่ม/สิ้นสุดการแสดงรายการฐานความรู้ และจำนวนฐานความรู้ที่มองเห็นได้
  • การเริ่มเรียกค้นข้อมูล รวมถึงฐานความรู้ที่เลือก, top_k และตัวอย่าง query_text สั้นๆ
  • การเริ่ม/สำเร็จ/ล้มเหลว ของการเรียกค้นข้อมูลแต่ละฐานความรู้
  • สรุปการเรียกค้นข้อมูลสุดท้าย รวมถึงจำนวนผลลัพธ์ที่รวมกัน จำนวนฐานความรู้ที่ล้มเหลว และจำนวนผลลัพธ์ที่ส่งคืน

ตัวอย่างข้อความบันทึกข้อมูล:

[AgenticRAG] tool call started: query_id=123 action=query params_keys=['action', 'kb_id', 'query_text', 'top_k']
[AgenticRAG] retrieval requested: query_id=123 kb_ids=['kb-1'] kb_count=1 top_k=5 query='what is the refund policy'
[AgenticRAG] querying knowledge base: query_id=123 kb_id=kb-1 top_k=5
[AgenticRAG] knowledge base query succeeded: query_id=123 kb_id=kb-1 result_count=4
[AgenticRAG] retrieval completed: query_id=123 merged_results=4 failed_kbs=0