26 điểm bởi xguru 2024-05-20 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Thông qua hệ thống Retrieval-Augmented Generation (RAG), có thể tạo một trợ lý AI trả lời câu hỏi dựa trên nền tảng tri thức nội bộ sẵn có (wiki, manual, tài liệu đào tạo và tham khảo, v.v.)
  • Có thể xây dựng hệ thống RAG chỉ với PostgreSQL, pgvector, ollama và chưa đến 200 dòng mã Go

Tổng quan

  • Sử dụng vài đoạn văn làm "kho tài liệu", và với mỗi tài liệu sẽ tạo embedding tài liệu bằng Meta Llama3 (được host cục bộ bằng ollama)
  • Lưu tài liệu và embedding vào bảng PostgreSQL, đồng thời dùng phần mở rộng pgvector để lưu trữ và truy cập embedding
  • Với truy vấn của người dùng, tìm 1 tài liệu liên quan nhất trong bảng rồi dùng Llama3 để tạo phản hồi
  • ollama cung cấp HTTP API tương tự OpenAI để tạo embedding và phản hồi chat
  • Mã Go dùng jackc/pgx và pgvector-go để giao tiếp với Postgres, đồng thời dùng gói API client của ollama để xử lý việc gọi HTTP API

Chạy các mô hình bằng Ollama

  • Ollama là công cụ giúp chạy các mô hình mã nguồn mở cục bộ và cung cấp REST API theo phong cách OpenAI
  • Chạy mô hình llama3 bằng lệnh ollama pull llama3
  • HTTP server của ollama mặc định khả dụng tại 127.0.0.1:11434

Cài đặt pgvector

  • pgvector là phần mở rộng cho PostgreSQL phiên bản 12~16; nếu dùng kho APT pgdg thì có thể cài bằng sudo apt install postgresql-16-pgvector
  • Sau khi cài đặt, thiết lập phần mở rộng trong cơ sở dữ liệu bằng create extension vector;
  • Tạo bảng để lưu tài liệu và embedding bằng create table items (id serial primary key, doc text, embedding vector(4096));

Dữ liệu tài liệu

  • Sử dụng 4 đoạn văn từ truyện Sherlock Holmes "The Boscombe Valley Mystery" (public domain - Project Gutenberg)

Mã nguồn

  • Có thể dùng mã demo được công khai trên GitHub theo giấy phép MIT
  • Chèn tài liệu bằng INSERT INTO items (doc, embedding) VALUES ($1, $2)
  • Tìm tài liệu liên quan nhất bằng SELECT doc FROM items ORDER BY embedding <-> $1 LIMIT 1 (<-> là toán tử do pgvector cung cấp)
  • Việc gọi Ollama API sử dụng gói Go của ollama
    • Tạo embedding bằng api.EmbeddingRequest
    • Tạo phản hồi chat bằng api.ChatRequest (bao gồm tài liệu đã truy xuất trong prompt)

Giao diện dòng lệnh

  • Lưu tài liệu vào cơ sở dữ liệu bằng ragdemo -insert {path-to-doc-file}
  • Nhập prompt và tạo phản hồi bằng ragdemo -query {query-text}

Toàn bộ quy trình

  1. Khi lưu tài liệu với tùy chọn -insert, đọc nội dung tệp, tạo embedding bằng Llama3 rồi lưu vào PostgreSQL
  2. Khi dùng tùy chọn -query, tạo embedding cho prompt rồi so sánh với các embedding khác trong bảng items để tìm tài liệu "gần nhất" (tính khoảng cách L2 bằng toán tử <->)
  3. Đưa tài liệu đã tìm được vào prompt rồi gửi cho Llama3, tạo phản hồi chat và in ra

Mẹo bổ sung

  • Nên cân nhắc dùng mô hình chuyên cho việc tạo embedding (thay vì llama3)
  • Với các ngôn ngữ ngoài tiếng Anh, cần tìm mô hình phù hợp hơn
  • Có thể thử các cách tính khoảng cách khác ngoài L2 (pgvector hỗ trợ các phương pháp khác)
  • Quét toàn bộ bảng có khả năng mở rộng thấp, nên tận dụng chỉ mục pgvector, v.v.
  • Ở bước tạo, việc dùng nhiều tài liệu hơn hoặc lấy thêm tài liệu bằng khớp từ khóa cũng có thể hữu ích
  • Có thể cải thiện chất lượng đầu ra bằng cách điều chỉnh prompt sinh và thử nhiều LLM khác nhau

Chưa có bình luận nào.

Chưa có bình luận nào.