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 เพียงอย่างเดียวไม่ควรอนุญาตให้เอเจนต์สอบถามฐานความรู้ใดๆ ภายนอกการกำหนดค่าไปป์ไลน์ได้
วิธีใช้
- ติดตั้งและเปิดใช้งานปลั๊กอิน
- กำหนดค่าฐานความรู้อย่างน้อยหนึ่งรายการในการตั้งค่าเอเจนต์ท้องถิ่นของไปป์ไลน์ปัจจุบัน
- ให้เอเจนต์เรียกใช้
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 เพื่อให้เอเจนต์สามารถดำเนินการต่อด้วยผลลัพธ์บางส่วนได้
ลำดับขั้นตอนทั่วไป
- เอเจนต์แสดงรายการฐานความรู้ที่มีอยู่
- เอเจนต์เลือกฐานความรู้เดียวหรือชุดเล็กๆ โดยพิจารณาจากชื่อและคำอธิบาย
- เอเจนต์ส่งคิวรีการเรียกค้นข้อมูลที่มุ่งเน้น
- เอเจนต์ใช้ข้อมูลที่ได้รับมาเพื่อตอบคำถามหรือใช้เครื่องมือต่อไป
เจตนาของการเขียนพรอมต์
เลเยอร์การเขียนพรอมต์ได้รับการออกแบบเพื่อสื่อสารสองสิ่งกับโมเดล:
- ฐานความรู้เหล่านี้เป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับข้อมูลที่อยู่ในขอบเขต
- ไม่มีการเรียกค้นข้อมูลอัตโนมัติสำรองเมื่อเปิดใช้งาน 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