PgVector를 사용하여 .NET에서 벡터 검색 구축하기, 개발자를 위한 가이드
큰 데이터, 문서, 제품 카탈로그, 고객 기록 또는 스캔한 파일을 다루는 .NET 애플리케이션을 구축하는 경우 검색은 항상 도전 과제입니다. 키워드 검색은 문맥을 놓칩니다. 전체 텍스트 검색에는 한계가 있습니다. 하지만 벡터 검색은 완전히 다른 방정식을 제시합니다.
.NET 커뮤니티에서 가장 존경받는 목소리 중 하나이자 Microsoft MVP인 Milan Jovanović의 훌륭한 가이드로, PgVector라는 PostgreSQL 확장을 사용하여 초기 데이터베이스에 의미론적 검색 기능을 직접 도입하는 방법을 다루고 있습니다.
벡터 검색이란 무엇이며 어떻게 작동하나요?
전통적인 검색은 정확한 단어 또는 문구를 일치시킵니다. 사용자가 '청구서 미납'을 검색하면 키워드 검색은 해당 정확한 단어가 포함된 문서만 찾습니다. '미결제'나 '잔액 미납' 같은 의미는 같지만 다른 문서는 표시되지 않습니다.
벡터 검색은 다르게 작동합니다. 단어를 일치시키는 대신 의미를 일치시킵니다.
실제 파이프라인이 실제로 작동하는 방식은 다음과 같습니다:
먼저, 텍스트를 고차원 부동 소수점 숫자의 배열인 임베딩이라는 숫자 표현으로 변환합니다. 이는 내용의 의미를 포착합니다. 예를 들어, '청구서 미납'과 '미결제'라는 문장은 공통 단어를 공유하지 않더라도 벡터 공간에서 수학적으로 가까운 임베딩을 생성합니다.
이러한 임베딩은 일반적으로 OpenAI의 텍스트 임베딩 모델과 같은 API를 통해 기계 학습 모델에 의해 생성되며 데이터베이스에 데이터와 함께 저장됩니다.

사용자가 검색 쿼리를 실행할 때, 그 쿼리 또한 동일한 모델을 사용하여 임베딩으로 변환됩니다. 그런 다음 데이터베이스는 쿼리 임베딩과 저장된 모든 임베딩 간의 거리를 계산하여 벡터 공간에서 가장 가까운, 즉 의미론적으로 가장 유사한 결과를 반환합니다.
PgVector는 별도의 벡터 데이터베이스가 필요 없이, 바로 기존의 관계형 데이터 옆에서 효율적인 유사성 검색을 지원하면서 PostgreSQL 내에서 이를 가능하게 합니다.
데이터베이스 초기화
벡터를 저장하기 전에 PgVector 확장을 활성화하고 테이블을 설정하십시오.
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddOllama("ollama")
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithGPUSupport();
var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");
var postgres = builder.AddPostgres("postgres", port: 6432)
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithImage("pgvector/pgvector", "pg17")
.AddDatabase("articles");
builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
.WithReference(embeddingModel)
.WithReference(postgres)
.WaitFor(embeddingModel)
.WaitFor(postgres);
builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddOllama("ollama")
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithGPUSupport();
var embeddingModel = ollama.AddModel("qwen3-embedding:0.6b");
var postgres = builder.AddPostgres("postgres", port: 6432)
.WithLifetime(ContainerLifetime.Persistent)
.WithDataVolume()
.WithImage("pgvector/pgvector", "pg17")
.AddDatabase("articles");
builder.AddProject<Projects.PgVector_Articles>("pgvector-articles")
.WithReference(embeddingModel)
.WithReference(postgres)
.WaitFor(embeddingModel)
.WaitFor(postgres);
builder.Build().Run();Aspire를 사용하지 않는 경우, 같은 pgvector/pgvector:pg17 이미지를 docker-compose를 통해 실행하고 일반 연결 문자열로 참조할 수 있습니다.
이 섹션은 Milan Jovanović의 원래 기사에 기반합니다. 전체 코드 예제와 구현 세부 사항은 여기에서 찾을 수 있습니다.
이것이 Iron Software 고객에게 중요한 이유
우리의 많은 고객이 IronPDF, IronOCR, 그리고 IronBarcode를 사용하여 대량의 문서를 처리합니다; 청구서, 보고서, 스캔 기록, 배송 라벨.
Iron Software 라이브러리와 PgVector를 결합하여 실용적인 워크플로우를 만들 수 있습니다:
Extract– IronOCR을 사용하여 스캔한 PDF 또는 이미지에서 텍스트를 추출합니다Embed– 추출한 텍스트를 임베딩 모델로 보내 벡터 표현을 생성합니다Store– Pgvector를 사용하여 PostgreSQL에 문서 메타데이터와 함께 임베딩을 저장합니다Search– 의미 기반 쿼리를 통해 정확한 키워드 일치 대신 가장 의미적으로 관련 있는 문서를 반환합니다
결과는 추가 인프라 없이 .NET 및 PostgreSQL 스택 내에서 완전히 구축된 스마트 문서 검색 시스템입니다.
Milan의 가이드에서 다루는 내용
Milan의 기사는 PostgreSQL에서 PgVector 확장을 설정하고, Npgsql로 Entity Framework Core를 구성하고, 임베딩을 생성하고, 성능을 위한 벡터 인덱스를 생성하고, 유사성 쿼리를 실행하는 전체 C# 구현을 안내합니다. 이는 실습 중심으로, 생산 지향적이며, 즉시 모든 .NET 개발자에게 적용 가능합니다.
Iron Software 개발 팀은 정기적으로 .NET 리소스, 튜토리얼 및 엔지니어링 통찰력을 커뮤니티와 공유합니다.
.NET에서 문서 워크플로우를 구축 중입니까? Iron Suite는 필요한 모든 것을 제공합니다.
