2 điểm bởi GN⁺ 2024-12-09 | 1 bình luận | Chia sẻ qua WhatsApp

Đầu ra có cấu trúc

6 tháng 12, 2024

Ollama giờ đây hỗ trợ đầu ra có cấu trúc, cho phép giới hạn đầu ra của mô hình vào một định dạng cụ thể được định nghĩa bằng lược đồ JSON. Thư viện Ollama Python và JavaScript cũng đã được cập nhật để hỗ trợ đầu ra có cấu trúc.

  • Các trường hợp sử dụng của đầu ra có cấu trúc:
    • Phân tích dữ liệu từ tài liệu
    • Trích xuất dữ liệu từ hình ảnh
    • Chuẩn hóa mọi phản hồi của mô hình ngôn ngữ
    • Cung cấp độ tin cậy và tính nhất quán cao hơn so với chế độ JSON

Bắt đầu

  • Tải phiên bản Ollama mới nhất
  • Nâng cấp thư viện Ollama Python hoặc JavaScript lên phiên bản mới nhất
cURL
  • Có thể truyền đầu ra có cấu trúc cho mô hình bằng tham số format
Đầu ra
  • Phản hồi sẽ được trả về theo định dạng được định nghĩa bởi lược đồ JSON của yêu cầu
Python
  • Dùng thư viện Ollama Python để truyền lược đồ dưới dạng đối tượng JSON vào tham số format
  • Khuyến nghị dùng Pydantic để tuần tự hóa lược đồ
Đầu ra
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Dùng thư viện Ollama JavaScript để truyền lược đồ dưới dạng đối tượng JSON vào tham số format
  • Khuyến nghị dùng Zod để tuần tự hóa lược đồ
Đầu ra
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

Ví dụ

Trích xuất dữ liệu

  • Định nghĩa một lược đồ biểu diễn thông tin để trích xuất dữ liệu có cấu trúc từ văn bản
  • Mô hình sẽ trích xuất thông tin và trả về dữ liệu ở dạng JSON theo lược đồ đã định nghĩa
Ví dụ đầu ra
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

Mô tả hình ảnh

  • Đầu ra có cấu trúc có thể được dùng cùng các mô hình thị giác
  • Dùng llama3.2-vision để mô tả hình ảnh và trả về đầu ra có cấu trúc
Ví dụ đầu ra
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
Tương thích OpenAI
  • Tương thích với đầu ra có cấu trúc khi dùng client OpenAI

Mẹo

  • Để dùng đầu ra có cấu trúc một cách đáng tin cậy:
    • Dùng Pydantic (Python) hoặc Zod (JavaScript) để định nghĩa lược đồ phản hồi
    • Thêm "trả về dưới dạng JSON" vào prompt để mô hình hiểu yêu cầu
    • Đặt temperature về 0 để có đầu ra mang tính quyết định hơn

Bước tiếp theo

  • Logit exposure cho khả năng sinh có kiểm soát
  • Cải thiện hiệu năng và độ chính xác của đầu ra có cấu trúc
  • Tăng tốc GPU cho sampling
  • Hỗ trợ thêm các định dạng vượt ra ngoài JSON schema

1 bình luận

 
GN⁺ 2024-12-09
Bình luận trên Hacker News
  • Có thể đặt các ràng buộc đầu ra mạnh hơn thông qua tính năng gbnf của llama.cpp

  • Hữu ích khi chuyển đổi prompt thông thường thành dữ liệu csv có cấu trúc vì có thể loại bỏ văn bản không cần thiết

  • Có thể nhập văn bản bằng gemma2:2b để nhận được đầu ra ở định dạng JSON có cấu trúc

    • Ví dụ đầu vào: "You have spent 190 at Fresh Mart. Current balance: 5098"
    • Ví dụ đầu ra: {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • Có ý kiến thắc mắc việc các ràng buộc ảnh hưởng thế nào đến chất lượng đầu ra của LLM

    • Trong một số trường hợp, parse dưới dạng Markdown hoặc văn bản thuần có thể cho chất lượng tốt hơn
  • Có câu hỏi liệu có thể dùng cùng các mô hình được hỗ trợ hay không

    • Trên phần cứng cá nhân chỉ có thể chạy ổn định các mô hình 1b-3b
  • Có thắc mắc liệu llama.cpp và ollama có tận dụng tính năng đầu ra có cấu trúc của llama hay được triển khai theo cách khác

    • Trang Llama của Meta có đề cập rằng mô hình vốn hỗ trợ đầu ra có cấu trúc
  • Có câu hỏi về giá trị gia tăng khi so với outlines

  • Lý do tiếp tục dùng oobabooga là vì hỗ trợ exlv2, cho suy luận hiệu quả hơn trên dual 3090s

  • Sẽ tốt hơn nếu ví dụ curl xuất hiện trước

    • Thích Pydantic, nhưng tự viết schema sẽ dễ chuyển prototype sang Go hơn
  • Có câu hỏi về cách tối ưu để cung cấp đầu vào có cấu trúc cho LLM

    • Ví dụ: nhập 100 câu và phân loại từng câu theo các cách khác nhau
    • Việc lấy dữ liệu có cấu trúc thì dễ, nhưng cách dùng số dòng làm tiền tố lại khá gượng gạo