전 글에서 작성한 것처럼 weaviate를 연결해야지 해당 게시글에 있는 코드가 실행된다는 점!!! 더불어 이건 2024-06-21 기준 가장 최신버전에 있는 코드로 작성했기 때문에 현시점 근처에서 실행하는 경우 weaviate버전을 확인해보고 실행해야한다. 예전 버전의 경우 실행이 안된다.
v4 버전에서는 컬렉션 생성하는 코드가 살짝 변했다. 필자의 경우 아래와 같이 컬렉션을 생성했다.
import weaviate
import os
import weaviate.classes.config as wc
HUGGINGFACE_API_KEY = os.environ["HUGGINGFACE_API_KEY"]
client = weaviate.connect_to_local(
headers={
"X-HuggingFace-Api-Key": HUGGINGFACE_API_KEY,
}
)
# 연결 확인
if client.is_ready():
print("Weaviate Cloud에 성공적으로 연결되었습니다.")
else:
print("Weaviate Cloud에 연결할 수 없습니다.")
# Paper 클래스의 속성 및 벡터화 설정 정의
client.collections.create(
name="Paper",
properties=[
wc.Property(name="title", data_type=wc.DataType.TEXT),
wc.Property(name="authors", data_type=wc.DataType.TEXT_ARRAY),
wc.Property(name="summary", data_type=wc.DataType.TEXT),
wc.Property(name="published", data_type=wc.DataType.DATE),
wc.Property(name="direct_link", data_type=wc.DataType.TEXT),
wc.Property(name="pdf_link", data_type=wc.DataType.TEXT),
wc.Property(name="category", data_type=wc.DataType.TEXT),
],
vectorizer_config=[
wc.Configure.NamedVectors.text2vec_huggingface(
name="summary_vector", source_properties=["summary"], model="sentence-transformers/all-MiniLM-L6-v2"
),
wc.Configure.NamedVectors.text2vec_huggingface(
name="title_vector", source_properties=["title"], model="sentence-transformers/all-MiniLM-L6-v2"
)
],
# Define the generative module
# generative_config=wc.Configure.Generative.openai(),
)
# 스키마 생성 확인
print("Paper 컬렉션이 성공적으로 생성되었습니다.")
collection = client.collections.get("Paper")
print(collection)
client.close()
논문 메타데이터를 저장하는 프로젝트를 진행중이기에 properties를 이렇게 설정하였다. 그리고 필자는 허깅페이스 벡터라이저를 사용하기 때문에 저런 코드를 작성하였다. 주석 처리를 한 것처럼 만일 generative module을 사용해야하는 경우 저런 코드를 작성해야한다.
후에 RAG를 사용해야하기에 스키마도 나중에 수정해야될 듯.. 추후에 포스팅해야겠다. 많관부ㅋㅋ
데이터를 저장하는 방법에는 다양한 방법이 존재하는데 나는 아래와 같이 batch를 사용해서 저장했다.
paper_collection = client.collections.get("Paper")
with paper_collection.batch.fixed_size(5) as batch:
for paper in papers:
# title 중복 확인
response = paper_collection.query.fetch_objects(
filters=Filter.by_property("title").equal(paper.title),
limit=1
)
# object가 있으면 건너뛰기
if response.objects:
continue
properties = {
"title": paper.title,
"authors": paper.authors,
"summary": paper.summary,
"published": paper.published,
"direct_link": paper.direct_link,
"pdf_link": paper.pdf_link,
"category": paper.category,
}
batch.add_object(
properties=properties,
)
코드는 따로 설명할 필요가 없을 것 같고~ 이렇게 데이터를 저장했으면 검색도 해보자!
weaviate는 여러가지 검색할 수 있는 방법이 존재하는데 나는 키워드기반으로 검색하고 싶어서 아래와 같은 쿼리 코드를 작성했다.
from weaviate.classes.query import Filter, MetadataQuery
response = paper_collection.query.bm25(
query=searchword,
return_metadata=MetadataQuery(score=True),
query_properties=["title", "authors", "summary"],
limit=10
)
res = []
# 오브젝트가 있으면
if response.objects:
for object in response.objects:
res.append(object.properties) # 반환 데이터에 추가
필자는 fastapi로 서버코드를 작성중이기에 docs로 확인해보았다.


잘 나온다!!!
공식문서를 잘 참고하자!
