#แลงแร็ก ปลั๊กอินเครื่องยนต์ RAG (Retriever-Augmented Generation) สำหรับ LangBot ปลั๊กอินนี้สาธิตวิธีสร้าง Knowledge Engine ที่จัดการการนำเข้าเอกสารและการดึงข้อมูลเวกเตอร์โดยใช้โครงสร้างพื้นฐานในตัวของ LangBot Host (โมเดลการฝังและฐานข้อมูลเวกเตอร์) ## คุณสมบัติ -**External Parser Integration**- ชอบเนื้อหาที่แยกวิเคราะห์ล่วงหน้าจากปลั๊กอิน Parser เช่น GeneralParsers รวมถึงส่วนที่มีโครงสร้างและข้อมูลเมตาของเอกสาร -**การแยกวิเคราะห์ภายในสำรอง**- รวมตัวแยกวิเคราะห์ในตัวเป็นทางเลือกเมื่อไม่มีการกำหนดค่าตัวแยกวิเคราะห์ภายนอก -**กลยุทธ์ดัชนีหลายรายการ**- การแบ่งส่วนแบบแบน การแบ่งส่วนหลักและรอง คู่คำถามและคำตอบที่สร้างโดย LLM -**การเรียกข้อมูลแบบยืดหยุ่น**- การค้นหาเวกเตอร์ ข้อความแบบเต็ม หรือแบบผสม -**การเขียนแบบสอบถามใหม่**- กลยุทธ์ HyDE, Multi-Query, Step-Back เพื่อการเรียกคืนที่ดีขึ้น -**การแบ่งส่วนที่กำหนดค่าได้**- การแยกอักขระแบบเรียกซ้ำด้วยขนาดก้อนที่กำหนดเองและการทับซ้อนกัน -**การแบ่งส่วนตามส่วน**- เมื่อส่วนที่มีโครงสร้างพร้อมใช้งาน การแบ่งส่วนจะรักษาส่วนหัว ข้อมูลหน้า และขอบเขตของตาราง -**การขยายบริบท**- เลือกที่จะต่อท้ายส่วนที่อยู่ติดกันรอบๆ Hit แต่ละครั้งเพื่อให้ได้รับบริบทที่สมบูรณ์ยิ่งขึ้น -**การจัดการเอกสาร**- ลบเวกเตอร์ที่จัดทำดัชนีตามเอกสาร ## สถาปัตยกรรม ``` ┌─────────────────────────────────┐ │ LangBot Core │ │ (Embedding / VDB / Storage) │ └──────────┬──────────────────────┘ │ RPC (IPC) ┌──────────▼──────────────────────┐ │ LangRAG │ │ ┌───────────────────────────┐ │ │ │ Knowledge Engine │ │ │ │ Parse → Chunk → Embed │ │ │ │ → Store / Search │ │ │ └───────────────────────────┘ │ └─────────────────────────────────┘ ``` ## กระแสการกลืนกิน ตอนนี้ LangRAG ต้องการเอาต์พุตพาร์เซอร์ที่จัดทำโดย LangBot Host: 1. LangBot อ่านไฟล์ที่อัพโหลด 2. ปลั๊กอิน Parser เช่น GeneralParsers จะแยก`text`,`sections`และ`metadata` 3. LangRAG นำเข้าผลลัพธ์ที่มีโครงสร้างนั้นโดยตรง 4. หากไม่มีเอาต์พุตของพาร์เซอร์ LangRAG จะถอยกลับไปยังพาร์เซอร์ภายใน 5. กลยุทธ์ดัชนีที่เลือกจะสร้างคู่คำถาม/คำตอบ 6. LangBot Host สร้างการฝังและจัดเก็บเวกเตอร์ ซึ่งหมายความว่า LangRAG จะทำงานได้ดีที่สุดเมื่อจับคู่กับปลั๊กอินพาร์เซอร์ภายนอก ## การกำหนดค่า ### การสร้างฐานความรู้ | พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น | |----------|-------------|---------| |`embedding_model_uuid`| โมเดลการฝัง | จำเป็น | |`index_type`| กลยุทธ์การจัดทำดัชนี:`chunk`,`parent_child`หรือ`qa`|`ชิ้น`| |`chunk_size`| ตัวอักษรต่อก้อน | 512 | |`ทับซ้อนกัน' | ทับซ้อนกันระหว่างชิ้น | 50 | |`ขนาดผู้ปกครอง_chunk_size`| ขนาดก้อนพาเรนต์ (parent_child เท่านั้น) | 2048 | |`ขนาดเด็กชิ้น`| ขนาดชิ้นย่อย (parent_child เท่านั้น) | 256 | |`qa_llm_model_uuid`| LLM สำหรับการสร้างคำถาม & คำตอบ (qa เท่านั้น) | - | |`คำถามต่อชิ้น`| คำถามที่จะสร้างต่อชิ้น (qa เท่านั้น) | 1 | ### การเรียกคืน | พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น | |----------|-------------|---------| |`top_k`| จำนวนผลลัพธ์ที่จะส่งคืน | 5 | |`ประเภทการค้นหา`| โหมดการค้นหา:`vector`,`full_text`หรือ`hybrid`|`เวกเตอร์`| |`query_rewrite`| เขียนกลยุทธ์ใหม่:`off`,`hyde`,`multi_query`หรือ`step_back`|`ปิด`| |`rewrite_llm_model_uuid`| LLM สำหรับการเขียนคิวรีใหม่ (เมื่อเปิดใช้งานการเขียนใหม่) | - | |`context_window`| จำนวนชิ้นที่อยู่ติดกันที่จะต่อท้ายแต่ละ Hit | 0 | ## กลยุทธ์ดัชนี -**ก้อน**- ก้อนแบนเริ่มต้น แยกเอกสารออกเป็นชิ้นขนาดคงที่และฝังแต่ละชิ้นโดยตรง เมื่อส่วน parser พร้อมใช้งาน ส่วนต่างๆ จะถูกสร้างขึ้นทีละส่วน แทนที่จะทำให้เอกสารทั้งหมดเรียบลง -**parent_child**- การแบ่งส่วนสองระดับ แบ่งเป็นชิ้นใหญ่ แล้วจึงแยกชิ้นเล็ก ฝังส่วนย่อยแต่ส่งคืนข้อความพาเรนต์เพื่อบริบทที่สมบูรณ์ยิ่งขึ้น เมื่อส่วนของ parser พร้อมใช้งาน ส่วนต่างๆ จะถูกใช้เป็นขอบเขตพาเรนต์ตามธรรมชาติ -**qa**- คู่ถามตอบที่สร้างโดย LLM ข้อความเป็นชิ้น ใช้ LLM เพื่อสร้างคู่คำถาม-คำตอบต่อชิ้น และฝังคำถาม เมื่อส่วน parser พร้อมใช้งาน การสร้าง Q&A ก็จะรับรู้ถึงส่วนด้วย ## การเขียนแบบสอบถามใหม่ -**ไฮด์**- การฝังเอกสารสมมุติ สร้างคำตอบสมมุติให้กับคำถาม จากนั้นฝังคำตอบนั้นเพื่อการเรียกค้น -**multi_query**- สร้างรูปแบบข้อความค้นหา 3 แบบ ค้นหาแต่ละรายการ และรวมผลลัพธ์ตามคะแนน -**step_back**- สร้างคำถามที่เป็นนามธรรมมากขึ้นและค้นหาด้วยข้อความค้นหาดั้งเดิมและเชิงนามธรรม ## จับคู่กับ GeneralParsers GeneralParsers ปัจจุบันเป็นตัวแยกวิเคราะห์ที่แนะนำสำหรับ LangRAG เนื่องจากสามารถให้: - การแยกไฟล์ PDF ที่สะอาดยิ่งขึ้น - ส่วนที่มีโครงสร้าง - ข้อความรักษาตาราง - ข้อมูลเมตาระดับเอกสาร - ตัวเลือก OCR และคำอธิบายรูปภาพผ่านโมเดลการมองเห็น LangRAG ใช้เอาต์พุตของพาร์เซอร์เหล่านั้นโดยตรงในระหว่างการนำเข้า ซึ่งโดยทั่วไปจะสร้างชิ้นส่วนที่ดีกว่าและคุณภาพการดึงข้อมูลที่ดีกว่าพาร์เซอร์ทางเลือก ## การพัฒนา ```bash pip install -r requirements.txt cp .env.example .env ``` กำหนดค่า`DEBUG_RUNTIME_WS_URL`และ`PLUGIN_DEBUG_KEY`ใน`.env`จากนั้นเปิดใช้งานด้วยดีบักเกอร์ IDE ของคุณ ## ลิงค์ - [เอกสาร LangBot](https://langbot.app/docs/)