개발/AI

[KoBERT] ChromaDB 사용 예제

jykim23 2024. 11. 5. 10:59

KoBERT 임베딩 모델을 활요한 Chromadb 사용 예시

 

import torch
import numpy as np
from transformers import BertTokenizer, BertModel
import chromadb
from chromadb.api.types import Documents, EmbeddingFunction

class KoBERTEmbeddingFunction(EmbeddingFunction[Documents]):
    def __init__(self):
        self.tokenizer = BertTokenizer.from_pretrained('monologg/kobert')
        self.model = BertModel.from_pretrained('monologg/kobert')
        self.model.eval()  # 평가 모드로 설정

    def __call__(self, documents: Documents) -> list:
        embeddings = []
        for document in documents:
            inputs = self.tokenizer(document, return_tensors='pt', truncation=True, padding=True)
            with torch.no_grad():
                outputs = self.model(**inputs)
            # CLS 토큰의 임베딩을 추가하고 NumPy 배열로 변환
            embedding = outputs.last_hidden_state[:, 0, :].numpy()
            embeddings.append(embedding.flatten())  # 1차원으로 변환
        return embeddings

# ChromaDB 클라이언트 초기화
client = chromadb.Client()

# 임베딩 함수 인스턴스 생성
embedding_function_instance = KoBERTEmbeddingFunction()

# 컬렉션 이름 정의
collection_name = "my_kobert_collection"


collection = client.get_or_create_collection(
    name=collection_name,
    embedding_function=embedding_function_instance,
    metadata={"description": "Collection using KoBERT embeddings"}
)

# 예제 문서 추가
documents = ["이것은 첫 번째 문서입니다.", "이것은 두 번째 문서입니다."]
embeddings = embedding_function_instance(documents)  # 임베딩 생성

# 문서와 임베딩을 ChromaDB에 추가
for idx, doc in enumerate(documents):
    collection.add(documents=[doc], ids=[str(idx)], embeddings=[embeddings[idx]])

# 검색 예제
query_text = "막내"  # 쿼리 문서
query_results = collection.query(query_texts=[query_text], n_results=1)  # query_texts로 쿼리
print(query_results)

'개발 > AI' 카테고리의 다른 글

[BM25] 사용 예제  (3) 2024.11.05
[Transformer] Attention, Self-Attention 설명  (0) 2024.03.08
[llama.cpp] quantize: 양자화 예시  (0) 2024.01.04
[Pytorch] GoogLeNet : 구현 연습  (0) 2023.11.29
[Pytorch] VGG11 논문 구현 코드  (0) 2023.11.27