2025년 April 18일
  1. 개발 히스토리
  2. [Backend] 파일 처리

[Backend] 파일 처리

파일 처리 개선

문서 파일 요약

원래 문서를 업로드하면 ‘추가되었다’는 안내만 출력될 뿐,
파일의 내용을 요약해주거나 해석하는 기능 없이 바로 DB에 저장했습니다.

문서 요약 코드

from langchain.prompts import ChatPromptTemplate
from langchain_service.llms.setup import get_backend_agent
from typing import Callable

def get_file_agent(file: str, provider: str = "openai", model: str = "gpt-3.5-turbo") -> Callable[[None], str]:
    llm = get_backend_agent(provider, model)


    prompt = ChatPromptTemplate.from_template(
        """
        당신은 META LLM MSP 시스템의 AI 에이전트입니다.
        아래의 문서 내용을 기반으로 중요한 정보를 요약해주세요:

        문서 내용:
        {content}
        """
    )

    def agent_executor(_: None = None) -> str:
        formatted_prompt = prompt.format_messages(content=file)
        response = llm(formatted_prompt)
        return response.content if hasattr(response, "content") else response

    return agent_executor

PDF, TXT와 같은 확장자의 문서가 입력되면 위의 함수가 실행됩니다.
문서를 전체적으로 읽고 요약하는 기능을 합니다.

결과

이렇게 하면 사용자가 보기에 편할 뿐만 아니라,
대화 기록에 문서에 대한 요약이 남기 때문에 이후 문서 내용 기반 질문에 대하여, LLM이 더 정확히 이해할 수 있습니다.

파일 및 세션 삭제

이미 생성된 파일 및 스키마를 삭제하는 기능을 구현했습니다.

스키마

class DeleteSessionRequest(BaseModel):
    session_id : str

class DeleteSessionResponse(BaseModel):
    message : str

class DeleteFileRequest(BaseModel):
    infobase_id :int

class DeleteFileResponse(BaseModel):
    message :str

CRUD 코드

def delete_session(db: Session, session_id : str):
    session = db.query(ConversationSession).filter(ConversationSession.id == session_id).first()
    if session:
        db.delete(session)
        db.commit()

def delete_infobase(db: Session, infobase_id : int):
    file = db.query(ProjectInfoBase).filter(ProjectInfoBase.id == infobase_id).first()
    if file:
        db.delete(file)
        db.commit()

엔드포인트

@project_router.post("/DeleteSession", response_model=DeleteSessionResponse)
async def delete_session_endpoint(request : DeleteSessionRequest, db: Session = Depends(get_db)):
    session_id = request.session_id
    delete_session(db = db, session_id = session_id)
    return JSONResponse(content={"message": "삭제 성공"})


@project_router.post("/DeleteFile", response_model=DeleteFileResponse)
async def delete_session_endpoint(request : DeleteFileRequest, db: Session = Depends(get_db)):
    infobase_id = request.infobase_id
    delete_infobase(db = db, infobase_id = infobase_id)
    return JSONResponse(content={"message": "삭제 성공"})

파일명 중복 방지

DB 구조 변경

class ProjectInfoBase(Base):
    __tablename__ = "project_info_base"

    id = Column(Integer, primary_key=True, autoincrement=True)
    project_id = Column(Integer, ForeignKey("project_table.project_id", ondelete="CASCADE"), nullable=False)
    user_email = Column(String(255), ForeignKey("user_table.email", ondelete="CASCADE"), nullable=False)
    file_name = Column(String(255))
    file_url = Column(Text, nullable=True)
    upload_at = Column(TIMESTAMP, default=func.current_timestamp())
    project = relationship("Project", backref="info")
    user = relationship("User", backref="project_info")

파일의 이름만 따로 저장하는 file_name 컬럼을 추가했습니다.

Leave a Reply

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

연관 글
BCT NEWS
인기 글
워드프레스 보안
워드프레스 모음
워드프레스 유지보수
워드프레스 제작 팁