11 KiB
#แลงแร็ก
ปลั๊กอินเครื่องยนต์ 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:
- LangBot อ่านไฟล์ที่อัพโหลด
- ปลั๊กอิน Parser เช่น GeneralParsers จะแยก
text,sectionsและmetadata - LangRAG นำเข้าผลลัพธ์ที่มีโครงสร้างนั้นโดยตรง
- หากไม่มีเอาต์พุตของพาร์เซอร์ LangRAG จะถอยกลับไปยังพาร์เซอร์ภายใน
- กลยุทธ์ดัชนีที่เลือกจะสร้างคู่คำถาม/คำตอบ
- 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 ใช้เอาต์พุตของพาร์เซอร์เหล่านั้นโดยตรงในระหว่างการนำเข้า ซึ่งโดยทั่วไปจะสร้างชิ้นส่วนที่ดีกว่าและคุณภาพการดึงข้อมูลที่ดีกว่าพาร์เซอร์ทางเลือก
การพัฒนา
pip install -r requirements.txt
cp .env.example .env
กำหนดค่าDEBUG_RUNTIME_WS_URLและPLUGIN_DEBUG_KEYใน.envจากนั้นเปิดใช้งานด้วยดีบักเกอร์ IDE ของคุณ