현재 MAFM은 시스템이 실행되었을 때를 기준으로 파일 정보를 Embedding한다.
만약 파일이 수정, 삭제, 생성, 이동 된다면?
➜ 파일 변경 사항을 감지하고, 새롭게 Embedding하는 기능이 필요하다.
해당 기능을 구현하기 위해, 파이썬 라이브러리인 Watchdog을 사용했다.
Watchdog
: 파일 시스템의 변경 사항을 실시간으로 감시할 수 있도록 도와주는 도구
Watchdog을 프로젝트에 적용시켰다.
파일이 수정, 삭제, 생성, 이동되는 경우, 파일을 다시 Embedding하고 VectorDB에 저장하는 로직을 구현했다.
수정 ➜ 파일을 다시 Embedding 후 VectorDB에 저장 + 파일 구조 DB 수정
생성 ➜ 파일을 새로 Embedding 후 VectorDB에 저장 + 파일 구조 DB에 추가
삭제 ➜ VectorDB에서 해당 파일 삭제 + 파일 구조 DB에서도 삭제
수정 ➜ VectorDB에 저장된 내용을 그대로 다른 VectorDB에 이동시킴 + 파일 구조 DB 수정
다음은 생성 로직의 예제이다.
# 생성 로직
def on_created(self, event):
print("--created--", flush=True)
"""파일 생성 이벤트 처리 함수"""
if self.is_dot_file(event.src_path) or self.is_ignored_file(event.src_path):
return # 숨김 파일과 무시할 패턴을 가진 파일은 무시
absolute_file_path = event.src_path
dirpath = os.path.dirname(absolute_file_path)
dirname = os.path.basename(dirpath)
if event.is_directory:
print("created directory")
try:
initialize_vector_db(dirpath + "/" + dirname + ".db") # 벡터 DB 초기화
id = insert_file_info(absolute_file_path, 1, "filesystem.db")
insert_directory_structure(
id, dirpath, os.path.dirname(dirpath), "filesystem.db"
)
except Exception as e:
print(f"Error initializing vector DB for directory: {e}")
else:
print("created file")
insert_file_info(
absolute_file_path, 0, "filesystem.db"
) # 파일 정보 DB에 추가
# 파일 형식에 따라 데이터를 읽고 500바이트 크기의 배열로 분할
if absolute_file_path.endswith(".pdf"):
text_content = read_pdf(absolute_file_path)
text_chunks = split_text_into_chunks(text_content)
elif absolute_file_path.endswith(".docx"):
text_content = read_word(absolute_file_path)
text_chunks = split_text_into_chunks(text_content)
else:
# 일반 텍스트 파일일 경우
file_chunks = get_file_data(absolute_file_path)
text_chunks = file_chunks[2:] # 필요한 데이터 조정
# 벡터 DB에 저장
save(
dirpath + "/" + dirname + ".db",
get_id_by_path(absolute_file_path, "filesystem.db"),
text_chunks,
)
print(f"Created file: {event.src_path}")
observer를 프로젝트에 적용한 후 실행시켜보니, 다음과 같은 오류가 발생했다.
Open /Users/Ruffles/Projects/MAFM/MAFM/mafm/MAFM_test/coding/coding.db failed, the file has been opened by another program
처음에는 VectorDB인 Milvus와의 Connection이 제대로 종료되지 않아 발생한 문제라고 생각했다.
하지만, vector_db.py 파일에 이미 client.close()를 통해 연결을 끊는 로직이 구현되어 있었다.
Docker를 통해 Milvus를 사용하거나 Garbage Collection을 수행해도 문제는 해결되지 않았다.
그러다 파일 시스템에 이상한 .lock 파일이 생성된 것을 발견했다.
.lock file
: 파일이나 리소스에 대한 동시 접근을 제어하기 위해 생성되는 파일
확인해보니 모든 DB에 lock이 걸려 있었다.
client.close()를 호출했음에도 불구하고 왜 .lock 파일이 남아있을까?
client.close()를 호출한 뒤, db.lock 파일을 수동으로 삭제해주었다.
def delete_db_lock_file(db_name):
dir_path = os.path.dirname(db_name)
base_name = os.path.basename(db_name)
lock_file = f"{dir_path}/.{base_name}.lock"
if os.path.exists(lock_file):
os.remove(lock_file)
else:
print(f"No lock file found for {lock_file}")
이 문제는 Milvus 자체의 오류로 보였다.
GitHub에 Issue를 등록한 결과, .lock 파일은 프로세스가 완전히 종료된 경우에만 삭제된다는 답변을 받았다.

client.close()를 호출해도 프로세스가 남아 있으면 .lock 파일이 유지되는 것이 Milvus의 기본 동작이었다.
MAFM(Multi-Agent File Management)은 기존 파일 관리 시스템의 한계를 극복하고 보다 효율적인 파일 검색 기능을 제공하는 지능형 파일 관리 시스템이다.
기존 시스템과의 차별점 3가지는 다음과 같다.
서울시립대학교 컴퓨터과학부 프로젝트 공모전 [셈틀제] 3위를 수상했다!
교수님의 평가
- 프로젝트 내용과 구현 결과는 좋지만 상품성에 대한 의문이 있음
- MAFM 자체만으로 상품화 하기는 어렵다는 의견
- 차라리 하나의
파일 관리 시스템에 검색 기능으로써 MAFM을 삽입하는 것이 좋을 것 같다.
이번 프로젝트는 아이디어 구상에 정말 많은 시간을 쏟았다.
서비스라는 틀에서 벗어나 보자
웹 개발을 하다보면, 정말 있을만한 서비스는 다 있다는 것을 자주 느낀다.
괜찮은 아이디어다~ 싶으면 이미 github에 있는 경우가 대다수다.
그래서 이번 프로젝트는 조금 다르게 접근하고자 했다.
서비스와 OS 사이의 무언가를 만들어보고 싶었다.
결론적으론 MAFM도 일종의 서비스지만, 내가 기존에 만들던 웹 서비스들과는 결이 다른 것 같다.
python과 C를 써서 로직을 구현하고, VectorDB라는 새로운 DB를 써볼 수 있어서 좋았다.
다음번에는 NoSQL DB도 써봐야겠다.