~/ / Bài viết về AI / LLM cục bộ trên VPS / Embedding với Ollama: kiến thức nền tảng cho tìm kiếm và RAG
Embedding với Ollama: kiến thức nền tảng cho tìm kiếm và RAG
Tìm kiếm đoạn văn theo ý nghĩa, và RAG, tức là mô hình trò chuyện trả lời dựa trên chính tài liệu của bạn, đều bắt đầu từ embedding. Ollama có thể tạo embedding ngay trên máy chủ đang chạy mô hình trò chuyện của bạn. Bài viết này trình bày cách gửi yêu cầu, các mô hình mà thư viện Ollama liệt kê, những thiết lập làm thay đổi kết quả và cách so sánh các vector, chỉ dựa trên những gì tài liệu và các trang thư viện của Ollama nói. Hai công cụ trên trang này cho phép bạn thử các bước đó ngay trong trình duyệt.
Đăng: · 6 phút đọc · Thông tin được đối chiếu với tài liệu và các trang thư viện của Ollama vào 2026-11-04. Mô hình và các trường có thể thay đổi, vì vậy hãy xem lại các trang hiện hành trước khi dựa vào chúng.
Embedding là gì
Trang embeddings của Ollama nói rằng embedding biến văn bản thành các vector số mà bạn có thể lưu trong cơ sở dữ liệu vector, tìm kiếm bằng độ tương đồng cosine, hoặc dùng trong các pipeline RAG. Độ dài vector phụ thuộc vào mô hình; trang này nêu con số thường gặp là 384 đến 1024 chiều.
Khi tìm kiếm, câu hỏi được tạo embedding bằng cùng một mô hình, rồi hệ thống tìm các vector đã lưu giống nó nhất.
Tạo embedding bằng /api/embed
Endpoint là POST /api/embed. Yêu cầu cần có model và input, và input có thể là một chuỗi hoặc một mảng chuỗi. Với mảng, phản hồi chứa một vector cho mỗi chuỗi trong trường embeddings, theo cùng thứ tự, nên một loạt đoạn văn chỉ cần một yêu cầu.
Tài liệu cũng minh họa dòng lệnh: ollama run embeddinggemma "Hello world" in vector ra dưới dạng mảng JSON, và có thể chuyển văn bản vào qua đường ống bằng echo.
| Trường | Tài liệu tham chiếu API nói gì |
|---|---|
| model | Bắt buộc. Tên mô hình. |
| input | Bắt buộc. Một văn bản hoặc một mảng văn bản. |
| truncate | Mặc định là true: đầu vào vượt quá cửa sổ ngữ cảnh sẽ bị cắt bớt. Nếu là false, một lỗi sẽ được trả về. |
| dimensions | Số chiều để tạo embedding. |
| keep_alive | Thời gian mô hình được giữ trong trạng thái đã nạp. |
| options | Các tùy chọn khi chạy, chẳng hạn num_ctx cho độ dài ngữ cảnh. |
Ollama cũng có một endpoint tương thích OpenAI, /v1/embeddings. Tài liệu của nó liệt kê model, input dạng chuỗi hoặc mảng chuỗi, encoding format và dimensions là được hỗ trợ, còn mảng token và user là không được hỗ trợ.
Các mô hình embedding trong thư viện Ollama
Thư viện Ollama có một danh mục embedding. Bảng dưới đây nêu sáu trong số các mô hình được liệt kê ở đó, cùng dung lượng và cửa sổ ngữ cảnh mà trang tag của từng mô hình cho biết ở tag latest. Bốn trong sáu mô hình nhỏ hơn 1GB.
| Mô hình | Dung lượng của tag latest | Cửa sổ ngữ cảnh |
|---|---|---|
| all-minilm | 46MB | 512 |
| nomic-embed-text | 274MB | 2K |
| embeddinggemma | 622MB | 2K |
| mxbai-embed-large | 670MB | 512 |
| bge-m3 | 1.2GB | 8K |
| qwen3-embedding | 4.7GB | 40K |
Các tag khác có dung lượng khác: chẳng hạn thư viện liệt kê qwen3-embedding:0.6b ở mức 639MB với cửa sổ ngữ cảnh 32K, và embeddinggemma:300m-qat-q4_0 ở mức 239MB. Chúng tôi không so sánh chất lượng của các mô hình này; các trang thư viện không xếp hạng chúng. Khi chúng tôi thử all-minilm trên Ollama 0.40.11, ollama show hiển thị độ dài ngữ cảnh 512 và tham số num_ctx là 256, và một đầu vào dài đã bị cắt ở 256 token. Hãy kiểm tra ollama show cho mô hình bạn dùng.
Đầu vào dài bị cắt mà không báo lỗi
Cửa sổ ngữ cảnh được tính bằng token. Vì truncate mặc định là true, một văn bản dài hơn cửa sổ ngữ cảnh của mô hình sẽ bị rút ngắn và vẫn trả về một vector, không có lỗi. Một tài liệu dài gửi dưới dạng một đầu vào duy nhất có thể bị mất phần cuối theo cách này.
Có hai việc giúp ích. Một là chia tài liệu dài thành các chunk nhỏ hơn và tạo embedding cho từng chunk, điều này cũng giúp tìm kiếm trả về đúng phần trả lời được câu hỏi. Hai là gửi kèm truncate đặt thành false, để khi một chunk vẫn quá dài thì Ollama trả về lỗi thay vì rút ngắn nó.
Công cụ chia chunk bên dưới tách văn bản ở các đoạn, dòng, câu và khoảng trắng, có phần chồng lấn (overlap), và dựng một yêu cầu /api/embed duy nhất cho tất cả các chunk. Nó đếm theo ký tự chứ không theo token, vì mỗi mô hình có tokenizer riêng, nên hãy để lại một khoảng đệm dưới cửa sổ ngữ cảnh.
Dùng thử: RAG Text Chunker
Độ dài tính bằng ký tự. Cửa sổ ngữ cảnh của mô hình tính bằng token, và một văn bản dùng bao nhiêu token tùy vào mô hình, nên hãy để lại một khoảng đệm.
Lệnh curl
Chạy trên một máy kết nối được tới Ollama. Phản hồi có một vector cho mỗi chunk, theo thứ tự này.
curl http://localhost:11434/api/embed -d '{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama'\''s /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model'\''s context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}'Các chunk
3 chunk. Chunk dài nhất có 294 ký tự.
#0 · 294 ký tự · bắt đầu tại vị trí 0
Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline. The length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.
#1 · 202 ký tự · bắt đầu tại vị trí 294
Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.
#2 · 169 ký tự · bắt đầu tại vị trí 496
Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question.
Nội dung JSON cho /api/embed
{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}Các trường của yêu cầu theo tài liệu tham chiếu API của Ollama cho /api/embed, đối chiếu vào 2026-11-04. Ollama API: Generate embeddings
Mọi thứ được thực hiện trong trình duyệt của bạn. Công cụ chỉ viết ra lệnh và không gửi gì cả.
Dùng cùng một mô hình để lập chỉ mục và tìm kiếm
Trang embeddings nói hãy dùng cùng một mô hình embedding cho cả việc lập chỉ mục lẫn truy vấn. Độ dài vector phụ thuộc vào mô hình, nên vector từ hai mô hình khác nhau thậm chí có thể không có cùng số chiều.
Với dimensions cũng vậy: nếu bạn đặt nó khi lập chỉ mục tài liệu, hãy đặt cùng giá trị khi tạo embedding cho các câu hỏi. Nếu bạn đổi mô hình hoặc thiết lập này, hãy tạo lại embedding cho các tài liệu đã lưu.
So sánh các vector
Tài liệu khuyên dùng độ tương đồng cosine cho hầu hết các trường hợp tìm kiếm ngữ nghĩa, và nói rằng /api/embed trả về các vector đã chuẩn hóa L2, có độ dài đơn vị. Với các vector độ dài đơn vị, độ tương đồng cosine và tích vô hướng là cùng một con số, nên cơ sở dữ liệu vector đặt theo cách nào thì cũng xếp hạng kết quả như nhau.
Để kiểm tra một mô hình trên văn bản của chính bạn trước khi xây dựng bất cứ thứ gì, hãy tạo embedding cho một câu hỏi và vài đoạn văn trong một yêu cầu, với câu hỏi đặt đầu tiên. Dán phản hồi vào bên dưới: các đoạn văn được xếp hạng theo độ tương đồng cosine với câu hỏi, và công cụ cho biết mọi vector có độ dài đơn vị và có cùng số chiều hay không.
Dùng thử: Embedding Similarity Calculator
Ví dụ dùng các vector tự nghĩ ra, có độ dài đơn vị và 4 chiều để bạn dễ đọc. Embedding thật có hàng trăm hoặc hàng nghìn chiều.
Đọc như một phản hồi /api/embed của Ollama: 4 vector có 4 chiều. Tất cả vector có độ dài bằng 1, nên độ tương đồng cosine và tích vô hướng bằng nhau.
Xếp hạng theo độ tương đồng cosine
So sánh với #0 How do I keep a model loaded in Ollama?. Giá trị càng cao càng giống.
| Hạng | Văn bản | Cosine | Tích vô hướng | Khoảng cách |
|---|---|---|---|---|
| 1 | #1 keep_alive controls how long the model stays in memory | 0.9962 | 0.9962 | 0.0876 |
| 2 | #2 Protect Ollama with nginx and a password | 0.4037 | 0.4037 | 1.0921 |
| 3 | #3 Tomorrow's weather forecast | 0.0100 | 0.0100 | 1.4071 |
Ma trận độ tương đồng cosine
Mỗi ô so sánh vector ở hàng với vector ở cột.
| #0 | #1 | #2 | #3 | |
|---|---|---|---|---|
| #0 | 1.000 | 0.996 | 0.404 | 0.010 |
| #1 | 0.996 | 1.000 | 0.475 | -0.005 |
| #2 | 0.404 | 0.475 | 1.000 | -0.377 |
| #3 | 0.010 | -0.005 | -0.377 | 1.000 |
Các vector
| Văn bản | Số chiều | Độ dài (chuẩn L2) | Độ dài đơn vị |
|---|---|---|---|
| #0 How do I keep a model loaded in Ollama? | 4 | 1.000000 | Có |
| #1 keep_alive controls how long the model stays in memory | 4 | 1.000000 | Có |
| #2 Protect Ollama with nginx and a password | 4 | 1.000001 | Có |
| #3 Tomorrow's weather forecast | 4 | 1.000000 | Có |
Dựa trên tài liệu embeddings và tài liệu tham chiếu API của Ollama, đối chiếu vào 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings
Mọi thứ được tính toán trong trình duyệt của bạn. Không có gì được gửi đi đâu cả.
Bộ nhớ trên máy chủ nhỏ
Một mô hình embedding được nạp giống như mọi mô hình khác. Ollama FAQ nói rằng OLLAMA_MAX_LOADED_MODELS, số mô hình có thể được nạp cùng lúc nếu vừa bộ nhớ, mặc định là 3 lần số GPU, hoặc 3 khi suy luận bằng CPU. Vì vậy, một mô hình trò chuyện và một mô hình embedding có thể cùng ở trạng thái đã nạp khi bộ nhớ cho phép.
Bài viết của chúng tôi về việc theo dõi bộ nhớ của Ollama giải thích ollama ps, keep_alive và các thiết lập khác quyết định điều gì ở lại trong bộ nhớ.
Nguồn
Đọc tiếp
- Lưu và tìm kiếm embedding của Ollama trong PostgreSQL bằng pgvectorLưu embedding của Ollama trong PostgreSQL bằng pgvector, tìm kiếm bằng HNSW hoặc IVFFlat, rồi chuyển kết quả sang /api/chat để câu trả lời trích dẫn các nguồn của nó.
- Theo dõi bộ nhớ của Ollama trên VPS nhỏXem Ollama giữ gì trong bộ nhớ, giữ bao lâu và thiết lập nào thay đổi điều đó: ollama ps, keep_alive và các giới hạn, theo FAQ chính thức.
- Kết nối Dify với Ollama trên VPS của riêng bạnChạy Dify trên VPS của riêng bạn và dùng Ollama làm mô hình: cài đặt, các trường của plugin, vấn đề địa chỉ trong Docker và embedding, theo tài liệu chính thức.
- Chạy LLM cục bộ mà không cần PC đắt tiền: hướng dẫn dùng VPS cho người mớiKhông có PC mạnh? Hãy thuê một VPS và chạy một LLM cục bộ nhỏ ngay trong trình duyệt: sáu bước từ ước tính bộ nhớ đến màn hình chat được bảo vệ, với các giới hạn được nêu trung thực.