~/ / Bài viết về AI / LLM cục bộ trên VPS / Lưu và tìm kiếm embedding của Ollama trong PostgreSQL bằng pgvector
Lưu và tìm kiếm embedding của Ollama trong PostgreSQL bằng pgvector
Các embedding từ /api/embed của Ollama chỉ hữu ích cho việc tìm kiếm khi chúng được lưu ở đâu đó. pgvector là một phần mở rộng mã nguồn mở thêm khả năng tìm kiếm tương đồng vector vào PostgreSQL, nên các vector có thể nằm cùng cơ sở dữ liệu với văn bản và phần còn lại của dữ liệu, trên cùng một máy chủ. Bài viết này trình bày cách cài đặt, tạo bảng, chọn khoảng cách và chỉ mục, cùng những thiết lập làm thay đổi kết quả, dựa trên README của pgvector phiên bản 0.8.7. Sau đó bài chuyển kết quả tìm kiếm sang /api/chat của Ollama để câu trả lời nêu rõ các nguồn của nó, rồi kiểm tra những trích dẫn đó. Chúng tôi đã chạy các câu SQL trên pgvector 0.8.7 với PostgreSQL 16 bằng các vector thật từ Ollama, và chạy các yêu cầu chat trên Ollama 0.40.11 với qwen2.5:7b. Bốn công cụ trên trang này viết SQL và yêu cầu, rồi kiểm tra câu trả lời ngay trong trình duyệt của bạn.
Đăng: · 12 phút đọc · Các dữ kiện đã được đối chiếu với README và mã nguồn của pgvector phiên bản 0.8.7 và với tài liệu cùng mã nguồn của Ollama (0.40.11) vào ngày 2026-11-05. Hãy xem tài liệu hiện hành trước khi dựa vào chúng.
pgvector thêm gì cho PostgreSQL
README của pgvector mô tả nó là công cụ tìm kiếm tương đồng vector mã nguồn mở cho Postgres. Nó hỗ trợ tìm kiếm láng giềng gần nhất chính xác và xấp xỉ; vector độ chính xác đơn, nửa độ chính xác, nhị phân và thưa; cùng khoảng cách L2, tích vô hướng, khoảng cách cosine, khoảng cách L1, khoảng cách Hamming và khoảng cách Jaccard. Vì các vector là cột PostgreSQL bình thường, chúng cũng có tính tuân thủ ACID, khôi phục tại một thời điểm (point-in-time recovery) và JOIN.
Để tìm kiếm trong tài liệu của bạn, bạn lưu mỗi chunk thành một hàng với văn bản và vector của nó, tạo embedding cho câu hỏi bằng cùng mô hình, rồi sắp xếp các hàng theo khoảng cách tới vector của câu hỏi.
Cài đặt
pgvector hỗ trợ PostgreSQL 13 trở lên. README liệt kê nhiều cách cài đặt, trong đó có các cách sau:
| Cách | README nói gì |
|---|---|
| Biên dịch từ mã nguồn | git clone --branch v0.8.7, rồi make và make install (có thể cần sudo) |
| Docker | Image pgvector/pgvector thêm pgvector vào image Postgres. Các tag như pg18-trixie hoặc 0.8.7-pg16 chọn phiên bản Postgres. |
| APT (Debian, Ubuntu) | sudo apt install postgresql-18-pgvector từ PostgreSQL APT Repository, thay 18 bằng phiên bản Postgres của bạn |
| Homebrew | brew install pgvector, chỉ thêm nó vào các formula postgresql@18 và postgresql@17 |
Sau đó, hãy bật nó một lần trong mỗi cơ sở dữ liệu mà bạn muốn dùng, bằng CREATE EXTENSION vector;. Trong bài này chúng tôi dùng image Docker pgvector/pgvector:0.8.7-pg16.
Tạo bảng
Một cột kiểu vector(n) chứa các vector có đúng n chiều, và n phải bằng độ dài của vector từ mô hình embedding của bạn. Vector có độ dài khác sẽ bị từ chối: khi chúng tôi chèn một vector 2 chiều vào cột vector(3), PostgreSQL trả về "expected 3 dimensions, not 2". all-minilm trả về 384 chiều, nên cột của nó là vector(384).
README cho biết dung lượng lưu mỗi vector là 4 × số chiều + 8 byte, với mỗi phần tử là một số dấu phẩy động độ chính xác đơn, và cho phép tối đa 16,000 chiều trong một cột. Chỉ mục hỗ trợ ít chiều hơn, như nêu bên dưới. Kiểu halfvec lưu các giá trị nửa độ chính xác với 2 × số chiều + 8 byte.
| Số chiều | vector | halfvec |
|---|---|---|
| 384 | 1,544 byte | 776 byte |
| 768 | 3,080 byte | 1,544 byte |
| 1024 | 4,104 byte | 2,056 byte |
Trên bảng thử nghiệm của chúng tôi, pg_column_size cho 1,544 byte với vector(384) và 776 byte với halfvec(384), khớp với công thức. Đây chỉ là phần vector; cột văn bản và các chỉ mục chiếm thêm dung lượng.
Nạp vector từ Ollama
pgvector đọc một vector dưới dạng văn bản trong ngoặc vuông, chẳng hạn '[1,2,3]', và README nói mọi phần tử phải hữu hạn (không có NaN, Infinity hay -Infinity). Mỗi mảng trong trường embeddings của phản hồi /api/embed đã có dạng này, và phản hồi giữ nguyên thứ tự của đầu vào, nên văn bản đầu tiên ứng với vector đầu tiên.
README cho thấy INSERT cho vài hàng, INSERT … ON CONFLICT cho upsert, và COPY để nạp hàng loạt. Công cụ chuyển đổi bên dưới ghép các văn bản của bạn với phản hồi và viết các câu lệnh INSERT với dấu nháy đã được thoát. Chúng tôi đã chạy đầu ra của nó với các văn bản chứa dấu nháy, dấu gạch chéo ngược, ngắt dòng và emoji, và chúng quay lại không thay đổi.
Dùng thử: Embeddings to pgvector INSERT
Ví dụ dùng các vector tự đặt, có độ dài 1 và 4 chiều để bạn dễ đọc. Embedding thật có hàng trăm hoặc hàng nghìn chiều.
3 hàng với 4 chiều. Các văn bản được đọc là phần thân yêu cầu /api/embed, các vector được đọc là một phản hồi /api/embed của Ollama.
Các câu lệnh INSERT
Chạy trong psql hoặc một ứng dụng khách khác. Các hàng được chèn trong một giao dịch.
BEGIN;
INSERT INTO documents (content, embedding) VALUES
('Embeddings turn text into numeric vectors.', '[0.620186,0.410123,0.550165,0.380114]'),
('pgvector stores vectors in PostgreSQL, next to the rest of your data.', '[0.578815,0.469039,0.518937,0.419142]'),
('Ollama''s /api/embed returns one vector per input, in the same order.', '[0.119982,0.809879,-0.329951,0.46993]');
COMMIT;Định dạng vector lấy từ README của pgvector, kiểm tra với pgvector 0.8.7 vào ngày 2026-11-04. pgvector README
Mọi thứ diễn ra trong trình duyệt của bạn. Công cụ chỉ viết SQL và không kết nối tới đâu cả.
Chọn khoảng cách
Tài liệu của Ollama 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 /api/embed trả về các vector có độ dài 1. Với những vector như vậy, khoảng cách cosine, khoảng cách L2 và tích vô hướng sắp xếp các hàng theo cùng một thứ tự, vì bình phương khoảng cách L2 bằng 2 trừ đi 2 lần độ tương đồng cosine. Trong thử nghiệm của chúng tôi với all-minilm, ba hàng đầu giống nhau ở cả ba cách, và khoảng cách L2 0.931 khớp với độ tương đồng cosine 0.566.
Mỗi khoảng cách có toán tử riêng. Một lần tìm kiếm sắp xếp theo toán tử đó và lấy các hàng đầu bằng LIMIT, còn chỉ mục được xây cho một lớp toán tử (operator class).
| Toán tử | Trả về | Lớp toán tử của chỉ mục |
|---|---|---|
| <=> | Khoảng cách cosine. Độ tương đồng cosine là 1 - (a <=> b). | vector_cosine_ops |
| <-> | Khoảng cách L2 (Euclid) | vector_l2_ops |
| <#> | Tích vô hướng âm. Nhân với -1 để có tích vô hướng. | vector_ip_ops |
| <+> | Khoảng cách L1 | vector_l1_ops |
README giải thích rằng <#> trả về tích vô hướng âm vì Postgres chỉ hỗ trợ quét chỉ mục theo thứ tự ASC trên các toán tử. Với halfvec, các lớp toán tử là halfvec_cosine_ops, halfvec_l2_ops, v.v.
Tìm kiếm chính xác hay dùng chỉ mục
Khi không có chỉ mục, pgvector thực hiện tìm kiếm láng giềng gần nhất chính xác, mà README nói là cho độ nhớ lại (recall) hoàn hảo. Một chỉ mục xấp xỉ đánh đổi một phần recall để lấy tốc độ, và README cảnh báo rằng các truy vấn có thể trả về kết quả khác sau khi bạn thêm chỉ mục.
Chỉ mục chỉ được dùng khi truy vấn có ORDER BY và LIMIT, và ORDER BY chính là toán tử khoảng cách theo thứ tự tăng dần. ORDER BY embedding <=> $1 LIMIT 5 có thể dùng chỉ mục; ORDER BY 1 - (embedding <=> $1) DESC thì không. README cũng lưu ý rằng quét toàn bảng có thể nhanh hơn khi bảng nhỏ.
| Điểm | HNSW | IVFFlat |
|---|---|---|
| Cách hoạt động | Một đồ thị nhiều tầng | Chia các vector thành các list và tìm trong những list gần truy vấn nhất |
| So với loại kia | Đánh đổi tốc độ và recall tốt hơn, nhưng xây chậm hơn và dùng nhiều bộ nhớ hơn | Xây nhanh hơn và dùng ít bộ nhớ hơn, nhưng đánh đổi tốc độ và recall kém hơn |
| Khi nào tạo | Có thể tạo trên bảng trống (không có bước huấn luyện) | Sau khi bảng đã có một ít dữ liệu |
| Tùy chọn khi xây | m (mặc định 16) và ef_construction (mặc định 64) | lists: bắt đầu với rows / 1000 cho đến 1M hàng, và sqrt(rows) khi nhiều hơn |
| Tùy chọn khi tìm | hnsw.ef_search, mặc định 40 | ivfflat.probes, mặc định 1; bắt đầu với sqrt(lists) |
| Số chiều | vector tối đa 2,000, halfvec tối đa 4,000 | vector tối đa 2,000, halfvec tối đa 4,000 |
Trên pgvector 0.8.7, chúng tôi cũng xác nhận rằng cột vector(2001) không thể có chỉ mục HNSW, IVFFlat không có lớp toán tử cho khoảng cách L1, và ef_construction phải ít nhất là 2 × m. Với nhiều chiều hơn, FAQ của README liệt kê halfvec, lượng tử hóa nhị phân và các lựa chọn khác.
Dùng thử: pgvector SQL Builder
Mỗi vector chiếm 1,544 byte, nên 10,000 hàng chiếm khoảng 15.4 MB chỉ riêng phần vector (chưa tính chỉ mục và các cột khác).
1. Phần mở rộng và bảng
CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE documents ( id bigserial PRIMARY KEY, content text NOT NULL, embedding vector(384) NOT NULL );
2. Chỉ mục
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
3. Tìm kiếm
PREPARE nhận vector của câu hỏi từ /api/embed làm $1. Hãy truyền nó dưới dạng văn bản, chẳng hạn '[0.01,-0.02,…]'.
PREPARE search_documents(vector(384)) AS
SELECT id, content, 1 - (embedding <=> $1) AS cosine_similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;
-- EXECUTE search_documents('[0.0123, -0.0456, ...]');Các giới hạn và giá trị mặc định lấy từ README và mã nguồn của pgvector 0.8.7, kiểm tra vào ngày 2026-11-04. pgvector README
Mọi thứ diễn ra trong trình duyệt của bạn. Công cụ chỉ viết SQL và không kết nối tới đâu cả.
Vì sao một lần tìm kiếm có thể trả về ít hàng hơn LIMIT
Với HNSW, kết quả bị giới hạn bởi hnsw.ef_search, mặc định là 40. Trên một bảng thử nghiệm 200 hàng có chỉ mục HNSW, LIMIT 100 trả về 40 hàng; sau SET hnsw.ef_search = 100, nó trả về 100 hàng. Hãy đặt hnsw.ef_search ít nhất bằng số hàng bạn cần. SET LOCAL trong một giao dịch chỉ thay đổi nó cho một truy vấn.
Việc lọc cũng làm giảm kết quả. Với các chỉ mục xấp xỉ, README nói điều kiện WHERE được áp dụng sau khi quét chỉ mục: nếu một điều kiện khớp 10% số hàng, HNSW với hnsw.ef_search mặc định là 40 chỉ trả về trung bình 4 hàng. Từ phiên bản 0.8.0, quét chỉ mục lặp (SET hnsw.iterative_scan = strict_order, hoặc relaxed_order) quét thêm chỉ mục cho đến khi tìm đủ hàng, tối đa đến hnsw.max_scan_tuples (mặc định 20,000).
README bổ sung rằng các vector NULL không được đánh chỉ mục, và các vector không cũng vậy khi dùng khoảng cách cosine.
Chuyển kết quả sang /api/chat dưới dạng các nguồn có đánh số
Khi lần tìm kiếm trả về các hàng gần nhất, mô hình cần có chúng trong prompt. /api/chat của Ollama nhận một danh sách thông điệp, mỗi thông điệp có một role (system, user, assistant hoặc tool) và content của nó. Một cách bố trí đơn giản là một thông điệp system chứa các quy tắc và một thông điệp user liệt kê các hàng, mỗi hàng có một số, chẳng hạn [1] và [2], rồi đến câu hỏi. Nhờ có số, câu trả lời có thể nói rõ nó đã dùng những hàng nào, và bạn có thể ánh xạ từng số về hàng của nó.
Để nhận các trích dẫn theo một dạng cố định, hãy đưa vào trường format một JSON Schema có câu trả lời và một danh sách các trích dẫn, mỗi trích dẫn gồm số nguồn và một đoạn trích ngắn. Trang structured outputs của Ollama khuyên nên viết cả schema vào prompt, và hạ temperature, chẳng hạn xuống 0, để đầu ra mang tính xác định hơn. Trong psql, hàm json_agg gom các hàng của một truy vấn thành một mảng JSON, và công cụ bên dưới đọc trực tiếp được mảng này.
Dùng thử: RAG Prompt Builder
Các nguồn trong ví dụ được viết tay theo dạng mà json_agg trả về.
3 nguồn, được đọc là một mảng JSON các đối tượng.
Lệnh curl
Gửi yêu cầu tới Ollama trên máy này (localhost:11434).
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}'Thân yêu cầu (JSON)
{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}Trong phản hồi, câu trả lời nằm ở message.content. Nếu prompt_eval_count thấp hơn nhiều so với bạn dự đoán, prompt có thể đã bị cắt.
Các trường của yêu cầu lấy từ tài liệu tham khảo API và mã nguồn của Ollama, đã kiểm tra trên Ollama 0.40.11 vào ngày 2026-11-05. Ollama API: /api/chat
Mọi việc đều được thực hiện trong trình duyệt của bạn. Công cụ viết yêu cầu và không kết nối tới đâu cả.
Khi các nguồn không vừa, Ollama cắt phần đầu của prompt
Các quy tắc, các hàng và câu hỏi đều phải vừa trong độ dài ngữ cảnh. Trang về độ dài ngữ cảnh của Ollama nêu mặc định là 4k token khi VRAM dưới 24 GiB, còn FAQ của nó nêu 4096 token; ollama ps trên máy thử nghiệm của chúng tôi hiển thị 4096. num_ctx trong options hoặc biến môi trường OLLAMA_CONTEXT_LENGTH sẽ thay đổi giá trị này.
Khi prompt dài hơn, /api/chat mặc định không trả về lỗi. Trong mã nguồn của Ollama (0.40.11), máy chủ trước hết bỏ nguyên các thông điệp trước đó, đồng thời giữ lại các thông điệp system và thông điệp cuối cùng. Nếu phần prompt còn lại vẫn quá dài, nó giữ vài token đầu (num_keep, mặc định là 4) và phần cuối của prompt, rồi bỏ phần ở giữa. Trong thử nghiệm của chúng tôi với qwen2.5:7b và num_ctx 1024, một prompt 2,068 token bị cắt còn 514. Thông điệp system và các nguồn đầu tiên bị mất: khi đáp án nằm ở nguồn [1], mô hình trả lời bằng một từ mã không có trong nguồn nào, còn khi đáp án nằm ở nguồn cuối, nó trả lời đúng nhưng không kèm số nguồn mà thông điệp system yêu cầu. Phản hồi không có lỗi nào; nhật ký của máy chủ có cảnh báo "truncating input prompt".
Mã nguồn của Ollama cũng có một trường truncate cho các yêu cầu chat, mà trang /api/chat không liệt kê. Với "truncate": false, cùng yêu cầu đó trả về HTTP 400 kèm lỗi "request (2068 tokens) exceeds the available context size (1024 tokens), try increasing it". Trường prompt_eval_count của phản hồi là số token trong prompt; trong thử nghiệm bị cắt, nó là 514, không phải 2,068.
Vì phần cuối của prompt được giữ lại, hãy đặt câu hỏi sau các nguồn. Để biết khi nào các nguồn không vừa, hãy gửi "truncate": false rồi tăng num_ctx hoặc gửi ít hàng hơn. num_ctx lớn hơn cần nhiều bộ nhớ hơn.
Kiểm tra các trích dẫn
Một trích dẫn có thể được kiểm tra một cách máy móc: số phải trỏ tới một nguồn đã được gửi, và đoạn trích nên xuất hiện trong nguồn đó. Trong thử nghiệm của chúng tôi với bốn nguồn và qwen2.5:7b, các đoạn trích trong những câu trả lời JSON khớp từng chữ với các nguồn. Điều đó không chứng minh câu trả lời đúng: khi được hỏi kích thước của một vector 384 chiều, mô hình trích đúng quy tắc (4 × số chiều + 8 byte) mà vẫn trả lời 1552 byte thay vì 1,544.
Hãy xem cả những câu trả lời không có trích dẫn. Khi các nguồn không chứa đáp án, có một lần mô hình trả lời từ kiến thức của chính nó mà không có trích dẫn nào, và một lần nó nói là không biết nhưng vẫn trích dẫn một nguồn không liên quan. Nếu done_reason trong phản hồi là "length", câu trả lời đã bị num_predict cắt giữa chừng và có thể thiếu các trích dẫn của nó.
Công cụ kiểm tra bên dưới chỉ so sánh văn bản. Việc một nguồn có thật sự ủng hộ một câu hay không vẫn phải do con người đánh giá.
Dùng thử: RAG Citation Checker
Câu trả lời trong ví dụ được viết tay để cho thấy một đoạn trích không có trong nguồn của nó.
4 nguồn (một mảng JSON các chuỗi). Câu trả lời được đọc là một phản hồi /api/chat của Ollama, ở dạng JSON có trích dẫn.
Số token trong prompt (prompt_eval_count): 306
- Đoạn trích của trích dẫn #2 không có trong nguồn [4].
Các trích dẫn
| Nguồn | Đoạn trích | Kết quả |
|---|---|---|
| [2] | hnsw.ef_search is 40 by default | Tìm thấy đúng như đã viết |
| [4] | 4 bytes per dimension plus 8 | Không có trong nguồn này |
Công cụ chỉ kiểm tra rằng các số và đoạn trích khớp với các nguồn. Nó không thể cho biết câu trả lời có đúng không hay một nguồn có thật sự ủng hộ một câu hay không.
Định dạng phản hồi lấy từ tài liệu tham khảo API và mã nguồn của Ollama, đã kiểm tra trên Ollama 0.40.11 vào ngày 2026-11-05. Ollama API: /api/chat
Mọi việc đều được thực hiện trong trình duyệt của bạn. Công cụ không kết nối tới đâu cả.
Bộ nhớ trên một máy chủ nhỏ
README nói một chỉ mục HNSW được xây nhanh hơn đáng kể khi đồ thị vừa trong maintenance_work_mem, hiển thị một thông báo khi nó không còn vừa, và cảnh báo đừng đặt maintenance_work_mem cao đến mức làm cạn bộ nhớ của máy chủ. Cũng như các chỉ mục khác, tạo chỉ mục sau khi nạp dữ liệu ban đầu sẽ nhanh hơn. Chỉ mục không nhất thiết phải vừa trong bộ nhớ, nhưng nhiều khả năng bạn sẽ thấy hiệu năng tốt hơn nếu chúng vừa; SELECT pg_size_pretty(pg_relation_size('index_name')) cho biết kích thước của một chỉ mục.
Để có tập làm việc và chỉ mục nhỏ hơn, README gợi ý halfvec, đánh chỉ mục nửa độ chính xác hoặc lượng tử hóa nhị phân. Nếu Ollama chạy trên cùng máy chủ, PostgreSQL và các mô hình dùng chung bộ nhớ; 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 điều gì quyết định mức các mô hình sử dụng.
Nguồn
- pgvector README (v0.8.7)
- pgvector source: HNSW limits (src/hnsw.h)
- pgvector source: IVFFlat limits (src/ivfflat.h)
- Ollama: Embeddings
- Ollama API: Generate embeddings (/api/embed)
- PostgreSQL documentation: Lexical Structure (string constants)
- Ollama API: Generate a chat message (/api/chat)
- Ollama: Structured Outputs
- Ollama: Context length
- Ollama FAQ (context window size)
- Ollama source v0.40.11: server/prompt.go (dropping earlier messages)
- Ollama source v0.40.11: llm/llama_server.go (truncating the prompt)
- Ollama source v0.40.11: api/types.go (truncate, num_keep)
- PostgreSQL documentation: Aggregate Functions (json_agg)
Đọc tiếp
- 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.
- 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.