Hnswlib
Hnswlib
이번엔 빠른 근사 최근접 이웃(ANN) 검색 인덱스인 Hnswlib을 LlamaIndex 벡터 저장소로 사용하는 방법을 배워볼게요. Hnswlib은 의존성이 거의 없는 경량 C++ HNSW 구현이라서 로컬에서 가볍게 돌리기 좋으며, 파이썬 바인딩도 제공한답니다. 파라미터만 잘 넣어 주면 바로 인덱스를 만들 수 있어요.
출처: 문서
본문
Hnswlib은 빠른 근사 최근접 이웃(approximate nearest neighbor) 검색 인덱스입니다. C++11 외에는 의존성이 없는 경량 헤더 전용 C++ HNSW 구현이며, 파이썬 바인딩을 제공합니다.
%pip install llama-index
%pip install llama-index-vector-stores-hnswlib
%pip install llama-index-embeddings-huggingface
%pip install hnswlib
패키지 의존성 import (Import package dependencies)
from llama_index.vector_stores.hnswlib import HnswlibVectorStore
from llama_index.core import (
VectorStoreIndex,
StorageContext,
SimpleDirectoryReader,
)
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
예제 데이터 로드 (Load example data)
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
데이터 읽기 (Read the data)
documents = SimpleDirectoryReader("./data/paul_graham/").load_data()
print(f"Total documents: {len(documents)}")
print(f"First document, id: {documents[0].doc_id}")
print(f"First document, hash: {documents[0].hash}")
print(
"First document, text"
f" ({len(documents[0].text)} characters):\n{'='*20}\n{documents[0].text[:360]} ..."
)
임베딩 모델 로드 (Load the embedding model)
embed_model = HuggingFaceEmbedding(
model_name="sentence-transformers/all-MiniLM-L6-v2",
normalize=True,
)
Hnswlib.Index 파라미터로 Hnswlib Vector Store 객체 생성 (Create Hnswlib Vector Store object from Hnswlib.Index parameters)
hnswlib_vector_store = HnswlibVectorStore.from_params(
space="ip",
dimension=embed_model._model.get_sentence_embedding_dimension(),
max_elements=1000,
)
또는 직접 Hnswlib.Index 객체를 만들 수도 있습니다.
import hnswlib
index = hnswlib.Index(
"ip", embed_model._model.get_sentence_embedding_dimension()
)
index.init_index(max_elements=1000)
hnswlib_vector_store = HnswlibVectorStore(index)
문서로 인덱스 구축 (Build index from documents)
hnswlib_storage_context = StorageContext.from_defaults(
vector_store=hnswlib_vector_store
)
hnswlib_index = VectorStoreIndex.from_documents(
documents,
storage_context=hnswlib_storage_context,
embed_model=embed_model,
show_progress=True,
)
인덱스 쿼리 (Query index)
k = 5
query = "Before college I wrote what begginers should write."
hnswlib_vector_retriever = hnswlib_index.as_retriever(similarity_top_k=k)
nodes_with_scores = nodes_with_scores = hnswlib_vector_retriever.retrieve(
query
)
for node in nodes_with_scores:
print(f"Node {node.id_} | Score: {node.score:.3f} - {node.text[:120]}...")