1 điểm bởi GN⁺ 2024-02-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • Ollama đã tích hợp khả năng tương thích ban đầu với Chat Completions API của OpenAI, cho phép kết nối trực tiếp các công cụ và ứng dụng dành cho OpenAI với mô hình cục bộ
  • Sau khi cài đặt, có thể tải các mô hình như llama2 hoặc mistral, rồi giữ nguyên định dạng yêu cầu OpenAI và chỉ thay đổi host là có thể gọi được
  • Thư viện OpenAI cho Python và JavaScript hoạt động khi đặt base_url/baseURL thành http://localhost:11434/v1 và cung cấp giá trị api_key bắt buộc nhưng không được sử dụng
  • Có sẵn ví dụ kết nối Vercel AI SDK cho ứng dụng chat streaming và framework đa tác tử Autogen của Microsoft với Ollama
  • Hiện hỗ trợ vẫn ở giai đoạn thử nghiệm ban đầu; Embeddings API, function calling, hỗ trợ vision và cải thiện Logprobs là các hạng mục sẽ được xem xét sau

Gọi Ollama bằng định dạng OpenAI API

  • Ollama cung cấp endpoint tương thích với Chat Completions API của OpenAI, giúp dùng các mô hình cục bộ trong những công cụ hiện có dựa trên OpenAI
  • Để bắt đầu, hãy cài Ollama và tải các mô hình như Llama 2 hoặc Mistral
ollama pull llama2
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
  • Thư viện OpenAI cho Python đặt base_url là endpoint cục bộ của Ollama
    • api_key='ollama' là bắt buộc nhưng không được sử dụng
from openai import OpenAI
client = OpenAI(
base_url = 'http://localhost:11434/v1',
api_key='ollama',
)
response = client.chat.completions.create(
model="llama2",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The LA Dodgers won in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
print(response.choices[0].message.content)
  • Thư viện OpenAI cho JavaScript đặt baseURL thành http://localhost:11434/v1
    • apiKey: 'ollama' cũng là bắt buộc nhưng không được sử dụng
import OpenAI from 'openai'
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
})
const completion = await openai.chat.completions.create({
model: 'llama2',
messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(completion.choices[0].message.content)

Tích hợp mẫu và kế hoạch sắp tới

  • Vercel AI SDK là thư viện mã nguồn mở để xây dựng ứng dụng streaming hội thoại, và có thể chuyển ví dụ Next.js dùng OpenAI sang Ollama để sử dụng
npx create-next-app --example https://github.com/vercel/ai/tree/main/examples/next-openai example
cd example
  • Trong app/api/chat/route.ts, đổi cấu hình client OpenAI sang endpoint cục bộ của Ollama
const openai = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
});
  • Yêu cầu chat completion sử dụng mô hình llama2stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
  • Chạy ứng dụng bằng npm run dev rồi mở http://localhost:3000 trong trình duyệt để kiểm tra
npm run dev
  • Autogen là framework mã nguồn mở của Microsoft cho ứng dụng đa tác tử, và ví dụ sử dụng Code Llama
ollama pull codellama
pip install pyautogen
from autogen import AssistantAgent, UserProxyAgent
config_list = [
{
"model": "codellama",
"base_url": "http://localhost:11434/v1";,
"api_key": "ollama",
}
]
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False})
user_proxy.initiate_chat(assistant, message="Plot a chart of NVDA and TESLA stock price change YTD.")
  • Chạy ví dụ bằng python example.py, để trợ lý viết mã vẽ biểu đồ
python example.py
  • Hỗ trợ OpenAI API hiện đang ở giai đoạn thử nghiệm ban đầu
    • Các hạng mục được xem xét cải thiện trong tương lai gồm Embeddings API, function calling, hỗ trợ vision và Logprobs
    • Có thể tiếp nhận issue trên GitHub, và xem thêm chi tiết trong tài liệu về khả năng tương thích OpenAI

1 bình luận

 
GN⁺ 2024-02-09
Ý kiến trên Hacker News
  • Tốc độ cải thiện về tính dễ dùng của hosting LLM cục bộ trong vài tháng gần đây thật đáng kinh ngạc. Mới vài giờ trước tôi còn nói về việc https://github.com/Mozilla-Ocho/llamafile dễ dùng đến thế nào[1], vậy mà giờ lại phải phân vân nên dùng gì
    [1] Đúng nghĩa là chỉ vài giờ trước: https://euri.ca/blog/2024-llm-self-hosting-is-easy-now/

    • Hiện giờ tôi nghĩ các công ty đã dễ dàng tự host một máy chủ suy luận có hỗ trợ RAG cơ bản hơn. Chỉ cần mua Mac Mini hoặc Mac Studio, chạy ollama serve, dựng ollama web-ui trong Docker, thêm một model trợ lý lập trình từ OllamaHub qua web UI rồi tải tài liệu lên là xong
      Không cần viết code cũng có một LLM tự host có thể dùng tài liệu làm ngữ cảnh để trả lời. Bên chúng tôi chạy deepseek coder 33b trên Mac Studio RAM 64GB đủ nhanh, và nó đưa ra các gợi ý khá ổn dựa trên tài liệu lập trình nội bộ
    • Cá nhân tôi khuyên dùng Ollama. Cách quản lý model được thiết kế tốt, khá giống Docker, và API cũng được hỗ trợ rộng hơn
      Bạn cũng có thể trộn nhiều model trong một file model duy nhất; đây là tính năng tôi đang thử nghiệm gần đây. Không nhất thiết phải phụ thuộc vào thư viện model của Ollama, bạn cũng có thể dùng model tự tạo. Hỗ trợ model mới được đưa vào thông qua binding llama.cpp
    • Tốc độ phát triển của lĩnh vực này thật sự đáng kinh ngạc. Tôi thích việc llamafile dễ chạy, nhưng thấy thiếu một giao diện chat đủ tính năng nên đã xây https://recurse.chat/ trên đó
      Một số tác vụ vẫn cần GPT-4, nhưng trong sử dụng hằng ngày nó đã thay thế được một phần đáng kể việc dùng ChatGPT, đặc biệt là tôi thích việc có thể nhập toàn bộ lịch sử chat từ ChatGPT. Tôi cũng tò mò mọi người muốn làm gì với AI cục bộ
    • Tôi đang dùng Ollama và Mixtral-7B để phát triển cục bộ trên MBP và rất hài lòng
    • Từ trước đến nay tôi chỉ dùng llamacpp -m -p , và vẫn dùng Mixtral 8x7b + CodeLlama 70b trên MacBook như công cụ hằng ngày. Tôi tò mò liệu các lựa chọn thay thế Llama.cpp có tính năng quyết định nào không, và không muốn bỏ lỡ những xu hướng mới thú vị
  • Tôi là giáo sư quản trị kinh doanh và đã viết một hướng dẫn để sinh viên thử Ollama và web-ui bằng cách chạy trên Google Cloud[1]. Nếu dùng spot instance thì có thể chạy với 18 cent mỗi giờ
    [1] https://docs.google.com/document/d/1OpZl4P3d0WKH9XtErUZib5_2...

    • Với cách thiết lập này, sinh viên có thể bị chiếm quyền quản trị và instance có thể bị chiếm đoạt. Rất không an toàn. Tôi mạnh mẽ khuyên nên cho dùng SSH key trong git-bash. Việc này cũng không khó hơn về mặt kỹ thuật so với những gì đã hướng dẫn
    • Trên Google Colab cũng có thể chạy miễn phí khá nhiều thứ. KoboldCPP có môi trường chạy dựng sẵn rất tốt trên website, và cũng có thể tải các model khác
  • Tôi biết vài người âm thầm thấy khó chịu khi tính tương thích OpenAI API đang trở thành chuẩn cộng đồng. Ngoài những điểm gượng như data.choices.text.response hay việc schema lồng nhau mang tính phòng thủ không cần thiết, tôi không có nhiều phàn nàn
    Tôi tò mò trong quá trình API trở thành chuẩn có những điểm đau nào, và liệu đã có ai thử các chuẩn thay thế đáng cân nhắc chưa

    • Cần có tài liệu hóa
      Việc nó trở thành chuẩn cộng đồng thì ổn, nhưng cần có một đặc tả thật vững chắc về việc cộng đồng nói tương thích OpenAI API là gì. Đặc biệt, chuẩn đó phải ổn định ngay cả khi OpenAI sáng nay vừa ra tính năng mới
      Điều tôi muốn là một đặc tả API chắc chắn, bao gồm cả điều kiện lỗi, một bộ test để kiểm tra triển khai mới có tuân theo đặc tả hay không, và một cái tên. Ví dụ, khi phần mềm nói tương thích với OpenAI-API-Spec v3, tôi muốn biết điều đó có nghĩa gì. Còn chỉ nói “tương thích OpenAI API” như hiện nay thì thiếu thông tin. Không biết là phần nào của API, và khớp với API ở thời điểm nào
    • Thành thật mà nói, trước khi thêm phần này chúng tôi đã bàn luận rất nhiều nội bộ. Việc bị buộc vào API của người khác, để API đó có thể chi phối việc dự án của chúng tôi nên hoặc không nên thêm tính năng nào, là điều kỳ lạ
      Ngay cả khi thêm vào Ollama những tính năng mới, hay và khác biệt, nếu OpenAI API không có phần tương ứng thì tôi không biết liệu mọi người có dùng được chúng không
    • Vì vậy, việc nó được cung cấp như một lựa chọn là điều tốt. Nó giảm ma sát và giảm phụ thuộc vào con hào phòng thủ của OpenAI
    • Tôi cho rằng một chuẩn chưa hoàn hảo luôn tốt hơn là không có chuẩn nào
    • Việc tạo một web server gọi trực tiếp các hàm llama.cpp bằng binding của ngôn ngữ bạn muốn là rất dễ, nên chuyện này không quá quan trọng. Nếu cần kiểm soát nhiều hơn thì chỉ cần thêm chút công sức, không nhất thiết phải có những công cụ plug-and-play kiểu này
  • Ở công ty, chúng tôi đang làm một phiên bản tốt hơn Copilot và cũng hỗ trợ cách để người dùng mang LLM của riêng họ vào. Gần đây chúng tôi đang thêm backend tương thích OpenAI; chỉ cần cho biết endpoint API tương thích OpenAI và nên đối xử với nó như model nào, chúng tôi có thể định dạng prompt, stop sequence, max token, v.v. theo ngữ nghĩa của model đó
    Chúng tôi cần đúng thứ này để test trong môi trường phát triển cục bộ. Nếu Ollama hỗ trợ điều này thì việc test cho vô số LLM mà chúng tôi cần hỗ trợ sẽ dễ hơn nhiều. Nhìn việc nhiều công cụ như OpenLLM cũng triển khai cùng API, có vẻ tất cả đang hội tụ về tính tương thích OpenAI API

  • Cảm giác xây dựng một startup AI lúc này thật sự rất tuyệt
    Ban đầu từng khổ sở vì giới hạn token nhưng đã được giải quyết; vấn đề xuất JSON nhất quán cũng đã được giải quyết; giới hạn tốc độ và vấn đề hiệu năng của các mô hình bên thứ ba cỡ lớn cũng đã được giải quyết; cả mong muốn tự host các mô hình mã nguồn mở cho những tác vụ nhỏ và có độ phức tạp trung bình để giảm chi phí cũng đã được giải quyết
    Mỗi khi có bước tiến lớn về LLM, có cảm giác sản phẩm tự động trở nên rẻ hơn, ổn định hơn và dễ mở rộng hơn. Tất nhiên vẫn phải tập trung xây dựng khả năng phòng thủ và khác biệt hóa ở mọi thứ “không phải AI”

    • Tôi tò mò không biết nói giới hạn token đã được giải quyết nghĩa là gì. Ý là giới hạn ngữ cảnh của các phiên bản gần đây đã lớn hơn rất nhiều, nhưng chi phí cũng đắt hơn rất nhiều phải không?
  • Nếu nói tương thích với OpenAI thì người ta sẽ kỳ vọng cả function calling hoặc tool calling, nên tôi nghĩ điều đó có thể hơi gây hiểu lầm
    Việc có cấu trúc vai trò và nội dung là tốt, nhưng vốn dĩ phần đó triển khai khá đơn giản. Khi đi theo hướng agent thì cần thực thi hành động thật. Trong hệ thống host agent mà tôi bắt đầu làm, tôi đã đưa vào một scripting engine, nên tôi từng nghĩ có lẽ sau khi xử lý bảo mật và quyền hạn thì nên để agent cứ thế chạy code. Thực tế tôi đã bắt đầu như vậy
    Vì thế tôi không chắc function/tool calling có thật sự cần thiết hay không. Nhưng nếu nhiều người đang chuẩn hóa tool calling, thì có thể tôi cũng phải đưa nó vào framework của mình, kể cả khi đã có khả năng chạy script tùy ý

    • Tài liệu nêu rõ các tính năng bị loại trừ: https://github.com/ollama/ollama/blob/main/docs/openai.md
      Function calling/chọn tool được xử lý ở cấp ứng dụng và hiện chưa có định dạng chuẩn. Ngay cả những cách được dùng rộng rãi thực chất cũng gần với các system prompt tùy chỉnh kém hiệu quả: https://github.com/langchain-ai/langchain/blob/master/libs/l...
    • Tôi từng bị Gemini Pro hấp dẫn vì nó hỗ trợ function/tool calling, nhưng thực tế hoạt động rất tệ. Tôi chưa thử Gemini Ultra, và cũng không rõ có dùng được qua API hay không
      Dù sao thì có khi không đưa ra một kiểu hỗ trợ không hoạt động còn tốt hơn
    • Với người đã dùng OpenAI API thì đây là lựa chọn đương nhiên dễ hiểu
  • Nhân tiện, script cài đặt Linux của Ollama hoạt động theo cách “chuẩn” phổ biến ở các công cụ ngày nay:
    curl https://ollama.ai/install.sh | sh
    Tuy nhiên lần cuối tôi kiểm tra, script này yêu cầu quyền root bằng sudo. Nếu muốn dùng công cụ, tốt nhất nên tải script về xem qua hoặc chỉnh sửa cho phù hợp nhu cầu

    • Có hướng dẫn cài đặt thủ công[0]. Nhìn vào đó thì có vẻ nó thiết lập một dịch vụ SystemD tự chạy khi khởi động. Nếu chỉ muốn thử nghiệm đơn giản, chỉ cần tải [1] về, cho phép thực thi (chmod +x ollama-linux-amd64) rồi chạy là đã ổn. Không cần quyền root
      [0] https://github.com/ollama/ollama/blob/main/docs/linux.md#man...
      [1] https://ollama.ai/download/ollama-linux-amd64
    • Binary ollama được đặt vào /usr/bin; không nhất thiết phải như vậy nhưng tiện. Tôi chưa kiểm tra còn thứ gì khác cần quyền root
    • Thời nay đã có trình quản lý gói rồi
  • Lớp tương thích cũng có thể được xây trong thư viện. Ví dụ llm() của LangChain có thể hoạt động với nhiều backend LLM. Tôi tò mò bạn thích hướng nào hơn

    • Tôi thích để trong thư viện hơn, nhưng hiện có khá nhiều vấn đề. Vấn đề lớn nhất là hệ sinh thái chuyển động quá nhanh khiến các wrapper thư viện không theo kịp
      Một vấn đề nữa là nếu cả thế giới chuẩn hóa lên một thư viện tệ như LangChain, chi phí bảo trì các backend không đồng nhất sẽ giết chết những người đến sau và khiến mọi người bị khóa lâu dài. Vì vậy hiện tại một API thống nhất có vẻ là lựa chọn tốt hơn về mặt tiện lợi
    • Làm vậy thì mỗi thư viện phải hỗ trợ từng LLM. Tôi xem đây là vấn đề giống như trong lưu trữ đối tượng, cuối cùng gần như mọi bên đều hỗ trợ API tương thích S3
      Có một API chuẩn là điều tốt, dù không hoàn hảo. Đồng thời, cũng ổn nếu có một API thứ hai cho phép dùng hết tiềm năng, như B2 của Backblaze. Không có cách nào dùng một thứ để khớp với mọi mô hình; nếu mô hình có năng lực khác nhau thì tôi nghĩ nên cung cấp cả hai tùy chọn
    • Trước khi OpenAI ra ứng dụng, tôi đã dùng LangChain trong hệ thống do mình làm. Đó là một giao diện SMS rất đơn giản gắn với LLM, và tôi thích làm việc với abstraction của LangChain hơn là đấu trực tiếp với GPT-4 API
  • Tôi đang làm một dự án giúp dễ dàng thay đổi giữa mô hình mã nguồn mở (HF, qua VLLM) và mô hình thương mại (OpenAI, Google, Anthropic, Together) trong Python: https://github.com/datadreamer-dev/DataDreamer
    Nếu muốn dùng trực tiếp trong Python mà không qua HTTP API thì đây là cách dễ hơn một chút

  • Tôi tò mò Ollama dùng để làm gì. Tại sao không dùng trực tiếp llama.cpp?

    • Nó giống Docker/trình quản lý gói dành cho LLM. Có thể dễ dàng cài đặt, tìm mô hình mới và cập nhật bằng một CLI chuẩn hóa, đơn giản. Tự động cập nhật cũng khá nhẹ nhàng
    • Tôi cũng có cùng thắc mắc. Có vẻ Ollama được quảng bá nhiều và phản hồi cũng tốt, nhưng hiện nay so với việc dùng trực tiếp llama.cpp, vốn cũng có server tích hợp tương thích OpenAI, thì chính xác nó có ưu điểm gì?