내가 보려고 만든 블로그
<Recommendation> Faiss , 벡터서치 본문
Faiss는 페이스북에서 공개한 벡터 유사도를 검색해주는 프레임워크이다. 벡터 유사도 검색 외에 빠르게 k-means를 찾아 주는 등 여러 기능이 있다. 내부적으로 C++ 로 구현되어 있어 매우 빠르고 GPU 연산도 지원을 해준다.
Latent Dimension = 5 인 임의의 벡터들중에서 가장 유사한 벡터를 찾는 예제
vector_index라는 객체를 만들어주고 sample_vectors 라는 hidden_dimension = 5인 100개의 벡터들을 색인해준다.
import faiss
latent_dimension = 5
vector_index = faiss.IndexFlatIP(latent_dimension) # latent dimension = 5
vector_index.add(sample_vectors.astype('float32')) #
위에서 만든 100개의 벡터 (vector_index) 에 대해 가장 가까운 target_vector를 생성하고 찾는다.
5개까지 가까운 벡터를 찾았고 rating 과 랭킹을 반환 .
인덱스가 있을 경우 .
추천등에 사용할 때 user_id 혹은 item_id 와 같이 인덱스가 붙어있을때 주어진 인덱스를 바로 구할 수 있게 기능을 제공한다.
faiss.IndexIDMap2 , add_with_ids 라는 메소드 사용해주면 됨.
vector_index = faiss.IndexFlatIP(latent_dimension)
vector_index = faiss.IndexIDMap2(vector_index)
아이디가 다음과 같이 부여되어있다고 가정해보았다. 아까 예제와 다르게 벡터사전의 크기도 4 * 5로 줄임
ids = np.array([4,10,2,3])
vector_index.add_with_ids(sample_vectors.astype('float32'), ids) # ids도 같이 넣어주면됨.
임의의 target_vector를 생성해주고 유사한 벡터를 찾으면 해당 인덱스를 반환하는 것을 확인 가능
빠르게 유사한 벡터를 찾아주는 방법이 있다면 기존에 행렬을 복원하여 복원된 행렬을 바탕으로 추천해주는 방법 외에
유저가 마지막으로 본 아이템과 유사한 아이템을 벡터서칭을 통해 찾아서 추천을 해주는 방법 또한 가능할 것 같다.