- 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
llama2 và stream: true
const response = await openai.chat.completions.create({
model: 'llama2',
stream: true,
messages,
});
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
Ý 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/
ollama serve, dựngollama web-uitrong 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à xongKhô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ộ
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.cppllamafiledễ 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ộ
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...
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ẫnTô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.responsehay 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ànTô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
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àoNgay 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
llama.cppbằ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”
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 ý
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...
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
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 | shTuy 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ầuchmod +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
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 rootLớ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ơnMộ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
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
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?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ì?