Azure Cosmos DB for MongoDB(vCore)의 통합 벡터 데이터베이스를 사용하여 AI 기반 애플리케이션을 Azure Cosmos DB에 저장된 데이터와 원활하게 연결합니다. 이 통합에는 Azure OpenAI 포함을 사용하여 빌드한 앱이 포함될 수 있습니다. 기본적으로 통합된 벡터 데이터베이스를 사용하면 벡터 데이터가 만들어지는 원본 데이터와 함께 Azure Cosmos DB for MongoDB(vCore)에 직접 저장된 고차원 벡터 데이터를 효율적으로 저장, 인덱싱 및 쿼리할 수 있습니다. 데이터를 대체 벡터 저장소로 전송할 필요가 없으며 추가 비용이 발생합니다.
벡터 저장소란?
벡터 저장소 또는 벡터 데이터베이스는 고차원 공간에서 데이터의 수학 표현인 벡터 포함을 저장하고 관리하도록 설계된 데이터베이스입니다. 이 공간에서 각 차원은 데이터의 기능에 해당하며, 정교한 데이터를 나타내기 위해 수만 개의 차원이 사용될 수 있습니다. 이 공간에서 벡터의 위치는 해당 특성을 나타냅니다. 단어, 구 또는 전체 문서, 이미지, 오디오 및 기타 유형의 데이터를 모두 벡터화할 수 있습니다.
벡터 저장소는 어떻게 작동하나요?
벡터 저장소에서는 벡터 검색 알고리즘을 사용하여 포함을 인덱싱하고 쿼리합니다. 잘 알려진 일부 벡터 검색 알고리즘에는 HNSW(계층적 탐색 가능 Small World), IVF(반전된 파일) 및 DiskANN이 포함됩니다. 벡터 검색은 속성 필드의 정확한 일치가 아닌 데이터 특성을 기반으로 유사한 항목을 찾는 데 도움이 되는 방법입니다. 이 기술은 유사한 텍스트 검색, 관련 이미지 찾기, 권장 사항 제공 또는 변칙 징후 검색과 같은 애플리케이션에 유용합니다. 기계 학습 모델을 사용하여 만든 데이터의 벡터 임베딩(숫자 목록)을 Embeddings API를 사용하여 쿼리하는 데 사용됩니다. 포함 API의 예로는 Azure OpenAI 포함 또는 Azure의 Hugging Face가 있습니다. 벡터 검색은 데이터 벡터와 쿼리 벡터 사이의 거리를 측정합니다. 쿼리 벡터에 가장 가까운 데이터 벡터는 의미상 가장 유사한 것으로 확인된 벡터입니다.
Azure Cosmos DB for MongoDB(vCore)의 통합 벡터 데이터베이스에서 포함은 원래 데이터와 함께 저장, 인덱싱 및 쿼리할 수 있습니다. 이 방식은 별도의 순수 벡터 데이터베이스에 데이터를 복제하는 데 드는 추가 비용을 제거합니다. 또한 이 아키텍처는 벡터 포함과 원본 데이터를 함께 유지하므로 다중 모드 데이터 작업을 더 쉽게 수행하고 데이터 일관성, 규모 및 성능을 향상시킬 수 있습니다.
벡터 유사성 검색 수행
Azure Cosmos DB for MongoDB(vCore)는 강력한 벡터 검색 기능을 제공하여 복잡한 데이터 세트에서 고속 유사성 검색을 수행할 수 있습니다. Azure Cosmos DB for MongoDB에서 벡터 검색을 수행하려면 먼저 벡터 인덱스를 만들어야 합니다. Azure Cosmos DB for MongoDB(vCore)는 여러 옵션을 제공하지만 데이터 세트의 크기에 따라 시작하는 데 도움이 되는 몇 가지 일반적인 지침은 다음과 같습니다.
| IVF | HNSW | DiskANN(권장) | |
|---|---|---|---|
| 설명 | IVFFlat 인덱스는 벡터를 목록으로 나눈 다음 쿼리 벡터에 가장 가까운 하위 집합을 검색합니다. | HNSW 인덱스는 다중 계층 그래프를 만듭니다. | DiskANN은 임의 규모에서 효율적인 벡터 검색을 위해 설계된 근사한 인접 검색 알고리즘입니다. |
| 주요 트레이드오프 |
프로: 빌드 시간이 빨라지고 메모리 사용량이 줄어듭니다. 단점: 쿼리 성능이 낮아집니다(속도-회수 간의 절충 측면에서). |
장점: 빈 테이블에 속도와 재호출을 고려한 더 나은 쿼리 성능을 구축할 수 있습니다. 죄수: 빌드 시간이 느리고 메모리 사용량이 높습니다. |
프로: 모든 규모에서 효율적, 높은 회수, 높은 처리량, 짧은 대기 시간. |
| 벡터 수 | 10,000 미만 | 최대 50,000개 | 최대 500,000+ |
| 권장 클러스터 계층 | M10 또는 M20 | M30 이상 | M30 이상 |
DiskANN 인덱스는 M30 이상 계층에서 사용할 수 있습니다. DiskANN 인덱을 만들려면 매개 변수를 "kind" 다음 템플릿으로 "vector-diskann" 설정합니다.
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": <integer_value>,
"similarity": <string_value>,
"maxDegree" : <integer_value>,
"lBuild" : <integer_value>,
}
}
]
}
| 필드 | Type | 설명 |
|---|---|---|
index_name |
문자열 | 인덱스의 고유 이름입니다. |
path_to_property |
문자열 | 벡터가 포함된 속성의 경로입니다. 이 경로는 최상위 속성이거나 속성에 대한 점 표기법 경로일 수 있습니다. 벡터 검색 결과에 인덱싱되고 사용되려면 벡터가 number[]여야 합니다.
double[]과 같은 다른 유형을 사용하면 문서가 인덱싱되지 않습니다. 인덱스되지 않은 문서는 벡터 검색 결과로 반환되지 않습니다. |
kind |
문자열 | 만들 벡터 인덱스의 형식입니다. 옵션은 vector-ivf, vector-hnsw 및 vector-diskann입니다. |
dimensions |
integer | 벡터 유사성의 차원 수입니다. DiskANN은 최대 16,000개의 차원( 제품 양자화 포함)을 지원하며 향후 지원은 40,000개 이상에 대해 계획됩니다. |
similarity |
문자열 | 인덱스와 함께 사용할 유사성 메트릭입니다. 가능한 옵션은 COS(코사인 거리), L2(유클리드 거리) 및 IP(내적)입니다. |
maxDegree |
integer | 그래프의 노드당 최대 에지 수입니다. 이 매개 변수의 범위는 20~2048입니다(기본값은 32). 더 높은 maxDegree는 높은 차원 및/또는 높은 정확도 요구 사항이 있는 데이터 세트에 적합합니다. |
lBuild |
integer | DiskANN 인덱스 생성 중에 평가되는 후보 인접 항목의 수를 설정합니다. 10~500(기본값은 50) 범위의 이 매개 변수는 정확도와 계산 오버헤드의 균형을 맞춥니다. 값이 높을수록 인덱스 품질과 정확도가 개선되지만 빌드 시간은 늘어납니다. |
DiskANN으로 벡터 검색 수행
벡터 검색을 수행하려면 $search 집계 파이프라인 단계를 사용하고 cosmosSearch 연산자로 쿼리합니다. DiskANN은 공간 또는 텍스트 기반 필터와 같은 선택적 필터링을 통해 방대한 데이터 세트에서 고성능 검색을 가능하게 합니다.
{
"$search": {
"cosmosSearch": {
"path": "<path_to_property>",
"query": "<query_vector>",
"k": <num_results_to_return>,
"filter": {"$and": [
{ "<attribute_1>": { "$eq": <value> } },
{"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
]}
}
}
},
| 필드 | Type | 설명 |
|---|---|---|
lSearch |
integer | 검색을 위한 동적 후보 목록의 크기를 지정합니다. 기본값은 40이며 구성 가능한 범위는 10에서 1000까지입니다. 값을 늘리면 회수가 향상되지만 검색 속도가 저하될 수 있습니다. |
k |
integer | 반환할 검색 결과의 수를 정의합니다.
k 값은 lSearch보다 작거나 같아야 합니다. |
필터링과 함께 DiskANN 인덱스 사용 예제
데이터베이스에 벡터 추가
지리 공간적 필터와 함께 벡터 검색을 사용하려면 벡터 포함과 위치 좌표를 모두 포함하는 문서를 추가합니다. 고유한 모델, Azure OpenAI 임베딩 또는 Azure의 Hugging Face와 같은 API를 사용하여 임베딩을 생성할 수 있습니다.
from pymongo import MongoClient
client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]
documents = [
{"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "___location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
{"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "___location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
{"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "___location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
{"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "___location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]
collection.insert_many(documents)
DiskANN 벡터 인덱스 만들기
다음 예에서는 필터링 기능을 사용하여 DiskANN 벡터 인덱스를 설정하는 방법을 보여 줍니다. 여기에는 유사성 검색을 위한 벡터 인덱스 만들기, 벡터 및 지리 공간적 속성이 있는 문서 추가, 더 많은 필터링을 위한 인덱싱 필드가 포함됩니다.
db.command({
"createIndexes": "testCollection",
"indexes": [
{
"name": "DiskANNVectorIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"dimensions": 3,
"similarity": "COS",
"maxDegree": 32,
"lBuild": 64
}
},
{
"name": "is_open",
"key": {
"is_open": 1
}
},
{
"name": "locationIndex",
"key": {
"___location": 1
}
}
]
})
이 명령은 contentVector의 exampleCollection 필드에 DiskANN 벡터 인덱스를 만들어 유사성 검색을 사용하도록 설정합니다. 또한 다음 내용이 추가되었습니다.
-
is_open필드에 대한 인덱스를 사용하면 사업체가 영업 중인지 여부에 따라 결과를 필터링할 수 있습니다. -
___location필드에 대한 지리 공간적 인덱스를 사용하여 지리적 근접성을 기준으로 필터링합니다.
벡터 검색 수행
특정 지리적 반경 내에서 유사한 벡터를 가진 문서를 찾으려면 유사성 검색에 queryVector를 지정하고 지리 공간적 필터를 포함합니다.
query_vector = [0.52, 0.28, 0.12]
pipeline = [
{
"$search": {
"cosmosSearch": {
"path": "contentVector",
"vector": query_vector,
"k": 5,
"filter": {
"$and": [
{"is_open": {"$eq": 1}},
{"___location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
]
}
}
}
}
]
results = list(collection.aggregate(pipeline))
for result in results:
print(result)
이 예에서 벡터 유사성 검색은 지정된 k 유사성 메트릭을 기반으로 상위 COS개의 가장 가까운 벡터를 반환하는 동시에 100마일 반경 내에 있는 영업 중인 사업체만 포함하도록 결과를 필터링합니다.
[
{
similarityScore: 0.9745354109084544,
document: {
_id: ObjectId("645acb54413be5502badff94"),
name: 'Eugenia Lopez',
bio: 'CEO of AdventureWorks',
is_open: 1,
___location: [-118.9865, 34.0145],
contentVector: [0.52, 0.20, 0.23]
}
},
{
similarityScore: 0.9006955671333992,
document: {
_id: ObjectId("645acb54413be5502badff97"),
name: 'Rory Nguyen',
bio: 'President of Our Planet initiative',
is_open: 1,
___location: [-119.7302, 34.4005],
contentVector: [0.91, 0.76, 0.83]
}
}
]
이 결과는 queryVector와 가장 유사한 문서를 100마일 반경으로 제한하고 영업 중인 업체를 보여 줍니다. 각 결과에는 유사성 점수와 메타데이터가 포함되어 있으며, Cosmos DB for MongoDB의 DiskANN이 풍부하고 위치에 중요한 쿼리 환경을 위해 결합된 벡터 및 지리 공간적 쿼리를 어떻게 지원하는지 보여 줍니다.
벡터 인덱스 정의 가져오기
컬렉션에서 벡터 인덱스 정의를 검색하려면 listIndexes 명령을 사용합니다.
db.exampleCollection.getIndexes();
이 예에서는 인덱스를 만드는 데 사용된 모든 vectorIndex 매개 변수와 함께 cosmosSearch가 반환됩니다.
[
{ v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
{
v: 2,
key: { vectorContent: 'cosmosSearch' },
name: 'vectorSearchIndex',
cosmosSearch: {
kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
numLists: 3,
similarity: 'COS',
dimensions: 3
},
ns: 'test.exampleCollection'
}
]
필터링된 벡터 검색
이제 $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin 및 $regex 같은 지원되는 쿼리 필터를 사용하여 벡터 검색을 실행할 수 있습니다.
미리 필터링을 활용하려면 먼저 벡터 인덱스 외에도 필터링하려는 속성에 표준 인덱스도 정의해야 합니다. 필터 인덱스 만들기의 예는 다음과 같습니다.
db.runCommand({
"createIndexes": "<collection_name>",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
필터 인덱스가 적용되면 절을 "filter" 벡터 검색 쿼리에 직접 통합할 수 있습니다. 이 예제에서는 제공된 목록에 속성 값이 "title"없는 결과를 필터링하는 방법을 보여줍니다.
db.exampleCollection.aggregate([
{
'$search': {
"cosmosSearch": {
"vector": "<query_vector>",
"path": <path_to_vector>,
"k": num_results,
"filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
},
"returnStoredSource": True }},
{'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);
중요합니다
미리 필터링된 벡터 검색의 성능과 정확도를 최적화하려면 벡터 인덱스 매개 변수를 조정하는 것이 좋습니다.
DiskANN 인덱스의 경우 증가 maxDegree 하거나 lBuild 더 나은 결과를 얻을 수 있습니다.
HNSW 인덱스의 경우, m, efConstruction, efSearch의 값을 높여 실험하면 성능을 향상시킬 수 있습니다. 마찬가지로, IVF 인덱스의 경우 튜닝 numLists 또는 nProbes 더 만족스러운 결과로 이어질 수 있습니다. 결과가 요구 사항을 충족하는지 확인하기 위해 데이터로 특정 구성을 테스트하는 것이 중요합니다. 이러한 매개 변수는 인덱스 구조 및 검색 동작에 영향을 줍니다. 최적 값은 데이터 특성 및 쿼리 패턴에 따라 달라질 수 있습니다.
LLM 오케스트레이션 도구 사용
의미 체계 커널과 함께 벡터 데이터베이스로 사용
의미 체계 커널을 사용하여 Azure Cosmos DB for MongoDB vCore 및 LLM에서 정보 검색을 오케스트레이션합니다. 자세한 내용은 GitHub 리포지토리를 참조하세요.
LangChain과 함께 벡터 데이터베이스로 사용
LangChain을 사용하여 Azure Cosmos DB for MongoDB vCore 및 LLM에서 정보 검색을 오케스트레이션합니다. 자세한 내용은 Azure Cosmos DB Mongo vCore를 참조하세요.
LangChain에서 의미 체계 캐시로 사용
LangChain과 Azure Cosmos DB for MongoDB(vCore)를 사용하여 이전에 기록된 LLM 응답을 활용하여 의미 체계 캐싱을 오케스트레이션하면 LLM API 비용을 절감하고 응답 대기 시간을 줄일 수 있습니다. 자세한 내용은 Azure Cosmos DB Mongo vCore를 참조하세요.
기능 및 제한 사항
- 지원되는 거리 측정법: L2(유클리드), 내적 및 코사인.
- 지원되는 인덱싱 방법: IVFFLAT, HNSW 및 DiskANN.
- DiskANN 및 제품 정량화를 사용하면 벡터를 최대 16,000차원까지 인덱싱할 수 있습니다.
- HNSW 또는 IVF를 반정밀도 로 사용하면 최대 4,000개의 벡터를 인덱싱할 수 있습니다.
- 압축이 없으면 인덱싱의 기본 최대 벡터 차원은 2,000입니다.
- 인덱싱은 경로당 하나의 벡터에만 적용됩니다.
- 벡터 패스당 하나의 인덱스만 만들 수 있습니다.
요약
이 가이드에서는 벡터 인덱스를 만들고, 벡터 데이터가 있는 문서를 추가하고, 유사성 검색을 수행하고, 인덱스 정의를 검색하는 방법을 보여 줍니다. 통합 벡터 데이터베이스를 사용하면 Azure Cosmos DB for MongoDB vCore에서 직접 고차원 벡터 데이터를 효율적으로 저장, 인덱싱 및 쿼리할 수 있습니다. 또한 벡터 포함을 통해 데이터의 잠재력을 최대한 활용할 수 있으며 더욱 정확하고 효율적이며 강력한 애플리케이션을 빌드할 수 있습니다.
관련 콘텐츠
- .NET RAG 패턴 소매 참조 솔루션
- C# RAG 패턴 - OpenAI Service를 Cosmos와 통합
- Python RAG 패턴 - Azure 제품 챗봇
- Python Notebook 자습서 - LangChain을 통한 벡터 데이터베이스 통합
- Python Notebook 자습서 - LangChain을 통한 LLM 캐싱 통합
- Python - LlamaIndex 통합
- Python - 의미 체계 커널 메모리 통합