데이터 노트

[side-1] LangChain 활용하여 RAG 구축을 위해 Milvus DB 연결 테스트 본문

Lab

[side-1] LangChain 활용하여 RAG 구축을 위해 Milvus DB 연결 테스트

돌돌찐 2025. 1. 21. 23:18

개요

Milvus에 적재해둔 데이터를 기반으로 사용자가 검색한 유실물과 유사한 유실물 정보를 출력하도록 하기 위해 LangChain 활용해 RAG 구축을 하려고 했고, 벡터데이터베이스로 Milvus DB와 연동하고자 했다. 검색 결과까지 보여주는게 목표였는데, 계속 오류로 인해 일단 연결하는 부분만 작성.

 

환경

Docker Compose로 모두 컨테이너화하였으며, 사용자의 입력값을 받기 위한 FastAPI 컨테이너에서 Milvus 컨테이너 연결

 

작업

FastAPI 컨테이너에서 Milvus 연결 테스트 시도 (오류 발생 및 해결)

Milvus 공식 문서를 참고해서, 코드를 작성하고 연결이 되는지 테스트 해보았다.

아래 코드는 오류가 난 코드.

from dotenv import load_dotenv
import os

from langchain_milvus import Milvus, Zilliz
from langchain_openai import OpenAIEmbeddings
from pymilvus import connections

load_dotenv()

# 환경 변수 가져오기
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
MILVUS_HOST = os.getenv("MILVUS_HOST")
MILVUS_PORT = os.getenv("MILVUS_PORT")
COLLECTION_NAME = "lost_items"

# Milvus 연결 테스트
try:
    connections.connect("default", host=MILVUS_HOST, port=MILVUS_PORT)
    print("Milvus에 성공적으로 연결되었습니다.")
except Exception as e:
    print(f"Milvus 연결 실패: {e}")
    exit(1)

embeddings = OpenAIEmbeddings()

vector_store = Milvus(
    collection_name=COLLECTION_NAME,
    embedding_function=embeddings,
    vector_field="embedding",
    connection_args={"host": f"{MILVUS_HOST}", "port": f"{MILVUS_PORT}"}
)

# 검색 쿼리 실행
query = "검은색 가방과 유사한 아이템 정보를 찾아주세요."
try:
    results = vector_store.similarity_search(query, k=3)
    print("검색 결과:", results)
except Exception as e:
    print(f"검색 중 오류 발생: {e}")

우선은 사용자 쿼리는 지정해서 전달했고, langchain_milvus 활용해 vector_store 설정해주었는데, 계속 이 부분에서 오류가 났다.

 

오류 메세지

더보기

pymilvus.exceptions.MilvusException: <MilvusException: (code=2, message=Fail connecting to server on localhost:19530, illegal connection params or server unavailable)>

처음에는 그냥 Milvus랑 연결이 안됐다는건가 하고 연결 테스트 코드도 추가하고 했는데, 그 문제가 아니었다.

(오류를 제대로 읽어보자..)

어떤 parms가 문제라는건데.. 하고 다시 공식 문서를 들여다 보았다.

다른 부분은 connection_args 부분인데, 키 값을 uri로 주어야하는건가 하고 똑같이 설정해보았다.

같은 오류로 고민중인 분들의 글을 보았을 때, http 설정 제대로 했느냐 하는 글들도 있어서, 이건가 싶었다.

 

나는 도커 컨테이너로 연결했기 때문에 아래와 같이 설정 변경했다.

connection_args={"uri": "http://{컨테이너 서비스명}:{설정포트}"}

 

코드 실행 시, 잘 돌아간다.

 

결국 문제는 vector_store Milvus 파라미터 설정에 대한 문제였던 것.

 

별 것 아닌 부분인데 생각보다 오래 시간을 허비했다 ㅜㅜ 

도커 컨테이너에 대한 정보를 주어야 한다고 생각해서 host랑 port 정보를 넘겼는데 그게 아니었다.

 

공식 문서 잘 참고하고 오류를 겉핥기식으로 키워드만 보지 말고 제대로 읽어보자. 답은 오류 메세지에 있다!

 

코드는 잘 돌아갔으나, 검색 결과는 제대로 나오지 않았기 때문에 컬렉션 내 필드 값을 가져오는 부분을 다시 살펴보아야겠다.