~/tools / 임베딩과 검색(RAG) / Embeddings to pgvector INSERT
Embeddings to pgvector INSERT — Ollama /api/embed 결과와 텍스트를 pgvector INSERT 문으로 바꾸기
임베딩한 텍스트와 Ollama의 /api/embed(또는 OpenAI 호환 /v1/embeddings 엔드포인트) 응답을 PostgreSQL pgvector 테이블용 INSERT 문으로 바꿉니다. 각 텍스트를 벡터와 순서대로 짝지어 따옴표를 이스케이프하고, 실행하기 전에 개수와 차원 수가 맞는지 확인합니다. 데이터는 브라우저 밖으로 나가지 않습니다.
예시는 읽기 쉽도록 임의로 만든 4차원의 길이 1 벡터를 씁니다. 실제 임베딩은 수백에서 수천 차원입니다.
4차원 3행. 텍스트는 /api/embed 요청 본문, 벡터는 Ollama /api/embed 응답(으)로 읽었습니다.
INSERT 문
psql이나 다른 클라이언트에서 실행하세요. 행은 하나의 트랜잭션으로 삽입됩니다.
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;벡터 형식은 pgvector README에서 가져왔으며, 2026-11-04에 pgvector 0.8.7로 확인했습니다. pgvector README
모든 처리는 브라우저에서 이루어집니다. 이 도구는 SQL을 작성할 뿐 어디에도 연결하지 않습니다.
문서 청크를 Ollama로 임베딩하고 나면, 벡터를 그 출처가 된 텍스트와 함께 데이터베이스에 넣어야 합니다. Ollama의 /api/embed는 입력 문자열마다 벡터 하나를 입력과 같은 순서로 돌려주므로, 첫 번째 텍스트는 첫 번째 벡터에 해당합니다. 이 도구는 그 짝짓기를 하고 SQL을 작성합니다. 텍스트는 /api/embed에 보낸 JSON 본문(이 사이트의 RAG Text Chunker가 만들어 줍니다), 문자열의 JSON 배열, 또는 한 줄에 하나로 붙여 넣고, 응답도 붙여 넣습니다. 도구는 Ollama 응답({"embeddings": [[…], …]})과 OpenAI 호환 응답({"data": [{"embedding": […]}]}, index 순서로 다시 정렬)을 읽습니다. 벡터는 '[0.1,-0.2,0.3]'처럼 pgvector의 텍스트 형식으로 쓰고, 각 텍스트는 SQL 문자열 상수로 씁니다. PostgreSQL 문서에 따르면 문자열 안의 작은따옴표는 작은따옴표 두 개로 쓰며, 백슬래시는 PostgreSQL 9.1부터 standard_conforming_strings가 기본으로 켜져 있으므로 그대로 둡니다. 무엇이든 쓰기 전에, INSERT를 실패하게 하거나 행을 잘못 짝짓게 할 수 있는 것들을 확인합니다. 텍스트와 벡터의 개수가 다른 경우, 벡터의 차원 수가 서로 다른 경우, 차원 수가 열의 vector(n)과 다른 경우, 유한한 수가 아닌 값(pgvector는 NaN이나 Infinity를 받지 않습니다), base64 임베딩, 그리고 PostgreSQL이 text에 저장할 수 없는 NUL 문자입니다. 문은 BEGIN과 COMMIT으로 감싸고, INSERT 하나에 100행씩 담습니다. 출력은 Ollama의 실제 응답으로 PostgreSQL 16의 pgvector 0.8.7에서 실행했으며, 따옴표, 백슬래시, 줄바꿈, 이모지가 들어 있는 텍스트도 그대로 돌아왔습니다.
이 도구의 핵심 로직은 MIT 라이선스의 오픈 소스로 공개되어 있습니다. github.com/seigo5555/toolkitbox-lib/src/pgvector-insert.ts
이럴 때 사용
- 매뉴얼이나 FAQ의 청크와 Ollama로 만든 임베딩을 RAG 검색을 위해 PostgreSQL에 적재하기
- 애플리케이션의 적재 코드를 쓰기 전에 실제 몇 행으로 검색 시험해 보기
- 삽입이 실패하는 이유 찾기: 차원 수가 틀린 벡터, 또는 벡터보다 많은 텍스트
사용법
- 임베딩한 텍스트를 붙여 넣습니다. RAG Text Chunker의 JSON 본문, 문자열의 JSON 배열, 또는 한 줄에 텍스트 하나입니다.
- 같은 텍스트를 /api/embed에 보내고 JSON 응답 전체를 붙여 넣습니다. 테이블과 열 이름을 입력하고, 원하면 vector(n) 열의 차원 수도 입력합니다.
- SQL을 복사해 psql이나 다른 클라이언트에서 실행합니다. 이 사이트의 pgvector SQL Builder가 짝이 되는 테이블과 검색 쿼리를 작성해 줍니다.
FAQ
어떤 벡터가 어떤 텍스트의 것인지 어떻게 알 수 있나요?
순서로 압니다. Ollama의 /api/embed는 입력 배열과 같은 순서로 임베딩을 돌려주므로, 도구는 첫 번째 텍스트를 첫 번째 벡터와, 두 번째를 두 번째와 짝짓는 식으로 합니다. 개수가 다르면 도구는 추측하지 않고 멈춥니다.
청크에 줄바꿈이 있습니다. 한 줄에 하나씩 붙여 넣어도 되나요?
아니요. 줄바꿈이 있으면 청크 하나가 텍스트 두 개로 나뉩니다. 대신 /api/embed에 보낸 JSON 본문이나 문자열의 JSON 배열을 붙여 넣으세요. 각 문자열 안의 줄바꿈은 SQL에서도 유지됩니다.
따옴표가 들어 있는 텍스트를 붙여 넣어도 안전한가요?
도구는 모든 작은따옴표를 두 개로 겹쳐 씁니다. PostgreSQL 문서가 문자열 상수 안에 따옴표를 쓰는 방법으로 제시하는 방식입니다. 백슬래시는 그대로 두는데, 기본값인 standard_conforming_strings = on에서는 이것이 맞습니다. 서버에서 이를 꺼 두었다면 출력을 실행하지 마세요. 애플리케이션 코드에서는 SQL 문자열을 직접 조립하지 말고 데이터베이스 드라이버의 매개변수를 쓰세요.
차원 수가 열과 맞지 않으면 어떻게 되나요?
pgvector가 그 행을 거부하며 "expected 384 dimensions, not 768" 같은 오류를 냅니다. 도구에 열의 차원 수를 입력하면 SQL을 실행하기 전에 이를 잡아낼 수 있습니다. 차원 수가 다르다는 것은 대개 벡터가 다른 모델에서 나왔거나 차원 수 설정이 달랐다는 뜻입니다.
한 번에 몇 행까지 변환할 수 있나요?
텍스트와 벡터를 1,000개까지입니다. 더 큰 적재에는 pgvector README가 COPY를 쓴 대량 적재를 보여 줍니다.
내 데이터가 어딘가로 전송되나요?
아니요. 변환은 브라우저에서 실행됩니다. 도구는 Ollama나 데이터베이스에 연결하지 않습니다.