Milvus JavaScript 클라이언트 시작하기
Milvus는 벡터 검색을 위한 강력한 오픈 소스 데이터베이스입니다. 거의 모든 부하에 대해 수평 확장이 가능한 능력 덕분에 머신 러닝 배포에 가장 적합한 선택입니다. 또한 JavaScript 클라이언트를 포함한 동급 최고의 도구도 제공합니다. 이 게시물에서는 Milvus와 JavaScript를 시작하는 방법을 보여드리겠습니다.
Milvus node.js SDK(Client)를 사용하면 JavaScript 환경에 유연하고 강력한 데이터 처리 기능을 바로 구축할 수 있습니다. Node.js를 사용하여 Milvus 서버에 연결하므로 모든 데이터베이스 작업에 완전하게 접근할 수 있습니다. 클라이언트를 사용해 컬렉션을 생성하고, 데이터를 삽입하고, 인덱스를 생성하고, 쿼리와 검색을 수행하는 등 다양한 작업을 할 수 있습니다.
먼저 로컬 서버 인스턴스를 포함하여 코드를 실행하는 데 필요한 환경을 설정하겠습니다. 준비가 완료되면 Milvus 데이터베이스에 연결하는 단계로 넘어갑니다. 이 기본 단계는 Milvus가 제공하는 방대한 리소스에 연결되도록 보장합니다.
그런 다음 Milvus에서 컬렉션을 생성합니다. 컬렉션 설정이 완료되면 마지막으로 데이터 작업의 핵심인 데이터 삽입 및 쿼리로 들어가겠습니다.
시작해 보겠습니다.
사전 요구 사항
시작하기 전에 개발 시스템에 몇 가지가 설치되어 있어야 합니다.
이 튜토리얼에서는 Milvus Lite를 사용할 것이므로 Python 3.8 이상이 필요합니다. 또한 패키지를 설치하기 위해 Node.js 버전 12 이상, npm 버전 12 이상 또는 yarn이 필요합니다.
모든 것을 준비한 후 Milvus Lite와 JavaScript Client를 설치하고 실행해 보겠습니다.
Milvus Lite 설치 및 실행
Milvus Lite와 같은 Python 애플리케이션을 실행할 때의 모범 사례는 가상 환경을 사용하는 것입니다. 환경을 생성하고, 활성화한 다음 pip를 업그레이드합니다.
[egoebelbecker@ares examples]$ python3 -m venv ./venv
[egoebelbecker@ares examples]$ source venv/bin/activate
(venv) [egoebelbecker@ares examples]$ pip install --upgrade pip
Requirement already satisfied: pip in ./venv/lib64/python3.11/site-packages (22.3.1)
Collecting pip
Using cached pip-23.2-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 22.3.1
Uninstalling pip-22.3.1:
Successfully uninstalled pip-22.3.1
Successfully installed pip-23.2
다음으로 PyPi에서 milvus 라이브러리를 설치합니다.
(venv) [egoebelbecker@ares examples]$ pip install milvus
Collecting milvus
Obtaining dependency information for milvus from https://files.pythonhosted.org/packages/c1/a6/599ba1f8615e6ec73208ab614f5daf7ab27097070fbbd1715a1b5cc5e578/milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadata
Downloading milvus-2.2.11-py3-none-manylinux2014_x86_64.whl.metadata (6.7 kB)
Using cached milvus-2.2.11-py3-none-manylinux2014_x86_64.whl (51.7 MB)
Installing collected packages: milvus
Successfully installed milvus-2.2.11
(venv) [egoebelbecker@ares examples]$
마지막으로 서버를 실행합니다.
(venv) [egoebelbecker@ares examples]$ milvus-server
__ _________ _ ____ ______
/ |/ / _/ /| | / / / / / __/
/ /|_/ // // /_| |/ / /_/ /\ \
/_/ /_/___/____/___/\____/___/ {Lite}
Welcome to use Milvus!
Version: v2.2.11-lite
Process: 505236
Started: 2023-07-20 14:18:37
Config: /home/egoebelbecker/.milvus.io/milvus-server/2.2.11/configs/milvus.yaml
Logs: /home/egoebelbecker/.milvus.io/milvus-server/2.2.11/logs
Ctrl+C to exit ...
Milvus node.js SDK(Client) 설치
먼저 작업 디렉터리에서 npm을 초기화합니다.
[egoebelbecker@ares examples]$ npm init
[egoebelbecker@ares examples]$ npm install @zilliz/milvus2-sdk-node
이제 코드를 작성할 준비가 되었습니다!
Milvus와 JavaScript 시작하기
Milvus와 JavaScript를 설치했으면, 이제 Milvus와 JavaScript를 실행할 준비가 되었습니다.
Milvus에 연결하기
MilvusClient 클래스를 통해 Milvus에 연결하고 통신할 수 있습니다.
Milvus는 사용자 이름, 비밀번호, 서버 주소 등 여러 연결 옵션을 제공합니다. Milvus Lite를 사용하고 있으므로, 연결할 위치만 알려주면 됩니다.
MilvusClient를 생성하고 connectStatus 필드를 확인하여 연결되었는지 확인하세요:
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log("Connection status: " + milvusClient.connectStatus)
출력은 다음과 같습니다:
Connection status: 1
데이터베이스 생성하기
서버가 비어 있으므로, 데이터베이스를 생성하는 것부터 시작해 보겠습니다.
대부분의 Milvus Javascript API 호출에는 네트워크 요청이 포함되므로 promise를 반환합니다. 또한 코드에 나열한 순서대로 실행된다는 보장이 없으므로, 함수가 예상한 순서대로 실행되도록 타이밍과 promise chaining, code blocks, await 같은 도구 사용에 유의해야 합니다.
코드를 더 읽기 쉽게 만들기 위해 개별 코드 블록을 사용하고 promise가 완료되면 출력하겠습니다. 또한 코드가 올바른 순서로 실행되도록 보장하는 "brute force" 방식으로 필요할 때 await도 사용하겠습니다.
프로덕션 코드라면 아마 다른 접근 방식을 사용할 것입니다.
이 코드는 await를 사용해 완료될 때까지 코드가 진행되지 않도록 하면서 createDatabase로 데이터베이스를 생성합니다. 그런 다음 listDatabases를 호출하여 새 데이터베이스가 생성되었는지 확인합니다.
CreateDatabase에는 데이터베이스 이름만 필요합니다.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log("Connection status: " + milvusClient.connectStatus)
const createDb = await milvusClient.createDatabase({ db_name: 'my_db' });
console.log('Database is created', createDb);
const listDatabases = await milvusClient.listDatabases();
console.log('list databases', listDatabases);
})();
결과는 다음과 같습니다:
Connection status: 1
Database is created { error_code: 'Success', reason: '' }
list databases {
db_names: [ 'my_db', 'default' ],
status: { error_code: 'Success', reason: '' }
}
컬렉션 생성하기
다음으로, 데이터를 추가할 수 있도록 컬렉션을 생성할 차례입니다.
컬렉션을 생성하거나 사용하기 전에, 해당 컬렉션이 들어 있는 데이터베이스를 use해야 합니다. 따라서 연결한 후 이 스크립트는 uses my_db를 수행합니다.
그런 다음 createCollection으로 새 컬렉션을 생성하고 describeCollection으로 확인합니다. 새 컬렉션에는 데이터 타입이 포함된 스키마가 필요하므로, 스크립트에 DataType을 가져와야 합니다.
import { MilvusClient, DataType } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log('Connection status: ' + milvusClient.connectStatus);
await milvusClient.use({ db_name: 'my_db' });
const create = await milvusClient.createCollection({
collection_name: 'sample_collection',
fields: [
{
name: 'age',
description: 'ID field',
data_type: DataType.Int64,
is_primary_key: true,
autoID: true,
},
{
name: 'vector',
description: 'Vector field',
data_type: DataType.FloatVector,
dim: 8,
},
{ name: 'height', description: 'int64 field', data_type: DataType.Int64 },
{
name: 'name',
description: 'VarChar field',
data_type: DataType.VarChar,
max_length: 128,
},
],
});
console.log('Create collection is finished.', create);
await milvusClient.describeCollection({ collection_name: 'sample_collection'});
console.log('describe collection', describeCollection);
})();
스크립트는 새 컬렉션에 대한 정보와 함께 성공합니다:
Connection status: 1
new Database is using { error_code: 'Success', reason: '' }
Create collection is finished. { error_code: 'Success', reason: '' }
describe collection {
virtual_channel_names: [ 'by-dev-rootcoord-dml_1_443014985196255045v0' ],
physical_channel_names: [ 'by-dev-rootcoord-dml_1' ],
aliases: [],
start_positions: [],
properties: [],
status: { error_code: 'Success', reason: '' },
schema: {
fields: [ [Object], [Object], [Object], [Object] ],
name: 'sample_collection',
description: '',
autoID: false,
enable_dynamic_field: false
},
collectionID: '443014985196255045',
created_timestamp: '443015720996700166',
created_utc_timestamp: '1689970859515',
shards_num: 1,
consistency_level: 'Bounded',
collection_name: 'sample_collection',
db_name: 'my_db',
num_partitions: '1'
}
데이터 추가 및 검색
이제 컬렉션에 데이터를 추가할 차례입니다.
먼저 데이터가 필요합니다. 일반적으로 코드는 어딘가에서 데이터를 읽거나 조합하지만, 여기서는 하드코딩된 값을 사용합니다.
값 배열을 선언한 후, 이 스크립트는 InsertReq를 사용해 이름으로 새 컬렉션에 insert합니다:
import { MilvusClient, InsertReq } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
console.log('Connection status: ' + milvusClient.connectStatus);
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const vectorsData = [
{
vector: [
0.11878310581111173, 0.9694947902934701, 0.16443679307243175,
0.5484226189097237, 0.9839246709011924, 0.5178387104937776,
0.8716926129208069, 0.5616972243831446,
],
height: 20405,
name: 'zlnmh',
},
{
vector: [
0.9992090731236536, 0.8248790611809487, 0.8660083940881405,
0.09946359318481224, 0.6790698063908669, 0.5013786801063624,
0.795311915725105, 0.9183033261617566,
],
height: 93773,
name: '5lr9y',
},
{
vector: [
0.8761291569818763, 0.07127366044153227, 0.775648976160332,
0.5619757601304878, 0.6076543120476996, 0.8373907516027586,
0.8556140171597648, 0.4043893119391049,
],
height: 85122,
name: 'nes0j',
},
{
vector: [
0.5849602436079879, 0.5108258101682586, 0.8250884731578105,
0.7996354835509332, 0.8207766774911736, 0.38133662902290566,
0.7576720055508186, 0.4393152967662368,
],
height: 92037,
name: 'ct2li',
},
{
vector: [
0.3768133716738886, 0.3823259261020866, 0.7906232829855262,
0.31693696726284193, 0.3731715403499176, 0.3300751870649885,
0.22353556137796238, 0.38062799545615444,
],
height: 31400,
name: '6ghrg',
},
{
vector: [
0.0007531778212483964, 0.12941566118774994, 0.9340164428788116,
0.3795768837758642, 0.4532443258064389, 0.596455163143,
0.9529469158782906, 0.7692465408044873,
],
height: 1778,
name: 'sb7mt',
},
];
const params: InsertReq = {
collection_name: 'sample_collection',
fields_data: vectorsData,
};
// insert data into collection
const insert = await milvusClient.insert(params);
console.log('Inserted data:', insert);
})();
API는 삽입한 항목에 대한 정보를 반환합니다:
Connection status: 1
new Database is using { error_code: 'Success', reason: '' }
Inserted data: {
succ_index: [ 0, 1, 2, 3, 4, 5 ],
err_index: [],
status: { error_code: 'Success', reason: '' },
IDs: { int_id: { data: [Array] }, id_field: 'int_id' },
acknowledged: false,
insert_cnt: '6',
delete_cnt: '0',
upsert_cnt: '0',
timestamp: '443015922585698312'
}
이제 쿼리할 데이터가 있습니다. 하지만 프로덕션에서 쿼리를 실행하기 전에 컬렉션에 인덱스를 추가하는 것이 좋습니다. 이렇게 하면 vector 필드에 인덱스가 추가됩니다:
const createIndex = await milvusClient.createIndex({
collection_name: 'sample_collection',
field_name: 'vector',
metric_type: 'L2',
});
이 코드를 실행하려면 스크립트가 여전히 연결하고 관련 데이터베이스를 사용해야 합니다.
마지막으로, Milvus에서 지원하는 모든 표현식이나 쿼리로 작성된 쿼리를 실행할 수 있습니다. 이 예에서는 단순히 나이를 기준으로 항목을 필터링합니다.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const load = await milvusClient.loadCollectionSync({ collection_name: 'sample_collection' });
const query = await milvusClient.query({
collection_name: 'sample_collection',
filter: 'age > 0',
output_fields: ['age', 'vector'],
limit: 100,
});
console.log('query result', query);
})();
결과는 다음과 같습니다:
new Database is using { error_code: 'Success', reason: '' }
Query time: 235.806ms
query result {
status: { error_code: 'Success', reason: '' },
data: [
{ vector: [Array], age: '443014985196258910' },
{ vector: [Array], age: '443014985196258911' },
{ vector: [Array], age: '443014985196258912' },
{ vector: [Array], age: '443014985196258913' },
{ vector: [Array], age: '443014985196258914' },
{ vector: [Array], age: '443014985196258915' }
]
}
벡터 검색
컬렉션이 메모리에 로드되면 해당 컬렉션에서 벡터 유사도 검색을 수행할 수 있습니다.
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
(async () => {
const milvusClient = new MilvusClient({
address: 'localhost:19530',
});
const useDb = await milvusClient.use({ db_name: 'my_db' });
console.log('new Database is using', useDb);
const load = await milvusClient.loadCollectionSync({ collection_name: 'sample_collection' });
const query = await milvusClient.search({
collection_name: 'sample_collection',
vector: [1,2,3,4,5,6,7,8],
filter: 'age > 0',
output_fields: ['id', 'age'],
limit: 5,
});
console.log('query result', query);
})();
결과는 다음과 같습니다:
Search result {
status: { error_code: 'Success', reason: '' },
results: [
{ score: 0, id: '442936641561652921', age: '442936641561652921' },
{
score: 1.0004949569702148,
id: '442936641561652924',
age: '442936641561652924'
},
{
score: 1.6779069900512695,
id: '442936641561652926',
age: '442936641561652926'
},
{
score: 1.7160398960113525,
id: '442936641561652922',
age: '442936641561652922'
},
{
score: 1.718210220336914,
id: '442936641561652925',
age: '442936641561652925'
}
]
}
요약
Milvus와 Milvus JavaScript를 사용하기 위한 개발 환경을 설정했습니다. 서버에 연결하고, 데이터베이스와 컬렉션을 생성하고, 데이터를 삽입하고 검색했으며, 유사도 벡터 검색을 수행했습니다. 보시다시피, Milvus로 JavaScript에서 벡터 데이터를 다루는 것은 이보다 더 간단할 수 없습니다!
오늘 바로 웹 앱에 벡터 검색의 강력함을 더해 보세요! 그와 함께 Zilliz Cloud 무료 체험도 살펴보고, 클라우드 준비가 되어 있고 안정적이며 고성능인 Milvus 클러스터를 몇 분 만에 실행할 수 있는 방법을 확인해 보세요.
저자 소개
이 글은 Eric Goebelbecker가 작성했습니다. Eric은 뉴욕시 금융 시장에서 25년간 근무하며 시장 데이터 및 금융 정보 교환(FIX) 프로토콜 네트워크를 위한 인프라를 개발해 왔습니다. 그는 팀을 효과적으로 만드는 요인(또는 그다지 효과적이지 않게 만드는 요인)에 대해 이야기하는 것을 좋아합니다.
계속 읽기

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Milvus 2.6.x Now Generally Available on Zilliz Cloud, Making Vector Search Faster, Smarter, and More Cost-Efficient for Production AI
Milvus 2.6.x is now GA on Zilliz Cloud, delivering faster vector search, smarter hybrid queries, and lower costs for production RAG and AI applications.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.



