• ผ่านระบบ 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} เพื่อป้อนพรอมป์ต์และสร้างคำตอบ

ขั้นตอนทั้งหมด

  1. เมื่อบันทึกเอกสารด้วยออปชัน -insert ระบบจะอ่านเนื้อหาไฟล์ สร้าง embedding ด้วย Llama3 แล้วบันทึกลง PostgreSQL
  2. เมื่อใช้ออปชัน -query ระบบจะสร้าง embedding ของพรอมป์ต์ จากนั้นเปรียบเทียบกับ embedding อื่น ๆ ในตาราง items เพื่อค้นหาเอกสาร "nearest neighbor" (<-> ใช้คำนวณระยะทางแบบ L2)
  3. นำเอกสารที่ค้นพบไปรวมในพรอมป์ต์แล้วส่งให้ Llama3 เพื่อสร้างคำตอบแบบแชตและแสดงผล

เคล็ดลับเพิ่มเติม

  • ควรพิจารณาใช้โมเดลที่ออกแบบมาสำหรับการสร้าง embedding โดยเฉพาะ (แทน llama3)
  • สำหรับภาษาอื่นที่ไม่ใช่อังกฤษ อาจต้องค้นหาโมเดลที่เหมาะสมกว่า
  • นอกจากระยะทาง L2 แล้ว ยังสามารถลองวิธีคำนวณระยะทางแบบอื่นได้ (pgvector รองรับหลายวิธี)
  • การสแกนทั้งตารางมีข้อจำกัดด้านการขยายระบบ จึงควรใช้ดัชนีของ pgvector เป็นต้น
  • ในขั้นตอนการสร้างคำตอบ การใช้เอกสารมากขึ้น หรือดึงเอกสารเพิ่มด้วยการจับคู่คีย์เวิร์ด ก็อาจช่วยได้
  • สามารถปรับพรอมป์ต์ในขั้นตอนการสร้าง และลองใช้ LLM หลากหลายแบบเพื่อปรับปรุงคุณภาพผลลัพธ์

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น