나의 .NET AI 메모리 라이브러리에 pgvector 지원을 추가했습니다
요약
.NET AI 메모리 라이브러리인 BlazorMemory가 pgvector 지원을 포함한 v0.6.0 버전을 출시했습니다. 기존 EF Core 방식의 비효율적인 C# 기반 코사인 유사도 계산 문제를 PostgreSQL의 벡터 검색 기능을 통해 해결하여 대규모 데이터에서도 빠른 성능을 제공합니다.
핵심 포인트
- pgvector 어댑터를 통해 벡터 검색 연산을 PostgreSQL로 이관
- 전체 테이블 스캔 문제를 해결하여 대규모 메모리 검색 성능 최적화
- HNSW 인덱스 자동 생성을 통한 근사 최근접 이웃(ANN) 검색 지원
- 사용자 규모와 데이터 양에 따른 적절한 스토리지 어댑터 선택 가이드 제공
BlazorMemory는 처음부터 EF Core 스토리지를 지원해 왔습니다. 잘 작동합니다. 하지만 검색을 처리하는 방식에 문제가 있습니다.
현재의 EfCoreMemoryStore는 사용자의 모든 메모리를 C#으로 로드한 다음, 루프 내에서 코사인 유사도 (cosine similarity)를 실행합니다. 메모리가 50개인 사용자에게는 괜찮습니다. 하지만 메모리가 5,000개인 사용자에게는 모든 쿼리마다 전체 테이블 스캔 (full table scan)이 발생합니다.
v0.6.0 버전은 이 문제를 제대로 해결하는 새로운 패키지를 출시합니다.
BlazorMemory.Storage.Pgvector
pgvector 어댑터는 벡터 검색 (vector search)을 PostgreSQL로 이동시킵니다. 모든 데이터를 로드하여 C#에서 계산하는 대신, <=> 코사인 거리 (cosine distance) 연산자를 사용하여 단일 SQL 쿼리를 실행합니다.
SELECT * FROM "Memories"
WHERE "UserId" = @userId
ORDER BY "Embedding" <=> @queryVector
...
PostgreSQL이 수학적 계산을 처리합니다. .NET 코드는 단순히 결과를 매핑할 뿐입니다.
설정 (Setup)
dotnet add package BlazorMemory.Storage.Pgvector
pgvector 확장이 설치된 PostgreSQL이 필요합니다. 새로운 데이터베이스를 사용하는 경우:
CREATE EXTENSION IF NOT EXISTS vector;
그 다음 다음과 같이 연결합니다:
builder.Services
.AddBlazorMemory()
.UsePgvectorStorage<AppDbContext>()
...
AppDbContext는 PgvectorMemoryDbContext를 상속받거나 수동으로 구성을 적용해야 합니다:
public class AppDbContext : PgvectorMemoryDbContext
{
public AppDbContext(DbContextOptions<PgvectorMemoryDbContext> options)
...
dimensions 파라미터는 사용 중인 임베딩 모델 (embedding model)과 일치해야 합니다. OpenAI의 text-embedding-3-small은 1536을 사용합니다. 다른 제공업체의 경우 이에 맞춰 조정하십시오.
HNSW 인덱스
이 패키지는 EF 마이그레이션 (migrations)을 통해 임베딩 컬럼에 HNSW 인덱스를 자동으로 생성합니다:
entity.HasIndex(e => e.Embedding)
.HasMethod("hnsw")
.HasOperators("vector_cosine_ops")
...
HNSW는 근사 최근접 이웃 (approximate nearest neighbour) 검색입니다. 이는 대규모 환경에서 훨씬 빠른 쿼리 시간을 위해 약간의 재현율 (recall)을 희생하는 방식입니다. 메모리 검색(memory retrieval)의 경우 이것이 올바른 절충안입니다. 완벽한 재현율이 필요한 것이 아니라, 빠르고 충분히 좋은 성능이 필요하기 때문입니다.
어떤 어댑터를 사용할 것인가
다음과 같은 경우 BlazorMemory.Storage.EfCore를 사용하세요:
- 서버 사이드 (Server-side) Blazor 또는 ASP.NET Core 앱을 구축하는 경우
- 사용자당 메모리 수가 적은 경우 (수백 개 미만)
- SQLite 또는 SQL Server를 사용하여 가능한 가장 간단한 설정을 원하는 경우
다음과 같은 경우에는 BlazorMemory.Storage.Pgvector를 사용하세요:
- 이미 PostgreSQL을 사용 중인 경우
- 사용자당 대규모 메모리 저장소를 예상하는 경우
- 데이터를 메모리에 로드하지 않고 검색 성능을 확장(Scale)하고 싶은 경우
다음과 같은 경우에는 BlazorMemory.Storage.IndexedDb를 사용하세요:
- Blazor WASM을 구축하는 경우
- 백엔드가 없는 (Zero backend) 환경을 원하는 경우
- 모든 데이터가 브라우저에 머물기를 원하는 경우
현재 상태
NuGet에 9개의 패키지가 있으며, 70개의 테스트를 통과했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기