- ผ่านระบบ Retrieval-Augmented Generation (RAG) สามารถสร้าง AI assistant ที่ตอบคำถามโดยอิงจากฐานความรู้ภายในที่มีอยู่เดิม (วิกิ, คู่มือ, เอกสารการฝึกอบรม และเอกสารอ้างอิง เป็นต้น) ได้
- สามารถสร้างระบบ RAG ได้ด้วย PostgreSQL, pgvector, ollama และโค้ด Go ไม่ถึง 200 บรรทัด
Overview
- ใช้ข้อความไม่กี่ย่อหน้าเป็น "document corpus" และสำหรับแต่ละเอกสารจะสร้าง document embedding ด้วย Meta Llama3 (โฮสต์แบบโลคัลผ่าน ollama)
- จัดเก็บเอกสารและ embedding ไว้ในตาราง PostgreSQL โดยใช้ส่วนขยาย pgvector สำหรับการจัดเก็บและเข้าถึง embedding
- สำหรับคำค้นของผู้ใช้ จะค้นหาเอกสารที่เกี่ยวข้องมากที่สุด 1 ชิ้นจากตาราง แล้วใช้ Llama3 สร้างคำตอบ
- ollama มี HTTP API ที่คล้ายกับ OpenAI สำหรับสร้าง embedding และคำตอบแบบแชต
- โค้ด Go ใช้ jackc/pgx และ pgvector-go ในการสื่อสารกับ Postgres และใช้แพ็กเกจ ollama client API เพื่อจัดการการเรียก HTTP API
การรันโมเดลด้วย Ollama
- Ollama เป็นเครื่องมือที่ช่วยให้รันโมเดลโอเพนซอร์สแบบโลคัลได้ และมี REST API สไตล์ OpenAI ให้ใช้งาน
- รันโมเดล llama3 ด้วยคำสั่ง
ollama pull llama3
- โดยปกติ HTTP server ของ ollama จะใช้งานได้ที่
127.0.0.1:11434
การติดตั้ง pgvector
- pgvector เป็นส่วนขยายสำหรับ PostgreSQL เวอร์ชัน 12~16 และหากใช้คลัง pgdg APT สามารถติดตั้งได้ด้วย
sudo apt install postgresql-16-pgvector
- หลังติดตั้ง ให้เปิดใช้ส่วนขยายในฐานข้อมูลด้วย
create extension vector;
- สร้างตารางสำหรับเก็บเอกสารและ embedding ด้วย
create table items (id serial primary key, doc text, embedding vector(4096));
ข้อมูลเอกสาร
- ใช้ 4 ย่อหน้าจากเรื่อง Sherlock Holmes "The Boscombe Valley Mystery" (สาธารณสมบัติ - Project Gutenberg)
โค้ด
- สามารถใช้เดโมโค้ดที่เผยแพร่บน GitHub ภายใต้ไลเซนส์ MIT ได้
- การแทรกเอกสารใช้
INSERT INTO items (doc, embedding) VALUES ($1, $2)
- การค้นหาเอกสารที่เกี่ยวข้องมากที่สุดใช้
SELECT doc FROM items ORDER BY embedding <-> $1 LIMIT 1 (<-> เป็นโอเปอเรเตอร์ที่ pgvector มีให้)
- การเรียก Ollama API ใช้แพ็กเกจ Go ของ ollama
- การสร้าง embedding ใช้
api.EmbeddingRequest
- การสร้างคำตอบแบบแชตใช้
api.ChatRequest (รวมเอกสารที่ค้นพบไว้ในพรอมป์ต์)
อินเทอร์เฟซบรรทัดคำสั่ง
- ใช้
ragdemo -insert {path-to-doc-file} เพื่อบันทึกเอกสารลงฐานข้อมูล
- ใช้
ragdemo -query {query-text} เพื่อป้อนพรอมป์ต์และสร้างคำตอบ
ขั้นตอนทั้งหมด
- เมื่อบันทึกเอกสารด้วยออปชัน
-insert ระบบจะอ่านเนื้อหาไฟล์ สร้าง embedding ด้วย Llama3 แล้วบันทึกลง PostgreSQL
- เมื่อใช้ออปชัน
-query ระบบจะสร้าง embedding ของพรอมป์ต์ จากนั้นเปรียบเทียบกับ embedding อื่น ๆ ในตาราง items เพื่อค้นหาเอกสาร "nearest neighbor" (<-> ใช้คำนวณระยะทางแบบ L2)
- นำเอกสารที่ค้นพบไปรวมในพรอมป์ต์แล้วส่งให้ Llama3 เพื่อสร้างคำตอบแบบแชตและแสดงผล
เคล็ดลับเพิ่มเติม
- ควรพิจารณาใช้โมเดลที่ออกแบบมาสำหรับการสร้าง embedding โดยเฉพาะ (แทน llama3)
- สำหรับภาษาอื่นที่ไม่ใช่อังกฤษ อาจต้องค้นหาโมเดลที่เหมาะสมกว่า
- นอกจากระยะทาง L2 แล้ว ยังสามารถลองวิธีคำนวณระยะทางแบบอื่นได้ (pgvector รองรับหลายวิธี)
- การสแกนทั้งตารางมีข้อจำกัดด้านการขยายระบบ จึงควรใช้ดัชนีของ pgvector เป็นต้น
- ในขั้นตอนการสร้างคำตอบ การใช้เอกสารมากขึ้น หรือดึงเอกสารเพิ่มด้วยการจับคู่คีย์เวิร์ด ก็อาจช่วยได้
- สามารถปรับพรอมป์ต์ในขั้นตอนการสร้าง และลองใช้ LLM หลากหลายแบบเพื่อปรับปรุงคุณภาพผลลัพธ์
ยังไม่มีความคิดเห็น