Prem AI 연동

Prem AI 연동 (premai)

PremAI는 AI 모델의 fine-tuning, 배포, 모니터링을 위한 통합 generative AI 개발 플랫폼이에요. Qdrant는 PremAI API와 호환됩니다.

출처: Qdrant 공식 문서 — premai

SDK 설치 (Installing the SDKs)

pip install premai qdrant-client

npm 패키지를 설치하려면:

npm install @premai/prem-sdk @qdrant/js-client-rest

필요한 패키지 전부 import하기

from premai import Prem

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
import Prem from '@premai/prem-sdk';
import { QdrantClient } from '@qdrant/js-client-rest';

모든 상수(Constants) 정의하기

프로젝트 ID와 사용할 임베딩 모델을 정의해야 해요. 이 값들을 얻는 방법은 PremAI 문서에서 자세히 배울 수 있어요.

PROJECT_ID = 123
EMBEDDING_MODEL = "text-embedding-3-large"
COLLECTION_NAME = "prem-collection-py"
QDRANT_SERVER_URL = "http://localhost:6333"
DOCUMENTS = [
    "This is a sample python document",
    "We will be using qdrant and premai python sdk"
]
const PROJECT_ID = 123;
const EMBEDDING_MODEL = "text-embedding-3-large";
const COLLECTION_NAME = "prem-collection-js";
const SERVER_URL = "http://localhost:6333"
const DOCUMENTS = [
    "This is a sample javascript document",
    "We will be using qdrant and premai javascript sdk"
];

PremAI와 Qdrant 클라이언트 설정하기

prem_client = Prem(api_key="xxxx-xxx-xxx")
qdrant_client = QdrantClient(url=QDRANT_SERVER_URL)
const premaiClient = new Prem({
    apiKey: "xxxx-xxx-xxx"
})
const qdrantClient = new QdrantClient({ url: SERVER_URL });

임베딩 생성 (Generating Embeddings)

from typing import Union, List

def get_embeddings(
    project_id: int,
    embedding_model: str,
    documents: Union[str, List[str]]
) -> List[List[float]]:
    """
    Helper function to get the embeddings from premai sdk
    Args
        project_id (int): The project id from prem saas platform.
        embedding_model (str): The embedding model alias to choose
        documents (Union[str, List[str]]): Single texts or list of texts to embed
    Returns:
        List[List[int]]: A list of list of integers that represents different
            embeddings
    """
    embeddings = []
    documents = [documents] if isinstance(documents, str) else documents
    for embedding in prem_client.embeddings.create(
        project_id=project_id,
        model=embedding_model,
        input=documents
    ).data:
        embeddings.append(embedding.embedding)

    return embeddings
async function getEmbeddings(projectID, embeddingModel, documents) {
    const response = await premaiClient.embeddings.create({
        project_id: projectID,
        model: embeddingModel,
        input: documents
    });
    return response;
}

임베딩을 Qdrant Points로 변환하기

from qdrant_client.models import PointStruct

embeddings = get_embeddings(
    project_id=PROJECT_ID,
    embedding_model=EMBEDDING_MODEL,
    documents=DOCUMENTS
)

points = [
    PointStruct(
        id=idx,
        vector=embedding,
        payload={"text": text},
    ) for idx, (embedding, text) in enumerate(zip(embeddings, DOCUMENTS))
]
function convertToQdrantPoints(embeddings, texts) {
    return embeddings.data.map((data, i) => {
        return {
            id: i,
            vector: data.embedding,
            payload: {
                text: texts[i]
            }
        };
    });
}

const embeddings = await getEmbeddings(PROJECT_ID, EMBEDDING_MODEL, DOCUMENTS);
const points = convertToQdrantPoints(embeddings, DOCUMENTS);

Qdrant 컬렉션 설정하기

qdrant_client.create_collection(
    collection_name=COLLECTION_NAME,
    vectors_config=VectorParams(size=3072, distance=Distance.DOT)
)
await qdrantClient.createCollection(COLLECTION_NAME, {
    vectors: {
        size: 3072,
        distance: 'Cosine'
    }
})

컬렉션에 문서 삽입하기

doc_ids = list(range(len(embeddings)))

qdrant_client.upsert(
    collection_name=COLLECTION_NAME,
    points=points
)
await qdrantClient.upsert(COLLECTION_NAME, {
        wait: true,
        points
    });
query = "what is the extension of python document"

query_embedding = get_embeddings(
    project_id=PROJECT_ID,
    embedding_model=EMBEDDING_MODEL,
    documents=query
)

qdrant_client.query_points(collection_name=COLLECTION_NAME, query=query_embedding[0])
const query = "what is the extension of javascript document"
const query_embedding_response = await getEmbeddings(PROJECT_ID, EMBEDDING_MODEL, query)

await qdrantClient.query(COLLECTION_NAME, {
    query: query_embedding_response.data[0].embedding
});

확인 필요: Python 예제에서는 distance=Distance.DOT를, TypeScript 예제에서는 distance: 'Cosine'를 사용하고 있어요. 소스 문서가 두 언어에서 서로 다른 거리 함수를 보여주는데, 실제 프로덕션에서는 임베딩 모델에 맞는 거리 함수를 통일해서 사용하는 것이 좋아요.

더 알아보기 (Learn more)