직렬화와 역직렬화로 LangChain 모델 로드하기
직렬화와 역직렬화로 모델 로드하기
직렬화는 데이터 구조나 객체의 상태를 저장하거나 전송하기 위해 일련의 바이트나 문자열 형식으로 변환하는 과정. RAG 에서 직렬화의 주된 목적은 모델을 저장하는데 잇음. 예를 들어 사용자가 만든 체인을 저장해야할 때 체인을 직렬화 해서 json 형식으로 변환해서 저장한다 .
역직렬화는 데이터를 원래 객체나 데이터 구조의 형태로 복원하는 과정.
직렬화 가능 여부 확인하기
모든 데이터 타입이 직렬화가 가능한 것은 아니므로 가능 여부를 먼저 확인해야한다. 예를 들어, 랭체인 프레임워크에서 만든 체인의 직렬화 여부를 확인하기 위해서는 이런 메서드를 사용한다. 체인 뿐만 아니라, llm 객체나 프롬프트에 대해서도 동일한 방법으로 확인이 가능하다.
chain = prompt | model
chain.is_lc_serializable()
직렬화하기
직렬화 가능한 객체를 딕셔너리나 json 문자열로 변환한다. 이때 객체의 속성과 데이터를 키-값 쌍으로 변환한다.
from langchain_core.load import dumpd, dumps
dumpd_chain = dumpd(chain)
역직렬화하기
json이나 딕셔너리 형식으로 직렬화되었던 체인은 역직렬화를 하면 스트링 타입으로 변환된다.
dumps_chain = dumbps(chain)
pickle 파일로 직렬화하고 로드하기
직렬화된 파일을 저장할때는 피클이라는 파일 형태로 저장한다. 피클이란 파이썬 객체를 바이너리 형태로 변환하는 포맷으로, 파일이나 메모리에 빠르게 저장할 수 있고, 저장된 데이터를 로드해서 복원할 수 잇다.
import pickle
with open("chain.pkl", "wb") as f:
pickle.dump(dumpd_chain, f)
이렇게 저장해두면 이 파일을 제3자에게 전달해서 재사용할 수 있다. 이 파일을 전달받은 사람이 체인을 사용하려면 먼저 파일을 로드하고, 역직렬화해서 사용하면 된다.
import pickle
with open("chain.pkl", "rb") as f:
loaded_chain = pickle.load(f)
from langchain_core.load import load
chain_from_file = load(loaded_chain)
response = chain_from_file.invoke(...)