~/tools / Embedding và tìm kiếm (RAG) / RAG Text Chunker
RAG Text Chunker — Chia văn bản cho RAG và dựng yêu cầu Ollama /api/embed
Chia một tài liệu dài thành các chunk có độ dài tối đa và phần chồng lấn (overlap) trước khi bạn tạo embedding cho RAG hoặc tìm kiếm ngữ nghĩa. Văn bản được cắt theo đoạn trước, rồi đến dòng, câu và khoảng trắng, và chỉ cắt giữa một từ khi không còn cách nào khác. Bạn nhận được các chunk và một lệnh curl chạy được ngay cho /api/embed của Ollama, với mọi chunk trong cùng một yêu cầu. Không có gì rời khỏi trình duyệt của bạn.
Độ 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ả.
Endpoint /api/embed của Ollama nhận một chuỗi hoặc một mảng chuỗi, và tài liệu tham chiếu API nói rằng theo mặc định, đầu vào dài hơn cửa sổ ngữ cảnh của mô hình sẽ bị cắt bớt. Vì vậy một tài liệu dài gửi dưới dạng một chuỗi có thể mất phần cuối mà không có lỗi nào, và chỉ một vector cho cả tài liệu khiến việc tìm kiếm khó trả về đúng phần trả lời được câu hỏi. Cách khắc phục thường dùng là chia tài liệu thành các chunk nhỏ hơn và tạo embedding cho từng chunk. Công cụ này tách văn bản ở ranh giới lớn nhất còn vừa: trước hết là các dòng trống giữa các đoạn, rồi đến ngắt dòng, rồi đến cuối câu (kể cả 。!?), rồi đến khoảng trắng, và chỉ cắt từng ký tự khi là biện pháp cuối cùng. Nó giữ nguyên các ký tự phân tách, nên ghép các chunk lại sẽ ra đúng văn bản gốc. Phần chồng lấn lặp lại phần cuối của một chunk ở đầu chunk kế tiếp, theo từng mảnh nguyên vẹn, để một câu bị cắt ở ranh giới vẫn xuất hiện trọn vẹn trong một chunk. Độ dài được đếm bằng ký tự. Kết quả là một yêu cầu /api/embed với tất cả chunk trong mảng input, kèm truncate đặt thành false nếu bạn muốn nhận lỗi thay vì bị cắt bớt âm thầm. Việc chia được kiểm tra bằng các ví dụ đếm tay và bằng cách xác nhận rằng mỗi chunk là một đoạn của văn bản gốc tại vị trí được hiển thị.
Phần xử lý chính của công cụ này là mã nguồn mở theo giấy phép MIT. github.com/seigo5555/toolkitbox-lib/src/text-chunk.ts
Trường hợp dùng
- Chuẩn bị một bản hướng dẫn, một FAQ hoặc một README cho tìm kiếm RAG trên máy chủ Ollama của bạn, và tạo embedding cho mọi chunk trong một yêu cầu
- Tìm kích thước chunk giữ các đoạn văn đi cùng nhau, bằng cách đổi kích thước và xem các ranh giới rơi ở đâu
- Đảm bảo không có gì bị cắt âm thầm: bật truncate false, và Ollama trả về lỗi khi một chunk quá dài so với mô hình
Cách dùng
- Dán văn bản. Ngăn cách các đoạn bằng một dòng trống để chúng được giữ cùng nhau khi có thể.
- Đặt độ dài chunk tối đa và phần chồng lấn tính bằng ký tự, tên mô hình embedding, và địa chỉ máy chủ Ollama của bạn nếu nó không phải http://localhost:11434.
- Sao chép lệnh curl và chạy trên một máy kết nối được tới Ollama. Phản hồi chứa một vector cho mỗi chunk, theo cùng thứ tự. Embedding Similarity Calculator trên trang này có thể so sánh chúng.
Hỏi đáp
Tôi nên dùng kích thước chunk bao nhiêu?
Không có một kích thước đúng duy nhất. Mỗi chunk phải vừa trong cửa sổ ngữ cảnh của mô hình, được tính bằng token, và chunk càng nhỏ thì tìm kiếm càng chỉ ra được đoạn cụ thể hơn. Hãy bắt đầu với kích thước giữ một hoặc hai đoạn đi cùng nhau, rồi so sánh kết quả tìm kiếm bằng Embedding Similarity Calculator.
Vì sao đếm theo ký tự mà không phải token?
Mỗi mô hình embedding có tokenizer riêng, nên cùng một văn bản có số token khác nhau ở các mô hình khác nhau, và một công cụ chạy trong trình duyệt không thể đếm chính xác cho mọi mô hình. Thư viện Ollama liệt kê cửa sổ ngữ cảnh của từng mô hình bằng token; chẳng hạn, nó cho thấy 2K với embeddinggemma và nomic-embed-text, và 512 với mxbai-embed-large và all-minilm. Hãy để lại một khoảng đệm, và dùng truncate false để tìm các chunk quá dài.
truncate false làm gì?
Tài liệu tham chiếu API của Ollama nói truncate mặc định là true, tức là cắt bớt các đầu vào vượt quá cửa sổ ngữ cảnh. Với false, Ollama trả về lỗi thay vì cắt. Công cụ thêm "truncate": false khi ô được chọn, để một chunk quá dài báo lỗi rõ ràng thay vì bị rút ngắn.
Phần chồng lấn hoạt động thế nào?
Khi một chunk mới bắt đầu, các mảnh cuối của chunk trước (câu, dòng hoặc từ) được lặp lại ở đầu nó, miễn là chúng nằm trong độ dài chồng lấn và chunk vẫn không vượt quá mức tối đa. Các mảnh không bao giờ bị cắt để lấp đầy phần chồng lấn, nên phần chồng lấn thực tế có thể ngắn hơn con số bạn đặt.
Công cụ có hiểu Markdown, HTML hoặc mã nguồn không?
Không. Nó coi mọi thứ là văn bản thuần và tách ở các đoạn, dòng, câu và khoảng trắng. Hãy xóa các thẻ đánh dấu mà bạn không muốn đưa vào embedding trước khi dán văn bản.
Văn bản của tôi có bị gửi đi đâu không?
Không. Văn bản được chia trong trình duyệt của bạn, và công cụ chỉ viết ra lệnh. Không có gì được gửi đi cho đến khi bạn tự chạy lệnh.
Bài viết liên quan
- Embedding với Ollama: kiến thức nền tảng cho tìm kiếm và RAGTạo embedding bằng /api/embed của Ollama: các mô hình và dung lượng, truncate và dimensions, vector độ dài đơn vị và độ tương đồng cosine, theo tài liệu chính thức.
- 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ó.