2025년 April 13일
  1. 개발 히스토리
  2. [Backend] SQLAlchemy 코드 업데이트

[Backend] SQLAlchemy 코드 업데이트

코드 업데이트

SQLAlchemy 코드

경고문

기존에 SQLAlchemy 코드를 활용한 CRUD 코드들은 전부 위와 같은 경고문이 출력되고 있었습니다.
실제 코드 실행에 문제가 되는 부분은 아니지만, 이는 SQLAlchemy 1버전에서 주로 사용되던 방식이라고 합니다.
현재 MSP는 신규 버전의 SQLAlchemy를 사용하기 때문에 버전에 맞는 더 안전한 방식으로 코드를 수정할 필요가 있습니다.


기존 코드

def delete_user(db : Session, email : str):
    user = db.query(User).filter(User.email == email).first()

    if user:
        db.delete(user)
        db.commit()
    else:
        raise HTTPException(status_code=404, detail="User not found")

기존 코드는 db.query문을 사용할 때 일반적인 비교 연산자를 사용합니다.
그러나 신규 버전의 SQLAlchemy가 해당 비교를 SQL 표현식으로 변환할 때 올바른 타입이나 표현식으로 처리되지 않기 때문에,
다른 방식을 사용해야 합니다.

신규 코드

def delete_user(db : Session, email : str):
    user = db.query(User).filter(User.email.is_(email)).first()

    if user:
        db.delete(user)
        db.commit()
    else:
        raise HTTPException(status_code=404, detail="User not found")

연산자를 사용했을 때 에러가 뜨는 코드에 대해서는 is() 함수를 사용합니다.

대화 기록 관리

지식베이스

기존 파일 업로드 기능

파일 업로드 이후에는 위 사진과 같이 어떤 파일을 입력했는지 채팅으로 표기가 됩니다.
그러나 이것은 일시적으로 뜨는 문구이며, DB에 저장되는 내용은 아닙니다.
그렇기 때문에 새로고침을 하거나, 이후 다시 해당 대화 세션에 들어가면 이 문구는 남아있지 않습니다.

이 문제를 해결하기 위해서는, 파일 업로드로 발생한 대화도
일반적인 대화처럼 똑같이 DB에 저장해야 합니다.

엔드포인트 수정

@langchain_router.post("/UploadFile", response_model=FileUploadResponse)
async def UploadFile(request: Request, db: Session = Depends(get_db)):
    try:
        form_data = await request.form()
        project_id = form_data.get("project_id")
        user_email = form_data.get("user_email")
        session_id = form_data.get("session_id")
        files = form_data.getlist("files[]")

        save_dir = config.UPLOADED_FILES
        os.makedirs(save_dir, exist_ok=True)
        file_name = ''
        file_path = ""
        for file in files:
            file_name = file.filename
            file_location = os.path.join(save_dir, file.filename)
            with open(file_location, "wb") as f:
                content = await file.read()
                f.write(content)
            print(f"파일 저장됨: {file.filename}")
            file_path = f"{save_dir}/{file.filename}"
        print(file_path)
        if os.path.exists(file_path):
            print(f"파일 {file_path} 존재합니다.")
        else:
            print(f"파일 {file_path} 존재하지 않습니다.")
        id = upload_file(db=db, project = project_id, email=user_email, url=file_path)
        get_file_chain(db=db, id = id, file_path=file_path)
        message1 = f"파일 업로드 : {file_name}"
        message2 = "파일이 지식 베이스에 추가되었습니다. 어떤 도움이 필요하신가요?"
        vector1 = text_to_vector(message1)
        vector2 = text_to_vector(message2)
        add_message(db = db, session_id = session_id, project_id = project_id, user_email=user_email, message_role='user', conversation=message1, vector_memory=vector1)
        add_message(db=db, session_id=session_id, project_id=project_id, user_email=user_email, message_role='assistant', conversation=message2, vector_memory=vector2)
        return JSONResponse(content={"message": "파일 업로드 성공"})
    except Exception as e:
        raise HTTPException(status_code=500, detail="파일 업로드 중 오류 발생")

클라이언트로부터 프로젝트 ID와 사용자 이메일 뿐만 아니라
파일 업로드를 사용한 세션의 ID까지 받아옵니다.
이후 DB에 파일을 주고 받았던 대화 기록 쌍을 저장하는 기능을 추가했습니다.

적용 결과

이제 세션을 새로고침해도, 언제 어떤 파일을 저장했는지 대화 기록으로 표시됩니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

연관 글
BCT NEWS
인기 글
BCT AI Chatbot
워드프레스 유지보수
AI 컨설팅
BCT AI Chatbot
워드프레스 모음